^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__ */