Harmonize vec/pool_get_aligned object sizes and alignment requests
[vpp.git] / src / vnet / map / map.h
index 644e80f..c304a1e 100644 (file)
 
 #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:
@@ -87,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;
@@ -249,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;
@@ -338,7 +335,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 +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;
@@ -407,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);
 }
 
 /*
@@ -436,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 ||
@@ -456,6 +462,7 @@ ip6_map_get_domain (u32 mdi,
     }
   *error = MAP_ERROR_NO_DOMAIN;
   return NULL;
+#endif
 }
 
 map_ip4_reass_t *
@@ -518,30 +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)
 
-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)