/*
 * VMware vSockets Driver
 *
 * Copyright (C) 2013 VMware, Inc. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation version 2 and no later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 */

#ifndef _VMCI_TRANSPORT_H_
#define _VMCI_TRANSPORT_H_

#include <linux/vmw_vmci_defs.h>
#include <linux/vmw_vmci_api.h>

#include <net/vsock_addr.h>
#include <net/af_vsock.h>

/* If the packet format changes in a release then this should change too. */
#define VMCI_TRANSPORT_PACKET_VERSION 1

/* The resource ID on which control packets are sent. */
#define VMCI_TRANSPORT_PACKET_RID 1

/* The resource ID on which control packets are sent to the hypervisor. */
#define VMCI_TRANSPORT_HYPERVISOR_PACKET_RID 15

#define VSOCK_PROTO_INVALID        0
#define VSOCK_PROTO_PKT_ON_NOTIFY (1 << 0)
#define VSOCK_PROTO_ALL_SUPPORTED (VSOCK_PROTO_PKT_ON_NOTIFY)

#define vmci_trans(_vsk) ((struct vmci_transport *)((_vsk)->trans))

enum vmci_transport_packet_type {
	VMCI_TRANSPORT_PACKET_TYPE_INVALID = 0,
	VMCI_TRANSPORT_PACKET_TYPE_REQUEST,
	VMCI_TRANSPORT_PACKET_TYPE_NEGOTIATE,
	VMCI_TRANSPORT_PACKET_TYPE_OFFER,
	VMCI_TRANSPORT_PACKET_TYPE_ATTACH,
	VMCI_TRANSPORT_PACKET_TYPE_WROTE,
	VMCI_TRANSPORT_PACKET_TYPE_READ,
	VMCI_TRANSPORT_PACKET_TYPE_RST,
	VMCI_TRANSPORT_PACKET_TYPE_SHUTDOWN,
	VMCI_TRANSPORT_PACKET_TYPE_WAITING_WRITE,
	VMCI_TRANSPORT_PACKET_TYPE_WAITING_READ,
	VMCI_TRANSPORT_PACKET_TYPE_REQUEST2,
	VMCI_TRANSPORT_PACKET_TYPE_NEGOTIATE2,
	VMCI_TRANSPORT_PACKET_TYPE_MAX
};

struct vmci_transport_waiting_info {
	u64 generation;
	u64 offset;
};

/* Control packet type for STREAM sockets.  DGRAMs have no control packets nor
 * special packet header for data packets, they are just raw VMCI DGRAM
 * messages.  For STREAMs, control packets are sent over the control channel
 * while data is written and read directly from queue pairs with no packet
 * format.
 */
struct vmci_transport_packet {
	struct vmci_datagram dg;
	u8 version;
	u8 type;
	u16 proto;
	u32 src_port;
	u32 dst_port;
	u32 _reserved2;
	union {
		u64 size;
		u64 mode;
		struct vmci_handle handle;
		struct vmci_transport_waiting_info wait;
	} u;
};

struct vmci_transport_notify_pkt {
	u64 write_notify_window;
	u64 write_notify_min_window;
	bool peer_waiting_read;
	bool peer_waiting_write;
	bool peer_waiting_write_detected;
	bool sent_waiting_read;
	bool sent_waiting_write;
	struct vmci_transport_waiting_info peer_waiting_read_info;
	struct vmci_transport_waiting_info peer_waiting_write_info;
	u64 produce_q_generation;
	u64 consume_q_generation;
};

struct vmci_transport_notify_pkt_q_state {
	u64 write_notify_window;
	u64 write_notify_min_window;
	bool peer_waiting_write;
	bool peer_waiting_write_detected;
};

union vmci_transport_notify {
	struct vmci_transport_notify_pkt pkt;
	struct vmci_transport_notify_pkt_q_state pkt_q_state;
};

/* Our transport-specific data. */
struct vmci_transport {
	/* For DGRAMs. */
	struct vmci_handle dg_handle;
	/* For STREAMs. */
	struct vmci_handle qp_handle;
	struct vmci_qp *qpair;
	u64 produce_size;
	u64 consume_size;
	u64 queue_pair_size;
	u64 queue_pair_min_size;
	u64 queue_pair_max_size;
	u32 detach_sub_id;
	union vmci_transport_notify notify;
	const struct vmci_transport_notify_ops *notify_ops;
	struct list_head elem;
	struct sock *sk;
	spinlock_t lock; /* protects sk. */
};

int vmci_transport_register(void);
void vmci_transport_unregister(void);

int vmci_transport_send_wrote_bh(struct sockaddr_vm *dst,
				 struct sockaddr_vm *src);
int vmci_transport_send_read_bh(struct sockaddr_vm *dst,
				struct sockaddr_vm *src);
int vmci_transport_send_wrote(struct sock *sk);
int vmci_transport_send_read(struct sock *sk);
int vmci_transport_send_waiting_write(struct sock *sk,
				      struct vmci_transport_waiting_info *wait);
int vmci_transport_send_waiting_read(struct sock *sk,
				     struct vmci_transport_waiting_info *wait);

#endif
