root/net/vmw_vsock/vmci_transport.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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         u64 queue_pair_size;
 112         u64 queue_pair_min_size;
 113         u64 queue_pair_max_size;
 114         u32 detach_sub_id;
 115         union vmci_transport_notify notify;
 116         const struct vmci_transport_notify_ops *notify_ops;
 117         struct list_head elem;
 118         struct sock *sk;
 119         spinlock_t lock; /* protects sk. */
 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

/* [<][>][^][v][top][bottom][index][help] */