1685a6bf8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2d021c344SAndy King /*
3d021c344SAndy King  * VMware vSockets Driver
4d021c344SAndy King  *
5d021c344SAndy King  * Copyright (C) 2013 VMware, Inc. All rights reserved.
6d021c344SAndy King  */
7d021c344SAndy King 
8d021c344SAndy King #ifndef _VMCI_TRANSPORT_H_
9d021c344SAndy King #define _VMCI_TRANSPORT_H_
10d021c344SAndy King 
11d021c344SAndy King #include <linux/vmw_vmci_defs.h>
12d021c344SAndy King #include <linux/vmw_vmci_api.h>
13d021c344SAndy King 
1482a54d0eSAsias He #include <net/vsock_addr.h>
1582a54d0eSAsias He #include <net/af_vsock.h>
16d021c344SAndy King 
17d021c344SAndy King /* If the packet format changes in a release then this should change too. */
18d021c344SAndy King #define VMCI_TRANSPORT_PACKET_VERSION 1
19d021c344SAndy King 
20d021c344SAndy King /* The resource ID on which control packets are sent. */
21d021c344SAndy King #define VMCI_TRANSPORT_PACKET_RID 1
22d021c344SAndy King 
232a89f924SReilly Grant /* The resource ID on which control packets are sent to the hypervisor. */
242a89f924SReilly Grant #define VMCI_TRANSPORT_HYPERVISOR_PACKET_RID 15
252a89f924SReilly Grant 
26d021c344SAndy King #define VSOCK_PROTO_INVALID        0
27d021c344SAndy King #define VSOCK_PROTO_PKT_ON_NOTIFY (1 << 0)
28d021c344SAndy King #define VSOCK_PROTO_ALL_SUPPORTED (VSOCK_PROTO_PKT_ON_NOTIFY)
29d021c344SAndy King 
30d021c344SAndy King #define vmci_trans(_vsk) ((struct vmci_transport *)((_vsk)->trans))
31d021c344SAndy King 
32d021c344SAndy King enum vmci_transport_packet_type {
33d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_INVALID = 0,
34d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_REQUEST,
35d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_NEGOTIATE,
36d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_OFFER,
37d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_ATTACH,
38d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_WROTE,
39d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_READ,
40d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_RST,
41d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_SHUTDOWN,
42d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_WAITING_WRITE,
43d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_WAITING_READ,
44d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_REQUEST2,
45d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_NEGOTIATE2,
46d021c344SAndy King 	VMCI_TRANSPORT_PACKET_TYPE_MAX
47d021c344SAndy King };
48d021c344SAndy King 
49d021c344SAndy King struct vmci_transport_waiting_info {
50d021c344SAndy King 	u64 generation;
51d021c344SAndy King 	u64 offset;
52d021c344SAndy King };
53d021c344SAndy King 
54d021c344SAndy King /* Control packet type for STREAM sockets.  DGRAMs have no control packets nor
55d021c344SAndy King  * special packet header for data packets, they are just raw VMCI DGRAM
56d021c344SAndy King  * messages.  For STREAMs, control packets are sent over the control channel
57d021c344SAndy King  * while data is written and read directly from queue pairs with no packet
58d021c344SAndy King  * format.
59d021c344SAndy King  */
60d021c344SAndy King struct vmci_transport_packet {
61d021c344SAndy King 	struct vmci_datagram dg;
62d021c344SAndy King 	u8 version;
63d021c344SAndy King 	u8 type;
64d021c344SAndy King 	u16 proto;
65d021c344SAndy King 	u32 src_port;
66d021c344SAndy King 	u32 dst_port;
67d021c344SAndy King 	u32 _reserved2;
68d021c344SAndy King 	union {
69d021c344SAndy King 		u64 size;
70d021c344SAndy King 		u64 mode;
71d021c344SAndy King 		struct vmci_handle handle;
72d021c344SAndy King 		struct vmci_transport_waiting_info wait;
73d021c344SAndy King 	} u;
74d021c344SAndy King };
75d021c344SAndy King 
76d021c344SAndy King struct vmci_transport_notify_pkt {
77d021c344SAndy King 	u64 write_notify_window;
78d021c344SAndy King 	u64 write_notify_min_window;
79d021c344SAndy King 	bool peer_waiting_read;
80d021c344SAndy King 	bool peer_waiting_write;
81d021c344SAndy King 	bool peer_waiting_write_detected;
82d021c344SAndy King 	bool sent_waiting_read;
83d021c344SAndy King 	bool sent_waiting_write;
84d021c344SAndy King 	struct vmci_transport_waiting_info peer_waiting_read_info;
85d021c344SAndy King 	struct vmci_transport_waiting_info peer_waiting_write_info;
86d021c344SAndy King 	u64 produce_q_generation;
87d021c344SAndy King 	u64 consume_q_generation;
88d021c344SAndy King };
89d021c344SAndy King 
90d021c344SAndy King struct vmci_transport_notify_pkt_q_state {
91d021c344SAndy King 	u64 write_notify_window;
92d021c344SAndy King 	u64 write_notify_min_window;
93d021c344SAndy King 	bool peer_waiting_write;
94d021c344SAndy King 	bool peer_waiting_write_detected;
95d021c344SAndy King };
96d021c344SAndy King 
97d021c344SAndy King union vmci_transport_notify {
98d021c344SAndy King 	struct vmci_transport_notify_pkt pkt;
99d021c344SAndy King 	struct vmci_transport_notify_pkt_q_state pkt_q_state;
100d021c344SAndy King };
101d021c344SAndy King 
102d021c344SAndy King /* Our transport-specific data. */
103d021c344SAndy King struct vmci_transport {
104d021c344SAndy King 	/* For DGRAMs. */
105d021c344SAndy King 	struct vmci_handle dg_handle;
106d021c344SAndy King 	/* For STREAMs. */
107d021c344SAndy King 	struct vmci_handle qp_handle;
108d021c344SAndy King 	struct vmci_qp *qpair;
109d021c344SAndy King 	u64 produce_size;
110d021c344SAndy King 	u64 consume_size;
111d021c344SAndy King 	u32 detach_sub_id;
112d021c344SAndy King 	union vmci_transport_notify notify;
1133b22dae3SJulia Lawall 	const struct vmci_transport_notify_ops *notify_ops;
1144ef7ea91SJorgen Hansen 	struct list_head elem;
1154ef7ea91SJorgen Hansen 	struct sock *sk;
1164ef7ea91SJorgen Hansen 	spinlock_t lock; /* protects sk. */
117d021c344SAndy King };
118d021c344SAndy King 
119d021c344SAndy King int vmci_transport_send_wrote_bh(struct sockaddr_vm *dst,
120d021c344SAndy King 				 struct sockaddr_vm *src);
121d021c344SAndy King int vmci_transport_send_read_bh(struct sockaddr_vm *dst,
122d021c344SAndy King 				struct sockaddr_vm *src);
123d021c344SAndy King int vmci_transport_send_wrote(struct sock *sk);
124d021c344SAndy King int vmci_transport_send_read(struct sock *sk);
125d021c344SAndy King int vmci_transport_send_waiting_write(struct sock *sk,
126d021c344SAndy King 				      struct vmci_transport_waiting_info *wait);
127d021c344SAndy King int vmci_transport_send_waiting_read(struct sock *sk,
128d021c344SAndy King 				     struct vmci_transport_waiting_info *wait);
129d021c344SAndy King 
130d021c344SAndy King #endif
131