FD.io VPP  v20.09-64-g4f7b92f0a
Vector Packet Processing
det44.c
Go to the documentation of this file.
1 /*
2  * det44.c - deterministic NAT
3  *
4  * Copyright (c) 2020 Cisco and/or its affiliates.
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 /**
18  * @file
19  * @brief deterministic NAT (CGN)
20  */
21 
22 #include <vnet/vnet.h>
23 #include <vnet/ip/ip.h>
24 #include <vnet/ip/ip4.h>
25 #include <vpp/app/version.h>
26 #include <vnet/plugin/plugin.h>
27 
28 #include <nat/det44/det44.h>
29 
31 
32 /* *INDENT-OFF* */
33 VNET_FEATURE_INIT (ip4_det44_in2out, static) = {
34  .arc_name = "ip4-unicast",
35  .node_name = "det44-in2out",
36  .runs_after = VNET_FEATURES ("acl-plugin-in-ip4-fa",
37  "ip4-sv-reassembly-feature"),
38 };
39 VNET_FEATURE_INIT (ip4_det44_out2in, static) = {
40  .arc_name = "ip4-unicast",
41  .node_name = "det44-out2in",
42  .runs_after = VNET_FEATURES ("acl-plugin-in-ip4-fa",
43  "ip4-sv-reassembly-feature",
44  "ip4-dhcp-client-detect"),
45 };
47  .version = VPP_BUILD_VER,
48  .description = "Deterministic NAT (CGN)",
49 };
50 /* *INDENT-ON* */
51 
52 void
54  int is_add)
55 {
56  det44_main_t *dm = &det44_main;
58  .fp_len = p_len,
59  .fp_proto = FIB_PROTOCOL_IP4,
60  .fp_addr = {
61  .ip4.as_u32 = addr->as_u32,
62  },
63  };
64  u32 fib_index = ip4_fib_table_get_index_for_sw_if_index (sw_if_index);
65 
66  if (is_add)
67  {
69  &prefix,
70  dm->fib_src_low,
75  NULL,
76  sw_if_index,
77  ~0, 1, NULL, FIB_ROUTE_PATH_FLAG_NONE);
78  }
79  else
80  {
81  fib_table_entry_delete (fib_index, &prefix, dm->fib_src_low);
82  }
83 }
84 
85 /**
86  * @brief Add/delete deterministic NAT mapping.
87  *
88  * Create bijective mapping of inside address to outside address and port range
89  * pairs, with the purpose of enabling deterministic NAT to reduce logging in
90  * CGN deployments.
91  *
92  * @param in_addr Inside network address.
93  * @param in_plen Inside network prefix length.
94  * @param out_addr Outside network address.
95  * @param out_plen Outside network prefix length.
96  * @param is_add If 0 delete, otherwise add.
97  */
98 int
99 snat_det_add_map (ip4_address_t * in_addr, u8 in_plen,
100  ip4_address_t * out_addr, u8 out_plen, int is_add)
101 {
102  static snat_det_session_t empty_snat_det_session = { 0 };
103  det44_main_t *dm = &det44_main;
104  ip4_address_t in_cmp, out_cmp;
106  snat_det_map_t *mp;
107  u8 found = 0;
108 
109  in_cmp.as_u32 = in_addr->as_u32 & ip4_main.fib_masks[in_plen];
110  out_cmp.as_u32 = out_addr->as_u32 & ip4_main.fib_masks[out_plen];
111  vec_foreach (mp, dm->det_maps)
112  {
113  /* Checking for overlapping addresses to be added here */
114  if (mp->in_addr.as_u32 == in_cmp.as_u32 &&
115  mp->in_plen == in_plen &&
116  mp->out_addr.as_u32 == out_cmp.as_u32 && mp->out_plen == out_plen)
117  {
118  found = 1;
119  break;
120  }
121  }
122 
123  /* If found, don't add again */
124  if (found && is_add)
125  return VNET_API_ERROR_VALUE_EXIST;
126 
127  /* If not found, don't delete */
128  if (!found && !is_add)
129  return VNET_API_ERROR_NO_SUCH_ENTRY;
130 
131  if (is_add)
132  {
133  pool_get (dm->det_maps, mp);
134  clib_memset (mp, 0, sizeof (*mp));
135  mp->in_addr.as_u32 = in_cmp.as_u32;
136  mp->in_plen = in_plen;
137  mp->out_addr.as_u32 = out_cmp.as_u32;
138  mp->out_plen = out_plen;
139  mp->sharing_ratio = (1 << (32 - in_plen)) / (1 << (32 - out_plen));
140  mp->ports_per_host = (65535 - 1023) / mp->sharing_ratio;
141 
143  DET44_SES_PER_USER * (1 << (32 - in_plen)) -
144  1, empty_snat_det_session);
145  }
146  else
147  {
148  vec_free (mp->sessions);
149  vec_del1 (dm->det_maps, mp - dm->det_maps);
150  }
151 
152  /* Add/del external address range to FIB */
153  /* *INDENT-OFF* */
154  pool_foreach (i, dm->interfaces, ({
155  if (det44_interface_is_inside(i))
156  continue;
157  det44_add_del_addr_to_fib(out_addr, out_plen, i->sw_if_index, is_add);
158  goto out;
159  }));
160  /* *INDENT-ON* */
161 out:
162  return 0;
163 }
164 
165 int
167 {
168  det44_main_t *dm = &det44_main;
169  if (timeouts->udp)
170  dm->timeouts.udp = timeouts->udp;
171  if (timeouts->tcp.established)
172  dm->timeouts.tcp.established = timeouts->tcp.established;
173  if (timeouts->tcp.transitory)
174  dm->timeouts.tcp.transitory = timeouts->tcp.transitory;
175  if (timeouts->icmp)
176  dm->timeouts.icmp = timeouts->icmp;
177  return 0;
178 }
179 
182 {
183  det44_main_t *dm = &det44_main;
184  return dm->timeouts;
185 }
186 
187 void
189 {
190  det44_main_t *dm = &det44_main;
191  dm->timeouts.udp = 300;
192  dm->timeouts.tcp.established = 7440;
193  dm->timeouts.tcp.transitory = 240;
194  dm->timeouts.icmp = 60;
195 }
196 
197 int
198 det44_interface_add_del (u32 sw_if_index, u8 is_inside, int is_del)
199 {
200  det44_main_t *dm = &det44_main;
201  det44_interface_t *tmp, *i = 0;
202  const char *feature_name;
203  int rv;
204 
205  // TODO: if plugin is not enabled do not register nodes on interfaces
206  // rather make a structure and when enable call is used
207  // then register nodes
208 
209  /* *INDENT-OFF* */
210  pool_foreach (tmp, dm->interfaces, ({
211  if (tmp->sw_if_index == sw_if_index)
212  {
213  i = tmp;
214  goto out;
215  }
216  }));
217  /* *INDENT-ON* */
218 out:
219 
220  feature_name = is_inside ? "det44-in2out" : "det44-out2in";
221 
222  if (is_del)
223  {
224  if (!i)
225  {
226  det44_log_err ("det44 is not enabled on this interface");
227  return VNET_API_ERROR_INVALID_VALUE;
228  }
229 
231  if (rv)
232  return rv;
233 
234  rv = vnet_feature_enable_disable ("ip4-unicast", feature_name,
235  sw_if_index, 1, 0, 0);
236  if (rv)
237  return rv;
238 
239  pool_put (dm->interfaces, i);
240  }
241  else
242  {
243  if (i)
244  {
245  det44_log_err ("det44 is already enabled on this interface");
246  return VNET_API_ERROR_INVALID_VALUE;
247  }
248 
250  if (rv)
251  return rv;
252 
253  rv = vnet_feature_enable_disable ("ip4-unicast", feature_name,
254  sw_if_index, 1, 0, 0);
255  if (rv)
256  return rv;
257 
258  pool_get (dm->interfaces, i);
259  clib_memset (i, 0, sizeof (*i));
260 
261  i->sw_if_index = sw_if_index;
262 
263  if (is_inside)
265  else
267  }
268 
269  if (!is_inside)
270  {
272  sw_if_index);
273  // add/del outside interface fib to registry
274  u8 found = 0;
275  det44_fib_t *outside_fib;
276  /* *INDENT-OFF* */
277  vec_foreach (outside_fib, dm->outside_fibs)
278  {
279  if (outside_fib->fib_index == fib_index)
280  {
281  if (!is_del)
282  {
283  outside_fib->refcount++;
284  }
285  else
286  {
287  outside_fib->refcount--;
288  if (!outside_fib->refcount)
289  {
290  vec_del1 (dm->outside_fibs,
291  outside_fib - dm->outside_fibs);
292  }
293  }
294  found = 1;
295  break;
296  }
297  }
298  /* *INDENT-ON* */
299  if (!is_del && !found)
300  {
301  vec_add2 (dm->outside_fibs, outside_fib, 1);
302  outside_fib->fib_index = fib_index;
303  outside_fib->refcount = 1;
304  }
305  // add/del outside address to FIB
306  snat_det_map_t *mp;
307  /* *INDENT-OFF* */
308  pool_foreach (mp, dm->det_maps, ({
309  det44_add_del_addr_to_fib(&mp->out_addr,
310  mp->out_plen, sw_if_index, !is_del);
311  }));
312  /* *INDENT-ON* */
313  }
314  return 0;
315 }
316 
317 /**
318  * @brief The 'det44-expire-walk' process's main loop.
319  *
320  * Check expire time for active sessions.
321  */
322 static uword
324  vlib_frame_t * f)
325 {
326  det44_main_t *dm = &det44_main;
327  snat_det_session_t *ses;
328  snat_det_map_t *mp;
329 
331  vlib_process_get_events (vm, NULL);
332  u32 now = (u32) vlib_time_now (vm);
333  /* *INDENT-OFF* */
334  pool_foreach (mp, dm->det_maps, ({
335  vec_foreach(ses, mp->sessions)
336  {
337  /* Delete if session expired */
338  if (ses->in_port && (ses->expire < now))
339  snat_det_ses_close (mp, ses);
340  }
341  }));
342  /* *INDENT-ON* */
343  return 0;
344 }
345 
346 void
348 {
349  det44_main_t *dm = &det44_main;
350 
351  if (dm->expire_walk_node_index)
352  return;
353 
355  "det44-expire-walk",
357  16 /* stack_bytes */ );
358 }
359 
360 int
362 {
363  det44_main_t *dm = &det44_main;
364 
365  if (plugin_enabled () == 1)
366  {
367  det44_log_err ("plugin already enabled!");
368  return 1;
369  }
370 
371  det44_log_err ("inside %u, outside %u", c.inside_vrf_id, c.outside_vrf_id);
372 
374  c.outside_vrf_id,
375  dm->fib_src_hi);
377  c.inside_vrf_id,
378  dm->fib_src_hi);
379 
381  dm->mss_clamping = 0;
382  dm->config = c;
383  dm->enabled = 1;
384  return 0;
385 }
386 
387 int
389 {
390  det44_main_t *dm = &det44_main;
391  det44_interface_t *i, *interfaces;
392  snat_det_map_t *mp;
393  int rv = 0;
394 
395  if (plugin_enabled () == 0)
396  {
397  det44_log_err ("plugin already disabled!");
398  return 1;
399  }
400 
401  // DET44 cleanup (order dependent)
402  // 1) remove interfaces (det44_interface_add_del) removes map ranges from fib
403  // 2) free sessions
404  // 3) free maps
405 
406  interfaces = vec_dup (dm->interfaces);
407  vec_foreach (i, interfaces)
408  {
409  vnet_main_t *vnm = vnet_get_main ();
410 
412  {
413  rv = det44_interface_add_del (i->sw_if_index, i->flags, 1);
414  if (rv)
415  {
416  det44_log_err ("inside interface %U del failed",
418  }
419  }
420 
422  {
423  rv = det44_interface_add_del (i->sw_if_index, i->flags, 1);
424  if (rv)
425  {
426  det44_log_err ("outside interface %U del failed",
428  }
429 
430  }
431  }
432  vec_free (interfaces);
433 
434  /* *INDENT-OFF* */
435  pool_foreach (mp, dm->det_maps,
436  ({
437  vec_free (mp->sessions);
438  }));
439  /* *INDENT-ON* */
440 
442  dm->enabled = 0;
443 
444  pool_free (dm->interfaces);
445  pool_free (dm->det_maps);
446 
447  return rv;
448 }
449 
450 static void
452  uword opaque,
453  u32 sw_if_index, u32 new_fib_index,
454  u32 old_fib_index)
455 {
456  det44_main_t *dm = &det44_main;
457 
458  det44_fib_t *outside_fib;
460 
461  u8 is_add = 1;
462  u8 match = 0;
463 
464  if (plugin_enabled () == 0)
465  return;
466 
467  if (new_fib_index == old_fib_index)
468  return;
469 
470  if (!vec_len (dm->outside_fibs))
471  return;
472 
473  /* *INDENT-OFF* */
474  pool_foreach (i, dm->interfaces,
475  ({
476  if (i->sw_if_index == sw_if_index)
477  {
478  if (!(det44_interface_is_outside (i)))
479  return;
480  match = 1;
481  }
482  }));
483  /* *INDENT-ON* */
484 
485  if (!match)
486  return;
487 
488  vec_foreach (outside_fib, dm->outside_fibs)
489  {
490  if (outside_fib->fib_index == old_fib_index)
491  {
492  outside_fib->refcount--;
493  if (!outside_fib->refcount)
494  vec_del1 (dm->outside_fibs, outside_fib - dm->outside_fibs);
495  break;
496  }
497  }
498 
499  vec_foreach (outside_fib, dm->outside_fibs)
500  {
501  if (outside_fib->fib_index == new_fib_index)
502  {
503  outside_fib->refcount++;
504  is_add = 0;
505  break;
506  }
507  }
508 
509  if (is_add)
510  {
511  vec_add2 (dm->outside_fibs, outside_fib, 1);
512  outside_fib->refcount = 1;
513  outside_fib->fib_index = new_fib_index;
514  }
515 }
516 
517 static clib_error_t *
519 {
520  det44_main_t *dm = &det44_main;
522  vlib_node_t *node;
523 
524  clib_memset (dm, 0, sizeof (*dm));
525 
526  dm->ip4_main = &ip4_main;
527  dm->log_class = vlib_log_register_class ("det44", 0);
528 
529  node = vlib_get_node_by_name (vm, (u8 *) "det44-in2out");
530  dm->in2out_node_index = node->index;
531  node = vlib_get_node_by_name (vm, (u8 *) "det44-out2in");
532  dm->out2in_node_index = node->index;
533 
534  dm->fib_src_hi = fib_source_allocate ("det44-hi",
537  dm->fib_src_low = fib_source_allocate ("det44-low",
540 
542  cb.function_opaque = 0;
544 
546  return det44_api_hookup (vm);
547 }
548 
550 
551 u8 *
552 format_det44_session_state (u8 * s, va_list * args)
553 {
554  u32 i = va_arg (*args, u32);
555  u8 *t = 0;
556 
557  switch (i)
558  {
559 #define _(v, N, str) case DET44_SESSION_##N: t = (u8 *) str; break;
561 #undef _
562  default:
563  t = format (t, "unknown");
564  }
565  s = format (s, "%s", t);
566  return s;
567 }
568 
569 u8 *
570 format_det_map_ses (u8 * s, va_list * args)
571 {
572  snat_det_map_t *det_map = va_arg (*args, snat_det_map_t *);
573  ip4_address_t in_addr, out_addr;
574  u32 in_offset, out_offset;
575  snat_det_session_t *ses = va_arg (*args, snat_det_session_t *);
576  u32 *i = va_arg (*args, u32 *);
577 
578  u32 user_index = *i / DET44_SES_PER_USER;
579  in_addr.as_u32 =
580  clib_host_to_net_u32 (clib_net_to_host_u32 (det_map->in_addr.as_u32) +
581  user_index);
582  in_offset =
583  clib_net_to_host_u32 (in_addr.as_u32) -
584  clib_net_to_host_u32 (det_map->in_addr.as_u32);
585  out_offset = in_offset / det_map->sharing_ratio;
586  out_addr.as_u32 =
587  clib_host_to_net_u32 (clib_net_to_host_u32 (det_map->out_addr.as_u32) +
588  out_offset);
589  s =
590  format (s,
591  "in %U:%d out %U:%d external host %U:%d state: %U expire: %d\n",
592  format_ip4_address, &in_addr, clib_net_to_host_u16 (ses->in_port),
593  format_ip4_address, &out_addr,
594  clib_net_to_host_u16 (ses->out.out_port), format_ip4_address,
595  &ses->out.ext_host_addr,
596  clib_net_to_host_u16 (ses->out.ext_host_port),
598 
599  return s;
600 }
601 
602 /*
603  * fd.io coding-style-patch-verification: ON
604  *
605  * Local Variables:
606  * eval: (c-set-style "gnu")
607  * End:
608  */
vlib_log_class_t vlib_log_register_class(char *class, char *subclass)
Definition: log.c:209
ip4_table_bind_function_t * function
Definition: ip4.h:93
int det44_plugin_enable(det44_config_t c)
Definition: det44.c:361
int det44_plugin_disable()
Definition: det44.c:388
static f64 vlib_process_wait_for_event_or_clock(vlib_main_t *vm, f64 dt)
Suspend a cooperative multi-tasking thread Waits for an event, or for the indicated number of seconds...
Definition: node_funcs.h:751
int ip4_sv_reass_enable_disable_with_refcnt(u32 sw_if_index, int is_enable)
fib_source_t fib_src_low
Definition: det44.h:172
u32 inside_vrf_id
Definition: det44.h:151
vnet_main_t * vnet_get_main(void)
Definition: misc.c:46
static clib_error_t * det44_init(vlib_main_t *vm)
Definition: det44.c:518
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
u32 index
Definition: node.h:279
static f64 vlib_time_now(vlib_main_t *vm)
Definition: main.h:333
u32 fib_table_get_index_for_sw_if_index(fib_protocol_t proto, u32 sw_if_index)
Get the index of the FIB bound to the interface.
Definition: fib_table.c:989
#define det44_log_err(...)
Definition: det44.h:209
add paths without path extensions
Definition: fib_source.h:205
u32 established
Definition: det44.h:89
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:592
Deterministic NAT (CGN) definitions.
#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
vlib_main_t * vm
Definition: in2out_ed.c:1582
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:424
unformat_function_t unformat_vnet_sw_interface
vl_api_prefix_t prefix
Definition: ip.api:144
VNET_FEATURE_INIT(ip4_det44_in2out, static)
#define DET44_INTERFACE_FLAG_IS_INSIDE
Definition: det44.h:221
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
Definition: pool.h:252
struct nat_timeouts_s::@74 tcp
vhost_vring_addr_t addr
Definition: vhost_user.h:111
unsigned char u8
Definition: types.h:56
nat_timeouts_t timeouts
Definition: det44.h:184
fib_node_index_t fib_table_entry_update_one_path(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, dpo_proto_t next_hop_proto, const ip46_address_t *next_hop, u32 next_hop_sw_if_index, u32 next_hop_fib_index, u32 next_hop_weight, fib_mpls_label_t *next_hop_labels, fib_route_path_flags_t path_flags)
Update the entry to have just one path.
Definition: fib_table.c:805
det44_fib_t * outside_fibs
Definition: det44.h:169
static_always_inline u8 plugin_enabled()
Definition: det44.h:237
u32 ip4_fib_table_get_index_for_sw_if_index(u32 sw_if_index)
Definition: ip4_fib.c:230
format_function_t format_ip4_address
Definition: format.h:73
u16 mss_clamping
Definition: det44.h:181
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
Definition: pool.h:513
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:173
ip4_address_t ext_host_addr
Definition: det44.h:103
static uword vlib_process_get_events(vlib_main_t *vm, uword **data_vector)
Return the first event type which has occurred and a vector of per-event data of that type...
Definition: node_funcs.h:579
static void det44_update_outside_fib(ip4_main_t *im, uword opaque, u32 sw_if_index, u32 new_fib_index, u32 old_fib_index)
Definition: det44.c:451
nat_timeouts_t det44_get_timeouts()
Definition: det44.c:181
Aggregate type for a prefix.
Definition: fib_types.h:203
u32 out2in_node_index
Definition: det44.h:174
unsigned int u32
Definition: types.h:88
u32 outside_vrf_id
Definition: det44.h:150
u32 fib_index
Definition: det44.h:157
fib_source_t fib_source_allocate(const char *name, fib_source_priority_t prio, fib_source_behaviour_t bh)
Definition: fib_source.c:118
Definition: fib_entry.h:117
Definition: fib_entry.h:116
vlib_node_t * vlib_get_node_by_name(vlib_main_t *vm, u8 *name)
Definition: node.c:45
#define FIB_SOURCE_PRIORITY_HI
Some priority values that plugins might use when they are not to concerned where in the list they&#39;ll ...
Definition: fib_source.h:273
snat_det_session_t * sessions
Definition: det44.h:138
u32 vlib_process_create(vlib_main_t *vm, char *name, vlib_node_function_t *f, u32 log2_n_stack_bytes)
Create a vlib process.
Definition: node.c:736
u8 * format_det44_session_state(u8 *s, va_list *args)
Definition: det44.c:552
#define pool_put(P, E)
Free an object E in pool P.
Definition: pool.h:302
#define vec_dup(V)
Return copy of vector (no header, no alignment)
Definition: vec.h:429
#define DET44_INTERFACE_FLAG_IS_OUTSIDE
Definition: det44.h:222
#define vec_del1(v, i)
Delete the element at index I.
Definition: vec.h:875
det44_main_t det44_main
Definition: det44.c:30
void det44_reset_timeouts()
Definition: det44.c:188
snat_det_map_t * det_maps
Definition: det44.h:178
#define pool_free(p)
Free a pool.
Definition: pool.h:427
u8 * format_det_map_ses(u8 *s, va_list *args)
Definition: det44.c:570
svmdb_client_t * c
void det44_add_del_addr_to_fib(ip4_address_t *addr, u8 p_len, u32 sw_if_index, int is_add)
Definition: det44.c:53
sll srl srl sll sra u16x4 i
Definition: vector_sse42.h:317
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:380
void fib_table_entry_delete(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source)
Delete a FIB entry.
Definition: fib_table.c:886
u32 in2out_node_index
Definition: det44.h:175
u32 sharing_ratio
Definition: det44.h:132
ip4_address_t out_addr
Definition: det44.h:129
u32 icmp
Definition: det44.h:92
u32 outside_fib_index
Definition: det44.h:165
vlib_main_t vlib_node_runtime_t * node
Definition: in2out_ed.c:1582
int det44_set_timeouts(nat_timeouts_t *timeouts)
Definition: det44.c:166
#define DET44_SES_PER_USER
Definition: det44.h:63
IPv4 main type.
Definition: ip4.h:106
u32 transitory
Definition: det44.h:88
u32 fib_table_find_or_create_and_lock(fib_protocol_t proto, u32 table_id, fib_source_t src)
Get the index of the FIB for a Table-ID.
Definition: fib_table.c:1156
u32 refcount
Definition: det44.h:158
ip4_address_t in_addr
Definition: det44.h:126
static uword det44_expire_walk_fn(vlib_main_t *vm, vlib_node_runtime_t *rt, vlib_frame_t *f)
The &#39;det44-expire-walk&#39; process&#39;s main loop.
Definition: det44.c:323
int snat_det_add_map(ip4_address_t *in_addr, u8 in_plen, ip4_address_t *out_addr, u8 out_plen, int is_add)
Add/delete deterministic NAT mapping.
Definition: det44.c:99
#define FIB_SOURCE_PRIORITY_LOW
Definition: fib_source.h:274
#define VNET_FEATURES(...)
Definition: feature.h:470
static vlib_main_t * vlib_get_main(void)
Definition: global_funcs.h:23
void det44_create_expire_walk_process()
Definition: det44.c:347
ip4_table_bind_callback_t * table_bind_callbacks
Functions to call when interface to table biding changes.
Definition: ip4.h:147
det44_interface_t * interfaces
Definition: det44.h:197
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
VLIB_PLUGIN_REGISTER()
u16 ports_per_host
Definition: det44.h:134
Definition: fib_entry.h:113
u64 uword
Definition: types.h:112
snat_det_out_key_t out
Definition: det44.h:116
ip4_main_t * ip4_main
Definition: det44.h:200
u32 enabled
Definition: det44.h:189
clib_error_t * det44_api_hookup(vlib_main_t *vm)
Definition: det44_api.c:620
vlib_log_class_t log_class
Definition: det44.h:195
int det44_interface_add_del(u32 sw_if_index, u8 is_inside, int is_del)
Definition: det44.c:198
ip4_main_t ip4_main
Global ip4 main structure.
Definition: ip4_forward.c:1144
#define vec_foreach(var, vec)
Vector iterator.
u32 expire_walk_node_index
Definition: det44.h:187
u32 inside_fib_index
Definition: det44.h:166
#define vec_validate_init_empty(V, I, INIT)
Make sure vector is long enough for given index and initialize empty space (no header, unspecified alignment)
Definition: vec.h:556
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:33
fib_source_t fib_src_hi
Definition: det44.h:171
det44_config_t config
Definition: det44.h:163
int vnet_feature_enable_disable(const char *arc_name, const char *node_name, u32 sw_if_index, int enable_disable, void *feature_config, u32 n_feature_config_bytes)
Definition: feature.c:303
u32 fib_masks[33]
Definition: ip4.h:119