FD.io VPP  v20.09-64-g4f7b92f0a
Vector Packet Processing
det44_cli.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020 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  * @brief DET44 CLI
18  */
19 #include <nat/det44/det44.h>
20 
21 static clib_error_t *
23  vlib_cli_command_t * cmd)
24 {
25  unformat_input_t _line_input, *line_input = &_line_input;
26  ip4_address_t in_addr, out_addr;
27  u32 in_plen, out_plen;
28  int is_add = 1, rv;
29  clib_error_t *error = 0;
30 
31  if (!unformat_user (input, unformat_line_input, line_input))
32  return 0;
33 
34  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
35  {
36  if (unformat
37  (line_input, "in %U/%u", unformat_ip4_address, &in_addr, &in_plen))
38  ;
39  else
40  if (unformat
41  (line_input, "out %U/%u", unformat_ip4_address, &out_addr,
42  &out_plen))
43  ;
44  else if (unformat (line_input, "del"))
45  is_add = 0;
46  else
47  {
48  error = clib_error_return (0, "unknown input '%U'",
49  format_unformat_error, line_input);
50  goto done;
51  }
52  }
53 
54  rv = snat_det_add_map (&in_addr, (u8) in_plen, &out_addr, (u8) out_plen,
55  is_add);
56 
57  if (rv)
58  {
59  error = clib_error_return (0, "snat_det_add_map return %d", rv);
60  goto done;
61  }
62 
63 done:
64  unformat_free (line_input);
65 
66  return error;
67 }
68 
69 static clib_error_t *
71  unformat_input_t * input,
72  vlib_cli_command_t * cmd)
73 {
74  det44_main_t *dm = &det44_main;
75  snat_det_map_t *mp;
76  vlib_cli_output (vm, "NAT44 deterministic mappings:");
77  /* *INDENT-OFF* */
78  pool_foreach (mp, dm->det_maps,
79  ({
80  vlib_cli_output (vm, " in %U/%d out %U/%d\n",
81  format_ip4_address, &mp->in_addr, mp->in_plen,
82  format_ip4_address, &mp->out_addr, mp->out_plen);
83  vlib_cli_output (vm, " outside address sharing ratio: %d\n",
84  mp->sharing_ratio);
85  vlib_cli_output (vm, " number of ports per inside host: %d\n",
86  mp->ports_per_host);
87  vlib_cli_output (vm, " sessions number: %d\n", mp->ses_num);
88  }));
89  /* *INDENT-ON* */
90  return 0;
91 }
92 
93 static clib_error_t *
95  unformat_input_t * input, vlib_cli_command_t * cmd)
96 {
97  unformat_input_t _line_input, *line_input = &_line_input;
98  ip4_address_t in_addr, out_addr;
99  u16 lo_port;
100  snat_det_map_t *mp;
101  clib_error_t *error = 0;
102 
103  if (!unformat_user (input, unformat_line_input, line_input))
104  return 0;
105 
106  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
107  {
108  if (unformat (line_input, "%U", unformat_ip4_address, &in_addr))
109  ;
110  else
111  {
112  error = clib_error_return (0, "unknown input '%U'",
113  format_unformat_error, line_input);
114  goto done;
115  }
116  }
117 
118  mp = snat_det_map_by_user (&in_addr);
119  if (!mp)
120  vlib_cli_output (vm, "no match");
121  else
122  {
123  snat_det_forward (mp, &in_addr, &out_addr, &lo_port);
124  vlib_cli_output (vm, "%U:<%d-%d>", format_ip4_address, &out_addr,
125  lo_port, lo_port + mp->ports_per_host - 1);
126  }
127 
128 done:
129  unformat_free (line_input);
130 
131  return error;
132 }
133 
134 static clib_error_t *
136  unformat_input_t * input, vlib_cli_command_t * cmd)
137 {
138  unformat_input_t _line_input, *line_input = &_line_input;
139  ip4_address_t in_addr, out_addr;
140  clib_error_t *error = 0;
141  snat_det_map_t *mp;
142  u32 out_port;
143 
144  if (!unformat_user (input, unformat_line_input, line_input))
145  return 0;
146 
147  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
148  {
149  if (unformat
150  (line_input, "%U:%d", unformat_ip4_address, &out_addr, &out_port))
151  ;
152  else
153  {
154  error = clib_error_return (0, "unknown input '%U'",
155  format_unformat_error, line_input);
156  goto done;
157  }
158  }
159 
160  if (out_port < 1024 || out_port > 65535)
161  {
162  error = clib_error_return (0, "wrong port, must be <1024-65535>");
163  goto done;
164  }
165 
166  mp = snat_det_map_by_out (&out_addr);
167  if (!mp)
168  vlib_cli_output (vm, "no match");
169  else
170  {
171  snat_det_reverse (mp, &out_addr, (u16) out_port, &in_addr);
172  vlib_cli_output (vm, "%U", format_ip4_address, &in_addr);
173  }
174 
175 done:
176  unformat_free (line_input);
177 
178  return error;
179 }
180 
181 static clib_error_t *
183  unformat_input_t * input,
184  vlib_cli_command_t * cmd)
185 {
186  det44_main_t *dm = &det44_main;
187  snat_det_session_t *ses;
188  snat_det_map_t *mp;
189  vlib_cli_output (vm, "NAT44 deterministic sessions:");
190  /* *INDENT-OFF* */
191  pool_foreach (mp, dm->det_maps,
192  ({
193  int i;
194  vec_foreach_index (i, mp->sessions)
195  {
196  ses = vec_elt_at_index (mp->sessions, i);
197  if (ses->in_port)
198  vlib_cli_output (vm, " %U", format_det_map_ses, mp, ses, &i);
199  }
200  }));
201  /* *INDENT-ON* */
202  return 0;
203 }
204 
205 static clib_error_t *
207  unformat_input_t * input,
208  vlib_cli_command_t * cmd)
209 {
210  unformat_input_t _line_input, *line_input = &_line_input;
211  ip4_address_t out_addr, ext_addr, in_addr;
212  u32 out_port, ext_port;
213  snat_det_map_t *mp;
214  snat_det_session_t *ses;
216  clib_error_t *error = 0;
217 
218  if (!unformat_user (input, unformat_line_input, line_input))
219  return 0;
220 
221  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
222  {
223  if (unformat (line_input, "%U:%d %U:%d",
224  unformat_ip4_address, &out_addr, &out_port,
225  unformat_ip4_address, &ext_addr, &ext_port))
226  ;
227  else
228  {
229  error = clib_error_return (0, "unknown input '%U'",
230  format_unformat_error, line_input);
231  goto done;
232  }
233  }
234 
235  unformat_free (line_input);
236 
237  mp = snat_det_map_by_out (&out_addr);
238  if (!mp)
239  vlib_cli_output (vm, "no match");
240  else
241  {
242  snat_det_reverse (mp, &ext_addr, (u16) out_port, &in_addr);
243  key.ext_host_addr = out_addr;
244  key.ext_host_port = ntohs ((u16) ext_port);
245  key.out_port = ntohs ((u16) out_port);
246  ses = snat_det_get_ses_by_out (mp, &out_addr, key.as_u64);
247  if (!ses)
248  vlib_cli_output (vm, "no match");
249  else
250  snat_det_ses_close (mp, ses);
251  }
252 
253 done:
254  unformat_free (line_input);
255 
256  return error;
257 }
258 
259 static clib_error_t *
261  unformat_input_t * input, vlib_cli_command_t * cmd)
262 {
263  unformat_input_t _line_input, *line_input = &_line_input;
264  ip4_address_t in_addr, ext_addr;
265  u32 in_port, ext_port;
266  snat_det_map_t *mp;
267  snat_det_session_t *ses;
269  clib_error_t *error = 0;
270 
271  if (!unformat_user (input, unformat_line_input, line_input))
272  return 0;
273 
274  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
275  {
276  if (unformat (line_input, "%U:%d %U:%d",
277  unformat_ip4_address, &in_addr, &in_port,
278  unformat_ip4_address, &ext_addr, &ext_port))
279  ;
280  else
281  {
282  error = clib_error_return (0, "unknown input '%U'",
283  format_unformat_error, line_input);
284  goto done;
285  }
286  }
287 
288  unformat_free (line_input);
289 
290  mp = snat_det_map_by_user (&in_addr);
291  if (!mp)
292  vlib_cli_output (vm, "no match");
293  else
294  {
295  key.ext_host_addr = ext_addr;
296  key.ext_host_port = ntohs ((u16) ext_port);
297  ses =
298  snat_det_find_ses_by_in (mp, &in_addr, ntohs ((u16) in_port), key);
299  if (!ses)
300  vlib_cli_output (vm, "no match");
301  else
302  snat_det_ses_close (mp, ses);
303  }
304 
305 done:
306  unformat_free (line_input);
307 
308  return error;
309 }
310 
311 static clib_error_t *
313  unformat_input_t * input,
314  vlib_cli_command_t * cmd)
315 {
316  unformat_input_t _line_input, *line_input = &_line_input;
317  nat_timeouts_t timeouts = { 0 };
318  clib_error_t *error = 0;
319  u8 reset = 0;
320 
321  if (!unformat_user (input, unformat_line_input, line_input))
322  return 0;
323 
324  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
325  {
326  if (unformat (line_input, "udp %u", &timeouts.udp));
327  else if (unformat (line_input, "tcp established %u",
328  &timeouts.tcp.established));
329  else if (unformat (line_input, "tcp transitory %u",
330  &timeouts.tcp.transitory));
331  else if (unformat (line_input, "icmp %u", &timeouts.icmp));
332  else if (unformat (line_input, "reset"))
333  reset = 1;
334  else
335  {
336  error = clib_error_return (0, "unknown input '%U'",
337  format_unformat_error, line_input);
338  goto done;
339  }
340  }
341 
342  if (!reset)
343  {
344  if (det44_set_timeouts (&timeouts))
345  {
346  error = clib_error_return (0, "error configuring timeouts");
347  }
348  }
349  else
351 done:
352  unformat_free (line_input);
353  return error;
354 }
355 
356 static clib_error_t *
358  unformat_input_t * input,
359  vlib_cli_command_t * cmd)
360 {
361  nat_timeouts_t timeouts;
362  timeouts = det44_get_timeouts ();
363  vlib_cli_output (vm, "udp timeout: %dsec", timeouts.udp);
364  vlib_cli_output (vm, "tcp established timeout: %dsec",
365  timeouts.tcp.established);
366  vlib_cli_output (vm, "tcp transitory timeout: %dsec",
367  timeouts.tcp.transitory);
368  vlib_cli_output (vm, "icmp timeout: %dsec", timeouts.icmp);
369  return 0;
370 }
371 
372 static clib_error_t *
374  unformat_input_t * input,
375  vlib_cli_command_t * cmd)
376 {
377  unformat_input_t _line_input, *line_input = &_line_input;
378  u8 enable = 0, is_set = 0;
379  clib_error_t *error = 0;
380  det44_config_t c = { 0 };
381 
382  if (!unformat_user (input, unformat_line_input, line_input))
383  return 0;
384 
385  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
386  {
387  if (!is_set && unformat (line_input, "enable"))
388  {
389  unformat (line_input, "inside vrf %u", &c.inside_vrf_id);
390  unformat (line_input, "outside vrf %u", &c.outside_vrf_id);
391  enable = 1;
392  }
393  else if (!is_set && unformat (line_input, "disable"));
394  else
395  {
396  error = clib_error_return (0, "unknown input '%U'",
397  format_unformat_error, line_input);
398  goto done;
399  }
400  is_set = 1;
401  }
402 
403  if (enable)
404  {
405  if (det44_plugin_enable (c))
406  error = clib_error_return (0, "plugin enable failed");
407  }
408  else
409  {
410  if (det44_plugin_disable ())
411  error = clib_error_return (0, "plugin disable failed");
412  }
413 done:
414  unformat_free (line_input);
415  return error;
416 }
417 
418 typedef struct
419 {
423 
424 static clib_error_t *
426  unformat_input_t * input, vlib_cli_command_t * cmd)
427 {
428  unformat_input_t _line_input, *line_input = &_line_input;
429  sw_if_indices_t *sw_if_indices = 0, *p, e;
430  vnet_main_t *vnm = vnet_get_main ();
431  clib_error_t *error = 0;
432  u8 is_del = 0;
433 
434  if (!unformat_user (input, unformat_line_input, line_input))
435  return 0;
436 
437  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
438  {
439  if (unformat (line_input, "inside %U", unformat_vnet_sw_interface,
440  vnm, &e.sw_if_index))
441  {
442  e.is_inside = 1;
443  vec_add1 (sw_if_indices, e);
444  }
445  else if (unformat (line_input, "outside %U", unformat_vnet_sw_interface,
446  vnm, &e.sw_if_index))
447  {
448  e.is_inside = 0;
449  vec_add1 (sw_if_indices, e);
450  }
451  else if (unformat (line_input, "del"))
452  is_del = 1;
453  else
454  {
455  error = clib_error_return (0, "unknown input '%U'",
456  format_unformat_error, line_input);
457  goto done;
458  }
459  }
460 
461  /* *INDENT-OFF* */
462  vec_foreach (p, sw_if_indices)
463  {
464  if (det44_interface_add_del (p->sw_if_index, p->is_inside, is_del))
465  {
466  error = clib_error_return (0, "%s %s %U failed",
467  is_del ? "del" : "add",
468  p->is_inside ? "inside" : "outside",
470  vnm, p->sw_if_index);
471  break;
472  }
473  }
474  /* *INDENT-ON* */
475 done:
476  unformat_free (line_input);
477  vec_free (sw_if_indices);
478  return error;
479 }
480 
481 static clib_error_t *
483  vlib_cli_command_t * cmd)
484 {
485  vnet_main_t *vnm = vnet_get_main ();
486  det44_main_t *dm = &det44_main;
488  vlib_cli_output (vm, "DET44 interfaces:");
489  /* *INDENT-OFF* */
490  pool_foreach (i, dm->interfaces,
491  ({
492  vlib_cli_output (vm, " %U %s", format_vnet_sw_if_index_name, vnm,
493  i->sw_if_index,
494  (det44_interface_is_inside(i) &&
495  det44_interface_is_outside(i)) ? "in out" :
496  (det44_interface_is_inside(i) ? "in" : "out"));
497  }));
498  /* *INDENT-ON* */
499  return 0;
500 }
501 
502 /* *INDENT-OFF* */
503 /*?
504  * @cliexpar
505  * @cliexstart{det44 add}
506  * Create bijective mapping of inside address to outside address and port range
507  * pairs, with the purpose of enabling DET44 to reduce logging in CGN
508  * deployments.
509  * To create mapping between inside network 10.0.0.0/18 and
510  * outside network 1.1.1.0/30 use:
511  * # vpp# det44 add in 10.0.0.0/18 out 1.1.1.0/30
512  * @cliexend
513 ?*/
514 VLIB_CLI_COMMAND (det44_map_command, static) = {
515  .path = "det44 add",
516  .short_help = "det44 add in <addr>/<plen> out <addr>/<plen> [del]",
517  .function = det44_map_command_fn,
518 };
519 
520 /*?
521  * @cliexpar
522  * @cliexpstart{show det44 mappings}
523  * Show DET44 mappings
524  * vpp# show det44 mappings
525  * DET44 mappings:
526  * in 10.0.0.0/24 out 1.1.1.1/32
527  * outside address sharing ratio: 256
528  * number of ports per inside host: 252
529  * sessions number: 0
530  * @cliexend
531 ?*/
532 VLIB_CLI_COMMAND (det44_show_mappings_command, static) = {
533  .path = "show det44 mappings",
534  .short_help = "show det44 mappings",
535  .function = det44_show_mappings_command_fn,
536 };
537 
538 /*?
539  * @cliexpar
540  * @cliexstart{det44 forward}
541  * Return outside address and port range from inside address for DET44.
542  * To obtain outside address and port of inside host use:
543  * vpp# det44 forward 10.0.0.2
544  * 1.1.1.0:<1054-1068>
545  * @cliexend
546 ?*/
547 VLIB_CLI_COMMAND (det44_forward_command, static) = {
548  .path = "det44 forward",
549  .short_help = "det44 forward <addr>",
550  .function = det44_forward_command_fn,
551 };
552 
553 /*?
554  * @cliexpar
555  * @cliexstart{det44 reverse}
556  * Return inside address from outside address and port for DET44.
557  * To obtain inside host address from outside address and port use:
558  * #vpp det44 reverse 1.1.1.1:1276
559  * 10.0.16.16
560  * @cliexend
561 ?*/
562 VLIB_CLI_COMMAND (det44_reverse_command, static) = {
563  .path = "det44 reverse",
564  .short_help = "det44 reverse <addr>:<port>",
565  .function = det44_reverse_command_fn,
566 };
567 
568 /*?
569  * @cliexpar
570  * @cliexstart{show det44 sessions}
571  * Show DET44 sessions.
572  * vpp# show det44 sessions
573  * DET44 sessions:
574  * in 10.0.0.3:3005 out 1.1.1.2:1146 external host 172.16.1.2:3006 state: udp-active expire: 306
575  * in 10.0.0.3:3000 out 1.1.1.2:1141 external host 172.16.1.2:3001 state: udp-active expire: 306
576  * in 10.0.0.4:3005 out 1.1.1.2:1177 external host 172.16.1.2:3006 state: udp-active expire: 306
577  * @cliexend
578 ?*/
579 VLIB_CLI_COMMAND (det44_show_sessions_command, static) = {
580  .path = "show det44 sessions",
581  .short_help = "show det44 sessions",
582  .function = det44_show_sessions_command_fn,
583 };
584 
585 /*?
586  * @cliexpar
587  * @cliexstart{det44 close session out}
588  * Close session using outside ip address and port
589  * and external ip address and port, use:
590  * vpp# det44 close session out 1.1.1.1:1276 2.2.2.2:2387
591  * @cliexend
592 ?*/
593 VLIB_CLI_COMMAND (det44_close_sesion_out_command, static) = {
594  .path = "det44 close session out",
595  .short_help = "det44 close session out "
596  "<out_addr>:<out_port> <ext_addr>:<ext_port>",
597  .function = det44_close_session_out_fn,
598 };
599 
600 /*?
601  * @cliexpar
602  * @cliexstart{det44 deterministic close session in}
603  * Close session using inside ip address and port
604  * and external ip address and port, use:
605  * vpp# det44 close session in 3.3.3.3:3487 2.2.2.2:2387
606  * @cliexend
607 ?*/
608 VLIB_CLI_COMMAND (det44_close_session_in_command, static) = {
609  .path = "det44 close session in",
610  .short_help = "det44 close session in "
611  "<in_addr>:<in_port> <ext_addr>:<ext_port>",
612  .function = det44_close_session_in_fn,
613 };
614 /* *INDENT-ON* */
615 
616 /*?
617  * @cliexpar
618  * @cliexstart{set det44 timeout}
619  * Set values of timeouts for DET44 sessions (in seconds), use:
620  * vpp# set det44 timeouts udp 120 tcp established 7500 tcp transitory 250 icmp 90
621  * To reset default values use:
622  * vpp# set det44 timeouts reset
623  * @cliexend
624 ?*/
625 VLIB_CLI_COMMAND (det44_set_timeouts_command, static) =
626 {
627 .path = "set det44 timeouts",.short_help =
628  "set det44 timeouts <[udp <sec>] [tcp established <sec>] "
629  "[tcp transitory <sec>] [icmp <sec>]|reset>",.function =
631 
632 /*?
633  * @cliexpar
634  * @cliexstart{show det44 timeouts}
635  * Show values of timeouts for DET44 sessions.
636  * vpp# show det44 timeouts
637  * udp timeout: 300sec
638  * tcp-established timeout: 7440sec
639  * tcp-transitory timeout: 240sec
640  * icmp timeout: 60sec
641  * @cliexend
642 ?*/
643 VLIB_CLI_COMMAND (det44_show_timeouts_command, static) =
644 {
645 .path = "show det44 timeouts",.short_help =
646  "show det44 timeouts",.function = det44_show_timeouts_command_fn,};
647 
648 /*?
649  * @cliexpar
650  * @cliexstart{det44 plugin}
651  * Enable/disable DET44 plugin.
652  * @cliexend
653 ?*/
654 VLIB_CLI_COMMAND (det44_plugin_enable_disable_command, static) =
655 {
656 .path = "det44 plugin",.short_help =
657  "det44 plugin <enable [inside vrf] [outside vrf]|disable>",.function =
659 
660 /*?
661  * @cliexpar
662  * @cliexstart{set interface det44}
663  * Enable/disable DET44 feature on the interface.
664  * To enable DET44 feature with local network interface use:
665  * vpp# set interface det44 inside GigabitEthernet0/8/0
666  * To enable DET44 feature with external network interface use:
667  * vpp# set interface det44 outside GigabitEthernet0/a/0
668  * @cliexend
669 ?*/
670 VLIB_CLI_COMMAND (det44_feature_command, static) =
671 {
672 .path = "set interface det44",.short_help =
673  "set interface det44 inside <intfc> outside <intfc> [del]",.function =
675 
676 /*?
677  * @cliexpar
678  * @cliexstart{show det44 interfaces}
679  * Show interfaces with DET44 feature.
680  * vpp# show det44 interfaces
681  * DET44 interfaces:
682  * GigabitEthernet0/8/0 in
683  * GigabitEthernet0/a/0 out
684  * @cliexend
685 ?*/
686 VLIB_CLI_COMMAND (det44_show_interfaces_command, static) =
687 {
688 .path = "show det44 interfaces",.short_help =
689  "show det44 interfaces",.function = det44_show_interfaces_command_fn,};
690 
691 /*
692  * fd.io coding-style-patch-verification: ON
693  *
694  * Local Variables:
695  * eval: (c-set-style "gnu")
696  * End:
697  */
static clib_error_t * det44_forward_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: det44_cli.c:94
static_always_inline snat_det_session_t * snat_det_get_ses_by_out(snat_det_map_t *dm, ip4_address_t *in_addr, u64 out_key)
Definition: det44.h:359
int det44_plugin_enable(det44_config_t c)
Definition: det44.c:361
int det44_plugin_disable()
Definition: det44.c:388
static_always_inline void snat_det_reverse(snat_det_map_t *dm, ip4_address_t *out_addr, u16 out_port, ip4_address_t *in_addr)
Definition: det44.h:337
#define ntohs(x)
Definition: af_xdp.bpf.c:29
u32 inside_vrf_id
Definition: det44.h:151
vnet_main_t * vnet_get_main(void)
Definition: misc.c:46
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.
static clib_error_t * det44_map_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: det44_cli.c:22
uword unformat_user(unformat_input_t *input, unformat_function_t *func,...)
Definition: unformat.c:989
static clib_error_t * det44_reverse_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: det44_cli.c:135
vlib_main_t * vm
Definition: in2out_ed.c:1582
unformat_function_t unformat_vnet_sw_interface
struct nat_timeouts_s::@74 tcp
format_function_t format_vnet_sw_if_index_name
unsigned char u8
Definition: types.h:56
static clib_error_t * det44_close_session_in_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: det44_cli.c:260
format_function_t format_ip4_address
Definition: format.h:73
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
Definition: pool.h:513
unformat_function_t unformat_ip4_address
Definition: format.h:68
ip4_address_t ext_host_addr
Definition: det44.h:103
nat_timeouts_t det44_get_timeouts()
Definition: det44.c:181
static_always_inline snat_det_session_t * snat_det_find_ses_by_in(snat_det_map_t *dm, ip4_address_t *in_addr, u16 in_port, snat_det_out_key_t out_key)
Definition: det44.h:376
static_always_inline snat_det_map_t * snat_det_map_by_out(ip4_address_t *out_addr)
Definition: det44.h:307
#define clib_error_return(e, args...)
Definition: error.h:99
unsigned int u32
Definition: types.h:88
u32 outside_vrf_id
Definition: det44.h:150
unformat_function_t unformat_line_input
Definition: format.h:283
struct _unformat_input_t unformat_input_t
unsigned short u16
Definition: types.h:57
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
static_always_inline void snat_det_forward(snat_det_map_t *dm, ip4_address_t *in_addr, ip4_address_t *out_addr, u16 *lo_port)
Definition: det44.h:322
#define UNFORMAT_END_OF_INPUT
Definition: format.h:145
svmdb_client_t * c
static clib_error_t * det44_close_session_out_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: det44_cli.c:206
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
u32 icmp
Definition: det44.h:92
static_always_inline void snat_det_ses_close(snat_det_map_t *dm, snat_det_session_t *ses)
Definition: det44.h:430
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:158
int det44_set_timeouts(nat_timeouts_t *timeouts)
Definition: det44.c:166
static clib_error_t * det44_set_timeouts_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: det44_cli.c:312
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
Definition: cli.c:696
u32 transitory
Definition: det44.h:88
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
static clib_error_t * det44_feature_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: det44_cli.c:425
typedef key
Definition: ipsec_types.api:85
static clib_error_t * det44_plugin_enable_disable_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: det44_cli.c:373
det44_interface_t * interfaces
Definition: det44.h:197
static clib_error_t * det44_show_interfaces_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: det44_cli.c:482
static clib_error_t * det44_show_mappings_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: det44_cli.c:70
u16 ports_per_host
Definition: det44.h:134
static void unformat_free(unformat_input_t *i)
Definition: format.h:163
int det44_interface_add_del(u32 sw_if_index, u8 is_inside, int is_del)
Definition: det44.c:198
u8 * format_unformat_error(u8 *s, va_list *va)
Definition: unformat.c:91
#define vec_foreach(var, vec)
Vector iterator.
static clib_error_t * det44_show_sessions_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: det44_cli.c:182
static_always_inline snat_det_map_t * snat_det_map_by_user(ip4_address_t *user_addr)
Definition: det44.h:292
static clib_error_t * det44_show_timeouts_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: det44_cli.c:357
uword unformat(unformat_input_t *i, const char *fmt,...)
Definition: unformat.c:978
static uword unformat_check_input(unformat_input_t *i)
Definition: format.h:171