1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * VMware vSockets Driver 4 * 5 * Copyright (C) 2013 VMware, Inc. All rights reserved. 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 14 #include <net/vsock_addr.h> 15 #include <net/af_vsock.h> 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 23 /* The resource ID on which control packets are sent to the hypervisor. */ 24 #define VMCI_TRANSPORT_HYPERVISOR_PACKET_RID 15 25 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 u32 detach_sub_id; 112 union vmci_transport_notify notify; 113 const struct vmci_transport_notify_ops *notify_ops; 114 struct list_head elem; 115 struct sock *sk; 116 spinlock_t lock; /* protects sk. */ 117 }; 118 119 int vmci_transport_send_wrote_bh(struct sockaddr_vm *dst, 120 struct sockaddr_vm *src); 121 int vmci_transport_send_read_bh(struct sockaddr_vm *dst, 122 struct sockaddr_vm *src); 123 int vmci_transport_send_wrote(struct sock *sk); 124 int vmci_transport_send_read(struct sock *sk); 125 int vmci_transport_send_waiting_write(struct sock *sk, 126 struct vmci_transport_waiting_info *wait); 127 int vmci_transport_send_waiting_read(struct sock *sk, 128 struct vmci_transport_waiting_info *wait); 129 130 #endif 131