FD.io VPP  v21.01.1
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 
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  clib_socket_t * client);
98 
101 {
102  return (sock->flags & CLIB_SOCKET_F_IS_SERVER) != 0;
103 }
104 
107 {
108  return !clib_socket_is_server (s);
109 }
110 
113 {
114  return sock->fd > 0;
115 }
116 
117 
118 always_inline int
120 {
121  return s->flags & CLIB_SOCKET_F_RX_END_OF_FILE;
122 }
123 
124 always_inline void *
126 {
127  u8 *result;
128  vec_add2 (s->tx_buffer, result, n_bytes);
129  return result;
130 }
131 
132 always_inline void
134 {
135  s->tx_buffer = va_format (s->tx_buffer, fmt, va);
136 }
137 
140 {
141  return s->write_func (s);
142 }
143 
145 clib_socket_rx (clib_socket_t * s, int n_bytes)
146 {
147  return s->read_func (s, n_bytes);
148 }
149 
151 clib_socket_sendmsg (clib_socket_t * s, void *msg, int msglen,
152  int fds[], int num_fds)
153 {
154  return s->sendmsg_func (s, msg, msglen, fds, num_fds);
155 }
156 
158 clib_socket_recvmsg (clib_socket_t * s, void *msg, int msglen,
159  int fds[], int num_fds)
160 {
161  return s->recvmsg_func (s, msg, msglen, fds, num_fds);
162 }
163 
164 always_inline void
166 {
167  vec_free (s->tx_buffer);
168  vec_free (s->rx_buffer);
169  if (clib_mem_is_heap_object (s->config))
170  vec_free (s->config);
171  clib_memset (s, 0, sizeof (s[0]));
172 }
173 
176 {
177  clib_error_t *err;
178  err = (*sock->close_func) (sock);
179  return err;
180 }
181 
182 void clib_socket_tx_add_formatted (clib_socket_t * s, char *fmt, ...);
183 
184 #endif /* _clib_included_socket_h */
185 
186 /*
187  * fd.io coding-style-patch-verification: ON
188  *
189  * Local Variables:
190  * eval: (c-set-style "gnu")
191  * End:
192  */
__clib_export u8 * va_format(u8 *s, const char *fmt, va_list *va)
Definition: format.c:387
vl_api_wireguard_peer_flags_t flags
Definition: wireguard.api:105
static uword clib_socket_is_connected(clib_socket_t *sock)
Definition: socket.h:112
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
Definition: vec.h:630
clib_error_t * clib_socket_accept(clib_socket_t *server, clib_socket_t *client)
Definition: socket.c:526
unsigned char u8
Definition: types.h:56
#define CLIB_SOCKET_F_IS_SERVER
Definition: socket.h:58
static clib_error_t * tx_buffer(void *transport, mc_transport_type_t type, u32 buffer_index)
Definition: mc_socket.c:129
static clib_error_t * clib_socket_sendmsg(clib_socket_t *s, void *msg, int msglen, int fds[], int num_fds)
Definition: socket.h:151
clib_error_t * clib_socket_init(clib_socket_t *socket)
Definition: socket.c:384
static clib_error_t * clib_socket_recvmsg(clib_socket_t *s, void *msg, int msglen, int fds[], int num_fds)
Definition: socket.h:158
unsigned int u32
Definition: types.h:88
static clib_error_t * clib_socket_close(clib_socket_t *sock)
Definition: socket.h:175
#define always_inline
Definition: ipsec.h:28
int cJSON_bool fmt
Definition: cJSON.h:160
vl_api_address_t peer
Definition: teib.api:28
static void clib_socket_tx_add_va_formatted(clib_socket_t *s, char *fmt, va_list *va)
Definition: socket.h:133
#define CLIB_SOCKET_F_RX_END_OF_FILE
Definition: socket.h:60
static uword clib_socket_is_server(clib_socket_t *sock)
Definition: socket.h:100
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:380
signed int i32
Definition: types.h:77
static uword clib_mem_is_heap_object(void *p)
Definition: mem.h:303
struct _socket_t clib_socket_t
static void clib_socket_free(clib_socket_t *s)
Definition: socket.h:165
static clib_error_t * clib_socket_rx(clib_socket_t *s, int n_bytes)
Definition: socket.h:145
static void * clib_socket_tx_add(clib_socket_t *s, int n_bytes)
Definition: socket.h:125
static int clib_socket_rx_end_of_file(clib_socket_t *s)
Definition: socket.h:119
void clib_socket_tx_add_formatted(clib_socket_t *s, char *fmt,...)
Definition: socket.c:58
u64 uword
Definition: types.h:112
u32 pid
Definition: dhcp.api:164
static clib_error_t * clib_socket_tx(clib_socket_t *s)
Definition: socket.h:139
static uword clib_socket_is_client(clib_socket_t *s)
Definition: socket.h:106