FD.io VPP  v21.10.1-2-g0a485f517
Vector Packet Processing
socket.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 /*
16  Copyright (c) 2001, 2002, 2003 Eliot Dresselhaus
17 
18  Permission is hereby granted, free of charge, to any person obtaining
19  a copy of this software and associated documentation files (the
20  "Software"), to deal in the Software without restriction, including
21  without limitation the rights to use, copy, modify, merge, publish,
22  distribute, sublicense, and/or sell copies of the Software, and to
23  permit persons to whom the Software is furnished to do so, subject to
24  the following conditions:
25 
26  The above copyright notice and this permission notice shall be
27  included in all copies or substantial portions of the Software.
28 
29  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
31  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
32  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
33  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
34  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
35  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 */
37 
38 #ifndef _clib_included_socket_h
39 #define _clib_included_socket_h
40 
41 #include <sys/types.h>
42 #include <sys/socket.h>
43 #include <netinet/in.h>
44 
45 #include <vppinfra/clib.h>
46 #include <vppinfra/error.h>
47 #include <vppinfra/format.h>
48 
49 typedef struct _socket_t
50 {
51  /* File descriptor. */
52  i32 fd;
53 
54  /* Config string for socket HOST:PORT or just HOST. */
55  char *config;
56 
57  u32 flags;
58 #define CLIB_SOCKET_F_IS_SERVER (1 << 0)
59 #define CLIB_SOCKET_F_IS_CLIENT (0 << 0)
60 #define CLIB_SOCKET_F_RX_END_OF_FILE (1 << 2)
61 #define CLIB_SOCKET_F_NON_BLOCKING_CONNECT (1 << 3)
62 #define CLIB_SOCKET_F_ALLOW_GROUP_WRITE (1 << 4)
63 #define CLIB_SOCKET_F_SEQPACKET (1 << 5)
64 #define CLIB_SOCKET_F_PASSCRED (1 << 6)
65 #define CLIB_SOCKET_F_BLOCKING (1 << 7)
66 
67  /* Transmit buffer. Holds data waiting to be written. */
68  u8 *tx_buffer;
69 
70  /* Receive buffer. Holds data read from socket. */
71  u8 *rx_buffer;
72 
73  /* Peer socket we are connected to. */
74  struct sockaddr_in peer;
75 
76  /* Credentials, populated if CLIB_SOCKET_F_PASSCRED is set */
77  pid_t pid;
78  uid_t uid;
79  gid_t gid;
80 
81  clib_error_t *(*write_func) (struct _socket_t * sock);
82  clib_error_t *(*read_func) (struct _socket_t * sock, int min_bytes);
83  clib_error_t *(*close_func) (struct _socket_t * sock);
84  clib_error_t *(*recvmsg_func) (struct _socket_t * s, void *msg, int msglen,
85  int fds[], int num_fds);
86  clib_error_t *(*sendmsg_func) (struct _socket_t * s, void *msg, int msglen,
87  int fds[], int num_fds);
88  uword private_data;
90 
91 /* socket config format is host:port.
92  Unspecified port causes a free one to be chosen starting
93  from IPPORT_USERRESERVED (5000). */
95 
97 
99  clib_socket_t * client);
100 
103 {
104  return (sock->flags & CLIB_SOCKET_F_IS_SERVER) != 0;
105 }
106 
109 {
110  return !clib_socket_is_server (s);
111 }
112 
115 {
116  return sock->fd > 0;
117 }
118 
119 
120 always_inline int
122 {
123  return s->flags & CLIB_SOCKET_F_RX_END_OF_FILE;
124 }
125 
126 always_inline void *
128 {
129  u8 *result;
130  vec_add2 (s->tx_buffer, result, n_bytes);
131  return result;
132 }
133 
134 always_inline void
136 {
137  s->tx_buffer = va_format (s->tx_buffer, fmt, va);
138 }
139 
142 {
143  return s->write_func (s);
144 }
145 
148 {
149  return s->read_func (s, n_bytes);
150 }
151 
153 clib_socket_sendmsg (clib_socket_t * s, void *msg, int msglen,
154  int fds[], int num_fds)
155 {
156  return s->sendmsg_func (s, msg, msglen, fds, num_fds);
157 }
158 
160 clib_socket_recvmsg (clib_socket_t * s, void *msg, int msglen,
161  int fds[], int num_fds)
162 {
163  return s->recvmsg_func (s, msg, msglen, fds, num_fds);
164 }
165 
166 always_inline void
168 {
169  vec_free (s->tx_buffer);
170  vec_free (s->rx_buffer);
171  if (clib_mem_is_heap_object (s->config))
172  vec_free (s->config);
173  clib_memset (s, 0, sizeof (s[0]));
174 }
175 
178 {
179  clib_error_t *err;
180  err = (*sock->close_func) (sock);
181  return err;
182 }
183 
184 void clib_socket_tx_add_formatted (clib_socket_t * s, char *fmt, ...);
185 
186 #endif /* _clib_included_socket_h */
187 
188 /*
189  * fd.io coding-style-patch-verification: ON
190  *
191  * Local Variables:
192  * eval: (c-set-style "gnu")
193  * End:
194  */
clib_socket_init_netns
clib_error_t * clib_socket_init_netns(clib_socket_t *socket, u8 *namespace)
Definition: socket.c:557
CLIB_SOCKET_F_IS_SERVER
#define CLIB_SOCKET_F_IS_SERVER
Definition: socket.h:58
clib.h
clib_socket_recvmsg
static clib_error_t * clib_socket_recvmsg(clib_socket_t *s, void *msg, int msglen, int fds[], int num_fds)
Definition: socket.h:160
tx_buffer
static clib_error_t * tx_buffer(void *transport, mc_transport_type_t type, u32 buffer_index)
Definition: mc_socket.c:129
clib_socket_accept
clib_error_t * clib_socket_accept(clib_socket_t *server, clib_socket_t *client)
Definition: socket.c:593
clib_socket_rx
static clib_error_t * clib_socket_rx(clib_socket_t *s, int n_bytes)
Definition: socket.h:147
clib_socket_is_client
static uword clib_socket_is_client(clib_socket_t *s)
Definition: socket.h:108
clib_socket_tx_add_va_formatted
static void clib_socket_tx_add_va_formatted(clib_socket_t *s, char *fmt, va_list *va)
Definition: socket.h:135
va_format
__clib_export u8 * va_format(u8 *s, const char *fmt, va_list *va)
Definition: format.c:391
i32
signed int i32
Definition: types.h:77
clib_socket_is_server
static uword clib_socket_is_server(clib_socket_t *sock)
Definition: socket.h:102
clib_socket_tx_add_formatted
void clib_socket_tx_add_formatted(clib_socket_t *s, char *fmt,...)
Definition: socket.c:65
clib_socket_rx_end_of_file
static int clib_socket_rx_end_of_file(clib_socket_t *s)
Definition: socket.h:121
clib_socket_init
clib_error_t * clib_socket_init(clib_socket_t *socket)
Definition: socket.c:403
pid
u32 pid
Definition: dhcp.api:164
error.h
vec_add2
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
Definition: vec.h:644
clib_socket_close
static clib_error_t * clib_socket_close(clib_socket_t *sock)
Definition: socket.h:177
peer
vl_api_address_t peer
Definition: teib.api:28
uword
u64 uword
Definition: types.h:112
clib_socket_sendmsg
static clib_error_t * clib_socket_sendmsg(clib_socket_t *s, void *msg, int msglen, int fds[], int num_fds)
Definition: socket.h:153
clib_socket_is_connected
static uword clib_socket_is_connected(clib_socket_t *sock)
Definition: socket.h:114
format.h
clib_socket_free
static void clib_socket_free(clib_socket_t *s)
Definition: socket.h:167
fmt
int cJSON_bool fmt
Definition: cJSON.h:160
vec_free
#define vec_free(V)
Free vector's memory (no header).
Definition: vec.h:395
always_inline
#define always_inline
Definition: rdma_mlx5dv.h:23
clib_socket_tx
static clib_error_t * clib_socket_tx(clib_socket_t *s)
Definition: socket.h:141
u32
unsigned int u32
Definition: types.h:88
n_bytes
u32 n_bytes
Definition: interface_output.c:421
clib_memset
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
u8
unsigned char u8
Definition: types.h:56
clib_error_t
Definition: clib_error.h:21
clib_socket_t
struct _socket_t clib_socket_t
clib_socket_tx_add
static void * clib_socket_tx_add(clib_socket_t *s, int n_bytes)
Definition: socket.h:127
clib_mem_is_heap_object
static uword clib_mem_is_heap_object(void *p)
Definition: mem.h:306
CLIB_SOCKET_F_RX_END_OF_FILE
#define CLIB_SOCKET_F_RX_END_OF_FILE
Definition: socket.h:60
flags
vl_api_wireguard_peer_flags_t flags
Definition: wireguard.api:105