21 #define MAP_SKIP_IP6_LOOKUP 1 32 u8 ea_bits_len,
u8 psid_offset,
u8 psid_length,
42 typedef enum __attribute__ ((__packed__))
60 #define MAP_IP4_REASS_LIFETIME_DEFAULT (100) 61 #define MAP_IP4_REASS_HT_RATIO_DEFAULT (1.0) 62 #define MAP_IP4_REASS_POOL_SIZE_DEFAULT 1024 // Number of reassembly structures 63 #define MAP_IP4_REASS_BUFFERS_DEFAULT 2048 65 #define MAP_IP4_REASS_MAX_FRAGMENTS_PER_REASSEMBLY 5 // Number of fragment per reassembly 67 #define MAP_IP6_REASS_LIFETIME_DEFAULT (100) 68 #define MAP_IP6_REASS_HT_RATIO_DEFAULT (1.0) 69 #define MAP_IP6_REASS_POOL_SIZE_DEFAULT 1024 // Number of reassembly structures 70 #define MAP_IP6_REASS_BUFFERS_DEFAULT 2048 72 #define MAP_IP6_REASS_MAX_FRAGMENTS_PER_REASSEMBLY 5 74 #define MAP_IP6_REASS_COUNT_BYTES 75 #define MAP_IP4_REASS_COUNT_BYTES 108 #define MAP_REASS_INDEX_NONE ((u16)0xffff) 130 #ifdef MAP_IP4_REASS_COUNT_BYTES 181 #ifdef MAP_IP6_REASS_COUNT_BYTES 202 #ifdef MAP_SKIP_IP6_LOOKUP 273 #define foreach_map_error \ 275 _(NONE, "valid MAP packets") \ 276 _(BAD_PROTOCOL, "bad protocol") \ 277 _(SEC_CHECK, "security check failed") \ 278 _(ENCAP_SEC_CHECK, "encap security check failed") \ 279 _(DECAP_SEC_CHECK, "decap security check failed") \ 280 _(ICMP, "unable to translate ICMP") \ 281 _(ICMP_RELAY, "unable to relay ICMP") \ 282 _(UNKNOWN, "unknown") \ 283 _(NO_BINDING, "no binding") \ 284 _(NO_DOMAIN, "no domain") \ 285 _(FRAGMENTED, "packet is a fragment") \ 286 _(FRAGMENT_MEMORY, "could not cache fragment") \ 287 _(FRAGMENT_MALFORMED, "fragment has unexpected format")\ 288 _(FRAGMENT_DROPPED, "dropped cached fragment") \ 289 _(MALFORMED, "malformed packet") \ 290 _(DF_SET, "can't fragment, DF set") 293 #define _(sym,str) MAP_ERROR_##sym, 330 return clib_net_to_host_u64(d->
rules[psid].
as_u64[0]);
341 return clib_host_to_net_u64(
map_get_pfx(d, clib_net_to_host_u32(addr),
342 clib_net_to_host_u16(port)));
355 return clib_net_to_host_u64(d->
rules[psid].
as_u64[1]);
364 return ((
u64) addr << 16) | psid;
370 return clib_host_to_net_u64(
map_get_sfx(d, clib_net_to_host_u32(addr),
371 clib_net_to_host_u16(port)));
377 return clib_host_to_net_u32(clib_net_to_host_u64(addr->
as_u64[1]) >> 16);
392 *map_domain_index = p[0];
403 u32 *map_domain_index,
u8 *error)
413 #ifdef MAP_NONSHARED_DOMAIN_ENABLED 419 *map_domain_index = p[0];
429 *map_domain_index = p[0];
432 *error = MAP_ERROR_NO_DOMAIN;
438 u8 protocol,
u32 **pi_to_drop);
442 #define map_ip4_reass_lock() while (__sync_lock_test_and_set(map_main.ip4_reass_lock, 1)) {} 443 #define map_ip4_reass_unlock() do {CLIB_MEMORY_BARRIER(); *map_main.ip4_reass_lock = 0;} while(0) 461 u8 protocol,
u32 **pi_to_drop);
465 #define map_ip6_reass_lock() while (__sync_lock_test_and_set(map_main.ip6_reass_lock, 1)) {} 466 #define map_ip6_reass_unlock() do {CLIB_MEMORY_BARRIER(); *map_main.ip6_reass_lock = 0;} while(0) 470 u16 data_offset,
u16 next_data_offset,
471 u8 *data_start,
u16 data_len);
476 #define MAP_IP4_REASS_CONF_HT_RATIO_MAX 100 478 #define MAP_IP4_REASS_CONF_POOL_SIZE_MAX (0xfeff) 480 #define MAP_IP4_REASS_CONF_LIFETIME_MAX 0xffff 482 #define MAP_IP4_REASS_CONF_BUFFERS_MAX (0xffffffff) 488 #define MAP_IP6_REASS_CONF_HT_RATIO_MAX 100 490 #define MAP_IP6_REASS_CONF_POOL_SIZE_MAX (0xfeff) 492 #define MAP_IP6_REASS_CONF_LIFETIME_MAX 0xffff 494 #define MAP_IP6_REASS_CONF_BUFFERS_MAX (0xffffffff) 498 u8 *l4_protocol,
u16 *l4_offset,
u16 *frag_hdr_offset)
500 if (ip6->
protocol == IP_PROTOCOL_IPV6_FRAGMENTATION) {
501 *l4_protocol = ((ip6_frag_hdr_t *)(ip6 + 1))->next_hdr;
502 *frag_hdr_offset =
sizeof(*ip6);
503 *l4_offset =
sizeof(*ip6) +
sizeof(ip6_frag_hdr_t);
506 *frag_hdr_offset = 0;
507 *l4_offset =
sizeof(*ip6);
510 return (buff_len < (*l4_offset + 4)) ||
511 (clib_net_to_host_u16(ip6->
payload_length) < (*l4_offset + 4 -
sizeof(*ip6)));
515 #define u8_ptr_add(ptr, index) (((u8 *)ptr) + index) 516 #define u16_net_add(u, val) clib_host_to_net_u16(clib_net_to_host_u16(u) + (val)) 518 #define frag_id_6to4(id) ((id) ^ ((id) >> 16)) 557 u32 n_left_from, *from, next_index, *to_next, n_left_to_next;
560 n_left_from =
vec_len(pi_vector);
562 while (n_left_from > 0) {
564 while (n_left_from > 0 && n_left_to_next > 0) {
565 u32 pi0 = to_next[0] = from[0];
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)
void vlib_put_next_frame(vlib_main_t *vm, vlib_node_runtime_t *r, u32 next_index, u32 n_vectors_left)
Release pointer to next frame vector data.
i32 ip4_get_port(ip4_header_t *ip, map_dir_e dir, u16 buffer_len)
map_ip4_reass_t * ip4_reass_pool
int map_ip4_reass_add_fragment(map_ip4_reass_t *r, u32 pi)
u32 ip4_reass_conf_buffers
sll srl srl sll sra u16x4 i
vlib_node_registration_t ip4_map_t_node
(constructor) VLIB_REGISTER_NODE (ip4_map_t_node)
static_always_inline u64 map_get_pfx(map_domain_t *d, u32 addr, u16 port)
volatile u32 * ip6_reass_lock
volatile u32 * counter_lock
u32 fragments[MAP_IP4_REASS_MAX_FRAGMENTS_PER_REASSEMBLY]
vlib_node_registration_t ip4_map_t_icmp_node
(constructor) VLIB_REGISTER_NODE (ip4_map_t_icmp_node)
ip_lookup_next_t lookup_next_index
int map_ip4_reass_conf_buffers(u32 buffers)
static_always_inline int ip6_parse(const ip6_header_t *ip6, u32 buff_len, u8 *l4_protocol, u16 *l4_offset, u16 *frag_hdr_offset)
int map_ip6_reass_conf_lifetime(u16 lifetime_ms)
int map_ip4_reass_conf_ht_ratio(f32 ht_ratio, u32 *trashed_reass, u32 *dropped_packets)
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
static void map_domain_counter_unlock(map_main_t *mm)
struct _vlib_node_registration vlib_node_registration_t
ip_lookup_main_t lookup_main
u32 ip4_reass_buffered_counter
ip6_address_t preresolve_ip6
map_ip6_reass_t * ip6_reass_pool
ip4_address_t preresolve_ip4
vlib_node_registration_t ip6_map_t_tcp_udp_node
(constructor) VLIB_REGISTER_NODE (ip6_map_t_tcp_udp_node)
static_always_inline void ip4_map_t_embedded_address(map_domain_t *d, ip6_address_t *ip6, const ip4_address_t *ip4)
#define MAP_IP4_REASS_MAX_FRAGMENTS_PER_REASSEMBLY
static_always_inline u32 ip6_map_t_embedded_address(map_domain_t *d, ip6_address_t *addr)
#define static_always_inline
vlib_combined_counter_main_t * domain_counters
ip4_address_t icmp4_src_address
static_always_inline void map_send_all_to_node(vlib_main_t *vm, u32 *pi_vector, vlib_node_runtime_t *node, vlib_error_t *error, u32 next)
u32 ip4_fib_lookup_with_table(ip4_main_t *im, u32 fib_index, ip4_address_t *dst, u32 disable_default_route)
vlib_simple_counter_main_t icmp_relayed
int map_ip4_reass_conf_pool_size(u16 pool_size, u32 *trashed_reass, u32 *dropped_packets)
int map_ip6_reass_conf_ht_ratio(f32 ht_ratio, u32 *trashed_reass, u32 *dropped_packets)
A collection of simple counters.
int map_ip6_reass_conf_buffers(u32 buffers)
map_ip4_reass_t * map_ip4_reass_get(u32 src, u32 dst, u16 fragment_id, u8 protocol, u32 **pi_to_drop)
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
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)
volatile u32 * ip4_reass_lock
static_always_inline u64 map_get_pfx_net(map_domain_t *d, u32 addr, u16 port)
u16 ip4_reass_conf_pool_size
int map_ip6_reass_conf_pool_size(u16 pool_size, u32 *trashed_reass, u32 *dropped_packets)
This packet needs to go to MAP - RFC7596, RFC7597.
static_always_inline u64 map_get_sfx_net(map_domain_t *d, u32 addr, u16 port)
static_always_inline map_domain_t * ip6_map_get_domain(u32 adj_index, ip4_address_t *addr, u32 *map_domain_index, u8 *error)
u16 * ip6_reass_hash_table
u16 * ip4_reass_hash_table
#define vlib_validate_buffer_enqueue_x1(vm, node, next_index, to_next, n_left_to_next, bi0, next0)
Finish enqueueing one buffer forward in the graph.
#define vlib_get_next_frame(vm, node, next_index, vectors, n_vectors_left)
Get pointer to next frame vector data by (vlib_node_runtime_t, next_index).
vlib_error_t error
Error code for buffers to be enqueued to error handler.
vlib_node_registration_t ip4_map_t_tcp_udp_node
(constructor) VLIB_REGISTER_NODE (ip4_map_t_tcp_udp_node)
vlib_node_registration_t ip4_map_t_fragmented_node
(constructor) VLIB_REGISTER_NODE (ip4_map_t_fragmented_node)
u16 ip6_reass_conf_pool_size
void map_ip4_drop_pi(u32 pi)
static_always_inline void map_ip4_reass_get_fragments(map_ip4_reass_t *r, u32 **pi)
vlib_node_registration_t ip6_map_t_icmp_node
(constructor) VLIB_REGISTER_NODE (ip6_map_t_icmp_node)
void map_ip6_reass_free(map_ip6_reass_t *r, u32 **pi_to_drop)
#define foreach_map_error
static void map_domain_counter_lock(map_main_t *mm)
f32 ip4_reass_conf_ht_ratio
vlib_node_registration_t ip4_map_node
(constructor) VLIB_REGISTER_NODE (ip4_map_node)
vlib_node_registration_t ip6_map_node
(constructor) VLIB_REGISTER_NODE (ip6_map_node)
ip_lookup_main_t lookup_main
u16 ip4_map_get_port(ip4_header_t *ip, map_dir_e dir)
void map_ip6_drop_pi(u32 pi)
f32 ip6_reass_conf_ht_ratio
u8 * format_map_trace(u8 *s, va_list *args)
i32 ip6_get_port(ip6_header_t *ip6, map_dir_e dir, u16 buffer_len)
static_always_inline map_domain_t * ip4_map_get_domain(u32 adj_index, u32 *map_domain_index)
static_always_inline u32 map_get_ip4(ip6_address_t *addr)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
u16 ip6_reass_conf_lifetime_ms
A collection of combined counters.
vlib_simple_counter_main_t * simple_domain_counters
u64 map_error_counter_get(u32 node_index, map_error_t map_error)
ip4_main_t ip4_main
Global ip4 main structure.
#define MAP_IP6_REASS_MAX_FRAGMENTS_PER_REASSEMBLY
void map_ip4_reass_free(map_ip4_reass_t *r, u32 **pi_to_drop)
u16 ip4_reass_conf_lifetime_ms
int map_delete_domain(u32 map_domain_index)
static_always_inline u64 map_get_sfx(map_domain_t *d, u32 addr, u16 port)
int map_add_del_psid(u32 map_domain_index, u16 psid, ip6_address_t *tep, u8 is_add)
int map_ip4_reass_conf_lifetime(u16 lifetime_ms)
vlib_node_registration_t ip6_map_t_fragmented_node
(constructor) VLIB_REGISTER_NODE (ip6_map_t_fragmented_node)
This packet needs to go to MAP with Translation - RFC7599.
vlib_node_registration_t ip6_map_t_node
(constructor) VLIB_REGISTER_NODE (ip6_map_t_node)
u32 ip6_reass_buffered_counter
static vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
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 ip_adjacency_t * ip_get_adjacency(ip_lookup_main_t *lm, u32 adj_index)
u32 ip6_reass_conf_buffers