summaryrefslogtreecommitdiff
path: root/bgpd/bgp_zebra.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_zebra.c')
-rw-r--r--bgpd/bgp_zebra.c70
1 files changed, 58 insertions, 12 deletions
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index 688dfacaa0..e3465feda8 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -421,11 +421,10 @@ static int bgp_interface_address_delete(ZAPI_CALLBACK_ARGS)
if (addr->family == AF_INET)
continue;
- if (!IN6_IS_ADDR_LINKLOCAL(&addr->u.prefix6)
- && memcmp(&peer->nexthop.v6_global,
- &addr->u.prefix6, 16)
- == 0) {
- memset(&peer->nexthop.v6_global, 0, 16);
+ if (!IN6_IS_ADDR_LINKLOCAL(&addr->u.prefix6) &&
+ memcmp(&peer->nexthop.v6_global, &addr->u.prefix6, IPV6_MAX_BYTELEN) ==
+ 0) {
+ memset(&peer->nexthop.v6_global, 0, IPV6_MAX_BYTELEN);
FOREACH_AFI_SAFI (afi, safi)
bgp_announce_route(peer, afi, safi,
true);
@@ -744,6 +743,7 @@ bool bgp_zebra_nexthop_set(union sockunion *local, union sockunion *remote,
int ret = 0;
struct interface *ifp = NULL;
bool v6_ll_avail = true;
+ bool shared_network_original = peer->shared_network;
memset(nexthop, 0, sizeof(struct bgp_nexthop));
@@ -838,9 +838,9 @@ bool bgp_zebra_nexthop_set(union sockunion *local, union sockunion *remote,
if (!v6_ll_avail && !peer->conf_if)
v6_ll_avail = true;
if (if_lookup_by_ipv4(&remote->sin.sin_addr, peer->bgp->vrf_id))
- peer->shared_network = 1;
+ peer->shared_network = true;
else
- peer->shared_network = 0;
+ peer->shared_network = false;
}
/* IPv6 connection, fetch and store IPv4 local address if any. */
@@ -903,11 +903,14 @@ bool bgp_zebra_nexthop_set(union sockunion *local, union sockunion *remote,
|| if_lookup_by_ipv6(&remote->sin6.sin6_addr,
remote->sin6.sin6_scope_id,
peer->bgp->vrf_id))
- peer->shared_network = 1;
+ peer->shared_network = true;
else
- peer->shared_network = 0;
+ peer->shared_network = false;
}
+ if (shared_network_original != peer->shared_network)
+ bgp_peer_bfd_update_source(peer);
+
/* KAME stack specific treatment. */
#ifdef KAME
if (IN6_IS_ADDR_LINKLOCAL(&nexthop->v6_global)
@@ -1187,9 +1190,10 @@ static bool update_ipv6nh_for_route_install(int nh_othervrf, struct bgp *nh_bgp,
ifindex =
pi->peer->nexthop.ifp->ifindex;
if (!ifindex) {
- if (pi->peer->conf_if)
- ifindex = pi->peer->ifp->ifindex;
- else if (pi->peer->ifname)
+ if (pi->peer->conf_if) {
+ if (pi->peer->ifp)
+ ifindex = pi->peer->ifp->ifindex;
+ } else if (pi->peer->ifname)
ifindex = ifname2ifindex(
pi->peer->ifname,
pi->peer->bgp->vrf_id);
@@ -3025,6 +3029,48 @@ static void bgp_zebra_connected(struct zclient *zclient)
BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp, bgp->peer);
}
+void bgp_zebra_process_remote_routes_for_l2vni(struct event *e)
+{
+ /*
+ * If we have learnt and retained remote routes (VTEPs, MACs)
+ * for this VNI, install them.
+ */
+ install_uninstall_routes_for_vni(NULL, NULL, true);
+
+ /*
+ * If there are VNIs still pending to be processed, schedule them
+ * after a small sleep so that CPU can be used for other purposes.
+ */
+ if (zebra_l2_vni_count(&bm->zebra_l2_vni_head))
+ event_add_timer_msec(bm->master, bgp_zebra_process_remote_routes_for_l2vni, NULL,
+ 20, &bm->t_bgp_zebra_l2_vni);
+}
+
+void bgp_zebra_process_remote_routes_for_l3vrf(struct event *e)
+{
+ /*
+ * Install/Uninstall all remote routes belonging to l3vni
+ *
+ * NOTE:
+ * - At this point it does not matter whether we call
+ * install_routes_for_vrf/uninstall_routes_for_vrf.
+ * - Since we pass struct bgp as NULL,
+ * * we iterate the bm FIFO list
+ * * the second variable (true) is ignored as well and
+ * calculated based on the BGP-VRFs flags for ADD/DELETE.
+ */
+ install_uninstall_routes_for_vrf(NULL, true);
+
+ /*
+ * If there are L3VNIs still pending to be processed, schedule them
+ * after a small sleep so that CPU can be used for other purposes.
+ */
+ if (zebra_l3_vni_count(&bm->zebra_l3_vni_head)) {
+ event_add_timer_msec(bm->master, bgp_zebra_process_remote_routes_for_l3vrf, NULL,
+ 20, &bm->t_bgp_zebra_l3_vni);
+ }
+}
+
static int bgp_zebra_process_local_es_add(ZAPI_CALLBACK_ARGS)
{
esi_t esi;