62 case VNET_API_ERROR_INVALID_WORKER:
65 case VNET_API_ERROR_FEATURE_DISABLED:
67 "Supported only if 2 or more workes available.");
120 if (
unformat (line_input,
"domain %d", &domain_id))
122 else if (
unformat (line_input,
"src-port %d", &src_port))
124 else if (
unformat (line_input,
"disable"))
155 u32 psid, psid_offset, psid_length;
163 if (
unformat (line_input,
"default"))
167 (line_input,
"map-e psid %d psid-offset %d psid-len %d", &psid,
168 &psid_offset, &psid_length))
192 u32 start_host_order, end_host_order;
206 if (
unformat (line_input,
"%U - %U",
210 else if (
unformat (line_input,
"tenant-vrf %u", &vrf_id))
213 end_addr = start_addr;
214 else if (
unformat (line_input,
"twice-nat"))
216 else if (
unformat (line_input,
"del"))
232 start_host_order = clib_host_to_net_u32 (start_addr.
as_u32);
233 end_host_order = clib_host_to_net_u32 (end_addr.
as_u32);
235 if (end_host_order < start_host_order)
241 count = (end_host_order - start_host_order) + 1;
248 this_addr = start_addr;
250 for (i = 0; i <
count; i++)
259 case VNET_API_ERROR_NO_SUCH_ENTRY:
262 case VNET_API_ERROR_UNSPECIFIED:
299 #define _(N, i, n, s) \ 300 vlib_cli_output (vm, " %d busy %s ports", ap->busy_##n##_ports, s); 313 #define _(N, i, n, s) \ 314 vlib_cli_output (vm, " %d busy %s ports", ap->busy_##n##_ports, s); 330 u32 *inside_sw_if_indices = 0;
331 u32 *outside_sw_if_indices = 0;
332 u8 is_output_feature = 0;
346 vec_add1 (inside_sw_if_indices, sw_if_index);
349 vec_add1 (outside_sw_if_indices, sw_if_index);
350 else if (
unformat (line_input,
"output-feature"))
351 is_output_feature = 1;
352 else if (
unformat (line_input,
"del"))
362 if (
vec_len (inside_sw_if_indices))
364 for (i = 0; i <
vec_len (inside_sw_if_indices); i++)
366 sw_if_index = inside_sw_if_indices[
i];
367 if (is_output_feature)
370 (sw_if_index, 1, is_del))
373 is_del ?
"del" :
"add",
384 is_del ?
"del" :
"add",
393 if (
vec_len (outside_sw_if_indices))
395 for (i = 0; i <
vec_len (outside_sw_if_indices); i++)
397 sw_if_index = outside_sw_if_indices[
i];
398 if (is_output_feature)
401 (sw_if_index, 0, is_del))
404 is_del ?
"del" :
"add",
415 is_del ?
"del" :
"add",
444 vlib_cli_output (vm,
" %U %s", format_vnet_sw_if_index_name, vnm,
446 (nat_interface_is_inside(i) &&
447 nat_interface_is_outside(i)) ?
"in out" :
448 (nat_interface_is_inside(i) ?
"in" :
"out"));
453 vlib_cli_output (vm,
" %U output-feature %s",
454 format_vnet_sw_if_index_name, vnm,
456 (nat_interface_is_inside(i) &&
457 nat_interface_is_outside(i)) ?
"in out" :
458 (nat_interface_is_inside(i) ?
"in" :
"out"));
473 u32 l_port = 0, e_port = 0, vrf_id = ~0;
476 u32 sw_if_index = ~0;
502 else if (
unformat (line_input,
"external %U %u",
507 else if (
unformat (line_input,
"external %U",
510 else if (
unformat (line_input,
"vrf %u", &vrf_id))
514 else if (
unformat (line_input,
"twice-nat"))
516 else if (
unformat (line_input,
"out2in-only"))
518 else if (
unformat (line_input,
"del"))
528 if (twice_nat && addr_only)
534 if (!addr_only && !proto_set)
541 vrf_id, addr_only, sw_if_index, proto, is_add,
542 twice_nat, out2in_only, 0);
546 case VNET_API_ERROR_INVALID_VALUE:
549 case VNET_API_ERROR_NO_SUCH_ENTRY:
555 case VNET_API_ERROR_NO_SUCH_FIB:
558 case VNET_API_ERROR_VALUE_EXIST:
579 u32 port = 0, vrf_id = ~0;
582 u32 sw_if_index = ~0;
597 else if (
unformat (line_input,
"external %U",
600 else if (
unformat (line_input,
"vrf %u", &vrf_id))
605 else if (
unformat (line_input,
"del"))
616 vrf_id, addr_only, sw_if_index, proto, is_add,
621 case VNET_API_ERROR_INVALID_VALUE:
624 case VNET_API_ERROR_NO_SUCH_ENTRY:
630 case VNET_API_ERROR_NO_SUCH_FIB:
633 case VNET_API_ERROR_VALUE_EXIST:
654 u32 l_port = 0, e_port = 0, vrf_id = 0, probability = 0;
669 if (
unformat (line_input,
"local %U:%u probability %u",
672 memset (&local, 0,
sizeof (local));
674 local.port = (
u16) l_port;
675 local.probability = (
u8) probability;
681 else if (
unformat (line_input,
"vrf %u", &vrf_id))
686 else if (
unformat (line_input,
"twice-nat"))
688 else if (
unformat (line_input,
"out2in-only"))
690 else if (
unformat (line_input,
"del"))
713 locals, is_add, twice_nat,
718 case VNET_API_ERROR_INVALID_VALUE:
721 case VNET_API_ERROR_NO_SUCH_ENTRY:
727 case VNET_API_ERROR_VALUE_EXIST:
754 vlib_cli_output (vm,
" %U", format_snat_static_mapping, m);
785 else if (
unformat (line_input,
"twice-nat"))
787 else if (
unformat (line_input,
"del"))
865 vlib_cli_output (vm,
" %U", format_snat_user, tsm, u, verbose);
897 else if (
unformat (line_input,
"in"))
902 else if (
unformat (line_input,
"vrf %u", &vrf_id))
937 u8 forwarding_enable;
938 u8 forwarding_enable_set = 0;
947 if (!forwarding_enable_set &&
unformat (line_input,
"enable"))
949 forwarding_enable = 1;
950 forwarding_enable_set = 1;
952 else if (!forwarding_enable_set &&
unformat (line_input,
"disable"))
954 forwarding_enable = 0;
955 forwarding_enable_set = 1;
965 if (!forwarding_enable_set)
986 u32 in_plen, out_plen;
1004 else if (
unformat (line_input,
"del"))
1041 vlib_cli_output (vm,
" in %U/%d out %U/%d\n",
1042 format_ip4_address, &dm->in_addr, dm->in_plen,
1043 format_ip4_address, &dm->out_addr, dm->out_plen);
1044 vlib_cli_output (vm,
" outside address sharing ratio: %d\n",
1046 vlib_cli_output (vm,
" number of ports per inside host: %d\n",
1047 dm->ports_per_host);
1048 vlib_cli_output (vm,
" sessions number: %d\n", dm->ses_num);
1128 if (out_port < 1024 || out_port > 65535)
1165 else if (
unformat (line_input,
"tcp-established %u",
1168 else if (
unformat (line_input,
"tcp-transitory %u",
1173 else if (
unformat (line_input,
"reset"))
1225 vec_foreach_index (i, dm->sessions)
1227 ses = vec_elt_at_index (dm->sessions, i);
1229 vlib_cli_output (vm,
" %U", format_det_map_ses, dm, ses, &i);
1244 u32 out_port, ext_port;
1256 if (
unformat (line_input,
"%U:%d %U:%d",
1300 u32 in_port, ext_port;
1312 if (
unformat (line_input,
"%U:%d %U:%d",
1356 .path =
"set nat workers",
1358 .short_help =
"set nat workers <workers-list>",
1372 .path =
"show nat workers",
1373 .short_help =
"show nat workers",
1387 .path =
"nat ipfix logging",
1389 .short_help =
"nat ipfix logging [domain <domain-id>] [src-port <port>] [disable]",
1403 .path =
"nat addr-port-assignment-alg",
1404 .short_help =
"nat addr-port-assignment-alg <alg-name> [<alg-params>]",
1420 .path =
"nat44 add address",
1421 .short_help =
"nat44 add address <ip4-range-start> [- <ip4-range-end>] " 1422 "[tenant-vrf <vrf-id>] [twice-nat] [del]",
1451 .path =
"show nat44 addresses",
1452 .short_help =
"show nat44 addresses",
1467 .path =
"set interface nat44",
1469 .short_help =
"set interface nat44 in <intfc> out <intfc> [output-feature] " 1484 .path =
"show nat44 interfaces",
1485 .short_help =
"show nat44 interfaces",
1504 .path =
"nat44 add static mapping",
1507 "nat44 add static mapping tcp|udp|icmp local <addr> [<port>] " 1508 "external <addr> [<port>] [vrf <table-id>] [twice-nat] [out2in-only] [del]",
1525 .path =
"nat44 add identity mapping",
1527 .short_help =
"nat44 add identity mapping <interface>|<ip4-addr> " 1528 "[<protocol> <port>] [vrf <table-id>] [del]",
1542 .path =
"nat44 add load-balancing static mapping",
1545 "nat44 add load-balancing static mapping protocol tcp|udp " 1546 "external <addr>:<port> local <addr>:<port> probability <n> [twice-nat] " 1547 "[vrf <table-id>] [out2in-only] [del]",
1566 .path =
"show nat44 static mappings",
1567 .short_help =
"show nat44 static mappings",
1580 .path =
"nat44 add interface address",
1581 .short_help =
"nat44 add interface address <interface> [twice-nat] [del]",
1597 .path =
"show nat44 interface address",
1598 .short_help =
"show nat44 interface address",
1609 .path =
"show nat44 sessions",
1610 .short_help =
"show nat44 sessions [detail]",
1624 .path =
"nat44 del session",
1625 .short_help =
"nat44 del session in|out <addr>:<port> tcp|udp|icmp [vrf <id>]",
1642 .path =
"nat44 forwarding",
1643 .short_help =
"nat44 forwarding enable|disable",
1659 .path =
"nat44 deterministic add",
1660 .short_help =
"nat44 deterministic add in <addr>/<plen> out <addr>/<plen> [del]",
1677 .path =
"show nat44 deterministic mappings",
1678 .short_help =
"show nat44 deterministic mappings",
1693 .path =
"nat44 deterministic forward",
1694 .short_help =
"nat44 deterministic forward <addr>",
1708 .path =
"nat44 deterministic reverse",
1709 .short_help =
"nat44 deterministic reverse <addr>:<port>",
1724 .path =
"set nat44 deterministic timeout",
1727 "set nat44 deterministic timeout [udp <sec> | tcp-established <sec> " 1728 "tcp-transitory <sec> | icmp <sec> | reset]",
1743 .path =
"show nat44 deterministic timeouts",
1744 .short_help =
"show nat44 deterministic timeouts",
1760 .path =
"show nat44 deterministic sessions",
1761 .short_help =
"show nat44 deterministic sessions",
1774 .path =
"nat44 deterministic close session out",
1775 .short_help =
"nat44 deterministic close session out " 1776 "<out_addr>:<out_port> <ext_addr>:<ext_port>",
1789 .path =
"nat44 deterministic close session in",
1790 .short_help =
"nat44 deterministic close session in " 1791 "<in_addr>:<in_port> <ext_addr>:<ext_port>",
static clib_error_t * add_address_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * snat_det_reverse_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define vec_foreach_index(var, v)
Iterate over vector indices.
static clib_error_t * nat44_show_sessions_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
int snat_del_address(snat_main_t *sm, ip4_address_t addr, u8 delete_sm, u8 twice_nat)
vnet_main_t * vnet_get_main(void)
#define SNAT_TCP_ESTABLISHED_TIMEOUT
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
static void snat_det_ses_close(snat_det_map_t *dm, snat_det_session_t *ses)
static 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)
static void snat_det_forward(snat_det_map_t *dm, ip4_address_t *in_addr, ip4_address_t *out_addr, u16 *lo_port)
unformat_function_t unformat_vnet_sw_interface
snat_det_map_t * det_maps
static clib_error_t * add_identity_mapping_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static void snat_det_reverse(snat_det_map_t *dm, ip4_address_t *out_addr, u16 out_port, ip4_address_t *in_addr)
static clib_error_t * snat_det_close_session_out_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
format_function_t format_vnet_sw_if_index_name
int snat_interface_add_del(u32 sw_if_index, u8 is_inside, int is_del)
int nat44_add_del_lb_static_mapping(ip4_address_t e_addr, u16 e_port, snat_protocol_t proto, u32 vrf_id, nat44_lb_addr_port_t *locals, u8 is_add, u8 twice_nat, u8 out2in_only, u8 *tag)
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
static clib_error_t * snat_det_map_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
ip4_address_t ext_host_addr
static clib_error_t * snat_det_close_session_in_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * snat_det_forward_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
#define clib_error_return(e, args...)
int snat_ipfix_logging_enable_disable(int enable, u32 domain_id, u16 src_port)
Enable/disable NAT plugin IPFIX logging.
static clib_error_t * nat44_set_alloc_addr_and_port_alg_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
u32 * auto_add_sw_if_indices_twice_nat
vlib_worker_thread_t * vlib_worker_threads
static clib_error_t * nat44_show_addresses_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static snat_det_map_t * snat_det_map_by_out(snat_main_t *sm, ip4_address_t *out_addr)
static clib_error_t * snat_forwarding_set_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * nat44_det_show_sessions_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
snat_static_mapping_t * static_mappings
static clib_error_t * snat_feature_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
int snat_add_static_mapping(ip4_address_t l_addr, ip4_address_t e_addr, u16 l_port, u16 e_port, u32 vrf_id, int addr_only, u32 sw_if_index, snat_protocol_t proto, int is_add, u8 twice_nat, u8 out2in_only, u8 *tag)
Add static mapping.
void nat_set_alloc_addr_and_port_default(void)
static clib_error_t * nat44_det_show_timeouts_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
snat_interface_t * output_feature_interfaces
static clib_error_t * add_lb_static_mapping_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * snat_ipfix_logging_enable_disable_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
u32 ft_table_id
Table ID (hash key) for this FIB.
static clib_error_t * nat_show_workers_commnad_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * nat44_show_interfaces_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
void nat44_add_del_address_dpo(ip4_address_t addr, u8 is_add)
#define vec_free(V)
Free vector's memory (no header).
deterministic NAT definitions
format_function_t format_snat_static_map_to_resolve
#define clib_warning(format, args...)
int snat_interface_add_del_output_feature(u32 sw_if_index, u8 is_inside, int is_del)
static clib_error_t * set_timeout_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
u32 tcp_transitory_timeout
int snat_det_add_map(snat_main_t *sm, ip4_address_t *in_addr, u8 in_plen, ip4_address_t *out_addr, u8 out_plen, int is_add)
Add/delete deterministic NAT mapping.
#define VLIB_CLI_COMMAND(x,...)
u32 * auto_add_sw_if_indices
static snat_det_map_t * snat_det_map_by_user(snat_main_t *sm, ip4_address_t *user_addr)
static clib_error_t * add_static_mapping_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define clib_bitmap_free(v)
Free a bitmap.
int nat44_del_session(snat_main_t *sm, ip4_address_t *addr, u16 port, snat_protocol_t proto, u32 vrf_id, int is_in)
snat_address_t * twice_nat_addresses
static clib_error_t * nat44_del_session_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
void increment_v4_address(ip4_address_t *a)
void snat_add_address(snat_main_t *sm, ip4_address_t *addr, u32 vrf_id, u8 twice_nat)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static uword unformat_bitmap_list(unformat_input_t *input, va_list *va)
unformat a list of bit ranges into a bitmap (eg "0-3,5-7,11" )
static clib_error_t * snat_add_interface_address_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
snat_main_per_thread_data_t * per_thread_data
fib_table_t * fib_table_get(fib_node_index_t index, fib_protocol_t proto)
Get a pointer to a FIB table.
snat_address_t * addresses
int snat_add_interface_address(snat_main_t *sm, u32 sw_if_index, int is_del, u8 twice_nat)
static clib_error_t * nat44_show_interface_address_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * nat44_show_static_mappings_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define SNAT_ICMP_TIMEOUT
uword unformat_snat_protocol(unformat_input_t *input, va_list *args)
static snat_det_session_t * snat_det_get_ses_by_out(snat_det_map_t *dm, ip4_address_t *in_addr, u64 out_key)
snat_static_map_resolve_t * to_resolve
#define vec_foreach(var, vec)
Vector iterator.
int snat_set_workers(uword *bitmap)
void nat_set_alloc_addr_and_port_mape(u16 psid, u16 psid_offset, u16 psid_length)
#define SNAT_TCP_TRANSITORY_TIMEOUT
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
static clib_error_t * nat44_det_show_mappings_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * set_workers_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
snat_interface_t * interfaces
u32 tcp_established_timeout