2 * VMware vSockets Driver
4 * Copyright (C) 2013 VMware, Inc. All rights reserved.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation version 2 and no later version.
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 #ifndef _VMCI_TRANSPORT_H_
17 #define _VMCI_TRANSPORT_H_
19 #include <linux/vmw_vmci_defs.h>
20 #include <linux/vmw_vmci_api.h>
22 #include "vsock_addr.h"
25 /* If the packet format changes in a release then this should change too. */
26 #define VMCI_TRANSPORT_PACKET_VERSION 1
28 /* The resource ID on which control packets are sent. */
29 #define VMCI_TRANSPORT_PACKET_RID 1
31 #define VSOCK_PROTO_INVALID 0
32 #define VSOCK_PROTO_PKT_ON_NOTIFY (1 << 0)
33 #define VSOCK_PROTO_ALL_SUPPORTED (VSOCK_PROTO_PKT_ON_NOTIFY)
35 #define vmci_trans(_vsk) ((struct vmci_transport *)((_vsk)->trans))
37 enum vmci_transport_packet_type
{
38 VMCI_TRANSPORT_PACKET_TYPE_INVALID
= 0,
39 VMCI_TRANSPORT_PACKET_TYPE_REQUEST
,
40 VMCI_TRANSPORT_PACKET_TYPE_NEGOTIATE
,
41 VMCI_TRANSPORT_PACKET_TYPE_OFFER
,
42 VMCI_TRANSPORT_PACKET_TYPE_ATTACH
,
43 VMCI_TRANSPORT_PACKET_TYPE_WROTE
,
44 VMCI_TRANSPORT_PACKET_TYPE_READ
,
45 VMCI_TRANSPORT_PACKET_TYPE_RST
,
46 VMCI_TRANSPORT_PACKET_TYPE_SHUTDOWN
,
47 VMCI_TRANSPORT_PACKET_TYPE_WAITING_WRITE
,
48 VMCI_TRANSPORT_PACKET_TYPE_WAITING_READ
,
49 VMCI_TRANSPORT_PACKET_TYPE_REQUEST2
,
50 VMCI_TRANSPORT_PACKET_TYPE_NEGOTIATE2
,
51 VMCI_TRANSPORT_PACKET_TYPE_MAX
54 struct vmci_transport_waiting_info
{
59 /* Control packet type for STREAM sockets. DGRAMs have no control packets nor
60 * special packet header for data packets, they are just raw VMCI DGRAM
61 * messages. For STREAMs, control packets are sent over the control channel
62 * while data is written and read directly from queue pairs with no packet
65 struct vmci_transport_packet
{
66 struct vmci_datagram dg
;
76 struct vmci_handle handle
;
77 struct vmci_transport_waiting_info wait
;
81 struct vmci_transport_notify_pkt
{
82 u64 write_notify_window
;
83 u64 write_notify_min_window
;
84 bool peer_waiting_read
;
85 bool peer_waiting_write
;
86 bool peer_waiting_write_detected
;
87 bool sent_waiting_read
;
88 bool sent_waiting_write
;
89 struct vmci_transport_waiting_info peer_waiting_read_info
;
90 struct vmci_transport_waiting_info peer_waiting_write_info
;
91 u64 produce_q_generation
;
92 u64 consume_q_generation
;
95 struct vmci_transport_notify_pkt_q_state
{
96 u64 write_notify_window
;
97 u64 write_notify_min_window
;
98 bool peer_waiting_write
;
99 bool peer_waiting_write_detected
;
102 union vmci_transport_notify
{
103 struct vmci_transport_notify_pkt pkt
;
104 struct vmci_transport_notify_pkt_q_state pkt_q_state
;
107 /* Our transport-specific data. */
108 struct vmci_transport
{
110 struct vmci_handle dg_handle
;
112 struct vmci_handle qp_handle
;
113 struct vmci_qp
*qpair
;
117 u64 queue_pair_min_size
;
118 u64 queue_pair_max_size
;
121 union vmci_transport_notify notify
;
122 struct vmci_transport_notify_ops
*notify_ops
;
125 int vmci_transport_register(void);
126 void vmci_transport_unregister(void);
128 int vmci_transport_send_wrote_bh(struct sockaddr_vm
*dst
,
129 struct sockaddr_vm
*src
);
130 int vmci_transport_send_read_bh(struct sockaddr_vm
*dst
,
131 struct sockaddr_vm
*src
);
132 int vmci_transport_send_wrote(struct sock
*sk
);
133 int vmci_transport_send_read(struct sock
*sk
);
134 int vmci_transport_send_waiting_write(struct sock
*sk
,
135 struct vmci_transport_waiting_info
*wait
);
136 int vmci_transport_send_waiting_read(struct sock
*sk
,
137 struct vmci_transport_waiting_info
*wait
);