IP6 SR multicast replicator
[vpp.git] / vnet / vnet / ip / lookup.h
index 23cb02d..9c88b85 100644 (file)
@@ -43,6 +43,7 @@
 #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. */
 typedef enum {
@@ -78,6 +79,9 @@ typedef enum {
   /* 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,
@@ -100,6 +104,7 @@ typedef enum {
     [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",                        \
 }
 
 #define IP6_LOOKUP_NEXT_NODES {                                        \
@@ -116,6 +121,7 @@ typedef enum {
     [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",                        \
 }
 
 /* Flow hash configuration */
@@ -168,15 +174,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);
@@ -464,9 +471,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);
 }