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