6rd: Move to plugin
[vpp.git] / vnet / vnet / ip / lookup.h
index fcac675..35c19a7 100644 (file)
@@ -43,8 +43,9 @@
 #include <vnet/vnet.h>
 #include <vlib/buffer.h>
 #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,
@@ -75,17 +76,57 @@ 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",                                \
+    [IP_LOOKUP_NEXT_PUNT] = "ip4-punt",                                \
+    [IP_LOOKUP_NEXT_LOCAL] = "ip4-local",                      \
+    [IP_LOOKUP_NEXT_ARP] = "ip4-arp",                          \
+    [IP_LOOKUP_NEXT_REWRITE] = "ip4-rewrite-transit",          \
+    [IP_LOOKUP_NEXT_CLASSIFY] = "ip4-classify",                        \
+    [IP_LOOKUP_NEXT_MAP] = "ip4-map",                          \
+    [IP_LOOKUP_NEXT_MAP_T] = "ip4-map-t",                      \
+    [IP_LOOKUP_NEXT_INDIRECT] = "ip4-indirect",                        \
+    [IP_LOOKUP_NEXT_ICMP_ERROR] = "ip4-icmp-error",            \
+}
+
+#define IP6_LOOKUP_NEXT_NODES {                                        \
+    [IP_LOOKUP_NEXT_MISS] = "ip6-miss",                                \
+    [IP_LOOKUP_NEXT_DROP] = "ip6-drop",                                \
+    [IP_LOOKUP_NEXT_PUNT] = "ip6-punt",                                \
+    [IP_LOOKUP_NEXT_LOCAL] = "ip6-local",                      \
+    [IP_LOOKUP_NEXT_ARP] = "ip6-discover-neighbor",            \
+    [IP_LOOKUP_NEXT_REWRITE] = "ip6-rewrite",                  \
+    [IP_LOOKUP_NEXT_CLASSIFY] = "ip6-classify",                        \
+    [IP_LOOKUP_NEXT_MAP] = "ip6-map",                          \
+    [IP_LOOKUP_NEXT_MAP_T] = "ip6-map-t",                      \
+    [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 */
 #define IP_FLOW_HASH_SRC_ADDR (1<<0)
 #define IP_FLOW_HASH_DST_ADDR (1<<1)
@@ -136,15 +177,16 @@ typedef struct {
   union {
     /* IP_LOOKUP_NEXT_ARP only */
     struct {
-      union {
-        ip4_address_t ip4;
-      } next_hop;
-      u32 next_adj_index_with_same_next_hop;
+      ip46_address_t next_hop;
     } arp;
     /* IP_LOOKUP_NEXT_CLASSIFY only */
     struct {
       u16 table_index;
     } classify;
+    /* IP_LOOKUP_NEXT_INDIRECT only */
+    struct {
+        ip46_address_t next_hop;
+    } indirect;
   };
 
   STRUCT_MARK(signature_end);
@@ -166,14 +208,14 @@ vnet_ip_adjacency_signature (ip_adjacency_t * adj)
   uword signature = 0xfeedfaceULL;
 
   /* Skip heap handle, sum everything up to but not including share_count */
-  signature = hash_memory64
+  signature = hash_memory
       (STRUCT_MARK_PTR(adj, signature_start),
        STRUCT_OFFSET_OF(ip_adjacency_t, signature_end)
        - STRUCT_OFFSET_OF(ip_adjacency_t, signature_start),
        signature);
 
   /* and the rewrite */
-  signature = hash_memory64 (&adj->rewrite_header, VLIB_BUFFER_PRE_DATA_SIZE,
+  signature = hash_memory (&adj->rewrite_header, VLIB_BUFFER_PRE_DATA_SIZE,
                              signature);
   return signature;
 }
@@ -432,9 +474,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);
 }