X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fmap%2Fmap.h;h=c304a1ea38acd380b77e179ae90e40e3589f65fa;hb=eb987d3a09f669787014b1553f032219522149e1;hp=b9b3353dd2e2318601b33056c6c01c13c96a156f;hpb=71612d61930e57e7c8ebf9e5647b15a4b23720b2;p=vpp.git diff --git a/src/vnet/map/map.h b/src/vnet/map/map.h index b9b3353dd2e..c304a1ea38a 100644 --- a/src/vnet/map/map.h +++ b/src/vnet/map/map.h @@ -35,10 +35,12 @@ int map_add_del_psid (u32 map_domain_index, u16 psid, ip6_address_t * tep, u8 is_add); u8 *format_map_trace (u8 * s, va_list * args); -typedef enum __attribute__ ((__packed__)) +typedef enum { - MAP_DOMAIN_PREFIX = 1 << 0, MAP_DOMAIN_TRANSLATION = 1 << 1, // The domain uses MAP-T -} map_domain_flags_e; + MAP_DOMAIN_PREFIX = 1 << 0, + MAP_DOMAIN_TRANSLATION = 1 << 1, // The domain uses MAP-T + MAP_DOMAIN_RFC6052 = 1 << 2, +} __attribute__ ((__packed__)) map_domain_flags_e; /** * IP4 reassembly logic: @@ -78,6 +80,8 @@ typedef enum __attribute__ ((__packed__)) */ typedef struct { + /* Required for pool_get_aligned */ + CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); ip6_address_t ip6_src; ip6_address_t ip6_prefix; ip6_address_t *rules; @@ -240,6 +244,8 @@ typedef struct { bool sec_check_frag; /* Inbound security check for (subsequent) fragments */ bool icmp6_enabled; /* Send destination unreachable for security check failure */ + bool is_ce; /* If this MAP node is a Customer Edge router*/ + /* ICMPv6 -> ICMPv4 relay parameters */ ip4_address_t icmp4_src_address; vlib_simple_counter_main_t icmp_relayed; @@ -382,6 +388,9 @@ map_get_sfx (map_domain_t *d, u32 addr, u16 port) if (d->ip6_prefix_len == 128) return clib_net_to_host_u64(d->ip6_prefix.as_u64[1]); + if (d->flags & MAP_DOMAIN_RFC6052) + return (clib_net_to_host_u64(d->ip6_prefix.as_u64[1]) | addr); + /* IPv4 prefix */ if (d->flags & MAP_DOMAIN_PREFIX) return (u64) (addr & (0xFFFFFFFF << d->suffix_shift)) << 16; @@ -398,9 +407,12 @@ map_get_sfx_net (map_domain_t *d, u32 addr, u16 port) } static_always_inline u32 -map_get_ip4 (ip6_address_t *addr) +map_get_ip4 (ip6_address_t *addr, map_domain_flags_e flags) { - return clib_host_to_net_u32(clib_net_to_host_u64(addr->as_u64[1]) >> 16); + if (flags & MAP_DOMAIN_RFC6052) + return clib_host_to_net_u32(clib_net_to_host_u64(addr->as_u64[1])); + else + return clib_host_to_net_u32(clib_net_to_host_u64(addr->as_u64[1]) >> 16); } /* @@ -427,16 +439,19 @@ ip6_map_get_domain (u32 mdi, { map_main_t *mm = &map_main; +#ifdef TODO /* * Disable direct MAP domain lookup on decap, until the security check is updated to verify IPv4 SA. * (That's done implicitly when MAP domain is looked up in the IPv4 FIB) */ -#ifdef MAP_NONSHARED_DOMAIN_ENABLED -#error "How can you be sure this domain is not shared?" + //#ifdef MAP_NONSHARED_DOMAIN_ENABLED + //#error "How can you be sure this domain is not shared?" +#endif + *map_domain_index = mdi; return pool_elt_at_index(mm->domains, mdi); -#endif +#ifdef TODO u32 lbi = ip4_fib_forwarding_lookup(0, addr); const dpo_id_t *dpo = load_balance_get_bucket(lbi, 0); if (PREDICT_TRUE(dpo->dpoi_type == map_dpo_type || @@ -447,6 +462,7 @@ ip6_map_get_domain (u32 mdi, } *error = MAP_ERROR_NO_DOMAIN; return NULL; +#endif } map_ip4_reass_t * @@ -509,10 +525,6 @@ int map_ip6_reass_conf_lifetime(u16 lifetime_ms); int map_ip6_reass_conf_buffers(u32 buffers); #define MAP_IP6_REASS_CONF_BUFFERS_MAX (0xffffffff) - -#define u8_ptr_add(ptr, index) (((u8 *)ptr) + index) -#define u16_net_add(u, val) clib_host_to_net_u16(clib_net_to_host_u16(u) + (val)) - static_always_inline void ip4_map_t_embedded_address (map_domain_t *d, ip6_address_t *ip6, const ip4_address_t *ip4)