FD.io VPP  v19.08.3-2-gbabecb413
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  u32 thread_index = uc->c_thread_index;
62  if (CLIB_DEBUG)
63  clib_memset (uc, 0xFA, sizeof (*uc));
64  pool_put (udp_main.connections[thread_index], uc);
65 }
66 
67 void
69 {
70  if ((uc->flags & UDP_CONN_F_OWNS_PORT)
71  || !(uc->flags & UDP_CONN_F_CONNECTED))
73  clib_net_to_host_u16 (uc->c_lcl_port),
74  uc->c_is_ip4);
77 }
78 
79 u32
81 {
85  u32 node_index;
86  void *iface_ip;
88 
89  pi =
90  udp_get_dst_port_info (um, clib_net_to_host_u16 (lcl->port), lcl->is_ip4);
91  if (pi)
92  return -1;
93 
94  pool_get (um->listener_pool, listener);
95  clib_memset (listener, 0, sizeof (udp_connection_t));
96 
97  listener->c_lcl_port = lcl->port;
98  listener->c_c_index = listener - um->listener_pool;
99 
100  /* If we are provided a sw_if_index, bind using one of its ips */
101  if (ip_is_zero (&lcl->ip, 1) && lcl->sw_if_index != ENDPOINT_INVALID_INDEX)
102  {
103  if ((iface_ip = ip_interface_get_first_ip (lcl->sw_if_index,
104  lcl->is_ip4)))
105  ip_set (&lcl->ip, iface_ip, lcl->is_ip4);
106  }
107  ip_copy (&listener->c_lcl_ip, &lcl->ip, lcl->is_ip4);
108  listener->c_is_ip4 = lcl->is_ip4;
109  listener->c_proto = TRANSPORT_PROTO_UDP;
110  listener->c_s_index = session_index;
111  listener->c_fib_index = lcl->fib_index;
112  listener->flags |= UDP_CONN_F_OWNS_PORT;
113  clib_spinlock_init (&listener->rx_lock);
114 
115  node_index = lcl->is_ip4 ? udp4_input_node.index : udp6_input_node.index;
116  udp_register_dst_port (vm, clib_net_to_host_u16 (lcl->port), node_index,
117  lcl->is_ip4);
118  return listener->c_c_index;
119 }
120 
121 u32
122 udp_session_unbind (u32 listener_index)
123 {
125 
127  listener = udp_listener_get (listener_index);
128  udp_unregister_dst_port (vm, clib_net_to_host_u16 (listener->c_lcl_port),
129  listener->c_is_ip4);
130  return 0;
131 }
132 
135 {
136  udp_connection_t *us;
137 
138  us = udp_listener_get (listener_index);
139  return &us->connection;
140 }
141 
142 u32
144 {
145  udp_connection_t *uc;
147 
149 
150  vlib_buffer_push_udp (b, uc->c_lcl_port, uc->c_rmt_port, 1);
151  if (tc->is_ip4)
152  vlib_buffer_push_ip4 (vm, b, &uc->c_lcl_ip4, &uc->c_rmt_ip4,
153  IP_PROTOCOL_UDP, 1);
154  else
155  {
156  ip6_header_t *ih;
157  ih = vlib_buffer_push_ip6 (vm, b, &uc->c_lcl_ip6, &uc->c_rmt_ip6,
158  IP_PROTOCOL_UDP);
159  vnet_buffer (b)->l3_hdr_offset = (u8 *) ih - b->data;
160  }
161  vnet_buffer (b)->sw_if_index[VLIB_RX] = 0;
162  vnet_buffer (b)->sw_if_index[VLIB_TX] = uc->c_fib_index;
163  b->flags |= VNET_BUFFER_F_LOCALLY_ORIGINATED;
164 
166  {
169  }
170 
171  return 0;
172 }
173 
175 udp_session_get (u32 connection_index, u32 thread_index)
176 {
177  udp_connection_t *uc;
178  uc = udp_connection_get (connection_index, thread_index);
179  if (uc)
180  return &uc->connection;
181  return 0;
182 }
183 
184 void
185 udp_session_close (u32 connection_index, u32 thread_index)
186 {
187  udp_connection_t *uc;
188 
189  uc = udp_connection_get (connection_index, thread_index);
190  if (!uc)
191  return;
192 
195  else
196  uc->flags |= UDP_CONN_F_CLOSING;
197 }
198 
199 void
200 udp_session_cleanup (u32 connection_index, u32 thread_index)
201 {
202  udp_connection_t *uc;
203  uc = udp_connection_get (connection_index, thread_index);
204  if (uc)
205  udp_connection_free (uc);
206 }
207 
208 u8 *
209 format_udp_connection_id (u8 * s, va_list * args)
210 {
211  udp_connection_t *uc = va_arg (*args, udp_connection_t *);
212  if (!uc)
213  return s;
214  if (uc->c_is_ip4)
215  s = format (s, "[#%d][%s] %U:%d->%U:%d", uc->c_thread_index, "U",
216  format_ip4_address, &uc->c_lcl_ip4,
217  clib_net_to_host_u16 (uc->c_lcl_port), format_ip4_address,
218  &uc->c_rmt_ip4, clib_net_to_host_u16 (uc->c_rmt_port));
219  else
220  s = format (s, "[#%d][%s] %U:%d->%U:%d", uc->c_thread_index, "U",
221  format_ip6_address, &uc->c_lcl_ip6,
222  clib_net_to_host_u16 (uc->c_lcl_port), format_ip6_address,
223  &uc->c_rmt_ip6, clib_net_to_host_u16 (uc->c_rmt_port));
224  return s;
225 }
226 
227 u8 *
228 format_udp_connection (u8 * s, va_list * args)
229 {
230  udp_connection_t *uc = va_arg (*args, udp_connection_t *);
231  u32 verbose = va_arg (*args, u32);
232  if (!uc)
233  return s;
234  s = format (s, "%-50U", format_udp_connection_id, uc);
235  if (verbose)
236  {
237  if (verbose == 1)
238  s = format (s, "%-15s", "-");
239  else
240  s = format (s, "\n");
241  }
242  return s;
243 }
244 
245 u8 *
246 format_udp_session (u8 * s, va_list * args)
247 {
248  u32 uci = va_arg (*args, u32);
249  u32 thread_index = va_arg (*args, u32);
250  u32 verbose = va_arg (*args, u32);
251  udp_connection_t *uc;
252 
253  uc = udp_connection_get (uci, thread_index);
254  return format (s, "%U", format_udp_connection, uc, verbose);
255 }
256 
257 u8 *
258 format_udp_half_open_session (u8 * s, va_list * args)
259 {
260  u32 __clib_unused tci = va_arg (*args, u32);
261  u32 __clib_unused thread_index = va_arg (*args, u32);
262  clib_warning ("BUG");
263  return 0;
264 }
265 
266 u8 *
267 format_udp_listener_session (u8 * s, va_list * args)
268 {
269  u32 tci = va_arg (*args, u32);
270  u32 __clib_unused thread_index = va_arg (*args, u32);
271  u32 verbose = va_arg (*args, u32);
273  return format (s, "%U", format_udp_connection, uc, verbose);
274 }
275 
276 u16
278 {
279  /* TODO figure out MTU of output interface */
280  return 1460;
281 }
282 
283 u32
285 {
286  /* No constraint on TX window */
287  return ~0;
288 }
289 
290 int
292 {
293  udp_main_t *um = vnet_get_udp_main ();
295  u32 thread_index = vm->thread_index;
296  udp_connection_t *uc;
297  ip46_address_t lcl_addr;
298  u32 node_index;
299  u16 lcl_port;
300 
301  if (transport_alloc_local_endpoint (TRANSPORT_PROTO_UDP, rmt, &lcl_addr,
302  &lcl_port))
303  return -1;
304 
305  while (udp_get_dst_port_info (um, lcl_port, rmt->is_ip4))
306  {
307  lcl_port = transport_alloc_local_port (TRANSPORT_PROTO_UDP, &lcl_addr);
308  if (lcl_port < 1)
309  {
310  clib_warning ("Failed to allocate src port");
311  return -1;
312  }
313  }
314 
315  node_index = rmt->is_ip4 ? udp4_input_node.index : udp6_input_node.index;
316  udp_register_dst_port (vm, lcl_port, node_index, 1 /* is_ipv4 */ );
317 
318  /* We don't poll main thread if we have workers */
319  if (vlib_num_workers ())
320  thread_index = 1;
321 
322  uc = udp_connection_alloc (thread_index);
323  ip_copy (&uc->c_rmt_ip, &rmt->ip, rmt->is_ip4);
324  ip_copy (&uc->c_lcl_ip, &lcl_addr, rmt->is_ip4);
325  uc->c_rmt_port = rmt->port;
326  uc->c_lcl_port = clib_host_to_net_u16 (lcl_port);
327  uc->c_is_ip4 = rmt->is_ip4;
328  uc->c_proto = TRANSPORT_PROTO_UDP;
329  uc->c_fib_index = rmt->fib_index;
331 
332  return uc->c_c_index;
333 }
334 
337 {
338  udp_connection_t *uc;
339  u32 thread_index;
340 
341  /* We don't poll main thread if we have workers */
342  thread_index = vlib_num_workers ()? 1 : 0;
343  uc = udp_connection_get (conn_index, thread_index);
344  if (!uc)
345  return 0;
346  return &uc->connection;
347 }
348 
349 /* *INDENT-OFF* */
351  .start_listen = udp_session_bind,
352  .connect = udp_open_connection,
353  .stop_listen = udp_session_unbind,
354  .push_header = udp_push_header,
355  .get_connection = udp_session_get,
356  .get_listener = udp_session_get_listener,
357  .get_half_open = udp_session_get_half_open,
358  .close = udp_session_close,
359  .cleanup = udp_session_cleanup,
360  .send_mss = udp_send_mss,
361  .send_space = udp_send_space,
362  .format_connection = format_udp_session,
363  .format_half_open = format_udp_half_open_session,
364  .format_listener = format_udp_listener_session,
365  .transport_options = {
366  .tx_type = TRANSPORT_TX_DGRAM,
367  .service_type = TRANSPORT_SERVICE_CL,
368  },
369 };
370 /* *INDENT-ON* */
371 
372 
373 int
375 {
376  udp_connection_t *uc;
377  /* Reproduce the logic of udp_open_connection to find the correct thread */
378  u32 thread_index = vlib_num_workers ()? 1 : vlib_get_main ()->thread_index;
379  u32 uc_index;
380  uc_index = udp_open_connection (rmt);
381  if (uc_index == (u32) ~ 0)
382  return -1;
383  uc = udp_connection_get (uc_index, thread_index);
385  return uc_index;
386 }
387 
388 u32
390 {
392  u32 li_index;
393  li_index = udp_session_bind (session_index, lcl);
394  if (li_index == (u32) ~ 0)
395  return -1;
396  listener = udp_listener_get (li_index);
397  listener->flags |= UDP_CONN_F_CONNECTED;
398  return li_index;
399 }
400 
401 /* *INDENT-OFF* */
403  .start_listen = udpc_connection_listen,
404  .stop_listen = udp_session_unbind,
405  .connect = udpc_connection_open,
406  .push_header = udp_push_header,
407  .get_connection = udp_session_get,
408  .get_listener = udp_session_get_listener,
409  .get_half_open = udp_session_get_half_open,
410  .close = udp_session_close,
411  .cleanup = udp_session_cleanup,
412  .send_mss = udp_send_mss,
413  .send_space = udp_send_space,
414  .format_connection = format_udp_session,
415  .format_half_open = format_udp_half_open_session,
416  .format_listener = format_udp_listener_session,
417  .transport_options = {
418  .tx_type = TRANSPORT_TX_DGRAM,
419  .service_type = TRANSPORT_SERVICE_VC,
420  .half_open_has_fifos = 1
421  },
422 };
423 /* *INDENT-ON* */
424 
425 static clib_error_t *
427 {
428  udp_main_t *um = vnet_get_udp_main ();
429  ip_main_t *im = &ip_main;
431  u32 num_threads;
432  ip_protocol_info_t *pi;
433  int i;
434 
435  /*
436  * Registrations
437  */
438 
439  /* IP registration */
440  pi = ip_get_protocol_info (im, IP_PROTOCOL_UDP);
441  if (pi == 0)
442  return clib_error_return (0, "UDP protocol info AWOL");
445 
446  /* Register as transport with URI */
447  transport_register_protocol (TRANSPORT_PROTO_UDP, &udp_proto,
449  transport_register_protocol (TRANSPORT_PROTO_UDP, &udp_proto,
451  transport_register_protocol (TRANSPORT_PROTO_UDPC, &udpc_proto,
453  transport_register_protocol (TRANSPORT_PROTO_UDPC, &udpc_proto,
455 
456  /*
457  * Initialize data structures
458  */
459 
460  num_threads = 1 /* main thread */ + tm->n_threads;
461  vec_validate (um->connections, num_threads - 1);
462  vec_validate (um->connection_peekers, num_threads - 1);
463  vec_validate (um->peekers_readers_locks, num_threads - 1);
464  vec_validate (um->peekers_write_locks, num_threads - 1);
465 
466  if (num_threads > 1)
467  for (i = 0; i < num_threads; i++)
468  {
471  }
472  return 0;
473 }
474 
475 /* *INDENT-OFF* */
477 {
478  .runs_after = VLIB_INITS("ip_main_init", "ip4_lookup_init",
479  "ip6_lookup_init"),
480 };
481 /* *INDENT-ON* */
482 
483 
484 static clib_error_t *
486  vlib_cli_command_t * cmd_arg)
487 {
488  udp_main_t *um = vnet_get_udp_main ();
489 
490  clib_error_t *error = NULL;
491 
493  return clib_error_return (0, "unknown input `%U'", format_unformat_error,
494  input);
495 
496  udp_dst_port_info_t *port_info;
497  if (um->punt_unknown4)
498  {
499  vlib_cli_output (vm, "IPv4 UDP punt: enabled");
500  }
501  else
502  {
503  u8 *s = NULL;
504  vec_foreach (port_info, um->dst_port_infos[UDP_IP4])
505  {
506  if (udp_is_valid_dst_port (port_info->dst_port, 1))
507  {
508  s = format (s, (!s) ? "%d" : ", %d", port_info->dst_port);
509  }
510  }
511  s = format (s, "%c", 0);
512  vlib_cli_output (vm, "IPV4 UDP ports punt : %s", s);
513  }
514 
515  if (um->punt_unknown6)
516  {
517  vlib_cli_output (vm, "IPv6 UDP punt: enabled");
518  }
519  else
520  {
521  u8 *s = NULL;
522  vec_foreach (port_info, um->dst_port_infos[UDP_IP6])
523  {
524  if (udp_is_valid_dst_port (port_info->dst_port, 01))
525  {
526  s = format (s, (!s) ? "%d" : ", %d", port_info->dst_port);
527  }
528  }
529  s = format (s, "%c", 0);
530  vlib_cli_output (vm, "IPV6 UDP ports punt : %s", s);
531  }
532 
533  return (error);
534 }
535 /* *INDENT-OFF* */
536 VLIB_CLI_COMMAND (show_tcp_punt_command, static) =
537 {
538  .path = "show udp punt",
539  .short_help = "show udp punt [ipv4|ipv6]",
540  .function = show_udp_punt_fn,
541 };
542 /* *INDENT-ON* */
543 
544 /*
545  * fd.io coding-style-patch-verification: ON
546  *
547  * Local Variables:
548  * eval: (c-set-style "gnu")
549  * End:
550  */
#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:485
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:200
#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:246
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:93
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
void session_transport_delete_notify(transport_connection_t *tc)
Notification from transport that connection is being deleted.
Definition: session.c:887
static clib_error_t * udp_init(vlib_main_t *vm)
Definition: udp.c:426
static_always_inline void clib_spinlock_unlock_if_init(clib_spinlock_t *p)
Definition: lock.h:110
transport_connection_t * udp_session_get_half_open(u32 conn_index)
Definition: udp.c:336
u32 thread_index
Definition: main.h:218
#define pool_get_aligned_will_expand(P, YESNO, A)
See if pool_get will expand the pool or not.
Definition: pool.h:242
conn closed with data
Definition: udp.h:41
int i
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:291
transport_connection_t * udp_session_get_listener(u32 listener_index)
Definition: udp.c:134
void * ip_interface_get_first_ip(u32 sw_if_index, u8 is_ip4)
Definition: ip.c:140
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:424
Definition: ip.h:107
u32 udp_push_header(transport_connection_t *tc, vlib_buffer_t *b)
Definition: udp.c:143
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:271
#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:88
void udp_connection_free(udp_connection_t *uc)
Definition: udp.c:59
int udpc_connection_open(transport_endpoint_cfg_t *rmt)
Definition: udp.c:374
#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:80
#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:526
unsigned int u32
Definition: types.h:88
static const transport_proto_vft_t udpc_proto
Definition: udp.c:402
struct _transport_proto_vft transport_proto_vft_t
static void clib_spinlock_init(clib_spinlock_t *p)
Definition: lock.h:63
vlib_node_registration_t udp4_input_node
(constructor) VLIB_REGISTER_NODE (udp4_input_node)
Definition: udp_input.c:302
static ip_protocol_info_t * ip_get_protocol_info(ip_main_t *im, u32 protocol)
Definition: ip.h:134
format_function_t * format_header
Definition: ip.h:79
u32 udp_session_unbind(u32 listener_index)
Definition: udp.c:122
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:328
#define PREDICT_FALSE(x)
Definition: clib.h:112
udp_connection_t * listener_pool
Definition: udp.h:151
u16 udp_send_mss(transport_connection_t *t)
Definition: udp.c:277
void udp_connection_delete(udp_connection_t *uc)
Definition: udp.c:68
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:323
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:506
#define clib_warning(format, args...)
Definition: error.h:59
u8 data[]
Packet data.
Definition: buffer.h:181
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:239
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:161
static u32 transport_max_tx_dequeue(transport_connection_t *tc)
Definition: session.h:478
connected mode
Definition: udp.h:39
vlib_node_registration_t ip6_lookup_node
(constructor) VLIB_REGISTER_NODE (ip6_lookup_node)
Definition: ip6_forward.c:656
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:228
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:389
Definition: defs.h:47
static const transport_proto_vft_t udp_proto
Definition: udp.c:350
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:663
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:529
void udp_session_close(u32 connection_index, u32 thread_index)
Definition: udp.c:185
VLIB buffer representation.
Definition: buffer.h:102
connectionless service
u8 * format_udp_half_open_session(u8 *s, va_list *args)
Definition: udp.c:258
u8 * format_udp_connection_id(u8 *s, va_list *args)
Definition: udp.c:209
#define vnet_buffer(b)
Definition: buffer.h:365
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:175
static vlib_thread_main_t * vlib_get_thread_main()
Definition: global_funcs.h:32
static u32 vlib_num_workers()
Definition: threads.h:372
#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:468
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:429
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:59
u32 udp_send_space(transport_connection_t *t)
Definition: udp.c:284
udp_connection_t ** connections
Definition: udp.h:147
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
Definition: cli.c:772
static_always_inline void clib_spinlock_lock_if_init(clib_spinlock_t *p)
Definition: lock.h:95
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:386
#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:267