summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgord_chen <gord_chen@edge-core.com>2021-07-20 09:28:37 +0000
committermergify-bot <noreply@mergify.io>2021-07-23 09:33:45 +0000
commit33922f04032e93b857f2149e64dfb3116701bbdd (patch)
treeead268b0f21e2fd1f251bf1f841f9468cbf0b4b9
parent381752f3679b43f53f5c72e91153729853930a3f (diff)
zebra: trigger remove all access vlans for access port
When port was removed from last access vlan, the linux kernel won't send any vlan info in the netlink message, it might affact the evpn mh not withdraw EAD-EVI routes. Signed-off-by: Gord Chen <gord_chen@edge-core.com> (cherry picked from commit ec8977510e9ddb9b8a2ea610d0acbbc5355c1fac)
-rw-r--r--zebra/if_netlink.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c
index c2b4dcc52f..a51e0b82cb 100644
--- a/zebra/if_netlink.c
+++ b/zebra/if_netlink.c
@@ -706,6 +706,9 @@ static int netlink_bridge_vxlan_update(struct interface *ifp,
struct bridge_vlan_info *vinfo;
vlanid_t access_vlan;
+ if (!af_spec)
+ return 0;
+
/* There is a 1-to-1 mapping of VLAN to VxLAN - hence
* only 1 access VLAN is accepted.
*/
@@ -742,23 +745,26 @@ static void netlink_bridge_vlan_update(struct interface *ifp,
/* create a new bitmap space for re-eval */
bf_init(zif->vlan_bitmap, IF_VLAN_BITMAP_MAX);
- for (i = RTA_DATA(af_spec), rem = RTA_PAYLOAD(af_spec);
- RTA_OK(i, rem); i = RTA_NEXT(i, rem)) {
+ if (af_spec) {
+ for (i = RTA_DATA(af_spec), rem = RTA_PAYLOAD(af_spec);
+ RTA_OK(i, rem); i = RTA_NEXT(i, rem)) {
- if (i->rta_type != IFLA_BRIDGE_VLAN_INFO)
- continue;
+ if (i->rta_type != IFLA_BRIDGE_VLAN_INFO)
+ continue;
- vinfo = RTA_DATA(i);
+ vinfo = RTA_DATA(i);
- if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) {
- vid_range_start = vinfo->vid;
- continue;
- }
+ if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) {
+ vid_range_start = vinfo->vid;
+ continue;
+ }
- if (!(vinfo->flags & BRIDGE_VLAN_INFO_RANGE_END))
- vid_range_start = vinfo->vid;
+ if (!(vinfo->flags & BRIDGE_VLAN_INFO_RANGE_END))
+ vid_range_start = vinfo->vid;
- zebra_vlan_bitmap_compute(ifp, vid_range_start, vinfo->vid);
+ zebra_vlan_bitmap_compute(ifp, vid_range_start,
+ vinfo->vid);
+ }
}
zebra_vlan_mbr_re_eval(ifp, old_vlan_bitmap);
@@ -794,8 +800,6 @@ static int netlink_bridge_interface(struct nlmsghdr *h, int len, ns_id_t ns_id,
/* We are only interested in the access VLAN i.e., AF_SPEC */
af_spec = tb[IFLA_AF_SPEC];
- if (!af_spec)
- return 0;
if (IS_ZEBRA_IF_VXLAN(ifp))
return netlink_bridge_vxlan_update(ifp, af_spec);