aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/adj
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/adj')
-rw-r--r--src/vnet/adj/adj.c8
-rw-r--r--src/vnet/adj/adj.h10
-rw-r--r--src/vnet/adj/adj_nbr.c5
3 files changed, 23 insertions, 0 deletions
diff --git a/src/vnet/adj/adj.c b/src/vnet/adj/adj.c
index 0de3fc8b775..80a5d05aaf4 100644
--- a/src/vnet/adj/adj.c
+++ b/src/vnet/adj/adj.c
@@ -35,6 +35,13 @@ ip_adjacency_t *adj_pool;
*/
int adj_per_adj_counters;
+const ip46_address_t ADJ_BCAST_ADDR = {
+ .ip6 = {
+ .as_u64[0] = 0xffffffffffffffff,
+ .as_u64[1] = 0xffffffffffffffff,
+ },
+};
+
always_inline void
adj_poison (ip_adjacency_t * adj)
{
@@ -172,6 +179,7 @@ adj_last_lock_gone (ip_adjacency_t *adj)
/* FALL THROUGH */
case IP_LOOKUP_NEXT_ARP:
case IP_LOOKUP_NEXT_REWRITE:
+ case IP_LOOKUP_NEXT_BCAST:
/*
* complete and incomplete nbr adjs
*/
diff --git a/src/vnet/adj/adj.h b/src/vnet/adj/adj.h
index fe77d1634e0..18a2e1ddbbb 100644
--- a/src/vnet/adj/adj.h
+++ b/src/vnet/adj/adj.h
@@ -81,6 +81,9 @@ typedef enum
/** Multicast Adjacency. */
IP_LOOKUP_NEXT_MCAST,
+ /** Broadcasr Adjacency. */
+ IP_LOOKUP_NEXT_BCAST,
+
/** Multicast Midchain Adjacency. An Adjacency for sending macst packets
* on a tunnel/virtual interface */
IP_LOOKUP_NEXT_MCAST_MIDCHAIN,
@@ -110,6 +113,7 @@ typedef enum
[IP_LOOKUP_NEXT_GLEAN] = "ip4-glean", \
[IP_LOOKUP_NEXT_REWRITE] = "ip4-rewrite", \
[IP_LOOKUP_NEXT_MCAST] = "ip4-rewrite-mcast", \
+ [IP_LOOKUP_NEXT_BCAST] = "ip4-rewrite-bcast", \
[IP_LOOKUP_NEXT_MIDCHAIN] = "ip4-midchain", \
[IP_LOOKUP_NEXT_MCAST_MIDCHAIN] = "ip4-mcast-midchain", \
[IP_LOOKUP_NEXT_ICMP_ERROR] = "ip4-icmp-error", \
@@ -122,6 +126,7 @@ typedef enum
[IP_LOOKUP_NEXT_ARP] = "ip6-discover-neighbor", \
[IP_LOOKUP_NEXT_GLEAN] = "ip6-glean", \
[IP_LOOKUP_NEXT_REWRITE] = "ip6-rewrite", \
+ [IP_LOOKUP_NEXT_BCAST] = "ip6-rewrite-bcast", \
[IP_LOOKUP_NEXT_MCAST] = "ip6-rewrite-mcast", \
[IP_LOOKUP_NEXT_MIDCHAIN] = "ip6-midchain", \
[IP_LOOKUP_NEXT_MCAST_MIDCHAIN] = "ip6-mcast-midchain", \
@@ -132,6 +137,11 @@ typedef enum
}
/**
+ * The special broadcast address (to construct a broadcast adjacency
+ */
+extern const ip46_address_t ADJ_BCAST_ADDR;
+
+/**
* Forward delcartion
*/
struct ip_adjacency_t_;
diff --git a/src/vnet/adj/adj_nbr.c b/src/vnet/adj/adj_nbr.c
index 3f66acbb5c5..3a474a8e199 100644
--- a/src/vnet/adj/adj_nbr.c
+++ b/src/vnet/adj/adj_nbr.c
@@ -230,6 +230,11 @@ adj_nbr_add_or_lock (fib_protocol_t nh_proto,
adj_index = adj_get_index(adj);
adj_lock(adj_index);
+ if (ip46_address_is_equal(&ADJ_BCAST_ADDR, nh_addr))
+ {
+ adj->lookup_next_index = IP_LOOKUP_NEXT_BCAST;
+ }
+
vnet_rewrite_init(vnm, sw_if_index, link_type,
adj_get_nd_node(nh_proto),
vnet_tx_node_index_for_sw_interface(vnm, sw_if_index),