74 (ip->
protocol == IP_PROTOCOL_UDP))) {
77 }
else if (ip->
protocol == IP_PROTOCOL_ICMP) {
78 icmp46_header_t *icmp = (
void *)(ip + 1);
79 if (icmp->type == ICMP4_echo_request ||
80 icmp->type == ICMP4_echo_reply) {
81 return *((
u16 *)(icmp + 1));
82 }
else if (clib_net_to_host_u16(ip->
length) >= 64) {
85 (ip->
protocol == IP_PROTOCOL_UDP))) {
88 }
else if (ip->
protocol == IP_PROTOCOL_ICMP) {
89 icmp46_header_t *icmp = (
void *)(ip + 1);
90 if (icmp->type == ICMP4_echo_request ||
91 icmp->type == ICMP4_echo_reply) {
92 return *((
u16 *)(icmp + 1));
108 if (
ip6_parse(ip6, buffer_len, &l4_protocol, &l4_offset, &frag_offset))
118 if (l4_protocol == IP_PROTOCOL_TCP ||
119 l4_protocol == IP_PROTOCOL_UDP) {
121 }
else if (l4_protocol == IP_PROTOCOL_ICMP6) {
122 icmp46_header_t *icmp = (icmp46_header_t *)(l4);
123 if (icmp->type == ICMP6_echo_request) {
125 }
else if (icmp->type == ICMP6_echo_reply) {
143 u32 *map_domain_index,
158 if (ea_bits_len > 0 && (ip6_prefix_len + ea_bits_len) > 64)
163 if (ip6_src_len != 96) {
164 clib_warning(
"MAP-T only supports ip6_src_len = 96 for now.");
168 if (ip6_src_len != 128) {
169 clib_warning(
"MAP-E requires a BR address, not a prefix (ip6_src_len should be 128).");
176 memset(d, 0,
sizeof (*d));
177 *map_domain_index = d - mm->
domains;
193 if (ip4_prefix_len + ea_bits_len < 32) {
195 suffix_len = d->
suffix_shift = 32 - ip4_prefix_len - ea_bits_len;
198 suffix_len = 32 - ip4_prefix_len;
202 d->
psid_shift = 16 - psid_length - psid_offset;
207 memset(&adj, 0,
sizeof(adj));
210 p = (
uword *)&adj.rewrite_data[0];
211 *p = (
uword) (*map_domain_index);
220 memset(&args4, 0,
sizeof(args4));
243 p = (
uword *)&adj6->rewrite_data[0];
250 memset(&args6, 0,
sizeof(args6));
293 clib_warning(
"MAP domain delete: domain does not exist: %d", map_domain_index);
299 memset(&adj, 0,
sizeof(adj));
304 memset(&args4, 0,
sizeof(args4));
323 memset(&args6, 0,
sizeof (args6));
353 clib_warning(
"MAP rule: domain does not exist: %d", map_domain_index);
365 if (!d->
rules)
return -1;
366 memset(d->
rules, 0, l);
375 d->
rules[psid] = *tep;
382 #ifdef MAP_SKIP_IP6_LOOKUP 415 else if (
unformat(line_input,
"on"))
439 else if (
unformat(line_input,
"on"))
458 u32 ip6_prefix_len, ip4_prefix_len, map_domain_index, ip6_src_len;
461 u32 ea_bits_len, psid_offset = 0, psid_length = 0;
479 else if (
unformat(line_input,
"ea-bits-len %d", &ea_bits_len))
481 else if (
unformat(line_input,
"psid-offset %d", &psid_offset))
483 else if (
unformat(line_input,
"psid-len %d", &psid_length))
485 else if (
unformat(line_input,
"mtu %d", &mtu))
487 else if (
unformat(line_input,
"map-t"))
499 &ip6_prefix, ip6_prefix_len, &ip6_src, ip6_src_len,
500 ea_bits_len, psid_offset, psid_length, &map_domain_index,
513 u32 map_domain_index;
520 if (
unformat(line_input,
"index %d", &map_domain_index))
544 u32 psid, map_domain_index;
551 if (
unformat(line_input,
"index %d", &map_domain_index))
553 else if (
unformat(line_input,
"psid %d", &psid))
572 #if MAP_SKIP_IP6_LOOKUP 583 memset(&ip4nh, 0,
sizeof(ip4nh));
584 memset(&ip6nh, 0,
sizeof(ip6nh));
651 else if (
unformat(line_input,
"off"))
681 else if (
unformat(line_input,
"outer"))
707 else if (
unformat(line_input,
"off"))
736 else if (
unformat(line_input,
"%x", &tc))
751 bool counters = va_arg(*args,
int);
756 memset(&ip6_prefix, 0,
sizeof(ip6_prefix));
761 "[%d] ip4-pfx %U/%d ip6-pfx %U/%d ip6-src %U/%d ea_bits_len %d psid-offset %d psid-len %d mtu %d %s",
802 f64 dt = (r->
ts + lifetime > now) ? (r->
ts + lifetime - now) : -1;
804 "ip4-reass src=%U dst=%U protocol=%d identifier=%d port=%d lifetime=%.3lf\n",
806 k->protocol, clib_net_to_host_u16(k->fragment_id), (r->
port >= 0)?clib_net_to_host_u16(r->
port):-1, dt);
818 f64 dt = (r->
ts + lifetime > now) ? (r->
ts + lifetime - now) : -1;
820 "ip6-reass src=%U dst=%U protocol=%d identifier=%d lifetime=%.3lf\n",
822 k->protocol, clib_net_to_host_u32(k->fragment_id), dt);
832 bool counters =
false;
833 u32 map_domain_index = ~0;
840 if (
unformat(line_input,
"counters"))
842 else if (
unformat(line_input,
"index %d", &map_domain_index))
853 if (map_domain_index == ~0) {
854 pool_foreach(d, mm->
domains, ({vlib_cli_output(vm,
"%U", format_map_domain, d, counters);}));
890 ASSERT (ci < n->n_errors);
901 int domains = 0, rules = 0, domaincount = 0, rulecount = 0;
907 rulecount+= 0x1 << d->psid_length;
908 rules += sizeof(ip6_address_t) * 0x1 << d->psid_length;
910 domains +=
sizeof(*d);
915 vlib_cli_output(vm,
"MAP domains: %d (%d bytes)\n", domaincount, domains);
919 #if MAP_SKIP_IP6_LOOKUP 920 vlib_cli_output(vm,
"MAP pre-resolve: IP6 next-hop: %U (%u), IP4 next-hop: %U (%u)\n",
930 vlib_cli_output(vm,
"MAP IPv6 inbound security check: %s, fragmented packet security check: %s", mm->sec_check ?
"enabled" :
"disabled",
931 mm->sec_check_frag ?
"enabled" :
"disabled");
934 vlib_cli_output(vm,
"ICMP6 unreachables sent for unmatched packets: %s\n", mm->icmp6_enabled ?
"enabled" :
"disabled");
935 vlib_cli_output(vm,
"Inner fragmentation: %s\n", mm->frag_inner ?
"enabled" :
"disabled");
936 vlib_cli_output(vm,
"Fragment packets regardless of DF flag: %s\n", mm->frag_ignore_df ?
"enabled" :
"disabled");
947 memset (total_pkts, 0,
sizeof (total_pkts));
948 memset (total_bytes, 0,
sizeof (total_bytes));
952 which = cm - mm->domain_counters;
956 total_pkts[which] += v.
packets;
957 total_bytes[which] += v.
bytes;
963 total_bytes[MAP_DOMAIN_COUNTER_TX]);
965 total_bytes[MAP_DOMAIN_COUNTER_RX]);
979 u64 buffers = ~(0ull);
986 if (!
unformat(line_input,
"lifetime %u", &lifetime) &&
987 !
unformat(line_input,
"ht-ratio %lf", &ht_ratio) &&
988 !
unformat(line_input,
"pool-size %u", &pool_size) &&
989 !
unformat(line_input,
"buffers %llu", &buffers) &&
990 !((
unformat(line_input,
"ip4")) && (ip4 = 1)) &&
991 !((
unformat(line_input,
"ip6")) && (ip6 = 1))) {
1024 u32 reass = 0, packets = 0;
1025 if (pool_size != ~0) {
1029 vlib_cli_output(vm,
"Setting ip4-reass pool-size (destroyed-reassembly=%u , dropped-fragments=%u)", reass, packets);
1036 vlib_cli_output(vm,
"Setting ip4-reass ht-log2len (destroyed-reassembly=%u , dropped-fragments=%u)", reass, packets);
1039 if (lifetime != ~0) {
1045 if (buffers != ~(0ull)) {
1054 vlib_cli_output(vm,
"Note: 'ip4-reass buffers' > pool-size * max-fragments-per-reassembly.");
1059 u32 reass = 0, packets = 0;
1060 if (pool_size != ~0) {
1064 vlib_cli_output(vm,
"Setting ip6-reass pool-size (destroyed-reassembly=%u , dropped-fragments=%u)", reass, packets);
1071 vlib_cli_output(vm,
"Setting ip6-reass ht-log2len (destroyed-reassembly=%u , dropped-fragments=%u)", reass, packets);
1074 if (lifetime != ~0) {
1080 if (buffers != ~(0ull)) {
1089 vlib_cli_output(vm,
"Note: 'ip6-reass buffers' > pool-size * max-fragments-per-reassembly.");
1109 s =
format(s,
"MAP domain index: %d L4 port: %u", map_domain_index, clib_net_to_host_u16(port));
1131 #define map_ip4_reass_pool_index(r) (r - map_main.ip4_reass_pool) 1169 u8 protocol,
u32 **pi_to_drop)
1174 .dst.data_u32 = dst,
1175 .fragment_id = fragment_id,
1176 .protocol = protocol };
1230 #ifdef MAP_IP4_REASS_COUNT_BYTES 1273 #define map_ip6_reass_pool_index(r) (r - map_main.ip6_reass_pool) 1319 u8 protocol,
u32 **pi_to_drop)
1326 .fragment_id = fragment_id,
1327 .protocol = protocol };
1331 for (i=0; i<10; i++)
1382 #ifdef MAP_IP6_REASS_COUNT_BYTES 1391 u16 data_offset,
u16 next_data_offset,
1392 u8 *data_start,
u16 data_len)
1395 u16 copied_len = (data_len > 20) ? 20 : data_len;
1411 else if (prev_f ==
NULL)
1416 if (!f || f->
pi != ~0)
1423 clib_memcpy(prev_f->next_data, data_start, copied_len);
1424 prev_f->next_data_len = copied_len;
1425 prev_f->next_data_offset = data_offset;
1427 if (((
ip4_header_t *)data_start)->ip_version_and_header_length != 0x45)
1478 u32 desired_size = (
u32)(pool_size * ht_ratio);
1480 for (i=1; i<31; i++)
1481 if ((1 << i) >= desired_size)
1598 .path =
"map params reassembly",
1599 .short_help =
"[ip4 | ip6] [lifetime <lifetime-ms>] [pool-size <pool-size>] [buffers <buffers>] [ht-ratio <ht-ratio>]",
1604 .path =
"map params traffic-class",
1606 "traffic-class {0x0-0xff | copy}",
1611 .path =
"map params pre-resolve",
1613 "pre-resolve {ip4-nh <address>} | {ip6-nh <address>}",
1618 .path =
"map params security-check",
1620 "security-check on|off",
1625 .path =
"map params icmp source-address",
1626 .short_help =
"source-address <ip4-address>",
1631 .path =
"map params icmp6 unreachables",
1632 .short_help =
"unreachables {on|off}",
1637 .path =
"map params fragment",
1638 .short_help =
"[inner|outer] [ignore-df [on|off]]",
1643 .path =
"map params fragment ignore-df",
1644 .short_help =
"on|off",
1649 .path =
"map params security-check fragments",
1656 .path =
"map add domain",
1658 "map add domain ip4-pfx <ip4-pfx> ip6-pfx <ip6-pfx> ip6-src <ip6-pfx> " 1659 "ea-bits-len <n> psid-offset <n> psid-len <n> [map-t] [mtu <mtu>]",
1664 .path =
"map add rule",
1666 "map add rule index <domain> psid <psid> ip6-dst <ip6-addr>",
1671 .path =
"map del domain",
1673 "map del domain index <domain>",
1678 .path =
"show map domain",
1683 .path =
"show map stats",
1688 .path =
"show map fragments",
1701 #ifdef MAP_SKIP_IP6_LOOKUP
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
#define map_ip4_reass_lock()
vlib_cli_command_t map_ip4_reass_lifetime_command
(constructor) VLIB_CLI_COMMAND (map_ip4_reass_lifetime_command)
map_ip4_reass_t * ip4_reass_pool
u32 ip4_reass_conf_buffers
vlib_cli_command_t map_icmp_relay_source_address_command
(constructor) VLIB_CLI_COMMAND (map_icmp_relay_source_address_command)
sll srl srl sll sra u16x4 i
static clib_error_t * map_fragment_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define MAP_IP6_REASS_CONF_BUFFERS_MAX
int map_delete_domain(u32 map_domain_index)
#define MAP_IP6_REASS_BUFFERS_DEFAULT
void vlib_validate_combined_counter(vlib_combined_counter_main_t *cm, u32 index)
volatile u32 * ip6_reass_lock
u32 fragments[MAP_IP4_REASS_MAX_FRAGMENTS_PER_REASSEMBLY]
always_inline vlib_node_t * vlib_get_node(vlib_main_t *vm, u32 i)
#define MAP_IP6_REASS_LIFETIME_DEFAULT
static_always_inline map_ip6_reass_t * map_ip6_reass_lookup(map_ip6_reass_key_t *k, u32 bucket, f64 now)
ip_lookup_next_t lookup_next_index
always_inline int ip4_get_fragment_offset(ip4_header_t *i)
always_inline void clib_mem_free(void *p)
static u8 * format_map_domain(u8 *s, va_list *args)
static clib_error_t * show_map_domain_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
void map_ip4_reass_reinit(u32 *trashed_reass, u32 *dropped_packets)
static clib_error_t * map_security_check_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
u64 map_error_counter_get(u32 node_index, map_error_t map_error)
static_always_inline int ip6_parse(const ip6_header_t *ip6, u32 buff_len, u8 *l4_protocol, u16 *l4_offset, u16 *frag_hdr_offset)
static clib_error_t * map_fragment_df_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * show_map_fragments_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
i32 ip6_get_port(ip6_header_t *ip6, map_dir_e dir, u16 buffer_len)
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
static void map_domain_counter_unlock(map_main_t *mm)
static u64 clib_xxhash(u64 key)
always_inline u64 vlib_get_simple_counter(vlib_simple_counter_main_t *cm, u32 index)
u32 ip4_reass_buffered_counter
static u8 * format_map_ip4_reass(u8 *s, va_list *args)
ip6_address_t preresolve_ip6
static u32 crc_u32(u32 data, u32 value)
vlib_cli_command_t show_map_domain_command
(constructor) VLIB_CLI_COMMAND (show_map_domain_command)
int map_ip6_reass_conf_ht_ratio(f32 ht_ratio, u32 *trashed_reass, u32 *dropped_packets)
always_inline vlib_main_t * vlib_get_main(void)
#define MAP_IP6_REASS_CONF_LIFETIME_MAX
map_ip6_reass_t * ip6_reass_pool
map_ip6_fragment_t fragments[MAP_IP6_REASS_MAX_FRAGMENTS_PER_REASSEMBLY]
ip4_address_t preresolve_ip4
#define map_ip6_reass_unlock()
vnet_main_t * vnet_get_main(void)
#define MAP_IP4_REASS_MAX_FRAGMENTS_PER_REASSEMBLY
#define static_always_inline
#define pool_foreach(VAR, POOL, BODY)
static clib_error_t * map_pre_resolve_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define MAP_REASS_INDEX_NONE
always_inline heap_elt_t * last(heap_header_t *h)
#define VLIB_INIT_FUNCTION(x)
static clib_error_t * map_icmp_unreachables_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
always_inline u32 vlib_error_get_code(vlib_error_t e)
vlib_combined_counter_main_t * domain_counters
vlib_cli_command_t show_map_fragments_command
(constructor) VLIB_CLI_COMMAND (show_map_fragments_command)
ip4_address_t icmp4_src_address
static clib_error_t * map_add_domain_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
vlib_cli_command_t map_del_command
(constructor) VLIB_CLI_COMMAND (map_del_command)
u32 ip4_fib_lookup_with_table(ip4_main_t *im, u32 fib_index, ip4_address_t *dst, u32 disable_default_route)
always_inline uword pool_elts(void *v)
vlib_simple_counter_main_t icmp_relayed
int map_ip4_reass_add_fragment(map_ip4_reass_t *r, u32 pi)
#define clib_warning(format, args...)
u32 table_index_or_table_id
u8 map_get_ht_log2len(f32 ht_ratio, u16 pool_size)
#define vec_resize(V, N)
Resize a vector (no header, unspecified alignment) Add N elements to end of given vector V...
#define MAP_IP4_REASS_CONF_LIFETIME_MAX
void ip6_add_del_route(ip6_main_t *im, ip6_add_del_route_args_t *args)
static_always_inline map_ip4_reass_t * map_ip4_reass_lookup(map_ip4_reass_key_t *k, u32 bucket, f64 now)
int map_add_del_psid(u32 map_domain_index, u16 psid, ip6_address_t *tep, u8 is_add)
always_inline void * clib_mem_alloc_aligned(uword size, uword align)
#define MAP_IP6_REASS_CONF_POOL_SIZE_MAX
ip6_address_t dst_address
#define pool_elt_at_index(p, i)
int map_ip6_reass_conf_buffers(u32 buffers)
#define map_ip4_reass_pool_index(r)
static clib_error_t * map_add_rule_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
int map_ip4_reass_conf_lifetime(u16 lifetime_ms)
vlib_error_main_t error_main
#define MAP_IP4_REASS_BUFFERS_DEFAULT
void * ip4_get_route(ip4_main_t *im, u32 fib_index_or_table_id, u32 flags, u8 *address, u32 address_length)
#define MAP_IP4_REASS_CONF_HT_RATIO_MAX
static u8 * format_map_ip6_reass(u8 *s, va_list *args)
volatile u32 * ip4_reass_lock
u16 ip4_reass_conf_pool_size
vlib_cli_command_t map_add_domain_command
(constructor) VLIB_CLI_COMMAND (map_add_domain_command)
int map_ip4_reass_conf_buffers(u32 buffers)
int map_ip6_reass_conf_lifetime(u16 lifetime_ms)
map_ip4_reass_t * map_ip4_reass_get(u32 src, u32 dst, u16 fragment_id, u8 protocol, u32 **pi_to_drop)
static void vlib_get_combined_counter(vlib_combined_counter_main_t *cm, u32 index, vlib_counter_t *result)
int map_ip4_reass_conf_pool_size(u16 pool_size, u32 *trashed_reass, u32 *dropped_packets)
u16 * ip6_reass_hash_table
u16 * ip4_reass_hash_table
u32 ip6_get_route(ip6_main_t *im, u32 fib_index_or_table_id, u32 flags, ip6_address_t *address, u32 address_length)
vlib_cli_command_t map_fragment_command
(constructor) VLIB_CLI_COMMAND (map_fragment_command)
i32 ip4_get_port(ip4_header_t *ip, map_dir_e dir, u16 buffer_len)
#define MAP_IP4_REASS_HT_RATIO_DEFAULT
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
#define pool_get_aligned(P, E, A)
void map_ip4_drop_pi(u32 pi)
void map_ip4_reass_free(map_ip4_reass_t *r, u32 **pi_to_drop)
vlib_cli_command_t map_icmp_unreachables_command
(constructor) VLIB_CLI_COMMAND (map_icmp_unreachables_command)
static clib_error_t * map_params_reass_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
vlib_cli_command_t map_pre_resolve_command
(constructor) VLIB_CLI_COMMAND (map_pre_resolve_command)
u16 ip6_reass_conf_pool_size
static_always_inline void map_ip4_reass_get_fragments(map_ip4_reass_t *r, u32 **pi)
map_ip6_reass_t * map_ip6_reass_get(ip6_address_t *src, ip6_address_t *dst, u32 fragment_id, u8 protocol, u32 **pi_to_drop)
#define MAP_IP6_REASS_POOL_SIZE_DEFAULT
#define vec_free(V)
Free vector's memory (no header).
int map_create_domain(ip4_address_t *ip4_prefix, u8 ip4_prefix_len, ip6_address_t *ip6_prefix, u8 ip6_prefix_len, ip6_address_t *ip6_src, u8 ip6_src_len, u8 ea_bits_len, u8 psid_offset, u8 psid_length, u32 *map_domain_index, u16 mtu, u8 flags)
vlib_cli_command_t map_security_check_frag_command
(constructor) VLIB_CLI_COMMAND (map_security_check_frag_command)
static clib_error_t * map_icmp_relay_source_address_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
vlib_cli_command_t map_fragment_df_command
(constructor) VLIB_CLI_COMMAND (map_fragment_df_command)
#define clib_memcpy(a, b, c)
u32 ip6_fib_lookup_with_table(ip6_main_t *im, u32 fib_index, ip6_address_t *dst)
#define IP6_ROUTE_FLAG_DEL
#define pool_is_free_index(P, I)
#define IP4_ROUTE_FLAG_DEL
int map_ip4_reass_conf_ht_ratio(f32 ht_ratio, u32 *trashed_reass, u32 *dropped_packets)
static clib_error_t * map_del_domain_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static void map_domain_counter_lock(map_main_t *mm)
f32 ip4_reass_conf_ht_ratio
#define VLIB_CLI_COMMAND(x,...)
vlib_cli_command_t map_security_check_command
(constructor) VLIB_CLI_COMMAND (map_security_check_command)
void vlib_validate_simple_counter(vlib_simple_counter_main_t *cm, u32 index)
#define ip6_frag_hdr_offset(hdr)
int map_ip6_reass_conf_pool_size(u16 pool_size, u32 *trashed_reass, u32 *dropped_packets)
#define u8_ptr_add(ptr, index)
ip4_address_t dst_address
#define IP4_ROUTE_FLAG_ADD
ip_lookup_main_t lookup_main
void map_ip6_reass_reinit(u32 *trashed_reass, u32 *dropped_packets)
#define map_ip4_reass_unlock()
u8 * format_map_trace(u8 *s, va_list *args)
#define MAP_IP6_REASS_HT_RATIO_DEFAULT
always_inline void vlib_zero_combined_counter(vlib_combined_counter_main_t *cm, u32 index)
always_inline ip_adjacency_t * ip_get_adjacency(ip_lookup_main_t *lm, u32 adj_index)
f32 ip6_reass_conf_ht_ratio
static clib_error_t * map_traffic_class_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
vlib_cli_command_t show_map_stats_command
(constructor) VLIB_CLI_COMMAND (show_map_stats_command)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
u16 ip6_reass_conf_lifetime_ms
#define map_ip6_reass_lock()
vlib_cli_command_t map_traffic_class_command
(constructor) VLIB_CLI_COMMAND (map_traffic_class_command)
#define MAP_IP4_REASS_POOL_SIZE_DEFAULT
#define MAP_IP6_REASS_CONF_HT_RATIO_MAX
u32 table_index_or_table_id
#define MAP_IP4_REASS_LIFETIME_DEFAULT
IP4 reassembly logic: One virtually reassembled flow requires a map_ip4_reass_t structure in order to...
#define MAP_IP4_REASS_CONF_POOL_SIZE_MAX
void map_ip6_reass_free(map_ip6_reass_t *r, u32 **pi_to_drop)
vlib_simple_counter_main_t * simple_domain_counters
always_inline void vlib_zero_simple_counter(vlib_simple_counter_main_t *cm, u32 index)
always_inline vlib_node_runtime_t * vlib_node_get_runtime(vlib_main_t *vm, u32 node_index)
#define MAP_IP6_REASS_MAX_FRAGMENTS_PER_REASSEMBLY
#define IP6_ROUTE_FLAG_ADD
u16 ip4_reass_conf_lifetime_ms
#define vec_foreach(var, vec)
Vector iterator.
always_inline f64 vlib_time_now(vlib_main_t *vm)
static clib_error_t * map_security_check_frag_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define MAP_IP4_REASS_CONF_BUFFERS_MAX
#define clib_error_return(e, args...)
void ip4_add_del_route(ip4_main_t *im, ip4_add_del_route_args_t *args)
u32 ip6_reass_buffered_counter
#define CLIB_CACHE_LINE_BYTES
int map_ip6_reass_add_fragment(map_ip6_reass_t *r, u32 pi, u16 data_offset, u16 next_data_offset, u8 *data_start, u16 data_len)
static void map_pre_resolve(ip4_address_t *ip4, ip6_address_t *ip6)
clib_error_t * map_init(vlib_main_t *vm)
static clib_error_t * show_map_stats_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
void map_ip6_drop_pi(u32 pi)
#define map_ip6_reass_pool_index(r)
vlib_cli_command_t map_add_rule_command
(constructor) VLIB_CLI_COMMAND (map_add_rule_command)
u32 ip6_reass_conf_buffers