Add ILA plugin
[vpp.git] / vnet / vnet / ip / lookup.h
index e9a4912..78a2641 100644 (file)
@@ -45,7 +45,7 @@
 #include <vnet/ip/ip4_packet.h>
 #include <vnet/ip/ip6_packet.h>
 
-/* Next index stored in adjacency. */
+/* Common (IP4/IP6) next index stored in adjacency. */
 typedef enum {
   /* Packet does not match any route in table. */
   IP_LOOKUP_NEXT_MISS,
@@ -76,20 +76,26 @@ typedef enum {
   /* This packet needs to go to MAP with Translation - RFC7599 */
   IP_LOOKUP_NEXT_MAP_T,
 
-  /* This packets needs to go to 6RD (RFC5969) */
-  IP_LOOKUP_NEXT_SIXRD,
-
   /* This packets needs to go to indirect next hop */
   IP_LOOKUP_NEXT_INDIRECT,
 
-  /* Hop-by-hop header handling */
-  IP_LOOKUP_NEXT_HOP_BY_HOP,
-  IP_LOOKUP_NEXT_ADD_HOP_BY_HOP,
-  IP_LOOKUP_NEXT_POP_HOP_BY_HOP,
+  IP_LOOKUP_NEXT_ICMP_ERROR,
 
   IP_LOOKUP_N_NEXT,
 } ip_lookup_next_t;
 
+typedef enum {
+  IP4_LOOKUP_N_NEXT = IP_LOOKUP_N_NEXT,
+} ip4_lookup_next_t;
+
+typedef enum {
+  /* Hop-by-hop header handling */
+  IP6_LOOKUP_NEXT_HOP_BY_HOP = IP_LOOKUP_N_NEXT,
+  IP6_LOOKUP_NEXT_ADD_HOP_BY_HOP,
+  IP6_LOOKUP_NEXT_POP_HOP_BY_HOP,
+  IP6_LOOKUP_N_NEXT,
+} ip6_lookup_next_t;
+
 #define IP4_LOOKUP_NEXT_NODES {                                        \
     [IP_LOOKUP_NEXT_MISS] = "ip4-miss",                                \
     [IP_LOOKUP_NEXT_DROP] = "ip4-drop",                                \
@@ -100,11 +106,8 @@ typedef enum {
     [IP_LOOKUP_NEXT_CLASSIFY] = "ip4-classify",                        \
     [IP_LOOKUP_NEXT_MAP] = "ip4-map",                          \
     [IP_LOOKUP_NEXT_MAP_T] = "ip4-map-t",                      \
-    [IP_LOOKUP_NEXT_SIXRD] = "ip4-sixrd",                      \
-    [IP_LOOKUP_NEXT_HOP_BY_HOP] = "ip4-hop-by-hop",            \
-    [IP_LOOKUP_NEXT_ADD_HOP_BY_HOP] = "ip4-add-hop-by-hop",    \
-    [IP_LOOKUP_NEXT_POP_HOP_BY_HOP] = "ip4-pop-hop-by-hop",    \
     [IP_LOOKUP_NEXT_INDIRECT] = "ip4-indirect",                        \
+    [IP_LOOKUP_NEXT_ICMP_ERROR] = "ip4-icmp-error",            \
 }
 
 #define IP6_LOOKUP_NEXT_NODES {                                        \
@@ -117,11 +120,11 @@ typedef enum {
     [IP_LOOKUP_NEXT_CLASSIFY] = "ip6-classify",                        \
     [IP_LOOKUP_NEXT_MAP] = "ip6-map",                          \
     [IP_LOOKUP_NEXT_MAP_T] = "ip6-map-t",                      \
-    [IP_LOOKUP_NEXT_SIXRD] = "ip6-sixrd",                      \
-    [IP_LOOKUP_NEXT_HOP_BY_HOP] = "ip6-hop-by-hop",            \
-    [IP_LOOKUP_NEXT_ADD_HOP_BY_HOP] = "ip6-add-hop-by-hop",    \
-    [IP_LOOKUP_NEXT_POP_HOP_BY_HOP] = "ip6-pop-hop-by-hop",    \
     [IP_LOOKUP_NEXT_INDIRECT] = "ip6-indirect",                        \
+    [IP_LOOKUP_NEXT_ICMP_ERROR] = "ip6-icmp-error",            \
+    [IP6_LOOKUP_NEXT_HOP_BY_HOP] = "ip6-hop-by-hop",           \
+    [IP6_LOOKUP_NEXT_ADD_HOP_BY_HOP] = "ip6-add-hop-by-hop",   \
+    [IP6_LOOKUP_NEXT_POP_HOP_BY_HOP] = "ip6-pop-hop-by-hop",   \
 }
 
 /* Flow hash configuration */
@@ -143,6 +146,7 @@ _(dport, IP_FLOW_HASH_DST_PORT)                 \
 _(proto, IP_FLOW_HASH_PROTO)                   \
 _(reverse, IP_FLOW_HASH_REVERSE_SRC_DST)
 
+#define IP_ADJACENCY_OPAQUE_SZ 16
 /* IP unicast adjacency. */
 typedef struct {
   CLIB_CACHE_LINE_ALIGN_MARK(cacheline0);
@@ -184,6 +188,7 @@ typedef struct {
     struct {
         ip46_address_t next_hop;
     } indirect;
+    u8 opaque[IP_ADJACENCY_OPAQUE_SZ];
   };
 
   STRUCT_MARK(signature_end);
@@ -471,9 +476,13 @@ ip_update_adjacency (ip_lookup_main_t * lm,
 static inline int
 ip_adjacency_is_multipath(ip_lookup_main_t * lm, u32 adj_index)
 {
+  if (!vec_len(lm->multipath_adjacencies))
+    return 0;
+
   if (vec_len(lm->multipath_adjacencies) < adj_index - 1)
     return 0;
 
+
   return (lm->multipath_adjacencies[adj_index].adj_index == adj_index &&
          lm->multipath_adjacencies[adj_index].n_adj_in_block > 0);
 }
@@ -524,7 +533,7 @@ ip_interface_address_for_packet (ip_lookup_main_t * lm, vlib_buffer_t * b, u32 s
                      vec_elt (lm->if_address_pool_index_by_sw_if_index, sw_if_index)
                      : if_address_index);
 
-  return pool_elt_at_index (lm->if_address_pool, if_address_index);
+  return (if_address_index != ~0)?pool_elt_at_index (lm->if_address_pool, if_address_index):NULL;
 }
 
 #define foreach_ip_interface_address(lm,a,sw_if_index,loop,body)        \