FD.io VPP  v21.06-3-gbb25fbf28
Vector Packet Processing
nat64_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 #include <vnet/fib/fib_table.h>
17 #include <nat/nat64/nat64.h>
18 
19 #define NAT64_EXPECTED_ARGUMENT "expected required argument(s)"
20 
21 static clib_error_t *
23  unformat_input_t * input,
24  vlib_cli_command_t * cmd)
25 {
26  unformat_input_t _line_input, *line_input = &_line_input;
27  u8 enable = 0, is_set = 0;
28  clib_error_t *error = 0;
29  nat64_config_t c = { 0 };
30 
31  if (!unformat_user (input, unformat_line_input, line_input))
33 
34  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
35  {
36  if (!is_set && unformat (line_input, "enable"))
37  {
38  unformat (line_input, "bib-buckets %u", &c.bib_buckets);
39  unformat (line_input, "bib-memory %u", &c.bib_memory_size);
40  unformat (line_input, "st-buckets %u", &c.st_buckets);
41  unformat (line_input, "st-memory %u", &c.st_memory_size);
42  enable = 1;
43  }
44  else if (!is_set && unformat (line_input, "disable"));
45  else
46  {
47  error = clib_error_return (0, "unknown input '%U'",
48  format_unformat_error, line_input);
49  goto done;
50  }
51  is_set = 1;
52  }
53 
54  if (enable)
55  {
56  if (nat64_plugin_enable (c))
57  error = clib_error_return (0, "plugin enable failed");
58  }
59  else
60  {
61  if (nat64_plugin_disable ())
62  error = clib_error_return (0, "plugin disable failed");
63  }
64 done:
65  unformat_free (line_input);
66  return error;
67 }
68 
69 static clib_error_t *
71  unformat_input_t * input,
72  vlib_cli_command_t * cmd)
73 {
74  unformat_input_t _line_input, *line_input = &_line_input;
75  ip4_address_t start_addr, end_addr, this_addr;
76  u32 start_host_order, end_host_order;
77  int i, count, rv;
78  u32 vrf_id = ~0;
79  u8 is_add = 1;
80  clib_error_t *error = 0;
81 
82  /* Get a line of input. */
83  if (!unformat_user (input, unformat_line_input, line_input))
85 
86  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
87  {
88  if (unformat (line_input, "%U - %U",
91  ;
92  else if (unformat (line_input, "tenant-vrf %u", &vrf_id))
93  ;
94  else if (unformat (line_input, "%U", unformat_ip4_address, &start_addr))
96  else if (unformat (line_input, "del"))
97  is_add = 0;
98  else
99  {
100  error = clib_error_return (0, "unknown input '%U'",
101  format_unformat_error, line_input);
102  goto done;
103  }
104  }
105 
106  start_host_order = clib_host_to_net_u32 (start_addr.as_u32);
107  end_host_order = clib_host_to_net_u32 (end_addr.as_u32);
108 
109  if (end_host_order < start_host_order)
110  {
111  error = clib_error_return (0, "end address less than start address");
112  goto done;
113  }
114 
115  count = (end_host_order - start_host_order) + 1;
116  this_addr = start_addr;
117 
118  for (i = 0; i < count; i++)
119  {
120  rv = nat64_add_del_pool_addr (0, &this_addr, vrf_id, is_add);
121 
122  switch (rv)
123  {
124  case VNET_API_ERROR_NO_SUCH_ENTRY:
125  error =
126  clib_error_return (0, "NAT64 pool address %U not exist.",
127  format_ip4_address, &this_addr);
128  goto done;
129  case VNET_API_ERROR_VALUE_EXIST:
130  error =
131  clib_error_return (0, "NAT64 pool address %U exist.",
132  format_ip4_address, &this_addr);
133  goto done;
134  default:
135  break;
136 
137  }
138  increment_v4_address (&this_addr);
139  }
140 
141 done:
142  unformat_free (line_input);
143 
144  return error;
145 }
146 
147 static int
149 {
150  vlib_main_t *vm = ctx;
151 
152  if (ap->fib_index != ~0)
153  {
154  fib_table_t *fib;
156  if (!fib)
157  return -1;
158  vlib_cli_output (vm, " %U tenant VRF: %u", format_ip4_address,
159  &ap->addr, fib->ft_table_id);
160  }
161  else
162  vlib_cli_output (vm, " %U", format_ip4_address, &ap->addr);
163 
164 #define _(N, i, n, s) \
165  vlib_cli_output (vm, " %d busy %s ports", ap->busy_##n##_ports, s);
167 #undef _
168  return 0;
169 }
170 
171 static clib_error_t *
173  unformat_input_t * input,
174  vlib_cli_command_t * cmd)
175 {
176  vlib_cli_output (vm, "NAT64 pool:");
178 
179  return 0;
180 }
181 
182 static clib_error_t *
185  input, vlib_cli_command_t * cmd)
186 {
187  unformat_input_t _line_input, *line_input = &_line_input;
188  vnet_main_t *vnm = vnet_get_main ();
189  clib_error_t *error = 0;
191  u32 *inside_sw_if_indices = 0;
192  u32 *outside_sw_if_indices = 0;
193  u8 is_add = 1;
194  int i, rv;
195 
196  /* Get a line of input. */
197  if (!unformat_user (input, unformat_line_input, line_input))
199 
200  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
201  {
202  if (unformat (line_input, "in %U", unformat_vnet_sw_interface,
203  vnm, &sw_if_index))
204  vec_add1 (inside_sw_if_indices, sw_if_index);
205  else if (unformat (line_input, "out %U", unformat_vnet_sw_interface,
206  vnm, &sw_if_index))
207  vec_add1 (outside_sw_if_indices, sw_if_index);
208  else if (unformat (line_input, "del"))
209  is_add = 0;
210  else
211  {
212  error = clib_error_return (0, "unknown input '%U'",
213  format_unformat_error, line_input);
214  goto done;
215  }
216  }
217 
218  if (vec_len (inside_sw_if_indices))
219  {
220  for (i = 0; i < vec_len (inside_sw_if_indices); i++)
221  {
222  sw_if_index = inside_sw_if_indices[i];
223  rv = nat64_interface_add_del (sw_if_index, 1, is_add);
224  switch (rv)
225  {
226  case VNET_API_ERROR_NO_SUCH_ENTRY:
227  error =
228  clib_error_return (0, "%U NAT64 feature not enabled.",
230  sw_if_index);
231  goto done;
232  case VNET_API_ERROR_VALUE_EXIST:
233  error =
234  clib_error_return (0, "%U NAT64 feature already enabled.",
236  vnm, sw_if_index);
237  goto done;
238  case VNET_API_ERROR_INVALID_VALUE:
239  case VNET_API_ERROR_INVALID_VALUE_2:
240  error =
242  "%U NAT64 feature enable/disable failed.",
244  sw_if_index);
245  goto done;
246  default:
247  break;
248 
249  }
250  }
251  }
252 
253  if (vec_len (outside_sw_if_indices))
254  {
255  for (i = 0; i < vec_len (outside_sw_if_indices); i++)
256  {
257  sw_if_index = outside_sw_if_indices[i];
258  rv = nat64_interface_add_del (sw_if_index, 0, is_add);
259  switch (rv)
260  {
261  case VNET_API_ERROR_NO_SUCH_ENTRY:
262  error =
263  clib_error_return (0, "%U NAT64 feature not enabled.",
265  sw_if_index);
266  goto done;
267  case VNET_API_ERROR_VALUE_EXIST:
268  error =
269  clib_error_return (0, "%U NAT64 feature already enabled.",
271  sw_if_index);
272  goto done;
273  case VNET_API_ERROR_INVALID_VALUE:
274  case VNET_API_ERROR_INVALID_VALUE_2:
275  error =
277  "%U NAT64 feature enable/disable failed.",
279  sw_if_index);
280  goto done;
281  default:
282  break;
283 
284  }
285  }
286  }
287 
288 done:
289  unformat_free (line_input);
290  vec_free (inside_sw_if_indices);
291  vec_free (outside_sw_if_indices);
292 
293  return error;
294 }
295 
296 static int
298 {
299  vlib_main_t *vm = ctx;
300  vnet_main_t *vnm = vnet_get_main ();
301 
303  i->sw_if_index,
305  && nat64_interface_is_outside (i)) ? "in out" :
306  nat64_interface_is_inside (i) ? "in" : "out");
307  return 0;
308 }
309 
310 static clib_error_t *
313  input, vlib_cli_command_t * cmd)
314 {
315  vlib_cli_output (vm, "NAT64 interfaces:");
317 
318  return 0;
319 }
320 
321 static clib_error_t *
323  vm,
325  * input, vlib_cli_command_t * cmd)
326 {
327  unformat_input_t _line_input, *line_input = &_line_input;
328  clib_error_t *error = 0;
329  u8 is_add = 1;
330  ip6_address_t in_addr;
331  ip4_address_t out_addr;
332  u32 in_port = 0;
333  u32 out_port = 0;
334  u32 vrf_id = 0, protocol;
335  nat_protocol_t proto = 0;
336  u8 p = 0;
337  int rv;
338 
339  if (!unformat_user (input, unformat_line_input, line_input))
341 
342  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
343  {
344  if (unformat (line_input, "%U %u", unformat_ip6_address,
345  &in_addr, &in_port))
346  ;
347  else if (unformat (line_input, "%U %u", unformat_ip4_address,
348  &out_addr, &out_port))
349  ;
350  else if (unformat (line_input, "vrf %u", &vrf_id))
351  ;
352  else if (unformat (line_input, "%U", unformat_nat_protocol, &proto))
353  ;
354  else
355  if (unformat
356  (line_input, "%U %U %u", unformat_ip6_address, &in_addr,
357  unformat_ip4_address, &out_addr, &protocol))
358  p = (u8) protocol;
359  else if (unformat (line_input, "del"))
360  is_add = 0;
361  else
362  {
363  error = clib_error_return (0, "unknown input: '%U'",
364  format_unformat_error, line_input);
365  goto done;
366  }
367  }
368 
369  if (!p)
370  {
371  if (!in_port)
372  {
373  error =
374  clib_error_return (0, "inside port and address must be set");
375  goto done;
376  }
377 
378  if (!out_port)
379  {
380  error =
381  clib_error_return (0, "outside port and address must be set");
382  goto done;
383  }
384 
386  }
387 
388  rv =
389  nat64_add_del_static_bib_entry (&in_addr, &out_addr, (u16) in_port,
390  (u16) out_port, p, vrf_id, is_add);
391 
392  switch (rv)
393  {
394  case VNET_API_ERROR_NO_SUCH_ENTRY:
395  error = clib_error_return (0, "NAT64 BIB entry not exist.");
396  goto done;
397  case VNET_API_ERROR_VALUE_EXIST:
398  error = clib_error_return (0, "NAT64 BIB entry exist.");
399  goto done;
400  case VNET_API_ERROR_UNSPECIFIED:
401  error = clib_error_return (0, "Crerate NAT64 BIB entry failed.");
402  goto done;
403  case VNET_API_ERROR_INVALID_VALUE:
404  error =
406  "Outside address %U and port %u already in use.",
407  format_ip4_address, &out_addr, out_port);
408  goto done;
409  case VNET_API_ERROR_INVALID_VALUE_2:
410  error = clib_error_return (0, "Invalid outside port.");
411  default:
412  break;
413  }
414 
415 done:
416  unformat_free (line_input);
417 
418  return error;
419 }
420 
421 static int
422 nat64_cli_bib_walk (nat64_db_bib_entry_t * bibe, void *ctx)
423 {
424  vlib_main_t *vm = ctx;
425  fib_table_t *fib;
426 
427  fib = fib_table_get (bibe->fib_index, FIB_PROTOCOL_IP6);
428  if (!fib)
429  return -1;
430 
431  switch (bibe->proto)
432  {
433  case IP_PROTOCOL_ICMP:
434  case IP_PROTOCOL_TCP:
435  case IP_PROTOCOL_UDP:
436  vlib_cli_output (vm, " %U %u %U %u protocol %U vrf %u %s %u sessions",
437  format_ip6_address, &bibe->in_addr,
438  clib_net_to_host_u16 (bibe->in_port),
439  format_ip4_address, &bibe->out_addr,
440  clib_net_to_host_u16 (bibe->out_port),
442  ip_proto_to_nat_proto (bibe->proto), fib->ft_table_id,
443  bibe->is_static ? "static" : "dynamic", bibe->ses_num);
444  break;
445  default:
446  vlib_cli_output (vm, " %U %U protocol %u vrf %u %s %u sessions",
447  format_ip6_address, &bibe->in_addr,
448  format_ip4_address, &bibe->out_addr,
449  bibe->proto, fib->ft_table_id,
450  bibe->is_static ? "static" : "dynamic", bibe->ses_num);
451  }
452  return 0;
453 }
454 
455 static clib_error_t *
457  unformat_input_t * input, vlib_cli_command_t * cmd)
458 {
460  unformat_input_t _line_input, *line_input = &_line_input;
461  clib_error_t *error = 0;
462  u32 proto = NAT_PROTOCOL_OTHER;
463  u8 p = 255;
464  nat64_db_t *db;
465 
466  if (!unformat_user (input, unformat_line_input, line_input))
468 
469  if (unformat (line_input, "%U", unformat_nat_protocol, &proto))
471  else if (unformat (line_input, "unknown"))
472  p = 0;
473  else if (unformat (line_input, "all"))
474  ;
475  else
476  {
477  error = clib_error_return (0, "unknown input: '%U'",
478  format_unformat_error, line_input);
479  goto done;
480  }
481 
482  if (p == 255)
483  vlib_cli_output (vm, "NAT64 BIB entries:");
484  else
485  vlib_cli_output (vm, "NAT64 %U BIB entries:", format_nat_protocol, proto);
486 
487  /* *INDENT-OFF* */
488  vec_foreach (db, nm->db)
490  /* *INDENT-ON* */
491 
492 done:
493  unformat_free (line_input);
494 
495  return error;
496 }
497 
499 {
503 
504 static int
505 nat64_cli_st_walk (nat64_db_st_entry_t * ste, void *arg)
506 {
508  vlib_main_t *vm = ctx->vm;
509  nat64_db_bib_entry_t *bibe;
510  fib_table_t *fib;
511 
512  bibe = nat64_db_bib_entry_by_index (ctx->db, ste->proto, ste->bibe_index);
513  if (!bibe)
514  return -1;
515 
516  fib = fib_table_get (bibe->fib_index, FIB_PROTOCOL_IP6);
517  if (!fib)
518  return -1;
519 
520  u32 vrf_id = fib->ft_table_id;
521 
522  if (ste->proto == IP_PROTOCOL_ICMP)
523  vlib_cli_output (vm, " %U %U %u %U %U %u protocol %U vrf %u",
524  format_ip6_address, &bibe->in_addr,
525  format_ip6_address, &ste->in_r_addr,
526  clib_net_to_host_u16 (bibe->in_port),
527  format_ip4_address, &bibe->out_addr,
528  format_ip4_address, &ste->out_r_addr,
529  clib_net_to_host_u16 (bibe->out_port),
531  ip_proto_to_nat_proto (bibe->proto), vrf_id);
532  else if (ste->proto == IP_PROTOCOL_TCP || ste->proto == IP_PROTOCOL_UDP)
533  vlib_cli_output (vm, " %U %u %U %u %U %u %U %u protcol %U vrf %u",
534  format_ip6_address, &bibe->in_addr,
535  clib_net_to_host_u16 (bibe->in_port),
536  format_ip6_address, &ste->in_r_addr,
537  clib_net_to_host_u16 (ste->r_port),
538  format_ip4_address, &bibe->out_addr,
539  clib_net_to_host_u16 (bibe->out_port),
540  format_ip4_address, &ste->out_r_addr,
541  clib_net_to_host_u16 (ste->r_port),
543  ip_proto_to_nat_proto (bibe->proto), vrf_id);
544  else
545  vlib_cli_output (vm, " %U %U %U %U protocol %u vrf %u",
546  format_ip6_address, &bibe->in_addr,
547  format_ip6_address, &ste->in_r_addr,
548  format_ip4_address, &bibe->out_addr,
549  format_ip4_address, &ste->out_r_addr,
550  bibe->proto, vrf_id);
551 
552  return 0;
553 }
554 
555 static clib_error_t *
557  unformat_input_t * input, vlib_cli_command_t * cmd)
558 {
560  unformat_input_t _line_input, *line_input = &_line_input;
561  clib_error_t *error = 0;
562  u32 proto = NAT_PROTOCOL_OTHER;
563  u8 p = 255;
564  nat64_db_t *db;
566  .vm = vm,
567  };
568 
569  if (!unformat_user (input, unformat_line_input, line_input))
571 
572  if (unformat (line_input, "%U", unformat_nat_protocol, &proto))
574  else if (unformat (line_input, "unknown"))
575  p = 0;
576  else if (unformat (line_input, "all"))
577  ;
578  else
579  {
580  error = clib_error_return (0, "unknown input: '%U'",
581  format_unformat_error, line_input);
582  goto done;
583  }
584 
585  if (p == 255)
586  vlib_cli_output (vm, "NAT64 sessions:");
587  else
588  vlib_cli_output (vm, "NAT64 %U sessions:", format_nat_protocol, proto);
589  /* *INDENT-OFF* */
590  vec_foreach (db, nm->db)
591  {
592  ctx.db = db;
594  }
595  /* *INDENT-ON* */
596 
597 done:
598  unformat_free (line_input);
599 
600  return error;
601 }
602 
603 static clib_error_t *
605  vlib_cli_command_t * cmd)
606 {
608  vnet_main_t *vnm = vnet_get_main ();
609  clib_error_t *error = 0;
610  unformat_input_t _line_input, *line_input = &_line_input;
611  u8 is_add = 1;
612  u32 vrf_id = 0, sw_if_index = ~0;
613  ip6_address_t prefix;
614  u32 plen = 0;
615  int rv;
616 
617  if (!unformat_user (input, unformat_line_input, line_input))
619 
620  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
621  {
622  if (unformat
623  (line_input, "%U/%u", unformat_ip6_address, &prefix, &plen))
624  ;
625  else if (unformat (line_input, "tenant-vrf %u", &vrf_id))
626  ;
627  else if (unformat (line_input, "del"))
628  is_add = 0;
629  else
630  if (unformat
631  (line_input, "interface %U", unformat_vnet_sw_interface, vnm,
632  &sw_if_index))
633  ;
634  else
635  {
636  error = clib_error_return (0, "unknown input: '%U'",
637  format_unformat_error, line_input);
638  goto done;
639  }
640  }
641 
642  if (!plen)
643  {
644  error = clib_error_return (0, "NAT64 prefix must be set.");
645  goto done;
646  }
647 
648  rv = nat64_add_del_prefix (&prefix, (u8) plen, vrf_id, is_add);
649 
650  switch (rv)
651  {
652  case VNET_API_ERROR_NO_SUCH_ENTRY:
653  error = clib_error_return (0, "NAT64 prefix not exist.");
654  goto done;
655  case VNET_API_ERROR_INVALID_VALUE:
656  error = clib_error_return (0, "Invalid prefix length.");
657  goto done;
658  default:
659  break;
660  }
661 
662  /*
663  * Add RX interface route, whenNAT isn't running on the real input
664  * interface
665  */
666  if (sw_if_index != ~0)
667  {
668  u32 fib_index;
669  fib_prefix_t fibpfx = {
670  .fp_len = plen,
671  .fp_proto = FIB_PROTOCOL_IP6,
672  .fp_addr = {
673  .ip6 = prefix}
674  };
675 
676  if (is_add)
677  {
678  fib_index =
680  vrf_id, nm->fib_src_hi);
681  fib_table_entry_update_one_path (fib_index, &fibpfx,
682  nm->fib_src_hi,
684  DPO_PROTO_IP6, NULL,
685  sw_if_index, ~0, 0,
686  NULL, FIB_ROUTE_PATH_INTF_RX);
687  }
688  else
689  {
690  fib_index = fib_table_find (FIB_PROTOCOL_IP6, vrf_id);
691  fib_table_entry_path_remove (fib_index, &fibpfx,
692  nm->fib_src_hi,
693  DPO_PROTO_IP6, NULL,
694  sw_if_index, ~0, 1,
697  }
698  }
699 
700 done:
701  unformat_free (line_input);
702 
703  return error;
704 }
705 
706 static int
708 {
709  vlib_main_t *vm = ctx;
710 
711  vlib_cli_output (vm, " %U/%u tenant-vrf %u",
712  format_ip6_address, &p->prefix, p->plen, p->vrf_id);
713 
714  return 0;
715 }
716 
717 static clib_error_t *
719  unformat_input_t * input,
720  vlib_cli_command_t * cmd)
721 {
722  vlib_cli_output (vm, "NAT64 prefix:");
724 
725  return 0;
726 }
727 
728 static clib_error_t *
730  unformat_input_t * input,
731  vlib_cli_command_t * cmd)
732 {
733  vnet_main_t *vnm = vnet_get_main ();
734  unformat_input_t _line_input, *line_input = &_line_input;
736  int rv;
737  int is_add = 1;
738  clib_error_t *error = 0;
739 
740  /* Get a line of input. */
741  if (!unformat_user (input, unformat_line_input, line_input))
743 
744  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
745  {
746  if (unformat
747  (line_input, "%U", unformat_vnet_sw_interface, vnm, &sw_if_index));
748  else if (unformat (line_input, "del"))
749  is_add = 0;
750  else
751  {
752  error = clib_error_return (0, "unknown input '%U'",
753  format_unformat_error, line_input);
754  goto done;
755  }
756  }
757 
759 
760  switch (rv)
761  {
762  case VNET_API_ERROR_NO_SUCH_ENTRY:
763  error = clib_error_return (0, "entry not exist");
764  break;
765  case VNET_API_ERROR_VALUE_EXIST:
766  error = clib_error_return (0, "entry exist");
767  break;
768  default:
769  break;
770  }
771 
772 done:
773  unformat_free (line_input);
774 
775  return error;
776 }
777 
778 /* *INDENT-OFF* */
779 /*?
780  * @cliexpar
781  * @cliexstart{nat64 plugin}
782  * Enable/disable NAT64 plugin.
783  * To enable NAT64 plugin use:
784  * vpp# nat64 plugin enable
785  * To enable NAT64 plugin and configure buckets/memory:
786  * vpp# nat64 plugin enable bib-buckets <n> bib-memory <s> \
787  * st-buckets <n> st-memory <s>
788  * To disable NAT64 plugin:
789  * vpp# nat64 plugin disable
790  * @cliexend
791 ?*/
793 {
794  .path = "nat64 plugin",
795  .short_help = "nat64 plugin <enable "
796  "[bib-buckets <count>] [bib-memory <size>] "
797  "[st-buckets <count>] [st-memory <size>] | disable>",
799 };
800 
801 /*?
802  * @cliexpar
803  * @cliexstart{nat64 add pool address}
804  * Add/delete NAT64 pool address.
805  * To add single NAT64 pool address use:
806  * vpp# nat64 add pool address 10.1.1.10
807  * To add NAT64 pool address range use:
808  * vpp# nat64 add pool address 10.1.1.2 - 10.1.1.5
809  * To add NAT64 pool address for specific tenant use:
810  * vpp# nat64 add pool address 10.1.1.100 tenant-vrf 100
811  * @cliexend
812 ?*/
814  .path = "nat64 add pool address",
815  .short_help = "nat64 add pool address <ip4-range-start> [- <ip4-range-end>] "
816  "[tenant-vrf <vrf-id>] [del]",
818 };
819 
820 /*?
821  * @cliexpar
822  * @cliexstart{show nat64 pool}
823  * Show NAT64 pool.
824  * vpp# show nat64 pool
825  * NAT64 pool:
826  * 10.1.1.3 tenant VRF: 0
827  * 10.1.1.10 tenant VRF: 10
828  * @cliexend
829 ?*/
831  .path = "show nat64 pool",
832  .short_help = "show nat64 pool",
833  .function = nat64_show_pool_command_fn,
834 };
835 
836 /*?
837  * @cliexpar
838  * @cliexstart{set interface nat64}
839  * Enable/disable NAT64 feature on the interface.
840  * To enable NAT64 feature with local (IPv6) network interface
841  * GigabitEthernet0/8/0 and external (IPv4) network interface
842  * GigabitEthernet0/a/0 use:
843  * vpp# set interface nat64 in GigabitEthernet0/8/0 out GigabitEthernet0/a/0
844  * @cliexend
845 ?*/
847  .path = "set interface nat64",
848  .short_help = "set interface nat64 in|out <intfc> [del]",
850 };
851 
852 /*?
853  * @cliexpar
854  * @cliexstart{show nat64 interfaces}
855  * Show interfaces with NAT64 feature.
856  * To show interfaces with NAT64 feature use:
857  * vpp# show nat64 interfaces
858  * NAT64 interfaces:
859  * GigabitEthernet0/8/0 in
860  * GigabitEthernet0/a/0 out
861  * @cliexend
862 ?*/
864  .path = "show nat64 interfaces",
865  .short_help = "show nat64 interfaces",
867 };
868 
869 /*?
870  * @cliexpar
871  * @cliexstart{nat64 add static bib}
872  * Add/delete NAT64 static BIB entry.
873  * To create NAT64 satatic BIB entry use:
874  * vpp# nat64 add static bib 2001:db8:c000:221:: 1234 10.1.1.3 5678 tcp
875  * vpp# nat64 add static bib 2001:db8:c000:221:: 1234 10.1.1.3 5678 udp vrf 10
876  * @cliexend
877 ?*/
879  .path = "nat64 add static bib",
880  .short_help = "nat64 add static bib <ip6-addr> <port> <ip4-addr> <port> "
881  "tcp|udp|icmp [vfr <table-id>] [del]",
883 };
884 
885 /*?
886  * @cliexpar
887  * @cliexstart{show nat64 bib}
888  * Show NAT64 BIB entries.
889  * To show NAT64 TCP BIB entries use:
890  * vpp# show nat64 bib tcp
891  * NAT64 tcp BIB:
892  * fd01:1::2 6303 10.0.0.3 62303 tcp vrf 0 dynamic 1 sessions
893  * 2001:db8:c000:221:: 1234 10.1.1.3 5678 tcp vrf 0 static 2 sessions
894  * To show NAT64 UDP BIB entries use:
895  * vpp# show nat64 bib udp
896  * NAT64 udp BIB:
897  * fd01:1::2 6304 10.0.0.3 10546 udp vrf 0 dynamic 10 sessions
898  * 2001:db8:c000:221:: 1234 10.1.1.3 5678 udp vrf 10 static 0 sessions
899  * To show NAT64 ICMP BIB entries use:
900  * vpp# show nat64 bib icmp
901  * NAT64 icmp BIB:
902  * fd01:1::2 6305 10.0.0.3 63209 icmp vrf 10 dynamic 1 sessions
903  * @cliexend
904 ?*/
906  .path = "show nat64 bib",
907  .short_help = "show nat64 bib all|tcp|udp|icmp|unknown",
908  .function = nat64_show_bib_command_fn,
909 };
910 
911 /*?
912  * @cliexpar
913  * @cliexstart{show nat64 session table}
914  * Show NAT64 session table.
915  * To show NAT64 TCP session table use:
916  * vpp# show nat64 session table tcp
917  * NAT64 tcp session table:
918  * fd01:1::2 6303 64:ff9b::ac10:202 20 10.0.0.3 62303 172.16.2.2 20 tcp vrf 0
919  * fd01:3::2 6303 64:ff9b::ac10:202 20 10.0.10.3 21300 172.16.2.2 20 tcp vrf 10
920  * To show NAT64 UDP session table use:
921  * #vpp show nat64 session table udp
922  * NAT64 udp session table:
923  * fd01:1::2 6304 64:ff9b::ac10:202 20 10.0.0.3 10546 172.16.2.2 20 udp vrf 0
924  * fd01:3::2 6304 64:ff9b::ac10:202 20 10.0.10.3 58627 172.16.2.2 20 udp vrf 10
925  * fd01:1::2 1235 64:ff9b::a00:3 4023 10.0.0.3 24488 10.0.0.3 4023 udp vrf 0
926  * fd01:1::3 23 64:ff9b::a00:3 24488 10.0.0.3 4023 10.0.0.3 24488 udp vrf 0
927  * To show NAT64 ICMP session table use:
928  * #vpp show nat64 session table icmp
929  * NAT64 icmp session table:
930  * fd01:1::2 64:ff9b::ac10:202 6305 10.0.0.3 172.16.2.2 63209 icmp vrf 0
931  * @cliexend
932 ?*/
934  .path = "show nat64 session table",
935  .short_help = "show nat64 session table all|tcp|udp|icmp|unknown",
936  .function = nat64_show_st_command_fn,
937 };
938 
939 /*?
940  * @cliexpar
941  * @cliexstart{nat64 add prefix}
942  * Set NAT64 prefix for generating IPv6 representations of IPv4 addresses.
943  * To set NAT64 global prefix use:
944  * vpp# nat64 add prefix 2001:db8::/32
945  * To set NAT64 prefix for specific tenant use:
946  * vpp# nat64 add prefix 2001:db8:122:300::/56 tenant-vrf 10
947  * @cliexend
948 ?*/
950  .path = "nat64 add prefix",
951  .short_help = "nat64 add prefix <ip6-prefix>/<plen> [tenant-vrf <vrf-id>] "
952  "[del] [interface <interface]",
954 };
955 
956 /*?
957  * @cliexpar
958  * @cliexstart{show nat64 prefix}
959  * Show NAT64 prefix.
960  * To show NAT64 prefix use:
961  * vpp# show nat64 prefix
962  * NAT64 prefix:
963  * 2001:db8::/32 tenant-vrf 0
964  * 2001:db8:122:300::/56 tenant-vrf 10
965  * @cliexend
966 ?*/
968  .path = "show nat64 prefix",
969  .short_help = "show nat64 prefix",
970  .function = nat64_show_prefix_command_fn,
971 };
972 
973 /*?
974  * @cliexpar
975  * @cliexstart{nat64 add interface address}
976  * Add/delete NAT64 pool address from specific (DHCP addressed) interface.
977  * To add NAT64 pool address from specific interface use:
978  * vpp# nat64 add interface address GigabitEthernet0/8/0
979  * @cliexend
980 ?*/
982  .path = "nat64 add interface address",
983  .short_help = "nat64 add interface address <interface> [del]",
985 };
986 /* *INDENT-ON* */
987 
988 /*
989  * fd.io coding-style-patch-verification: ON
990  *
991  * Local Variables:
992  * eval: (c-set-style "gnu")
993  * End:
994  */
nat64_add_del_prefix
int nat64_add_del_prefix(ip6_address_t *prefix, u8 plen, u32 vrf_id, u8 is_add)
Add/delete NAT64 prefix.
Definition: nat64.c:1206
nat64_add_del_static_bib_entry
int nat64_add_del_static_bib_entry(ip6_address_t *in_addr, ip4_address_t *out_addr, u16 in_port, u16 out_port, u8 proto, u32 vrf_id, u8 is_add)
Add/delete static NAT64 BIB entry.
Definition: nat64.c:879
nat64_add_del_static_bib_command
static vlib_cli_command_t nat64_add_del_static_bib_command
(constructor) VLIB_CLI_COMMAND (nat64_add_del_static_bib_command)
Definition: nat64_cli.c:878
unformat_user
uword unformat_user(unformat_input_t *input, unformat_function_t *func,...)
Definition: unformat.c:989
end_addr
vl_api_address_t end_addr
Definition: ikev2_types.api:38
format_ip4_address
format_function_t format_ip4_address
Definition: format.h:73
fib_table_entry_update_one_path
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:814
unformat_line_input
unformat_function_t unformat_line_input
Definition: format.h:275
nat64_prefix_walk
void nat64_prefix_walk(nat64_prefix_walk_fn_t fn, void *ctx)
Walk NAT64 prefixes.
Definition: nat64.c:1256
nat64_main
nat64_main_t nat64_main
Definition: nat64.c:27
unformat_nat_protocol
unformat_function_t unformat_nat_protocol
Definition: nat64.h:507
nat64_prefix_t::prefix
ip6_address_t prefix
Definition: nat64.h:73
nat64_add_del_prefix_command_fn
static clib_error_t * nat64_add_del_prefix_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: nat64_cli.c:604
ip_proto_to_nat_proto
static nat_protocol_t ip_proto_to_nat_proto(u8 ip_proto)
Common NAT inline functions.
Definition: inlines.h:24
nat64_cli_prefix_walk
static int nat64_cli_prefix_walk(nat64_prefix_t *p, void *ctx)
Definition: nat64_cli.c:707
nat_protocol_t
nat_protocol_t
Definition: lib.h:63
clib_error_return
#define clib_error_return(e, args...)
Definition: error.h:99
nat64_add_del_pool_addr_command_fn
static clib_error_t * nat64_add_del_pool_addr_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: nat64_cli.c:70
u8
#define u8
Padding.
Definition: clib.h:121
nat64_add_interface_address_command
static vlib_cli_command_t nat64_add_interface_address_command
(constructor) VLIB_CLI_COMMAND (nat64_add_interface_address_command)
Definition: nat64_cli.c:981
vlib_cli_command_t::path
char * path
Definition: cli.h:96
fib_table.h
u16
unsigned short u16
Definition: types.h:57
show_nat64_bib_command
static vlib_cli_command_t show_nat64_bib_command
(constructor) VLIB_CLI_COMMAND (show_nat64_bib_command)
Definition: nat64_cli.c:905
nat64_add_pool_address_command
static vlib_cli_command_t nat64_add_pool_address_command
(constructor) VLIB_CLI_COMMAND (nat64_add_pool_address_command)
Definition: nat64_cli.c:813
fib_prefix_t_::fp_len
u16 fp_len
The mask length.
Definition: fib_types.h:206
vm
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
Definition: nat44_ei.c:3047
nat64_cli_interface_walk
static int nat64_cli_interface_walk(nat64_interface_t *i, void *ctx)
Definition: nat64_cli.c:297
nat64_db_st_walk
void nat64_db_st_walk(nat64_db_t *db, u8 proto, nat64_db_st_walk_fn_t fn, void *ctx)
Walk NAT64 session table.
Definition: nat64_db.c:341
nat64_cli_st_walk
static int nat64_cli_st_walk(nat64_db_st_entry_t *ste, void *arg)
Definition: nat64_cli.c:505
unformat_input_t
struct _unformat_input_t unformat_input_t
start_addr
vl_api_address_t start_addr
Definition: ikev2_types.api:37
nat64_add_interface_address_command_fn
static clib_error_t * nat64_add_interface_address_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: nat64_cli.c:729
nat64_address_t::addr
ip4_address_t addr
Definition: nat64.h:94
nat64_show_interfaces_command_fn
static clib_error_t * nat64_show_interfaces_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: nat64_cli.c:311
error
Definition: cJSON.c:88
nat64_plugin_enable_disable_command
static vlib_cli_command_t nat64_plugin_enable_disable_command
(constructor) VLIB_CLI_COMMAND (nat64_plugin_enable_disable_command)
Definition: nat64_cli.c:792
nat64_cli_st_walk_ctx_t_
Definition: nat64_cli.c:498
nat64_db_bib_walk
void nat64_db_bib_walk(nat64_db_t *db, u8 proto, nat64_db_bib_walk_fn_t fn, void *ctx)
Walk NAT64 BIB.
Definition: nat64_db.c:267
unformat
uword unformat(unformat_input_t *i, const char *fmt,...)
Definition: unformat.c:978
nat64_cli_st_walk_ctx_t_::vm
vlib_main_t * vm
Definition: nat64_cli.c:500
show_nat64_st_command
static vlib_cli_command_t show_nat64_st_command
(constructor) VLIB_CLI_COMMAND (show_nat64_st_command)
Definition: nat64_cli.c:933
foreach_nat_protocol
@ foreach_nat_protocol
Definition: lib.h:66
fib_table_t_
A protocol Independent FIB table.
Definition: fib_table.h:71
count
u8 count
Definition: dhcp.api:208
vec_len
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
Definition: vec_bootstrap.h:142
FIB_ROUTE_PATH_INTF_RX
@ FIB_ROUTE_PATH_INTF_RX
A path that result in received traffic being recieved/recirculated so that it appears to have arrived...
Definition: fib_types.h:361
nat64_add_del_prefix_command
static vlib_cli_command_t nat64_add_del_prefix_command
(constructor) VLIB_CLI_COMMAND (nat64_add_del_prefix_command)
Definition: nat64_cli.c:949
unformat_free
static void unformat_free(unformat_input_t *i)
Definition: format.h:155
nat64_plugin_enable
int nat64_plugin_enable(nat64_config_t c)
Definition: nat64.c:1516
vec_add1
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:606
NAT64_EXPECTED_ARGUMENT
#define NAT64_EXPECTED_ARGUMENT
Definition: nat64_cli.c:19
fib_table_entry_path_remove
void fib_table_entry_path_remove(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, 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_route_path_flags_t path_flags)
remove one path to an entry (aka route) in the FIB.
Definition: fib_table.c:731
vnet_get_main
vnet_main_t * vnet_get_main(void)
Definition: pnat_test_stubs.h:56
fib_table_t_::ft_table_id
u32 ft_table_id
Table ID (hash key) for this FIB.
Definition: fib_table.h:92
nat64_cli_st_walk_ctx_t_::db
nat64_db_t * db
Definition: nat64_cli.c:501
fib_table_find_or_create_and_lock
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:1165
unformat_check_input
static uword unformat_check_input(unformat_input_t *i)
Definition: format.h:163
nat_proto_to_ip_proto
static_always_inline u8 nat_proto_to_ip_proto(nat_protocol_t nat_proto)
Definition: inlines.h:37
FIB_ENTRY_FLAG_NONE
@ FIB_ENTRY_FLAG_NONE
Definition: fib_entry.h:112
c
svmdb_client_t * c
Definition: vpp_get_metrics.c:48
nat64_cli_st_walk_ctx_t
struct nat64_cli_st_walk_ctx_t_ nat64_cli_st_walk_ctx_t
nat64_pool_addr_walk
void nat64_pool_addr_walk(nat64_pool_addr_walk_fn_t fn, void *ctx)
Walk NAT64 pool.
Definition: nat64.c:440
nat64_interfaces_walk
void nat64_interfaces_walk(nat64_interface_walk_fn_t fn, void *ctx)
Walk NAT64 interfaces.
Definition: nat64.c:639
show_nat64_interfaces_command
static vlib_cli_command_t show_nat64_interfaces_command
(constructor) VLIB_CLI_COMMAND (show_nat64_interfaces_command)
Definition: nat64_cli.c:863
i
sll srl srl sll sra u16x4 i
Definition: vector_sse42.h:261
format_unformat_error
u8 * format_unformat_error(u8 *s, va_list *va)
Definition: unformat.c:91
VLIB_CLI_COMMAND
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:163
ip4_address_t
Definition: ip4_packet.h:50
nat64_interface_is_inside
#define nat64_interface_is_inside(i)
Check if NAT64 interface is inside.
Definition: nat64.h:483
nat64_cli_bib_walk
static int nat64_cli_bib_walk(nat64_db_bib_entry_t *bibe, void *ctx)
Definition: nat64_cli.c:422
vlib_cli_output
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
Definition: cli.c:716
nat64_prefix_t::plen
u8 plen
Definition: nat64.h:74
nat64_interface_is_outside
#define nat64_interface_is_outside(i)
Check if NAT64 interface is outside.
Definition: nat64.h:489
nat64_show_bib_command_fn
static clib_error_t * nat64_show_bib_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: nat64_cli.c:456
nat44_ei_main_s::fib_src_hi
fib_source_t fib_src_hi
Definition: nat44_ei.h:459
nat64_show_st_command_fn
static clib_error_t * nat64_show_st_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: nat64_cli.c:556
increment_v4_address
static void increment_v4_address(ip4_address_t *a)
Definition: nat_inlines.h:23
nat64_add_del_static_bib_command_fn
static clib_error_t * nat64_add_del_static_bib_command_fn(vlib_main_t *vm, unformat_input_t() *input, vlib_cli_command_t *cmd)
Definition: nat64_cli.c:322
nat64.h
vnet_main_t
Definition: vnet.h:76
vec_free
#define vec_free(V)
Free vector's memory (no header).
Definition: vec.h:395
show_nat64_prefix_command
static vlib_cli_command_t show_nat64_prefix_command
(constructor) VLIB_CLI_COMMAND (show_nat64_prefix_command)
Definition: nat64_cli.c:967
nat64_config_t
Definition: nat64_db.h:25
nat64_add_del_pool_addr
int nat64_add_del_pool_addr(u32 thread_index, ip4_address_t *addr, u32 vrf_id, u8 is_add)
Add/delete address to NAT64 pool.
Definition: nat64.c:364
format_nat_protocol
format_function_t format_nat_protocol
Definition: nat64.h:506
format_vnet_sw_if_index_name
format_function_t format_vnet_sw_if_index_name
Definition: interface_funcs.h:455
nat64_prefix_t
Definition: nat64.h:71
unformat_vnet_sw_interface
unformat_function_t unformat_vnet_sw_interface
Definition: interface_funcs.h:459
nat64_main_t
Definition: nat64.h:112
fib_table_get
fib_table_t * fib_table_get(fib_node_index_t index, fib_protocol_t proto)
Get a pointer to a FIB table.
Definition: fib_table.c:29
DPO_PROTO_IP6
@ DPO_PROTO_IP6
Definition: dpo.h:65
nat64_show_pool_command_fn
static clib_error_t * nat64_show_pool_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: nat64_cli.c:172
u32
unsigned int u32
Definition: types.h:88
nat64_prefix_t::vrf_id
u32 vrf_id
Definition: nat64.h:75
protocol
vl_api_ip_proto_t protocol
Definition: lb_types.api:72
FIB_PROTOCOL_IP6
@ FIB_PROTOCOL_IP6
Definition: fib_types.h:37
ctx
long ctx[MAX_CONNS]
Definition: main.c:144
nat64_show_prefix_command_fn
static clib_error_t * nat64_show_prefix_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: nat64_cli.c:718
vec_foreach
#define vec_foreach(var, vec)
Vector iterator.
Definition: vec_bootstrap.h:213
set_interface_nat64_command
static vlib_cli_command_t set_interface_nat64_command
(constructor) VLIB_CLI_COMMAND (set_interface_nat64_command)
Definition: nat64_cli.c:846
nm
nat44_ei_main_t * nm
Definition: nat44_ei_hairpinning.c:413
nat64_cli_pool_walk
static int nat64_cli_pool_walk(nat64_address_t *ap, void *ctx)
Definition: nat64_cli.c:148
vlib_main_t
Definition: main.h:102
nat64_interface_feature_command_fn
static clib_error_t * nat64_interface_feature_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: nat64_cli.c:183
u8
unsigned char u8
Definition: types.h:56
clib_error_t
Definition: clib_error.h:21
format_ip6_address
format_function_t format_ip6_address
Definition: format.h:91
fib_table_unlock
void fib_table_unlock(u32 fib_index, fib_protocol_t proto, fib_source_t source)
Take a reference counting lock on the table.
Definition: fib_table.c:1336
unformat_ip6_address
unformat_function_t unformat_ip6_address
Definition: format.h:89
rv
int __clib_unused rv
Definition: application.c:491
unformat_ip4_address
unformat_function_t unformat_ip4_address
Definition: format.h:68
vrf_id
u32 vrf_id
Definition: nat44_ed.api:1053
nat64_plugin_enable_disable_command_fn
static clib_error_t * nat64_plugin_enable_disable_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: nat64_cli.c:22
nat64_db_bib_entry_by_index
nat64_db_bib_entry_t * nat64_db_bib_entry_by_index(nat64_db_t *db, u8 proto, u32 bibe_index)
Get BIB entry by index and protocol.
Definition: nat64_db.c:318
nat64_interface_t
Definition: nat64.h:106
nat64_add_interface_address
int nat64_add_interface_address(u32 sw_if_index, int is_add)
NAT64 pool address from specific (DHCP addressed) interface.
Definition: nat64.c:455
proto
vl_api_ip_proto_t proto
Definition: acl_types.api:51
nat64_address_t::fib_index
u32 fib_index
Definition: nat64.h:95
vlib_cli_command_t
Definition: cli.h:92
nat64_plugin_disable
int nat64_plugin_disable()
Definition: nat64.c:1553
fib_table_find
u32 fib_table_find(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
Definition: fib_table.c:1106
sw_if_index
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:34
nat64_interface_add_del
int nat64_interface_add_del(u32 sw_if_index, u8 is_inside, u8 is_add)
Enable/disable NAT64 feature on the interface.
Definition: nat64.c:538
show_nat64_pool_command
static vlib_cli_command_t show_nat64_pool_command
(constructor) VLIB_CLI_COMMAND (show_nat64_pool_command)
Definition: nat64_cli.c:830
fib_prefix_t_
Aggregate type for a prefix.
Definition: fib_types.h:202
nat64_db_s
Definition: nat64_db.h:142
UNFORMAT_END_OF_INPUT
#define UNFORMAT_END_OF_INPUT
Definition: format.h:137
prefix
vl_api_prefix_t prefix
Definition: ip.api:146
nat64_address_t
Definition: nat64.h:92