mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-16 10:38:05 +00:00
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:
parent
b5ebdc9ba5
commit
af026ae40e
@ -224,12 +224,18 @@ void zebra_l2if_update_bridge_slave(struct interface *ifp,
|
|||||||
zif->brslave_info.bridge_ifindex = bridge_ifindex;
|
zif->brslave_info.bridge_ifindex = bridge_ifindex;
|
||||||
|
|
||||||
/* Set up or remove link with master */
|
/* Set up or remove link with master */
|
||||||
if (bridge_ifindex != IFINDEX_INTERNAL)
|
if (bridge_ifindex != IFINDEX_INTERNAL) {
|
||||||
zebra_l2_map_slave_to_bridge(&zif->brslave_info);
|
zebra_l2_map_slave_to_bridge (&zif->brslave_info);
|
||||||
else if (old_bridge_ifindex != IFINDEX_INTERNAL)
|
/* In the case of VxLAN, invoke the handler for EVPN. */
|
||||||
zebra_l2_unmap_slave_from_bridge(&zif->brslave_info);
|
if (zif->zif_type == ZEBRA_IF_VXLAN)
|
||||||
|
zebra_vxlan_if_update (ifp, ZEBRA_VXLIF_MASTER_CHANGE);
|
||||||
/* In the case of VxLAN, invoke the handler for EVPN. */
|
} else if (old_bridge_ifindex != IFINDEX_INTERNAL) {
|
||||||
if (zif->zif_type == ZEBRA_IF_VXLAN)
|
/* In the case of VxLAN, invoke the handler for EVPN. Note that
|
||||||
zebra_vxlan_if_update(ifp, ZEBRA_VXLIF_MASTER_CHANGE);
|
* 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3084,7 +3084,7 @@ int zebra_vxlan_remote_macip_del(struct zserv *client, int sock, u_short length,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ifp = zvni->vxlan_if;
|
ifp = zvni->vxlan_if;
|
||||||
if (!ifp)
|
if (!ifp) {
|
||||||
zlog_err(
|
zlog_err(
|
||||||
"VNI %u hash %p doesn't have intf upon remote MACIP DEL",
|
"VNI %u hash %p doesn't have intf upon remote MACIP DEL",
|
||||||
vni, zvni);
|
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),
|
vxl->access_vlan, inet_ntoa(vxl->vtep_ip),
|
||||||
zif->brslave_info.bridge_ifindex, chgflags);
|
zif->brslave_info.bridge_ifindex, chgflags);
|
||||||
|
|
||||||
/* Removed from bridge? */
|
/* Removed from bridge? Cleanup and return */
|
||||||
if ((chgflags & ZEBRA_VXLIF_MASTER_CHANGE)
|
if ((chgflags & ZEBRA_VXLIF_MASTER_CHANGE)
|
||||||
&& (zif->brslave_info.bridge_ifindex == IFINDEX_INTERNAL)) {
|
&& (zif->brslave_info.bridge_ifindex == IFINDEX_INTERNAL)) {
|
||||||
/* Delete from client, remove all remote VTEPs */
|
/* 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_neigh_del_all(zvrf, zvni, 1, 0, DEL_ALL_NEIGH);
|
||||||
zvni_mac_del_all(zvrf, zvni, 1, 0, DEL_ALL_MAC);
|
zvni_mac_del_all(zvrf, zvni, 1, 0, DEL_ALL_MAC);
|
||||||
zvni_vtep_del_all(zvni, 1);
|
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
|
/* Remove all existing local neighbors and MACs for this VNI
|
||||||
* (including from BGP)
|
* (including from BGP)
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user