X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fmap%2Fmap.h;h=5700cc1c19131e52e9c93938e472470cbd2c7a17;hb=039cbfe254be998f7311bc4638bb262b44efac19;hp=644e80f56cf4e55b89aadc148b94d098764d8244;hpb=9705c3833a7b18609df8ae315a0aa062e1d2e180;p=vpp.git diff --git a/src/vnet/map/map.h b/src/vnet/map/map.h index 644e80f56cf..5700cc1c191 100644 --- a/src/vnet/map/map.h +++ b/src/vnet/map/map.h @@ -25,12 +25,6 @@ #define MAP_SKIP_IP6_LOOKUP 1 -typedef enum -{ - MAP_SENDER, - MAP_RECEIVER -} map_dir_e; - 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, @@ -40,14 +34,13 @@ int map_delete_domain (u32 map_domain_index); 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); -i32 ip4_get_port (ip4_header_t * ip, map_dir_e dir, u16 buffer_len); -i32 ip6_get_port (ip6_header_t * ip6, map_dir_e dir, u16 buffer_len); -u16 ip4_map_get_port (ip4_header_t * ip, map_dir_e dir); -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: @@ -249,6 +242,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; @@ -338,7 +333,7 @@ typedef struct { u16 port; } map_trace_t; -map_main_t map_main; +extern map_main_t map_main; extern vlib_node_registration_t ip4_map_node; extern vlib_node_registration_t ip6_map_node; @@ -391,6 +386,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; @@ -407,9 +405,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); } /* @@ -436,16 +437,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 || @@ -456,6 +460,7 @@ ip6_map_get_domain (u32 mdi, } *error = MAP_ERROR_NO_DOMAIN; return NULL; +#endif } map_ip4_reass_t * @@ -518,30 +523,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) -static_always_inline -int ip6_parse(const ip6_header_t *ip6, u32 buff_len, - u8 *l4_protocol, u16 *l4_offset, u16 *frag_hdr_offset) -{ - if (ip6->protocol == IP_PROTOCOL_IPV6_FRAGMENTATION) { - *l4_protocol = ((ip6_frag_hdr_t *)(ip6 + 1))->next_hdr; - *frag_hdr_offset = sizeof(*ip6); - *l4_offset = sizeof(*ip6) + sizeof(ip6_frag_hdr_t); - } else { - *l4_protocol = ip6->protocol; - *frag_hdr_offset = 0; - *l4_offset = sizeof(*ip6); - } - - return (buff_len < (*l4_offset + 4)) || - (clib_net_to_host_u16(ip6->payload_length) < (*l4_offset + 4 - sizeof(*ip6))); -} - - -#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)) - -#define frag_id_6to4(id) ((id) ^ ((id) >> 16)) - static_always_inline void ip4_map_t_embedded_address (map_domain_t *d, ip6_address_t *ip6, const ip4_address_t *ip4)