27 #define MAP_SKIP_IP6_LOOKUP 1 29 #define MAP_ERR_GOOD 0 30 #define MAP_ERR_BAD_POOL_SIZE -1 31 #define MAP_ERR_BAD_HT_RATIO -2 32 #define MAP_ERR_BAD_LIFETIME -3 33 #define MAP_ERR_BAD_BUFFERS -4 34 #define MAP_ERR_BAD_BUFFERS_TOO_LARGE -5 39 u8 ea_bits_len,
u8 psid_offset,
u8 psid_length,
54 u32 * reass,
u32 * packets);
80 #define MAP_IP4_REASS_LIFETIME_DEFAULT (100) 81 #define MAP_IP4_REASS_HT_RATIO_DEFAULT (1.0) 82 #define MAP_IP4_REASS_POOL_SIZE_DEFAULT 1024 // Number of reassembly structures 83 #define MAP_IP4_REASS_BUFFERS_DEFAULT 2048 85 #define MAP_IP4_REASS_MAX_FRAGMENTS_PER_REASSEMBLY 5 // Number of fragment per reassembly 87 #define MAP_IP6_REASS_LIFETIME_DEFAULT (100) 88 #define MAP_IP6_REASS_HT_RATIO_DEFAULT (1.0) 89 #define MAP_IP6_REASS_POOL_SIZE_DEFAULT 1024 // Number of reassembly structures 90 #define MAP_IP6_REASS_BUFFERS_DEFAULT 2048 92 #define MAP_IP6_REASS_MAX_FRAGMENTS_PER_REASSEMBLY 5 94 #define MAP_IP6_REASS_COUNT_BYTES 95 #define MAP_IP4_REASS_COUNT_BYTES 132 "MAP domain fits in one cacheline");
144 #define MAP_REASS_INDEX_NONE ((u16)0xffff) 166 #ifdef MAP_IP4_REASS_COUNT_BYTES 217 #ifdef MAP_IP6_REASS_COUNT_BYTES 229 #ifdef MAP_SKIP_IP6_LOOKUP 350 #define foreach_map_error \ 352 _(NONE, "valid MAP packets") \ 353 _(BAD_PROTOCOL, "bad protocol") \ 354 _(SEC_CHECK, "security check failed") \ 355 _(ENCAP_SEC_CHECK, "encap security check failed") \ 356 _(DECAP_SEC_CHECK, "decap security check failed") \ 357 _(ICMP, "unable to translate ICMP") \ 358 _(ICMP_RELAY, "unable to relay ICMP") \ 359 _(UNKNOWN, "unknown") \ 360 _(NO_BINDING, "no binding") \ 361 _(NO_DOMAIN, "no domain") \ 362 _(FRAGMENTED, "packet is a fragment") \ 363 _(FRAGMENT_MEMORY, "could not cache fragment") \ 364 _(FRAGMENT_MALFORMED, "fragment has unexpected format")\ 365 _(FRAGMENT_DROPPED, "dropped cached fragment") \ 366 _(MALFORMED, "malformed packet") \ 367 _(DF_SET, "can't fragment, DF set") 370 #define _(sym,str) MAP_ERROR_##sym, 407 return clib_net_to_host_u64(d->
rules[psid].
as_u64[0]);
418 return clib_host_to_net_u64(
map_get_pfx(d, clib_net_to_host_u32(addr),
419 clib_net_to_host_u16(port)));
432 return clib_net_to_host_u64(d->
rules[psid].
as_u64[1]);
444 return ((
u64) addr << 16) | psid;
450 return clib_host_to_net_u64(
map_get_sfx(d, clib_net_to_host_u32(addr),
451 clib_net_to_host_u16(port)));
457 ASSERT(prefix_len == 64 || prefix_len == 96);
458 if (prefix_len == 96)
459 return clib_host_to_net_u32(clib_net_to_host_u64(addr->
as_u64[1]));
461 return clib_host_to_net_u32(clib_net_to_host_u64(addr->
as_u64[1]) >> 16);
471 *error = MAP_ERROR_NO_DOMAIN;
474 *map_domain_index = mdi;
485 u32 *map_domain_index,
491 *error = MAP_ERROR_NO_DOMAIN;
495 *map_domain_index = mdi;
501 u8 protocol,
u32 **pi_to_drop);
505 #define map_ip4_reass_lock() clib_spinlock_lock (&map_main.ip4_reass_lock) 506 #define map_ip4_reass_unlock() clib_spinlock_unlock (&map_main.ip4_reass_lock) 526 u8 protocol,
u32 **pi_to_drop);
530 #define map_ip6_reass_lock() clib_spinlock_lock (&map_main.ip6_reass_lock) 531 #define map_ip6_reass_unlock() clib_spinlock_unlock (&map_main.ip6_reass_lock) 535 u16 data_offset,
u16 next_data_offset,
536 u8 *data_start,
u16 data_len);
541 #define MAP_IP4_REASS_CONF_HT_RATIO_MAX 100 543 #define MAP_IP4_REASS_CONF_POOL_SIZE_MAX (0xfeff) 545 #define MAP_IP4_REASS_CONF_LIFETIME_MAX 0xffff 547 #define MAP_IP4_REASS_CONF_BUFFERS_MAX (0xffffffff) 553 #define MAP_IP6_REASS_CONF_HT_RATIO_MAX 100 555 #define MAP_IP6_REASS_CONF_POOL_SIZE_MAX (0xfeff) 557 #define MAP_IP6_REASS_CONF_LIFETIME_MAX 0xffff 559 #define MAP_IP6_REASS_CONF_BUFFERS_MAX (0xffffffff) 606 u32 n_left_from, *from, next_index, *to_next, n_left_to_next;
609 n_left_from =
vec_len(pi_vector);
611 while (n_left_from > 0) {
613 while (n_left_from > 0 && n_left_to_next > 0) {
614 u32 pi0 = to_next[0] = from[0];
631 u8 opt_len, opts_len, kind;
633 u16 mss_value_net = clib_host_to_net_u16(mss_clamping);
639 data = (
u8 *) (tcp + 1);
640 for (; opts_len > 0; opts_len -= opt_len, data += opt_len)
657 if (opt_len < 2 || opt_len > opts_len)
663 mss = *(
u16 *) (data + 2);
679 #ifdef MAP_SKIP_IP6_LOOKUP 693 #ifdef MAP_SKIP_IP6_LOOKUP
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)
int map_param_set_icmp(ip4_address_t *ip4_err_relay_src)
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
fib_node_t node
Linkage into the FIB graph.
#define CLIB_CACHE_LINE_ALIGN_MARK(mark)
clib_spinlock_t ip4_reass_lock
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 * 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)
int map_if_enable_disable(bool is_enable, u32 sw_if_index, bool is_translation)
#define clib_memcpy_fast(a, b, c)
dpo_id_t dpo
The Load-balance object index to use to forward.
int map_ip4_reass_conf_buffers(u32 buffers)
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)
static_always_inline map_domain_t * ip6_map_get_domain(ip6_address_t *addr, u32 *map_domain_index, u8 *error)
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, u8 *tag)
#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_always_inline map_domain_t * ip4_map_get_domain(ip4_address_t *addr, u32 *map_domain_index, u8 *error)
u32 ip4_reass_buffered_counter
static_always_inline bool ip6_map_ip4_lookup_bypass(vlib_buffer_t *p0, ip4_header_t *ip)
uword * bm_trans_enabled_by_sw_if
struct _tcp_header tcp_header_t
map_ip6_reass_t * ip6_reass_pool
#define clib_memcpy(d, s, n)
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
static_always_inline u32 map_get_ip4(ip6_address_t *addr, u16 prefix_len)
vl_api_interface_index_t sw_if_index
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)
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)
#define clib_atomic_test_and_set(a)
vlib_error_t error
Error code for buffers to be enqueued to error handler.
static void mss_clamping(snat_main_t *sm, tcp_header_t *tcp, ip_csum_t *sum)
u32(* lookup)(struct lpm_ *lpm, void *addr_v, u8 pfxlen)
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
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.
#define clib_atomic_release(a)
int map_add_del_psid(u32 map_domain_index, u16 psid, ip6_address_t *tep, bool is_add)
vl_api_ip_proto_t protocol
int map_param_set_traffic_class(bool copy, u8 tc)
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)
static_always_inline u64 map_get_sfx_net(map_domain_t *d, u32 addr, u16 port)
u16 * ip6_reass_hash_table
u16 * ip4_reass_hash_table
STATIC_ASSERT((sizeof(map_domain_t)<=CLIB_CACHE_LINE_BYTES), "MAP domain fits in one cacheline")
#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.
An node in the FIB 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_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)
lpm_t * ip6_src_prefix_tbl
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)
uword * bm_encap_enabled_by_sw_if
void map_ip6_reass_free(map_ip6_reass_t *r, u32 **pi_to_drop)
int map_param_set_fragmentation(bool inner, bool ignore_df)
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.
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.
#define foreach_map_error
clib_spinlock_t ip6_reass_lock
static void map_domain_counter_lock(map_main_t *mm)
f32 ip4_reass_conf_ht_ratio
void map_pre_resolve(ip4_address_t *ip4, ip6_address_t *ip6, bool is_del)
vlib_node_registration_t ip4_map_node
(constructor) VLIB_REGISTER_NODE (ip4_map_node)
u16 cached_next_index
Next frame index that vector arguments were last enqueued to last time this node ran.
vlib_node_registration_t ip6_map_node
(constructor) VLIB_REGISTER_NODE (ip6_map_node)
static_always_inline bool ip4_map_ip6_lookup_bypass(vlib_buffer_t *p0, ip4_header_t *ip)
void map_ip6_drop_pi(u32 pi)
static_always_inline void map_mss_clamping(tcp_header_t *tcp, ip_csum_t *sum, u16 mss_clamping)
f32 ip6_reass_conf_ht_ratio
u8 * format_map_trace(u8 *s, va_list *args)
struct _vlib_node_registration vlib_node_registration_t
template key/value backing page structure
int map_param_set_security_check(bool enable, bool fragments)
int map_param_set_icmp6(u8 enable_unreachable)
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.
map_domain_extra_t * domain_extras
VLIB buffer representation.
#define ip_csum_update(sum, old, new, type, field)
A collection of combined counters.
#define FIB_PROTOCOL_MAX
Definition outside of enum so it does not need to be included in non-defaulted switch statements...
vlib_simple_counter_main_t * simple_domain_counters
u64 map_error_counter_get(u32 node_index, map_error_t map_error)
int map_param_set_tcp(u16 tcp_mss)
#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_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)
int map_param_set_reassembly(bool is_ipv6, u16 lifetime_ms, u16 pool_size, u32 buffers, f64 ht_ratio, u32 *reass, u32 *packets)
vlib_node_registration_t ip6_map_t_node
(constructor) VLIB_REGISTER_NODE (ip6_map_t_node)
u32 ip6_reass_buffered_counter
#define CLIB_CACHE_LINE_BYTES
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)
struct map_main_pre_resolved_t_ map_main_pre_resolved_t
A pre-resolved next-hop.
u32 ip6_reass_conf_buffers