25 u8 enable = 0, is_set = 0;
34 if (!is_set &&
unformat (line_input,
"enable"))
42 else if (!is_set &&
unformat (line_input,
"disable"));
74 u32 start_host_order, end_host_order;
90 else if (
unformat (line_input,
"tenant-vrf %u", &vrf_id))
94 else if (
unformat (line_input,
"del"))
104 start_host_order = clib_host_to_net_u32 (start_addr.
as_u32);
105 end_host_order = clib_host_to_net_u32 (end_addr.
as_u32);
107 if (end_host_order < start_host_order)
113 count = (end_host_order - start_host_order) + 1;
116 for (i = 0; i <
count; i++)
122 case VNET_API_ERROR_NO_SUCH_ENTRY:
127 case VNET_API_ERROR_VALUE_EXIST:
162 #define _(N, i, n, s) \ 163 vlib_cli_output (vm, " %d busy %s ports", ap->busy_##n##_ports, s); 189 u32 *inside_sw_if_indices = 0;
190 u32 *outside_sw_if_indices = 0;
202 vec_add1 (inside_sw_if_indices, sw_if_index);
205 vec_add1 (outside_sw_if_indices, sw_if_index);
206 else if (
unformat (line_input,
"del"))
216 if (
vec_len (inside_sw_if_indices))
218 for (i = 0; i <
vec_len (inside_sw_if_indices); i++)
220 sw_if_index = inside_sw_if_indices[
i];
224 case VNET_API_ERROR_NO_SUCH_ENTRY:
230 case VNET_API_ERROR_VALUE_EXIST:
236 case VNET_API_ERROR_INVALID_VALUE:
237 case VNET_API_ERROR_INVALID_VALUE_2:
240 "%U NAT64 feature enable/disable failed.",
251 if (
vec_len (outside_sw_if_indices))
253 for (i = 0; i <
vec_len (outside_sw_if_indices); i++)
255 sw_if_index = outside_sw_if_indices[
i];
259 case VNET_API_ERROR_NO_SUCH_ENTRY:
265 case VNET_API_ERROR_VALUE_EXIST:
271 case VNET_API_ERROR_INVALID_VALUE:
272 case VNET_API_ERROR_INVALID_VALUE_2:
275 "%U NAT64 feature enable/disable failed.",
328 ip6_address_t in_addr;
346 &out_addr, &out_port))
348 else if (
unformat (line_input,
"vrf %u", &vrf_id))
357 else if (
unformat (line_input,
"del"))
388 (
u16) out_port, p, vrf_id, is_add);
392 case VNET_API_ERROR_NO_SUCH_ENTRY:
395 case VNET_API_ERROR_VALUE_EXIST:
398 case VNET_API_ERROR_UNSPECIFIED:
401 case VNET_API_ERROR_INVALID_VALUE:
404 "Outside address %U and port %u already in use.",
407 case VNET_API_ERROR_INVALID_VALUE_2:
431 case IP_PROTOCOL_ICMP:
432 case IP_PROTOCOL_TCP:
433 case IP_PROTOCOL_UDP:
436 clib_net_to_host_u16 (bibe->in_port),
438 clib_net_to_host_u16 (bibe->out_port),
441 bibe->is_static ?
"static" :
"dynamic", bibe->ses_num);
448 bibe->is_static ?
"static" :
"dynamic", bibe->ses_num);
469 else if (
unformat (line_input,
"unknown"))
471 else if (
unformat (line_input,
"all"))
507 nat64_db_bib_entry_t *bibe;
520 if (ste->proto == IP_PROTOCOL_ICMP)
524 clib_net_to_host_u16 (bibe->in_port),
527 clib_net_to_host_u16 (bibe->out_port),
530 else if (ste->proto == IP_PROTOCOL_TCP || ste->proto == IP_PROTOCOL_UDP)
533 clib_net_to_host_u16 (bibe->in_port),
535 clib_net_to_host_u16 (ste->r_port),
537 clib_net_to_host_u16 (bibe->out_port),
539 clib_net_to_host_u16 (ste->r_port),
548 bibe->proto, vrf_id);
572 else if (
unformat (line_input,
"unknown"))
574 else if (
unformat (line_input,
"all"))
623 else if (
unformat (line_input,
"tenant-vrf %u", &vrf_id))
625 else if (
unformat (line_input,
"del"))
650 case VNET_API_ERROR_NO_SUCH_ENTRY:
653 case VNET_API_ERROR_INVALID_VALUE:
746 else if (
unformat (line_input,
"del"))
760 case VNET_API_ERROR_NO_SUCH_ENTRY:
763 case VNET_API_ERROR_VALUE_EXIST:
792 .path =
"nat64 plugin",
793 .short_help =
"nat64 plugin <enable " 794 "[bib-buckets <count>] [bib-memory <size>] " 795 "[st-buckets <count>] [st-memory <size>] | disable>",
812 .path =
"nat64 add pool address",
813 .short_help =
"nat64 add pool address <ip4-range-start> [- <ip4-range-end>] " 814 "[tenant-vrf <vrf-id>] [del]",
829 .path =
"show nat64 pool",
830 .short_help =
"show nat64 pool",
845 .path =
"set interface nat64",
846 .short_help =
"set interface nat64 in|out <intfc> [del]",
862 .path =
"show nat64 interfaces",
863 .short_help =
"show nat64 interfaces",
877 .path =
"nat64 add static bib",
878 .short_help =
"nat64 add static bib <ip6-addr> <port> <ip4-addr> <port> " 879 "tcp|udp|icmp [vfr <table-id>] [del]",
904 .path =
"show nat64 bib",
905 .short_help =
"show nat64 bib all|tcp|udp|icmp|unknown",
932 .path =
"show nat64 session table",
933 .short_help =
"show nat64 session table all|tcp|udp|icmp|unknown",
948 .path =
"nat64 add prefix",
949 .short_help =
"nat64 add prefix <ip6-prefix>/<plen> [tenant-vrf <vrf-id>] " 950 "[del] [interface <interface]",
966 .path =
"show nat64 prefix",
967 .short_help =
"show nat64 prefix",
980 .path =
"nat64 add interface address",
981 .short_help =
"nat64 add interface address <interface> [del]",
static int nat64_cli_pool_walk(nat64_address_t *ap, void *ctx)
vl_api_address_t end_addr
static clib_error_t * nat64_show_bib_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
nat64_db_t * db
BIB and session DB per thread.
vnet_main_t * vnet_get_main(void)
vl_api_ip_proto_t protocol
vl_api_address_t start_addr
format_function_t format_nat_protocol
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
#define nat64_interface_is_inside(i)
Check if NAT64 interface is inside.
unformat_function_t unformat_vnet_sw_interface
A path that result in received traffic being recieved/recirculated so that it appears to have arrived...
int nat64_add_interface_address(u32 sw_if_index, int is_add)
NAT64 pool address from specific (DHCP addressed) interface.
format_function_t format_vnet_sw_if_index_name
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.
static clib_error_t * nat64_add_del_pool_addr_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * nat64_add_del_static_bib_command_fn(vlib_main_t *vm, unformat_input_t() *input, vlib_cli_command_t *cmd)
static nat_protocol_t ip_proto_to_nat_proto(u8 ip_proto)
Common NAT inline functions.
Aggregate type for a prefix.
#define clib_error_return(e, args...)
static int nat64_cli_bib_walk(nat64_db_bib_entry_t *bibe, void *ctx)
static clib_error_t * nat64_add_interface_address_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
u32 fib_table_find(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
u16 fp_len
The mask length.
static clib_error_t * nat64_show_pool_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
void fib_table_unlock(u32 fib_index, fib_protocol_t proto, fib_source_t source)
Take a reference counting lock on the table.
struct nat64_cli_st_walk_ctx_t_ nat64_cli_st_walk_ctx_t
void nat64_pool_addr_walk(nat64_pool_addr_walk_fn_t fn, void *ctx)
Walk NAT64 pool.
u32 ft_table_id
Table ID (hash key) for this FIB.
sll srl srl sll sra u16x4 i
#define vec_free(V)
Free vector's memory (no header).
int nat64_add_del_prefix(ip6_address_t *prefix, u8 plen, u32 vrf_id, u8 is_add)
Add/delete NAT64 prefix.
static clib_error_t * nat64_plugin_enable_disable_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static void increment_v4_address(ip4_address_t *a)
#define VLIB_CLI_COMMAND(x,...)
#define nat64_interface_is_outside(i)
Check if NAT64 interface is outside.
unformat_function_t unformat_nat_protocol
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
void nat64_db_st_walk(nat64_db_t *db, u8 proto, nat64_db_st_walk_fn_t fn, void *ctx)
Walk NAT64 session table.
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.
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.
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.
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.
void nat64_prefix_walk(nat64_prefix_walk_fn_t fn, void *ctx)
Walk NAT64 prefixes.
static int nat64_cli_interface_walk(nat64_interface_t *i, void *ctx)
void nat64_interfaces_walk(nat64_interface_walk_fn_t fn, void *ctx)
Walk NAT64 interfaces.
static clib_error_t * nat64_interface_feature_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static_always_inline u8 nat_proto_to_ip_proto(nat_protocol_t nat_proto)
static int nat64_cli_st_walk(nat64_db_st_entry_t *ste, void *arg)
int nat64_plugin_disable()
int nat64_interface_add_del(u32 sw_if_index, u8 is_inside, u8 is_add)
Enable/disable NAT64 feature on the interface.
fib_table_t * fib_table_get(fib_node_index_t index, fib_protocol_t proto)
Get a pointer to a FIB table.
static clib_error_t * nat64_show_st_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
int nat64_plugin_enable(nat64_config_t c)
#define vec_foreach(var, vec)
Vector iterator.
static clib_error_t * nat64_add_del_prefix_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static int nat64_cli_prefix_walk(nat64_prefix_t *p, void *ctx)
static clib_error_t * nat64_show_prefix_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
void nat64_db_bib_walk(nat64_db_t *db, u8 proto, nat64_db_bib_walk_fn_t fn, void *ctx)
Walk NAT64 BIB.
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.
vl_api_interface_index_t sw_if_index
static clib_error_t * nat64_show_interfaces_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
A protocol Independent FIB table.