zebra: Fix VxLAN interface add-del to bridge

Ensure that removal and addition of VxLAN interface from/to bridge is
handled correctly.

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
This commit is contained in:
vivek 2017-07-20 09:54:46 -07:00 committed by Mitesh Kanjariya
parent b5ebdc9ba5
commit af026ae40e
2 changed files with 21 additions and 11 deletions

View File

@ -224,12 +224,18 @@ void zebra_l2if_update_bridge_slave(struct interface *ifp,
zif->brslave_info.bridge_ifindex = bridge_ifindex;
/* Set up or remove link with master */
if (bridge_ifindex != IFINDEX_INTERNAL)
zebra_l2_map_slave_to_bridge(&zif->brslave_info);
else if (old_bridge_ifindex != IFINDEX_INTERNAL)
zebra_l2_unmap_slave_from_bridge(&zif->brslave_info);
/* In the case of VxLAN, invoke the handler for EVPN. */
if (zif->zif_type == ZEBRA_IF_VXLAN)
zebra_vxlan_if_update(ifp, ZEBRA_VXLIF_MASTER_CHANGE);
if (bridge_ifindex != IFINDEX_INTERNAL) {
zebra_l2_map_slave_to_bridge (&zif->brslave_info);
/* In the case of VxLAN, invoke the handler for EVPN. */
if (zif->zif_type == ZEBRA_IF_VXLAN)
zebra_vxlan_if_update (ifp, ZEBRA_VXLIF_MASTER_CHANGE);
} else if (old_bridge_ifindex != IFINDEX_INTERNAL) {
/* In the case of VxLAN, invoke the handler for EVPN. Note that
* this should be done *prior* to unmapping the interface from the
* bridge.
*/
if (zif->zif_type == ZEBRA_IF_VXLAN)
zebra_vxlan_if_update (ifp, ZEBRA_VXLIF_MASTER_CHANGE);
zebra_l2_unmap_slave_from_bridge (&zif->brslave_info);
}
}

View File

@ -3084,7 +3084,7 @@ int zebra_vxlan_remote_macip_del(struct zserv *client, int sock, u_short length,
continue;
}
ifp = zvni->vxlan_if;
if (!ifp)
if (!ifp) {
zlog_err(
"VNI %u hash %p doesn't have intf upon remote MACIP DEL",
vni, zvni);
@ -4174,7 +4174,7 @@ int zebra_vxlan_if_update(struct interface *ifp, u_int16_t chgflags)
vxl->access_vlan, inet_ntoa(vxl->vtep_ip),
zif->brslave_info.bridge_ifindex, chgflags);
/* Removed from bridge? */
/* Removed from bridge? Cleanup and return */
if ((chgflags & ZEBRA_VXLIF_MASTER_CHANGE)
&& (zif->brslave_info.bridge_ifindex == IFINDEX_INTERNAL)) {
/* Delete from client, remove all remote VTEPs */
@ -4183,7 +4183,11 @@ int zebra_vxlan_if_update(struct interface *ifp, u_int16_t chgflags)
zvni_neigh_del_all(zvrf, zvni, 1, 0, DEL_ALL_NEIGH);
zvni_mac_del_all(zvrf, zvni, 1, 0, DEL_ALL_MAC);
zvni_vtep_del_all(zvni, 1);
} else if (chgflags & ZEBRA_VXLIF_VLAN_CHANGE) {
return 0;
}
/* Handle other changes. */
if (chgflags & ZEBRA_VXLIF_VLAN_CHANGE) {
/* Remove all existing local neighbors and MACs for this VNI
* (including from BGP)
*/