#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,
/* This packets needs to go to 6RD (RFC5969) */
IP_LOOKUP_NEXT_SIXRD,
- /* 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,
+ /* This packets needs to go to indirect next hop */
+ IP_LOOKUP_NEXT_INDIRECT,
+
+ 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_SIXRD] = "ip4-sixrd", \
+ [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_SIXRD] = "ip6-sixrd", \
+ [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)
u16 saved_lookup_next_index;
union {
+ /* IP_LOOKUP_NEXT_ARP only */
+ struct {
+ 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);
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;
}
CLIB_PREFETCH (_adj, sizeof (_adj[0]), type); \
} while (0)
+static inline void
+ip_register_add_del_adjacency_callback(ip_lookup_main_t * lm,
+ ip_add_del_adjacency_callback_t cb)
+{
+ vec_add1(lm->add_del_adjacency_callbacks, cb);
+}
+
always_inline void
ip_call_add_del_adjacency_callbacks (ip_lookup_main_t * lm, u32 adj_index, u32 is_del)
{
u32 * adj_index_result);
void ip_del_adjacency (ip_lookup_main_t * lm, u32 adj_index);
+void
+ip_update_adjacency (ip_lookup_main_t * lm,
+ u32 adj_index,
+ ip_adjacency_t * copy_adj);
+
+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);
+}
void
ip_multipath_adjacency_free (ip_lookup_main_t * lm,