#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 {
/* 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_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 { \
[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 */
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);
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);
}