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