IPv6 HBH: Refactor code. Separate out RFC2460 HBH handling and the more experimental
[vpp.git] / vnet / vnet / ip / lookup.h
index e9a4912..30c1291 100644 (file)
@@ -87,6 +87,8 @@ typedef enum {
   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;
 
@@ -105,6 +107,7 @@ typedef enum {
     [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 {                                        \
@@ -122,6 +125,7 @@ typedef enum {
     [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",            \
 }
 
 /* Flow hash configuration */
@@ -471,9 +475,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);
 }