From: Sharath Ramamurthy Date: Tue, 27 Jul 2021 16:20:47 +0000 (+0530) Subject: zebra: Handle vni determination for non-vlan-aware bridges X-Git-Tag: base_9.0~402^2~52 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=feffe4eea6d4f6e533a9c22917163fa34a2119b6;p=mirror%2Ffrr.git zebra: Handle vni determination for non-vlan-aware bridges This patch addresses following - Remove unused VLAN Id parameter when trying to determine the VNI associated with a non-VLAN aware bridge. Also, add a check to ensure that in this case, we have a per-VNI VXLAN interface. Due to sequence of events, it is possible that we may have VLAN-VNI mappings, in which case the code should return gracefully. - With support for a container VXLAN interface that has VLAN-VNI mappings, the VXLAN interface itself may be up but a particular VNI might have been removed. Ensure that VNI mapping exists before proceeding with further processing. Signed-off-by: Sharath Ramamurthy --- diff --git a/zebra/zebra_evpn.c b/zebra/zebra_evpn.c index 8e204cd547..214f34c58e 100644 --- a/zebra/zebra_evpn.c +++ b/zebra/zebra_evpn.c @@ -711,13 +711,12 @@ static int zebra_evpn_map_vlan_ns(struct ns *ns, if (zif->brslave_info.br_if != br_if) continue; - vni_id = zebra_vxlan_if_access_vlan_vni_find(zif, vid, - br_if); + vni_id = + zebra_vxlan_if_access_vlan_vni_find(zif, br_if); if (vni_id) { found = 1; break; } - } } @@ -808,11 +807,12 @@ static int zebra_evpn_from_svi_ns(struct ns *ns, if (zif->brslave_info.br_if != br_if) continue; - vni_id = zebra_vxlan_if_access_vlan_vni_find(zif, vid, - br_if); - if (vni_id) + vni_id = + zebra_vxlan_if_access_vlan_vni_find(zif, br_if); + if (vni_id) { found = 1; - break; + break; + } } } diff --git a/zebra/zebra_evpn_mh.c b/zebra/zebra_evpn_mh.c index 4bba98c5a0..adb1d229c1 100644 --- a/zebra/zebra_evpn_mh.c +++ b/zebra/zebra_evpn_mh.c @@ -500,11 +500,14 @@ void zebra_evpn_update_all_es(struct zebra_evpn *zevpn) if (if_is_operative(vxlan_if) && vxlan_zif->brslave_info.br_if) { vni = zebra_vxlan_if_vni_find(vxlan_zif, zevpn->vni); - vlan_if = - zvni_map_to_svi(vni->access_vlan, - vxlan_zif->brslave_info.br_if); - if (vlan_if) - zebra_evpn_acc_bd_svi_mac_add(vlan_if); + /* VLAN-VNI mappings may not exist */ + if (vni) { + vlan_if = zvni_map_to_svi( + vni->access_vlan, + vxlan_zif->brslave_info.br_if); + if (vlan_if) + zebra_evpn_acc_bd_svi_mac_add(vlan_if); + } } } } diff --git a/zebra/zebra_vxlan.c b/zebra/zebra_vxlan.c index c3a39fc435..9101dbe6a3 100644 --- a/zebra/zebra_vxlan.c +++ b/zebra/zebra_vxlan.c @@ -1912,8 +1912,8 @@ static int zl3vni_from_svi_ns(struct ns *ns, void *_in_param, void **_p_zl3vni) if (zif->brslave_info.br_if != in_param->br_if) continue; - vni_id = zebra_vxlan_if_access_vlan_vni_find(zif, in_param->vid, - in_param->br_if); + vni_id = zebra_vxlan_if_access_vlan_vni_find( + zif, in_param->br_if); if (vni_id) { found = 1; break; diff --git a/zebra/zebra_vxlan_if.c b/zebra/zebra_vxlan_if.c index ce27cfb412..78a04372dc 100644 --- a/zebra/zebra_vxlan_if.c +++ b/zebra/zebra_vxlan_if.c @@ -655,6 +655,7 @@ struct zebra_vxlan_vni *zebra_vxlan_if_vni_find(const struct zebra_if *zif, return vnip; } + /* For SVD, the VNI value is a required parameter. */ assert(vni); memset(&vni_tmp, 0, sizeof(vni_tmp)); @@ -716,13 +717,17 @@ void zebra_vxlan_if_vni_walk(struct zebra_if *zif, hash_walk(vni_info->vni_table, zebra_vxlan_if_vni_walk_callback, &ctx); } -vni_t zebra_vxlan_if_access_vlan_vni_find(struct zebra_if *zif, vlanid_t vid, +vni_t zebra_vxlan_if_access_vlan_vni_find(struct zebra_if *zif, struct interface *br_if) { struct zebra_vxlan_vni *vni = NULL; - /* Expected to be called only for vlan-unware bridges */ - assert(!IS_ZEBRA_IF_BRIDGE_VLAN_AWARE((struct zebra_if *)br_if->info)); + /* Expected to be called only for vlan-unware bridges. In this case, + * we only support a per-VNI VXLAN interface model. + */ + if (!IS_ZEBRA_VXLAN_IF_VNI(zif)) + return 0; + vni = zebra_vxlan_if_vni_find(zif, 0); assert(vni); diff --git a/zebra/zebra_vxlan_if.h b/zebra/zebra_vxlan_if.h index 9ddd0f89cd..a09e3dbe8c 100644 --- a/zebra/zebra_vxlan_if.h +++ b/zebra/zebra_vxlan_if.h @@ -61,7 +61,6 @@ extern void zebra_vxlan_if_vni_walk(struct zebra_if *zif, void *), void *arg); extern vni_t zebra_vxlan_if_access_vlan_vni_find(struct zebra_if *zif, - vlanid_t vid, struct interface *br_if); extern int zebra_vxlan_if_vni_mcast_group_update(struct interface *ifp, vni_t vni_id,