linux/net/vmw_vsock/vmci_transport.h
<<
>>
Prefs
   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
  32enum 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
  49struct 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 */
  60struct 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
  76struct 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
  90struct 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
  97union 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. */
 103struct 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
 119int vmci_transport_register(void);
 120void vmci_transport_unregister(void);
 121
 122int vmci_transport_send_wrote_bh(struct sockaddr_vm *dst,
 123                                 struct sockaddr_vm *src);
 124int vmci_transport_send_read_bh(struct sockaddr_vm *dst,
 125                                struct sockaddr_vm *src);
 126int vmci_transport_send_wrote(struct sock *sk);
 127int vmci_transport_send_read(struct sock *sk);
 128int vmci_transport_send_waiting_write(struct sock *sk,
 129                                      struct vmci_transport_waiting_info *wait);
 130int vmci_transport_send_waiting_read(struct sock *sk,
 131                                     struct vmci_transport_waiting_info *wait);
 132
 133#endif
 134