24 #include <vpp/app/version.h> 75 u8 suffix_len, suffix_shift;
84 if (ip6_src_len != 96)
86 clib_warning (
"MAP-T only supports ip6_src_len = 96 for now.");
91 clib_warning (
"RFC6052 translation only supports ip6_prefix_len = " 98 if (ip6_src_len != 128)
101 (
"MAP-E requires a BR address, not a prefix (ip6_src_len should " 108 if (ip4_prefix_len + ea_bits_len < 32)
110 if (!(flags & MAP_DOMAIN_TRANSLATION))
112 suffix_shift = 32 - ip4_prefix_len - ea_bits_len;
113 suffix_len = ea_bits_len;
118 suffix_len = 32 - ip4_prefix_len;
122 if (ea_bits_len > 0 && ((ip6_prefix_len + ea_bits_len) > 64 ||
123 ip6_prefix_len + suffix_len + psid_length > 64))
126 (
"Embedded Address bits must be within the first 64 bits of " 131 if (mm->
is_ce && !(flags & MAP_DOMAIN_TRANSLATION))
139 memset (d, 0,
sizeof (*d));
140 *map_domain_index = d - mm->
domains;
157 d->
psid_shift = 16 - psid_length - psid_offset;
162 if (d->
flags & MAP_DOMAIN_TRANSLATION)
182 .fp_len = ip4_pfx_len,
196 if (d->
flags & MAP_DOMAIN_TRANSLATION)
224 .fp_len = ip6_pfx_len,
225 .fp_addr.ip6 = ip6_pfx,
265 clib_warning (
"MAP domain delete: domain does not exist: %d",
310 clib_warning (
"MAP rule: domain does not exist: %d", map_domain_index);
325 memset (d->
rules, 0, l);
330 clib_warning (
"MAP rule: PSID outside bounds: %d [%d]", psid,
337 d->
rules[psid] = *tep;
346 #ifdef MAP_SKIP_IP6_LOOKUP 370 return (
format (s,
"%U (%u)",
376 return (
format (s,
"un-set"));
430 return (&pre_resolved[index].node);
483 if (ip6 && (ip6->
as_u64[0] != 0 || ip6->
as_u64[1] != 0))
485 ip46_address_t
addr = {
490 FIB_PROTOCOL_IP6, 128, &addr);
493 FIB_PROTOCOL_IP6, 128, &addr);
495 if (ip4 && (ip4->
as_u32 != 0))
497 ip46_address_t
addr = {
502 FIB_PROTOCOL_IP4, 32, &addr);
505 FIB_PROTOCOL_IP4, 32, &addr);
527 else if (
unformat (line_input,
"on"))
560 else if (
unformat (line_input,
"on"))
584 u32 ip6_prefix_len = 0, ip4_prefix_len = 0, map_domain_index, ip6_src_len;
587 u32 ea_bits_len = 0, psid_offset = 0, psid_length = 0;
617 else if (
unformat (line_input,
"ea-bits-len %d", &ea_bits_len))
619 else if (
unformat (line_input,
"psid-offset %d", &psid_offset))
621 else if (
unformat (line_input,
"psid-len %d", &psid_length))
623 else if (
unformat (line_input,
"mtu %d", &mtu))
625 else if (
unformat (line_input,
"map-t"))
627 else if (
unformat (line_input,
"rfc6052"))
644 &ip6_prefix, ip6_prefix_len, &ip6_src, ip6_src_len,
645 ea_bits_len, psid_offset, psid_length, &map_domain_index,
660 u32 map_domain_index;
669 if (
unformat (line_input,
"index %d", &map_domain_index))
700 u32 psid = 0, map_domain_index;
709 if (
unformat (line_input,
"index %d", &map_domain_index))
711 else if (
unformat (line_input,
"psid %d", &psid))
742 #if MAP_SKIP_IP6_LOOKUP 754 memset (&ip4nh, 0,
sizeof (ip4nh));
755 memset (&ip6nh, 0,
sizeof (ip6nh));
768 else if (
unformat (line_input,
"del"))
841 else if (
unformat (line_input,
"off"))
877 else if (
unformat (line_input,
"outer"))
910 else if (
unformat (line_input,
"off"))
946 else if (
unformat (line_input,
"%x", &tc))
978 bool counters = va_arg (*args,
int);
983 memset (&ip6_prefix, 0,
sizeof (ip6_prefix));
988 "[%d] ip4-pfx %U/%d ip6-pfx %U/%d ip6-src %U/%d ea_bits_len %d " 989 "psid-offset %d psid-len %d mtu %d %s",
1036 f64 dt = (r->
ts + lifetime > now) ? (r->
ts + lifetime - now) : -1;
1038 "ip4-reass src=%U dst=%U protocol=%d identifier=%d port=%d lifetime=%.3lf\n",
1040 &k->dst.as_u8, k->protocol,
1041 clib_net_to_host_u16 (k->fragment_id),
1042 (r->
port >= 0) ? clib_net_to_host_u16 (r->
port) : -1, dt);
1054 f64 dt = (r->
ts + lifetime > now) ? (r->
ts + lifetime - now) : -1;
1056 "ip6-reass src=%U dst=%U protocol=%d identifier=%d lifetime=%.3lf\n",
1058 &k->dst.as_u8, k->protocol,
1059 clib_net_to_host_u32 (k->fragment_id), dt);
1070 bool counters =
false;
1071 u32 map_domain_index = ~0;
1080 if (
unformat (line_input,
"counters"))
1082 else if (
unformat (line_input,
"index %d", &map_domain_index))
1095 if (map_domain_index == ~0)
1098 pool_foreach(d, mm->
domains, ({vlib_cli_output(vm,
"%U", format_map_domain, d, counters);}));
1148 ASSERT (ci < n->n_errors);
1160 int domains = 0, rules = 0, domaincount = 0, rulecount = 0;
1170 rulecount+= 0x1 << d->psid_length;
1171 rules += sizeof(ip6_address_t) * 0x1 << d->psid_length;
1173 domains +=
sizeof(*d);
1183 #if MAP_SKIP_IP6_LOOKUP 1185 "MAP pre-resolve: IP6 next-hop: %U, IP4 next-hop: %U\n",
1197 "MAP IPv6 inbound security check: %s, fragmented packet security check: %s",
1198 mm->sec_check ?
"enabled" :
"disabled",
1199 mm->sec_check_frag ?
"enabled" :
"disabled");
1204 mm->icmp6_enabled ?
"enabled" :
"disabled");
1206 mm->frag_inner ?
"enabled" :
"disabled");
1208 mm->frag_ignore_df ?
"enabled" :
"disabled");
1219 memset (total_pkts, 0,
sizeof (total_pkts));
1220 memset (total_bytes, 0,
sizeof (total_bytes));
1225 which = cm - mm->domain_counters;
1230 total_pkts[which] += v.
packets;
1231 total_bytes[which] += v.
bytes;
1257 u64 buffers = ~(0ull);
1258 u8 ip4 = 0, ip6 = 0;
1265 if (
unformat (line_input,
"lifetime %u", &lifetime))
1267 else if (
unformat (line_input,
"ht-ratio %lf", &ht_ratio))
1269 else if (
unformat (line_input,
"pool-size %u", &pool_size))
1271 else if (
unformat (line_input,
"buffers %llu", &buffers))
1273 else if (
unformat (line_input,
"ip4"))
1275 else if (
unformat (line_input,
"ip6"))
1324 u32 reass = 0, packets = 0;
1325 if (pool_size != ~0)
1334 "Setting ip4-reass pool-size (destroyed-reassembly=%u , dropped-fragments=%u)",
1347 "Setting ip4-reass ht-log2len (destroyed-reassembly=%u , dropped-fragments=%u)",
1358 if (buffers != ~(0ull))
1371 "Note: 'ip4-reass buffers' > pool-size * max-fragments-per-reassembly.");
1377 u32 reass = 0, packets = 0;
1378 if (pool_size != ~0)
1387 "Setting ip6-reass pool-size (destroyed-reassembly=%u , dropped-fragments=%u)",
1400 "Setting ip6-reass ht-log2len (destroyed-reassembly=%u , dropped-fragments=%u)",
1411 if (buffers != ~(0ull))
1424 "Note: 'ip6-reass buffers' > pool-size * max-fragments-per-reassembly.");
1445 format (s,
"MAP domain index: %d L4 port: %u", map_domain_index,
1446 clib_net_to_host_u16 (port));
1470 #define map_ip4_reass_pool_index(r) (r - map_main.ip4_reass_pool) 1517 u8 protocol,
u32 ** pi_to_drop)
1522 .dst.data_u32 = dst,
1523 .fragment_id = fragment_id,
1524 .protocol = protocol
1528 #ifdef clib_crc32c_uses_intrinsics 1529 h = clib_crc32c ((
u8 *) k.
as_u32, 16);
1588 #ifdef MAP_IP4_REASS_COUNT_BYTES 1633 #define map_ip6_reass_pool_index(r) (r - map_main.ip6_reass_pool) 1689 u8 protocol,
u32 ** pi_to_drop)
1696 .fragment_id = fragment_id,
1697 .protocol = protocol
1703 #ifdef clib_crc32c_uses_intrinsics 1704 h = clib_crc32c ((
u8 *) k.
as_u32, 40);
1768 #ifdef MAP_IP6_REASS_COUNT_BYTES 1777 u16 data_offset,
u16 next_data_offset,
1778 u8 * data_start,
u16 data_len)
1781 u16 copied_len = (data_len > 20) ? 20 : data_len;
1803 else if (prev_f ==
NULL)
1808 if (!f || f->
pi != ~0)
1816 clib_memcpy (prev_f->next_data, data_start, copied_len);
1817 prev_f->next_data_len = copied_len;
1818 prev_f->next_data_offset = data_offset;
1822 if (((
ip4_header_t *) data_start)->ip_version_and_header_length != 0x45)
1844 if (dropped_packets)
1879 u32 desired_size = (
u32) (pool_size * ht_ratio);
1881 for (i = 1; i < 31; i++)
1882 if ((1 << i) >= desired_size)
1889 u32 * dropped_packets)
1906 u32 * dropped_packets)
1937 if (dropped_packets)
1972 u32 * dropped_packets)
1989 u32 * dropped_packets)
2026 .path =
"map params reassembly",
2027 .short_help =
"map params reassembly [ip4 | ip6] [lifetime <lifetime-ms>] " 2028 "[pool-size <pool-size>] [buffers <buffers>] " 2029 "[ht-ratio <ht-ratio>]",
2046 .path =
"map params traffic-class",
2047 .short_help =
"map params traffic-class {0x0-0xff | copy}",
2064 .path =
"map params pre-resolve",
2065 .short_help =
" map params pre-resolve {ip4-nh <address>} " 2066 "| {ip6-nh <address>}",
2082 .path =
"map params security-check",
2083 .short_help =
"map params security-check on|off",
2099 .path =
"map params icmp source-address",
2100 .short_help =
"map params icmp source-address <ip4-address>",
2115 .path =
"map params icmp6 unreachables",
2116 .short_help =
"map params icmp6 unreachables {on|off}",
2128 .path =
"map params fragment",
2129 .short_help =
"map params fragment inner|outer",
2147 .path =
"map params fragment ignore-df",
2148 .short_help =
"map params fragment ignore-df on|off",
2165 .path =
"map params security-check fragments",
2166 .short_help =
"map params security-check fragments on|off",
2178 .path =
"map add domain",
2179 .short_help =
"map add domain ip4-pfx <ip4-pfx> ip6-pfx <ip6-pfx> " 2180 "ip6-src <ip6-pfx> ea-bits-len <n> psid-offset <n> psid-len <n> " 2181 "[map-t] [map-ce] [mtu <mtu>]",
2193 .path =
"map add rule",
2194 .short_help =
"map add rule index <domain> psid <psid> ip6-dst <ip6-addr>",
2206 .path =
"map del domain",
2207 .short_help =
"map del domain index <domain>",
2219 .path =
"show map domain",
2220 .short_help =
"show map domain index <n> [counters]",
2232 .path =
"show map stats",
2233 .short_help =
"show map stats",
2245 .path =
"show map fragments",
2246 .short_help =
"show map fragments",
2251 .version = VPP_BUILD_VER,
2252 .description =
"Mapping of address and port (MAP)",
2265 if (
unformat (input,
"customer edge"))
2290 #ifdef MAP_SKIP_IP6_LOOKUP 2355 #ifdef MAP_SKIP_IP6_LOOKUP
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
fib_protocol_t fp_proto
protocol type
#define map_ip4_reass_lock()
map_ip4_reass_t * ip4_reass_pool
Recursive resolution source.
u32 ip4_reass_conf_buffers
fib_node_t node
Linkage into the FIB graph.
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)
validate a combined counter
static fib_node_t * map_fib_node_get(fib_node_index_t index)
Function definition to get a FIB node from its index.
volatile u32 * ip6_reass_lock
u32 fragments[MAP_IP4_REASS_MAX_FRAGMENTS_PER_REASSEMBLY]
vnet_main_t * vnet_get_main(void)
#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)
#define pool_alloc(P, N)
Allocate N more free elements to pool (unspecified alignment).
void fib_node_init(fib_node_t *node, fib_node_type_t type)
u32 fib_entry_child_add(fib_node_index_t fib_entry_index, fib_node_type_t child_type, fib_node_index_t child_index)
void fib_entry_get_prefix(fib_node_index_t fib_entry_index, fib_prefix_t *pfx)
dpo_id_t dpo
The Load-balance object index to use to forward.
static u8 * format_map_domain(u8 *s, va_list *args)
static f64 vlib_time_now(vlib_main_t *vm)
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)
enum fib_node_back_walk_rc_t_ fib_node_back_walk_rc_t
Return code from a back walk function.
const dpo_id_t * fib_entry_contribute_ip_forwarding(fib_node_index_t fib_entry_index)
static clib_error_t * map_fragment_df_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static void map_fib_resolve(map_main_pre_resolved_t *pr, fib_protocol_t proto, u8 len, const ip46_address_t *addr)
static clib_error_t * show_map_fragments_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
void fib_entry_child_remove(fib_node_index_t fib_entry_index, u32 sibling_index)
void dpo_copy(dpo_id_t *dst, const dpo_id_t *src)
atomic copy a data-plane object.
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
static void map_domain_counter_unlock(map_main_t *mm)
Combined counter to hold both packets and byte differences.
static u64 clib_xxhash(u64 key)
static heap_elt_t * last(heap_header_t *h)
#define STRUCT_OFFSET_OF(t, f)
u32 ip4_reass_buffered_counter
static u8 * format_map_ip4_reass(u8 *s, va_list *args)
vlib_error_t * errors
Vector of errors for this node.
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
int map_ip6_reass_conf_ht_ratio(f32 ht_ratio, u32 *trashed_reass, u32 *dropped_packets)
#define MAP_IP6_REASS_CONF_LIFETIME_MAX
enum fib_protocol_t_ fib_protocol_t
Protocol Type.
map_ip6_reass_t * ip6_reass_pool
map_ip6_fragment_t fragments[MAP_IP6_REASS_MAX_FRAGMENTS_PER_REASSEMBLY]
void fib_node_register_type(fib_node_type_t type, const fib_node_vft_t *vft)
fib_node_register_type
#define map_ip6_reass_unlock()
static void map_pre_resolve(ip4_address_t *ip4, ip6_address_t *ip6, int is_del)
void map_dpo_create(dpo_proto_t dproto, u32 domain_index, dpo_id_t *dpo)
A representation of a MAP DPO.
static counter_t vlib_get_simple_counter(vlib_simple_counter_main_t *cm, u32 index)
Get the value of a simple counter Scrapes the entire set of per-thread counters.
#define MAP_IP4_REASS_MAX_FRAGMENTS_PER_REASSEMBLY
#define static_always_inline
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
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
#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)
void fib_table_entry_special_remove(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source)
Remove a 'special' entry from the FIB.
vlib_combined_counter_main_t * domain_counters
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)
Aggregrate type for a prefix.
#define clib_error_return(e, args...)
vlib_simple_counter_main_t icmp_relayed
int map_ip4_reass_add_fragment(map_ip4_reass_t *r, u32 pi)
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
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)
#define MAP_IP6_REASS_CONF_POOL_SIZE_MAX
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
static void vlib_zero_combined_counter(vlib_combined_counter_main_t *cm, u32 index)
Clear a combined counter Clears the set of per-thread counters.
int map_ip6_reass_conf_buffers(u32 buffers)
#define map_ip4_reass_pool_index(r)
counter_t packets
packet counter
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)
ip46_address_t fp_addr
The address type is not deriveable from the fp_addr member.
vlib_error_main_t error_main
static map_main_pre_resolved_t * map_from_fib_node(fib_node_t *node)
#define MAP_IP4_REASS_BUFFERS_DEFAULT
#define MAP_IP4_REASS_CONF_HT_RATIO_MAX
static u8 * format_map_ip6_reass(u8 *s, va_list *args)
volatile u32 * ip4_reass_lock
u32 vlib_combined_counter_n_counters(const vlib_combined_counter_main_t *cm)
The number of counters (not the number of per-thread counters)
u16 ip4_reass_conf_pool_size
static clib_error_t * map_config(vlib_main_t *vm, unformat_input_t *input)
int map_ip4_reass_conf_buffers(u32 buffers)
#define pool_put(P, E)
Free an object E in pool P.
void map_t_dpo_create(dpo_proto_t dproto, u32 domain_index, dpo_id_t *dpo)
#define FOR_EACH_FIB_PROTOCOL(_item)
void map_dpo_module_init(void)
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)
int map_ip4_reass_conf_pool_size(u16 pool_size, u32 *trashed_reass, u32 *dropped_packets)
u16 * ip6_reass_hash_table
#define VLIB_CONFIG_FUNCTION(x, n,...)
u16 * ip4_reass_hash_table
fib_node_type_t fn_type
The node's type.
An node in the FIB graph.
#define MAP_IP4_REASS_HT_RATIO_DEFAULT
static u32 vlib_error_get_code(vlib_error_t e)
#define pool_get_aligned(P, E, A)
Allocate an object E from a pool P (general version).
void map_ip4_drop_pi(u32 pi)
#define pool_free(p)
Free a pool.
void map_ip4_reass_free(map_ip4_reass_t *r, u32 **pi_to_drop)
fib_node_index_t fib_table_entry_special_add(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags)
Add a 'special' entry to the FIB.
static clib_error_t * map_params_reass_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
u16 ip6_reass_conf_pool_size
static_always_inline void map_ip4_reass_get_fragments(map_ip4_reass_t *r, u32 **pi)
static void vlib_get_combined_counter(const vlib_combined_counter_main_t *cm, u32 index, vlib_counter_t *result)
Get the value of a combined counter, never called in the speed path Scrapes the entire set of per-thr...
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)
static clib_error_t * map_icmp_relay_source_address_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define clib_warning(format, args...)
static vlib_node_runtime_t * vlib_node_get_runtime(vlib_main_t *vm, u32 node_index)
Get node runtime by node index.
#define clib_memcpy(a, b, c)
u32 sibling
This object sibling index on the FIB entry's child dependency list.
u32 fib_node_index_t
A typedef of a node index.
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
static void map_pre_resolve_init(map_main_pre_resolved_t *pr)
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
Context passed between object during a back walk.
#define VLIB_CLI_COMMAND(x,...)
fib_node_index_t fib_table_entry_special_dpo_add(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, const dpo_id_t *dpo)
Add a 'special' entry to the FIB that links to the DPO passed A special entry is an entry that the FI...
void vlib_validate_simple_counter(vlib_simple_counter_main_t *cm, u32 index)
validate a simple counter
int map_ip6_reass_conf_pool_size(u16 pool_size, u32 *trashed_reass, u32 *dropped_packets)
void map_ip6_reass_reinit(u32 *trashed_reass, u32 *dropped_packets)
static void clib_mem_free(void *p)
#define map_ip4_reass_unlock()
static void vlib_zero_simple_counter(vlib_simple_counter_main_t *cm, u32 index)
Clear a simple counter Clears the set of per-thread u16 counters, and the u64 counter.
u8 * format_map_trace(u8 *s, va_list *args)
#define MAP_IP6_REASS_HT_RATIO_DEFAULT
static u8 * format_map_pre_resolve(u8 *s, va_list *ap)
static vlib_main_t * vlib_get_main(void)
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)
counter_t bytes
byte counter
index_t dpoi_index
the index of objects of that type
#define FIB_NODE_INDEX_INVALID
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
clib_error_t * map_plugin_api_hookup(vlib_main_t *vm)
u16 ip6_reass_conf_lifetime_ms
fib_node_index_t fei
The FIB entry index of the next-hop.
#define map_ip6_reass_lock()
#define MAP_IP4_REASS_POOL_SIZE_DEFAULT
#define MAP_IP6_REASS_CONF_HT_RATIO_MAX
#define DPO_INVALID
An initialiser for DPOs declared on the stack.
char * name
The counter collection's name.
A collection of combined counters.
#define MAP_IP4_REASS_LIFETIME_DEFAULT
IP4 reassembly logic: One virtually reassembled flow requires a map_ip4_reass_t structure in order to...
#define FIB_PROTOCOL_MAX
Definition outside of enum so it does not need to be included in non-defaulted switch statements...
#define MAP_IP4_REASS_CONF_POOL_SIZE_MAX
A FIB graph nodes virtual function table.
void map_ip6_reass_free(map_ip6_reass_t *r, u32 **pi_to_drop)
vlib_simple_counter_main_t * simple_domain_counters
static void * clib_mem_alloc_aligned(uword size, uword align)
static fib_node_back_walk_rc_t map_back_walk(fib_node_t *node, fib_node_back_walk_ctx_t *ctx)
Function definition to backwalk a FIB node.
#define MAP_IP6_REASS_MAX_FRAGMENTS_PER_REASSEMBLY
static void map_stack(map_main_pre_resolved_t *pr)
static vlib_node_t * vlib_get_node(vlib_main_t *vm, u32 i)
Get vlib node by index.
static void map_last_lock_gone(fib_node_t *node)
Function definition to inform the FIB node that its last lock has gone.
void dpo_reset(dpo_id_t *dpo)
reset a DPO ID The DPO will be unlocked.
u16 ip4_reass_conf_lifetime_ms
#define vec_foreach(var, vec)
Vector iterator.
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
static char * map_flags_to_string(u32 flags)
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)
clib_error_t * map_init(vlib_main_t *vm)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
static void map_fib_unresolve(map_main_pre_resolved_t *pr, fib_protocol_t proto, u8 len, const ip46_address_t *addr)
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)
u32 ip6_reass_conf_buffers
static uword pool_elts(void *v)
Number of active elements in a pool.