FD.io VPP  v19.08-27-gf4dcae4
Vector Packet Processing
udp.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016-2019 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 /** @file
17  udp state machine, etc.
18 */
19 
20 #include <vnet/udp/udp.h>
21 #include <vnet/session/session.h>
22 #include <vnet/dpo/load_balance.h>
23 #include <vnet/fib/ip4_fib.h>
24 
26 
28 udp_connection_alloc (u32 thread_index)
29 {
30  udp_main_t *um = &udp_main;
31  udp_connection_t *uc;
32  u32 will_expand = 0;
33  pool_get_aligned_will_expand (um->connections[thread_index], will_expand,
35 
36  if (PREDICT_FALSE (will_expand))
37  {
39  [thread_index]);
40  pool_get_aligned (udp_main.connections[thread_index], uc,
43  [thread_index]);
44  }
45  else
46  {
47  pool_get_aligned (um->connections[thread_index], uc,
49  }
50  clib_memset (uc, 0, sizeof (*uc));
51  uc->c_c_index = uc - um->connections[thread_index];
52  uc->c_thread_index = thread_index;
53  uc->c_proto = TRANSPORT_PROTO_UDP;
55  return uc;
56 }
57 
58 void
60 {
61  pool_put (udp_main.connections[uc->c_thread_index], uc);
62  if (CLIB_DEBUG)
63  clib_memset (uc, 0xFA, sizeof (*uc));
64 }
65 
66 void
68 {
69  if ((uc->flags & UDP_CONN_F_OWNS_PORT)
70  || !(uc->flags & UDP_CONN_F_CONNECTED))
72  clib_net_to_host_u16 (uc->c_lcl_port),
73  uc->c_is_ip4);
76 }
77 
78 u32
80 {
84  u32 node_index;
85  void *iface_ip;
87 
88  pi = udp_get_dst_port_info (um, lcl->port, lcl->is_ip4);
89  if (pi)
90  return -1;
91 
92  pool_get (um->listener_pool, listener);
93  clib_memset (listener, 0, sizeof (udp_connection_t));
94 
95  listener->c_lcl_port = lcl->port;
96  listener->c_c_index = listener - um->listener_pool;
97 
98  /* If we are provided a sw_if_index, bind using one of its ips */
99  if (ip_is_zero (&lcl->ip, 1) && lcl->sw_if_index != ENDPOINT_INVALID_INDEX)
100  {
101  if ((iface_ip = ip_interface_get_first_ip (lcl->sw_if_index,
102  lcl->is_ip4)))
103  ip_set (&lcl->ip, iface_ip, lcl->is_ip4);
104  }
105  ip_copy (&listener->c_lcl_ip, &lcl->ip, lcl->is_ip4);
106  listener->c_is_ip4 = lcl->is_ip4;
107  listener->c_proto = TRANSPORT_PROTO_UDP;
108  listener->c_s_index = session_index;
109  listener->c_fib_index = lcl->fib_index;
110  listener->flags |= UDP_CONN_F_OWNS_PORT;
111  clib_spinlock_init (&listener->rx_lock);
112 
113  node_index = lcl->is_ip4 ? udp4_input_node.index : udp6_input_node.index;
114  udp_register_dst_port (vm, clib_net_to_host_u16 (lcl->port), node_index,
115  1 /* is_ipv4 */ );
116  return listener->c_c_index;
117 }
118 
119 u32
120 udp_session_unbind (u32 listener_index)
121 {
123 
125  listener = udp_listener_get (listener_index);
126  udp_unregister_dst_port (vm, clib_net_to_host_u16 (listener->c_lcl_port),
127  listener->c_is_ip4);
128  return 0;
129 }
130 
133 {
134  udp_connection_t *us;
135 
136  us = udp_listener_get (listener_index);
137  return &us->connection;
138 }
139 
140 u32
142 {
143  udp_connection_t *uc;
145 
147 
148  vlib_buffer_push_udp (b, uc->c_lcl_port, uc->c_rmt_port, 1);
149  if (tc->is_ip4)
150  vlib_buffer_push_ip4 (vm, b, &uc->c_lcl_ip4, &uc->c_rmt_ip4,
151  IP_PROTOCOL_UDP, 1);
152  else
153  {
154  ip6_header_t *ih;
155  ih = vlib_buffer_push_ip6 (vm, b, &uc->c_lcl_ip6, &uc->c_rmt_ip6,
156  IP_PROTOCOL_UDP);
157  vnet_buffer (b)->l3_hdr_offset = (u8 *) ih - b->data;
158  }
159  vnet_buffer (b)->sw_if_index[VLIB_RX] = 0;
160  vnet_buffer (b)->sw_if_index[VLIB_TX] = uc->c_fib_index;
161  b->flags |= VNET_BUFFER_F_LOCALLY_ORIGINATED;
162 
164  {
167  }
168 
169  return 0;
170 }
171 
173 udp_session_get (u32 connection_index, u32 thread_index)
174 {
175  udp_connection_t *uc;
176  uc = udp_connection_get (connection_index, thread_index);
177  if (uc)
178  return &uc->connection;
179  return 0;
180 }
181 
182 void
183 udp_session_close (u32 connection_index, u32 thread_index)
184 {
185  udp_connection_t *uc;
186 
187  uc = udp_connection_get (connection_index, thread_index);
188  if (!uc)
189  return;
190 
193  else
194  uc->flags |= UDP_CONN_F_CLOSING;
195 }
196 
197 void
198 udp_session_cleanup (u32 connection_index, u32 thread_index)
199 {
200  udp_connection_t *uc;
201  uc = udp_connection_get (connection_index, thread_index);
202  if (uc)
203  udp_connection_free (uc);
204 }
205 
206 u8 *
207 format_udp_connection_id (u8 * s, va_list * args)
208 {
209  udp_connection_t *uc = va_arg (*args, udp_connection_t *);
210  if (!uc)
211  return s;
212  if (uc->c_is_ip4)
213  s = format (s, "[#%d][%s] %U:%d->%U:%d", uc->c_thread_index, "U",
214  format_ip4_address, &uc->c_lcl_ip4,
215  clib_net_to_host_u16 (uc->c_lcl_port), format_ip4_address,
216  &uc->c_rmt_ip4, clib_net_to_host_u16 (uc->c_rmt_port));
217  else
218  s = format (s, "[#%d][%s] %U:%d->%U:%d", uc->c_thread_index, "U",
219  format_ip6_address, &uc->c_lcl_ip6,
220  clib_net_to_host_u16 (uc->c_lcl_port), format_ip6_address,
221  &uc->c_rmt_ip6, clib_net_to_host_u16 (uc->c_rmt_port));
222  return s;
223 }
224 
225 u8 *
226 format_udp_connection (u8 * s, va_list * args)
227 {
228  udp_connection_t *uc = va_arg (*args, udp_connection_t *);
229  u32 verbose = va_arg (*args, u32);
230  if (!uc)
231  return s;
232  s = format (s, "%-50U", format_udp_connection_id, uc);
233  if (verbose)
234  {
235  if (verbose == 1)
236  s = format (s, "%-15s", "-");
237  else
238  s = format (s, "\n");
239  }
240  return s;
241 }
242 
243 u8 *
244 format_udp_session (u8 * s, va_list * args)
245 {
246  u32 uci = va_arg (*args, u32);
247  u32 thread_index = va_arg (*args, u32);
248  u32 verbose = va_arg (*args, u32);
249  udp_connection_t *uc;
250 
251  uc = udp_connection_get (uci, thread_index);
252  return format (s, "%U", format_udp_connection, uc, verbose);
253 }
254 
255 u8 *
256 format_udp_half_open_session (u8 * s, va_list * args)
257 {
258  u32 __clib_unused tci = va_arg (*args, u32);
259  u32 __clib_unused thread_index = va_arg (*args, u32);
260  clib_warning ("BUG");
261  return 0;
262 }
263 
264 u8 *
265 format_udp_listener_session (u8 * s, va_list * args)
266 {
267  u32 tci = va_arg (*args, u32);
268  u32 __clib_unused thread_index = va_arg (*args, u32);
269  u32 verbose = va_arg (*args, u32);
271  return format (s, "%U", format_udp_connection, uc, verbose);
272 }
273 
274 u16
276 {
277  /* TODO figure out MTU of output interface */
278  return 1460;
279 }
280 
281 u32
283 {
284  /* No constraint on TX window */
285  return ~0;
286 }
287 
288 int
290 {
291  udp_main_t *um = vnet_get_udp_main ();
293  u32 thread_index = vm->thread_index;
294  udp_connection_t *uc;
295  ip46_address_t lcl_addr;
296  u32 node_index;
297  u16 lcl_port;
298 
300  &lcl_port))
301  return -1;
302 
303  while (udp_get_dst_port_info (um, lcl_port, rmt->is_ip4))
304  {
305  lcl_port = transport_alloc_local_port (TRANSPORT_PROTO_UDP, &lcl_addr);
306  if (lcl_port < 1)
307  {
308  clib_warning ("Failed to allocate src port");
309  return -1;
310  }
311  }
312 
313  node_index = rmt->is_ip4 ? udp4_input_node.index : udp6_input_node.index;
314  udp_register_dst_port (vm, lcl_port, node_index, 1 /* is_ipv4 */ );
315 
316  /* We don't poll main thread if we have workers */
317  if (vlib_num_workers ())
318  thread_index = 1;
319 
320  uc = udp_connection_alloc (thread_index);
321  ip_copy (&uc->c_rmt_ip, &rmt->ip, rmt->is_ip4);
322  ip_copy (&uc->c_lcl_ip, &lcl_addr, rmt->is_ip4);
323  uc->c_rmt_port = rmt->port;
324  uc->c_lcl_port = clib_host_to_net_u16 (lcl_port);
325  uc->c_is_ip4 = rmt->is_ip4;
326  uc->c_proto = TRANSPORT_PROTO_UDP;
327  uc->c_fib_index = rmt->fib_index;
329 
330  return uc->c_c_index;
331 }
332 
335 {
336  udp_connection_t *uc;
337  u32 thread_index;
338 
339  /* We don't poll main thread if we have workers */
340  thread_index = vlib_num_workers ()? 1 : 0;
341  uc = udp_connection_get (conn_index, thread_index);
342  if (!uc)
343  return 0;
344  return &uc->connection;
345 }
346 
347 /* *INDENT-OFF* */
349  .start_listen = udp_session_bind,
350  .connect = udp_open_connection,
351  .stop_listen = udp_session_unbind,
352  .push_header = udp_push_header,
353  .get_connection = udp_session_get,
354  .get_listener = udp_session_get_listener,
355  .get_half_open = udp_session_get_half_open,
356  .close = udp_session_close,
357  .cleanup = udp_session_cleanup,
358  .send_mss = udp_send_mss,
359  .send_space = udp_send_space,
360  .format_connection = format_udp_session,
361  .format_half_open = format_udp_half_open_session,
362  .format_listener = format_udp_listener_session,
363  .transport_options = {
364  .tx_type = TRANSPORT_TX_DGRAM,
365  .service_type = TRANSPORT_SERVICE_CL,
366  },
367 };
368 /* *INDENT-ON* */
369 
370 
371 int
373 {
374  udp_connection_t *uc;
375  /* Reproduce the logic of udp_open_connection to find the correct thread */
376  u32 thread_index = vlib_num_workers ()? 1 : vlib_get_main ()->thread_index;
377  u32 uc_index;
378  uc_index = udp_open_connection (rmt);
379  if (uc_index == (u32) ~ 0)
380  return -1;
381  uc = udp_connection_get (uc_index, thread_index);
383  return uc_index;
384 }
385 
386 u32
388 {
390  u32 li_index;
391  li_index = udp_session_bind (session_index, lcl);
392  if (li_index == (u32) ~ 0)
393  return -1;
394  listener = udp_listener_get (li_index);
395  listener->flags |= UDP_CONN_F_CONNECTED;
396  return li_index;
397 }
398 
399 /* *INDENT-OFF* */
401  .start_listen = udpc_connection_listen,
402  .stop_listen = udp_session_unbind,
403  .connect = udpc_connection_open,
404  .push_header = udp_push_header,
405  .get_connection = udp_session_get,
406  .get_listener = udp_session_get_listener,
407  .get_half_open = udp_session_get_half_open,
408  .close = udp_session_close,
409  .cleanup = udp_session_cleanup,
410  .send_mss = udp_send_mss,
411  .send_space = udp_send_space,
412  .format_connection = format_udp_session,
413  .format_half_open = format_udp_half_open_session,
414  .format_listener = format_udp_listener_session,
415  .transport_options = {
416  .tx_type = TRANSPORT_TX_DGRAM,
417  .service_type = TRANSPORT_SERVICE_VC,
418  .half_open_has_fifos = 1
419  },
420 };
421 /* *INDENT-ON* */
422 
423 static clib_error_t *
425 {
426  udp_main_t *um = vnet_get_udp_main ();
427  ip_main_t *im = &ip_main;
429  u32 num_threads;
430  ip_protocol_info_t *pi;
431  int i;
432 
433  /*
434  * Registrations
435  */
436 
437  /* IP registration */
438  pi = ip_get_protocol_info (im, IP_PROTOCOL_UDP);
439  if (pi == 0)
440  return clib_error_return (0, "UDP protocol info AWOL");
443 
444  /* Register as transport with URI */
453 
454  /*
455  * Initialize data structures
456  */
457 
458  num_threads = 1 /* main thread */ + tm->n_threads;
459  vec_validate (um->connections, num_threads - 1);
460  vec_validate (um->connection_peekers, num_threads - 1);
461  vec_validate (um->peekers_readers_locks, num_threads - 1);
462  vec_validate (um->peekers_write_locks, num_threads - 1);
463 
464  if (num_threads > 1)
465  for (i = 0; i < num_threads; i++)
466  {
469  }
470  return 0;
471 }
472 
473 /* *INDENT-OFF* */
475 {
476  .runs_after = VLIB_INITS("ip_main_init", "ip4_lookup_init",
477  "ip6_lookup_init"),
478 };
479 /* *INDENT-ON* */
480 
481 
482 static clib_error_t *
484  vlib_cli_command_t * cmd_arg)
485 {
486  udp_main_t *um = vnet_get_udp_main ();
487 
488  clib_error_t *error = NULL;
489 
491  return clib_error_return (0, "unknown input `%U'", format_unformat_error,
492  input);
493 
494  udp_dst_port_info_t *port_info;
495  if (um->punt_unknown4)
496  {
497  vlib_cli_output (vm, "IPv4 UDP punt: enabled");
498  }
499  else
500  {
501  u8 *s = NULL;
502  vec_foreach (port_info, um->dst_port_infos[UDP_IP4])
503  {
504  if (udp_is_valid_dst_port (port_info->dst_port, 1))
505  {
506  s = format (s, (!s) ? "%d" : ", %d", port_info->dst_port);
507  }
508  }
509  s = format (s, "%c", 0);
510  vlib_cli_output (vm, "IPV4 UDP ports punt : %s", s);
511  }
512 
513  if (um->punt_unknown6)
514  {
515  vlib_cli_output (vm, "IPv6 UDP punt: enabled");
516  }
517  else
518  {
519  u8 *s = NULL;
520  vec_foreach (port_info, um->dst_port_infos[UDP_IP6])
521  {
522  if (udp_is_valid_dst_port (port_info->dst_port, 01))
523  {
524  s = format (s, (!s) ? "%d" : ", %d", port_info->dst_port);
525  }
526  }
527  s = format (s, "%c", 0);
528  vlib_cli_output (vm, "IPV6 UDP ports punt : %s", s);
529  }
530 
531  return (error);
532 }
533 /* *INDENT-OFF* */
534 VLIB_CLI_COMMAND (show_tcp_punt_command, static) =
535 {
536  .path = "show udp punt",
537  .short_help = "show udp punt [ipv4|ipv6]",
538  .function = show_udp_punt_fn,
539 };
540 /* *INDENT-ON* */
541 
542 /*
543  * fd.io coding-style-patch-verification: ON
544  *
545  * Local Variables:
546  * eval: (c-set-style "gnu")
547  * End:
548  */
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:439
static clib_error_t * show_udp_punt_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd_arg)
Definition: udp.c:483
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index, VLIB_BUFFER_IS_TRACED: trace this buffer.
Definition: buffer.h:124
udp_main_t udp_main
Definition: udp.c:25
void udp_session_cleanup(u32 connection_index, u32 thread_index)
Definition: udp.c:198
#define ENDPOINT_INVALID_INDEX
port belong to conn (UDPC)
Definition: udp.h:40
static udp_connection_t * udp_listener_get(u32 conn_index)
Definition: udp.h:170
u8 * format_udp_session(u8 *s, va_list *args)
Definition: udp.c:244
void ip_copy(ip46_address_t *dst, ip46_address_t *src, u8 is_ip4)
Definition: ip.c:81
format_function_t format_udp_header
Definition: format.h:101
u32 * connection_peekers
Definition: udp.h:148
static udp_connection_t * udp_get_connection_from_transport(transport_connection_t *tc)
Definition: udp.h:182
void ip_set(ip46_address_t *dst, void *src, u8 is_ip4)
Definition: ip.c:90
#define NULL
Definition: clib.h:58
void session_transport_delete_notify(transport_connection_t *tc)
Notification from transport that connection is being deleted.
Definition: session.c:851
static clib_error_t * udp_init(vlib_main_t *vm)
Definition: udp.c:424
static_always_inline void clib_spinlock_unlock_if_init(clib_spinlock_t *p)
Definition: lock.h:108
transport_connection_t * udp_session_get_half_open(u32 conn_index)
Definition: udp.c:334
u32 thread_index
Definition: main.h:197
#define pool_get_aligned_will_expand(P, YESNO, A)
See if pool_get will expand the pool or not.
Definition: pool.h:242
u8 data[0]
Packet data.
Definition: buffer.h:181
conn closed with data
Definition: udp.h:41
int i
clib_memset(h->entries, 0, sizeof(h->entries[0])*entries)
static udp_dst_port_info_t * udp_get_dst_port_info(udp_main_t *um, udp_dst_port_t dst_port, u8 is_ip4)
Definition: udp.h:250
int udp_open_connection(transport_endpoint_cfg_t *rmt)
Definition: udp.c:289
transport_connection_t * udp_session_get_listener(u32 listener_index)
Definition: udp.c:132
void * ip_interface_get_first_ip(u32 sw_if_index, u8 is_ip4)
Definition: ip.c:134
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:424
Definition: ip.h:122
u32 udp_push_header(transport_connection_t *tc, vlib_buffer_t *b)
Definition: udp.c:141
u8 punt_unknown6
Definition: udp.h:142
static void * vlib_buffer_push_udp(vlib_buffer_t *b, u16 sp, u16 dp, u8 offload_csum)
Definition: udp.h:270
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
Definition: pool.h:236
unsigned char u8
Definition: types.h:56
static udp_main_t * vnet_get_udp_main()
Definition: udp.h:176
u8 flags
connection flags
Definition: udp.h:50
vlib_node_registration_t ip4_lookup_node
(constructor) VLIB_REGISTER_NODE (ip4_lookup_node)
Definition: ip4_forward.c:101
format_function_t format_ip4_address
Definition: format.h:75
unformat_function_t * unformat_pg_edit
Definition: ip.h:103
void udp_connection_free(udp_connection_t *uc)
Definition: udp.c:59
int udpc_connection_open(transport_endpoint_cfg_t *rmt)
Definition: udp.c:372
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:173
u8 punt_unknown4
Definition: udp.h:141
u32 udp_session_bind(u32 session_index, transport_endpoint_t *lcl)
Definition: udp.c:79
#define clib_error_return(e, args...)
Definition: error.h:99
int transport_alloc_local_endpoint(u8 proto, transport_endpoint_cfg_t *rmt_cfg, ip46_address_t *lcl_addr, u16 *lcl_port)
Definition: transport.c:544
unsigned int u32
Definition: types.h:88
static const transport_proto_vft_t udpc_proto
Definition: udp.c:400
struct _transport_proto_vft transport_proto_vft_t
static void clib_spinlock_init(clib_spinlock_t *p)
Definition: lock.h:61
vlib_node_registration_t udp4_input_node
(constructor) VLIB_REGISTER_NODE (udp4_input_node)
Definition: udp_input.c:318
static ip_protocol_info_t * ip_get_protocol_info(ip_main_t *im, u32 protocol)
Definition: ip.h:149
format_function_t * format_header
Definition: ip.h:94
u32 udp_session_unbind(u32 listener_index)
Definition: udp.c:120
udp_dst_port_info_t * dst_port_infos[N_UDP_AF]
Definition: udp.h:131
udp_connection_t * udp_connection_alloc(u32 thread_index)
Definition: udp.c:28
struct _unformat_input_t unformat_input_t
unsigned short u16
Definition: types.h:57
clib_spinlock_t * peekers_readers_locks
Definition: udp.h:149
#define pool_put(P, E)
Free an object E in pool P.
Definition: pool.h:286
vlib_node_registration_t udp6_input_node
(constructor) VLIB_REGISTER_NODE (udp6_input_node)
Definition: udp_input.c:344
#define PREDICT_FALSE(x)
Definition: clib.h:111
udp_connection_t * listener_pool
Definition: udp.h:151
u16 udp_send_mss(transport_connection_t *t)
Definition: udp.c:275
void udp_connection_delete(udp_connection_t *uc)
Definition: udp.c:67
Definition: udp.h:124
#define pool_get_aligned(P, E, A)
Allocate an object E from a pool P with alignment A.
Definition: pool.h:230
#define UNFORMAT_END_OF_INPUT
Definition: format.h:145
format_function_t format_ip6_address
Definition: format.h:93
vlib_main_t * vm
Definition: buffer.c:312
ip_main_t ip_main
Definition: ip_init.c:42
virtual circuit service
void udp_unregister_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u8 is_ip4)
Definition: udp_local.c:509
#define clib_warning(format, args...)
Definition: error.h:59
unformat_function_t unformat_pg_udp_header
Definition: format.h:103
static udp_connection_t * udp_connection_get(u32 conn_index, u32 thread_index)
Definition: udp.h:162
struct _transport_connection transport_connection_t
void transport_register_protocol(transport_proto_t transport_proto, const transport_proto_vft_t *vft, fib_protocol_t fib_proto, u32 output_node)
Register transport virtual function table.
Definition: transport.c:266
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:155
static u32 transport_max_tx_dequeue(transport_connection_t *tc)
Definition: session.h:439
connected mode
Definition: udp.h:39
vlib_node_registration_t ip6_lookup_node
(constructor) VLIB_REGISTER_NODE (ip6_lookup_node)
Definition: ip6_forward.c:552
udp_dst_port_t dst_port
Definition: udp.h:110
datagram mode
clib_spinlock_t * peekers_write_locks
Definition: udp.h:150
static vlib_main_t * vlib_get_main(void)
Definition: global_funcs.h:23
u8 * format_udp_connection(u8 *s, va_list *args)
Definition: udp.c:226
u8 ip_is_zero(ip46_address_t *ip46_address, u8 is_ip4)
Definition: ip.c:20
u32 udpc_connection_listen(u32 session_index, transport_endpoint_t *lcl)
Definition: udp.c:387
Definition: defs.h:47
static const transport_proto_vft_t udp_proto
Definition: udp.c:348
static void * vlib_buffer_push_ip6(vlib_main_t *vm, vlib_buffer_t *b, ip6_address_t *src, ip6_address_t *dst, int proto)
Push IPv6 header to buffer.
Definition: ip6.h:662
transport_connection_t connection
must be first
Definition: udp.h:48
clib_spinlock_t rx_lock
rx fifo lock
Definition: udp.h:49
bool udp_is_valid_dst_port(udp_dst_port_t dst_port, u8 is_ip4)
Definition: udp_local.c:532
void udp_session_close(u32 connection_index, u32 thread_index)
Definition: udp.c:183
VLIB buffer representation.
Definition: buffer.h:102
connectionless service
u8 * format_udp_half_open_session(u8 *s, va_list *args)
Definition: udp.c:256
u8 * format_udp_connection_id(u8 *s, va_list *args)
Definition: udp.c:207
#define vnet_buffer(b)
Definition: buffer.h:361
u8 * format_unformat_error(u8 *s, va_list *va)
Definition: unformat.c:91
transport_connection_t * udp_session_get(u32 connection_index, u32 thread_index)
Definition: udp.c:173
static vlib_thread_main_t * vlib_get_thread_main()
Definition: global_funcs.h:32
static u32 vlib_num_workers()
Definition: threads.h:367
#define vec_foreach(var, vec)
Vector iterator.
void udp_register_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u32 node_index, u8 is_ip4)
Definition: udp_local.c:471
int transport_alloc_local_port(u8 proto, ip46_address_t *ip)
Allocate local port and add if successful add entry to local endpoint table to mark the pair as used...
Definition: transport.c:447
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:59
u32 udp_send_space(transport_connection_t *t)
Definition: udp.c:282
udp_connection_t ** connections
Definition: udp.h:147
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
Definition: cli.c:768
static_always_inline void clib_spinlock_lock_if_init(clib_spinlock_t *p)
Definition: lock.h:93
static void * vlib_buffer_push_ip4(vlib_main_t *vm, vlib_buffer_t *b, ip4_address_t *src, ip4_address_t *dst, int proto, u8 csum_offload)
Push IPv4 header to buffer.
Definition: ip4.h:387
#define VLIB_INITS(...)
Definition: init.h:344
Definition: udp.h:125
Definition: defs.h:46
static uword unformat_check_input(unformat_input_t *i)
Definition: format.h:171
u8 * format_udp_listener_session(u8 *s, va_list *args)
Definition: udp.c:265