Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * VMware vSockets Driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Copyright (C) 2007-2013 VMware, Inc. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #ifndef __AF_VSOCK_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #define __AF_VSOCK_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <uapi/linux/vm_sockets.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include "vsock_addr.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #define LAST_RESERVED_PORT 1023
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #define VSOCK_HASH_SIZE         251
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) extern struct list_head vsock_bind_table[VSOCK_HASH_SIZE + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) extern struct list_head vsock_connected_table[VSOCK_HASH_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) extern spinlock_t vsock_table_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #define vsock_sk(__sk)    ((struct vsock_sock *)__sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #define sk_vsock(__vsk)   (&(__vsk)->sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) struct vsock_sock {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	/* sk must be the first member. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	struct sock sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	const struct vsock_transport *transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	struct sockaddr_vm local_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	struct sockaddr_vm remote_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	/* Links for the global tables of bound and connected sockets. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	struct list_head bound_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	struct list_head connected_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	/* Accessed without the socket lock held. This means it can never be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	 * modified outsided of socket create or destruct.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	bool trusted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	bool cached_peer_allow_dgram;	/* Dgram communication allowed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 					 * cached peer?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 					 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	u32 cached_peer;  /* Context ID of last dgram destination check. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	const struct cred *owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	/* Rest are SOCK_STREAM only. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	long connect_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	/* Listening socket that this came from. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	struct sock *listener;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	/* Used for pending list and accept queue during connection handshake.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	 * The listening socket is the head for both lists.  Sockets created
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	 * for connection requests are placed in the pending list until they
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	 * are connected, at which point they are put in the accept queue list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	 * so they can be accepted in accept().  If accept() cannot accept the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	 * connection, it is marked as rejected so the cleanup function knows
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	 * to clean up the socket.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	struct list_head pending_links;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	struct list_head accept_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	bool rejected;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	struct delayed_work connect_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	struct delayed_work pending_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	struct delayed_work close_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	bool close_work_scheduled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	u32 peer_shutdown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	bool sent_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	bool ignore_connecting_rst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	/* Protected by lock_sock(sk) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	u64 buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	u64 buffer_min_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	u64 buffer_max_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	/* Private to transport. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	void *trans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) s64 vsock_stream_has_data(struct vsock_sock *vsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) s64 vsock_stream_has_space(struct vsock_sock *vsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) struct sock *vsock_create_connected(struct sock *parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) /**** TRANSPORT ****/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) struct vsock_transport_recv_notify_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	u64 data1; /* Transport-defined. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	u64 data2; /* Transport-defined. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	bool notify_on_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) struct vsock_transport_send_notify_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	u64 data1; /* Transport-defined. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	u64 data2; /* Transport-defined. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) /* Transport features flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) /* Transport provides host->guest communication */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) #define VSOCK_TRANSPORT_F_H2G		0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) /* Transport provides guest->host communication */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) #define VSOCK_TRANSPORT_F_G2H		0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) /* Transport provides DGRAM communication */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define VSOCK_TRANSPORT_F_DGRAM		0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) /* Transport provides local (loopback) communication */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define VSOCK_TRANSPORT_F_LOCAL		0x00000008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct vsock_transport {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	struct module *module;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	/* Initialize/tear-down socket. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	int (*init)(struct vsock_sock *, struct vsock_sock *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	void (*destruct)(struct vsock_sock *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	void (*release)(struct vsock_sock *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	/* Cancel all pending packets sent on vsock. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	int (*cancel_pkt)(struct vsock_sock *vsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	/* Connections. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	int (*connect)(struct vsock_sock *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	/* DGRAM. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	int (*dgram_bind)(struct vsock_sock *, struct sockaddr_vm *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	int (*dgram_dequeue)(struct vsock_sock *vsk, struct msghdr *msg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 			     size_t len, int flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	int (*dgram_enqueue)(struct vsock_sock *, struct sockaddr_vm *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 			     struct msghdr *, size_t len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	bool (*dgram_allow)(u32 cid, u32 port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	/* STREAM. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	/* TODO: stream_bind() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	ssize_t (*stream_dequeue)(struct vsock_sock *, struct msghdr *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 				  size_t len, int flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	ssize_t (*stream_enqueue)(struct vsock_sock *, struct msghdr *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 				  size_t len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	s64 (*stream_has_data)(struct vsock_sock *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	s64 (*stream_has_space)(struct vsock_sock *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	u64 (*stream_rcvhiwat)(struct vsock_sock *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	bool (*stream_is_active)(struct vsock_sock *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	bool (*stream_allow)(u32 cid, u32 port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	/* Notification. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	int (*notify_poll_in)(struct vsock_sock *, size_t, bool *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	int (*notify_poll_out)(struct vsock_sock *, size_t, bool *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	int (*notify_recv_init)(struct vsock_sock *, size_t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 		struct vsock_transport_recv_notify_data *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	int (*notify_recv_pre_block)(struct vsock_sock *, size_t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 		struct vsock_transport_recv_notify_data *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	int (*notify_recv_pre_dequeue)(struct vsock_sock *, size_t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		struct vsock_transport_recv_notify_data *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	int (*notify_recv_post_dequeue)(struct vsock_sock *, size_t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 		ssize_t, bool, struct vsock_transport_recv_notify_data *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	int (*notify_send_init)(struct vsock_sock *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 		struct vsock_transport_send_notify_data *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	int (*notify_send_pre_block)(struct vsock_sock *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 		struct vsock_transport_send_notify_data *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	int (*notify_send_pre_enqueue)(struct vsock_sock *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 		struct vsock_transport_send_notify_data *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	int (*notify_send_post_enqueue)(struct vsock_sock *, ssize_t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 		struct vsock_transport_send_notify_data *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	/* sk_lock held by the caller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	void (*notify_buffer_size)(struct vsock_sock *, u64 *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	/* Shutdown. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	int (*shutdown)(struct vsock_sock *, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	/* Addressing. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	u32 (*get_local_cid)(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) /**** CORE ****/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) int vsock_core_register(const struct vsock_transport *t, int features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) void vsock_core_unregister(const struct vsock_transport *t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) /* The transport may downcast this to access transport-specific functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) const struct vsock_transport *vsock_core_get_transport(struct vsock_sock *vsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /**** UTILS ****/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) /* vsock_table_lock must be held */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) static inline bool __vsock_in_bound_table(struct vsock_sock *vsk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	return !list_empty(&vsk->bound_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) /* vsock_table_lock must be held */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) static inline bool __vsock_in_connected_table(struct vsock_sock *vsk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	return !list_empty(&vsk->connected_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) void vsock_release_pending(struct sock *pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) void vsock_add_pending(struct sock *listener, struct sock *pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) void vsock_remove_pending(struct sock *listener, struct sock *pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) void vsock_enqueue_accept(struct sock *listener, struct sock *connected);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) void vsock_insert_connected(struct vsock_sock *vsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) void vsock_remove_bound(struct vsock_sock *vsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) void vsock_remove_connected(struct vsock_sock *vsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) struct sock *vsock_find_bound_socket(struct sockaddr_vm *addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) struct sock *vsock_find_connected_socket(struct sockaddr_vm *src,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 					 struct sockaddr_vm *dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) void vsock_remove_sock(struct vsock_sock *vsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) void vsock_for_each_connected_socket(void (*fn)(struct sock *sk));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) bool vsock_find_cid(unsigned int cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) /**** TAP ****/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) struct vsock_tap {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	struct module *module;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) int vsock_init_tap(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) int vsock_add_tap(struct vsock_tap *vt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) int vsock_remove_tap(struct vsock_tap *vt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) void vsock_deliver_tap(struct sk_buff *build_skb(void *opaque), void *opaque);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #endif /* __AF_VSOCK_H__ */