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