summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilippe Guibert <philippe.guibert@6wind.com>2021-08-17 10:56:32 +0200
committerPhilippe Guibert <philippe.guibert@6wind.com>2021-09-17 10:25:38 +0200
commitf56a15b5bd231c78456a2d340abbd0300a686e81 (patch)
tree081c3e8bc73c2c1d92820b28c57752ddfc6dc72c
parentc7620108890f58796b0155bb9ef3d65f0b39909f (diff)
zebra: refresh vxlan evpn contexts, when bridge interface goes up
When using bgp evpn rt5 setup, after BGP configuration has been loaded, if the user attempts to detach and reattach the bridged vxlan interface from the bridge, then BGP loses its BGP EVPN contexts, and a refresh of BGP configuration is necessary to maintain consistency between linux configuration and BGP EVPN contexts (RIB). The following command can lead to inconsistency: ip netns exec cust1 ip link set dev vxlan1000 nomaster ip netns exec cust1 ip link set dev vxlan1000 master br1000 consecutive to the, BGP l2vpn evpn RIB is empty, and the way to solve this until now is to reconfigure EVPN like this: vrf cust1 no vni 1000 vni 1000 exit-vrf Actually, the link information is correctly handled. In fact, at the time of link event, the lower link status of the bridge interface was not yet up, thus preventing from establishing BGP EVPN contexts. In fact, when a bridge interface does not have any slave interface, the link status of the bridge interface is down. That change of status comes a bit after, and is not detected by slave interfaces, as this event is not intercepted. This commit intercepts the bridge link up event, and triggers a check on slaved vxlan interfaces. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
-rw-r--r--zebra/if_netlink.c3
-rw-r--r--zebra/zebra_l2.c2
-rw-r--r--zebra/zebra_l2.h1
3 files changed, 6 insertions, 0 deletions
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c
index 658b862e62..a78b7607a0 100644
--- a/zebra/if_netlink.c
+++ b/zebra/if_netlink.c
@@ -1756,6 +1756,9 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
"Intf %s(%u) has come UP",
name, ifp->ifindex);
if_up(ifp);
+ if (IS_ZEBRA_IF_BRIDGE(ifp))
+ chgflags =
+ ZEBRA_BRIDGE_MASTER_UP;
} else {
if (IS_ZEBRA_DEBUG_KERNEL)
zlog_debug(
diff --git a/zebra/zebra_l2.c b/zebra/zebra_l2.c
index ae630314be..5a02149611 100644
--- a/zebra/zebra_l2.c
+++ b/zebra/zebra_l2.c
@@ -434,6 +434,8 @@ void zebra_l2if_update_bridge_slave(struct interface *ifp,
if (ZEBRA_BRIDGE_MASTER_MAC_CHANGE)
zebra_vxlan_if_update(ifp,
ZEBRA_VXLIF_MASTER_MAC_CHANGE);
+ if (ZEBRA_BRIDGE_MASTER_UP)
+ zebra_vxlan_if_update(ifp, ZEBRA_VXLIF_MASTER_CHANGE);
}
old_bridge_ifindex = zif->brslave_info.bridge_ifindex;
old_ns_id = zif->brslave_info.ns_id;
diff --git a/zebra/zebra_l2.h b/zebra/zebra_l2.h
index de833ebdbc..98744f3c1f 100644
--- a/zebra/zebra_l2.h
+++ b/zebra/zebra_l2.h
@@ -35,6 +35,7 @@ extern "C" {
#define ZEBRA_BRIDGE_NO_ACTION (0)
#define ZEBRA_BRIDGE_MASTER_MAC_CHANGE (1 << 1)
+#define ZEBRA_BRIDGE_MASTER_UP (1 << 2)
/* zebra L2 interface information - bridge slave (linkage to bridge) */
struct zebra_l2info_brslave {