1 /* 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 22 #include <net/vsock_addr.h> 23 #include <net/af_vsock.h> 24 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 31 /* The resource ID on which control packets are sent to the hypervisor. */ 32 #define VMCI_TRANSPORT_HYPERVISOR_PACKET_RID 15 33 34 #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 40 enum 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 57 struct 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 */ 68 struct 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 84 struct 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 98 struct 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 105 union 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. */ 111 struct 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 detach_sub_id; 123 union vmci_transport_notify notify; 124 struct vmci_transport_notify_ops *notify_ops; 125 struct list_head elem; 126 struct sock *sk; 127 spinlock_t lock; /* protects sk. */ 128 }; 129 130 int vmci_transport_register(void); 131 void vmci_transport_unregister(void); 132 133 int vmci_transport_send_wrote_bh(struct sockaddr_vm *dst, 134 struct sockaddr_vm *src); 135 int vmci_transport_send_read_bh(struct sockaddr_vm *dst, 136 struct sockaddr_vm *src); 137 int vmci_transport_send_wrote(struct sock *sk); 138 int vmci_transport_send_read(struct sock *sk); 139 int vmci_transport_send_waiting_write(struct sock *sk, 140 struct vmci_transport_waiting_info *wait); 141 int vmci_transport_send_waiting_read(struct sock *sk, 142 struct vmci_transport_waiting_info *wait); 143 144 #endif 145