root/include/net/af_vsock.h

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

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. vsock_core_init
  2. __vsock_in_bound_table
  3. __vsock_in_connected_table

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

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