Linux Audio

Check our new training course

Loading...
v5.14.15
  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
v6.13.7
  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_send_wrote_bh(struct sockaddr_vm *dst,
120				 struct sockaddr_vm *src);
121int vmci_transport_send_read_bh(struct sockaddr_vm *dst,
122				struct sockaddr_vm *src);
123int vmci_transport_send_wrote(struct sock *sk);
124int vmci_transport_send_read(struct sock *sk);
125int vmci_transport_send_waiting_write(struct sock *sk,
126				      struct vmci_transport_waiting_info *wait);
127int vmci_transport_send_waiting_read(struct sock *sk,
128				     struct vmci_transport_waiting_info *wait);
129
130#endif