mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-06-04 18:48:54 +00:00
Merge pull request #15607 from chiragshah6/evpn_dev4
zebra: bridge flap handle vlan membership update
This commit is contained in:
commit
d0401cb0dc
@ -563,8 +563,9 @@ zebra_evpn_acc_vl_new(vlanid_t vid, struct interface *br_if)
|
||||
struct zebra_evpn_access_bd *acc_bd;
|
||||
struct interface *vlan_if;
|
||||
|
||||
if (IS_ZEBRA_DEBUG_EVPN_MH_ES)
|
||||
zlog_debug("access vlan %d bridge %s add", vid, br_if->name);
|
||||
if (IS_ZEBRA_DEBUG_EVPN_MH_ES || IS_ZEBRA_DEBUG_KERNEL)
|
||||
zlog_debug("%s access vlan %d bridge %s add", __func__, vid,
|
||||
br_if->name);
|
||||
|
||||
acc_bd = XCALLOC(MTYPE_ZACC_BD, sizeof(struct zebra_evpn_access_bd));
|
||||
|
||||
@ -582,8 +583,8 @@ zebra_evpn_acc_vl_new(vlanid_t vid, struct interface *br_if)
|
||||
vlan_if = zvni_map_to_svi(vid, br_if);
|
||||
if (vlan_if) {
|
||||
if (IS_ZEBRA_DEBUG_EVPN_MH_ES)
|
||||
zlog_debug("vlan %d bridge %s SVI %s set", vid,
|
||||
br_if->name, vlan_if->name);
|
||||
zlog_debug("%s vlan %d bridge %s SVI %s set", __func__,
|
||||
vid, br_if->name, vlan_if->name);
|
||||
acc_bd->vlan_zif = vlan_if->info;
|
||||
}
|
||||
return acc_bd;
|
||||
@ -731,6 +732,29 @@ static void zebra_evpn_acc_bd_evpn_set(struct zebra_evpn_access_bd *acc_bd,
|
||||
}
|
||||
}
|
||||
|
||||
/* Lookup API for VxLAN_IF's Bridge, VLAN in EVPN cache */
|
||||
int zebra_evpn_vl_vxl_bridge_lookup(uint16_t vid, struct zebra_if *vxlan_zif)
|
||||
{
|
||||
struct interface *br_if;
|
||||
struct zebra_evpn_access_bd *acc_bd;
|
||||
|
||||
if (!vid)
|
||||
return -1;
|
||||
|
||||
br_if = vxlan_zif->brslave_info.br_if;
|
||||
|
||||
if (!br_if)
|
||||
return -1;
|
||||
|
||||
acc_bd = zebra_evpn_acc_vl_find(vid, br_if);
|
||||
|
||||
if (!acc_bd)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* handle VLAN->VxLAN_IF association */
|
||||
void zebra_evpn_vl_vxl_ref(uint16_t vid, vni_t vni_id,
|
||||
struct zebra_if *vxlan_zif)
|
||||
@ -768,8 +792,9 @@ void zebra_evpn_vl_vxl_ref(uint16_t vid, vni_t vni_id,
|
||||
if (acc_bd->zevpn == old_zevpn)
|
||||
return;
|
||||
|
||||
if (IS_ZEBRA_DEBUG_EVPN_MH_ES)
|
||||
zlog_debug("access vlan %d vni %u ref", acc_bd->vid, vni_id);
|
||||
if (IS_ZEBRA_DEBUG_EVPN_MH_ES || IS_ZEBRA_DEBUG_KERNEL)
|
||||
zlog_debug("%s bridge %s access vlan %d vni %u ref", __func__,
|
||||
br_if->name, acc_bd->vid, vni_id);
|
||||
|
||||
if (old_zevpn)
|
||||
zebra_evpn_acc_bd_evpn_set(acc_bd, NULL, old_zevpn);
|
||||
|
@ -378,7 +378,8 @@ extern void zebra_evpn_es_bypass_update(struct zebra_evpn_es *es,
|
||||
extern void zebra_evpn_proc_remote_nh(ZAPI_HANDLER_ARGS);
|
||||
extern struct zebra_evpn_es_evi *
|
||||
zebra_evpn_es_evi_find(struct zebra_evpn_es *es, struct zebra_evpn *zevpn);
|
||||
|
||||
extern int zebra_evpn_vl_vxl_bridge_lookup(uint16_t vid,
|
||||
struct zebra_if *vxlan_zif);
|
||||
void zebra_build_type3_esi(uint32_t lid, struct ethaddr *mac, esi_t *esi);
|
||||
|
||||
void zebra_evpn_es_sys_mac_update(struct zebra_if *zif, struct ethaddr *sysmac);
|
||||
|
@ -384,7 +384,7 @@ void zebra_l2_vxlanif_update_access_vlan(struct interface *ifp,
|
||||
return;
|
||||
|
||||
old_access_vlan = zif->l2info.vxl.vni_info.vni.access_vlan;
|
||||
;
|
||||
|
||||
if (old_access_vlan == access_vlan)
|
||||
return;
|
||||
|
||||
|
@ -506,7 +506,7 @@ static int zebra_vxlan_if_add_update_vni(struct zebra_if *zif,
|
||||
if ((hashcount(ctx->old_vni_table) == 0) ||
|
||||
!(old_vni = hash_release(ctx->old_vni_table, &vni_tmp))) {
|
||||
if (IS_ZEBRA_DEBUG_VXLAN)
|
||||
zlog_debug("vxlan %s adding vni(%d, %d)",
|
||||
zlog_debug("%s vxlan %s adding vni(%d, %d)", __func__,
|
||||
zif->ifp->name, vni->vni, vni->access_vlan);
|
||||
|
||||
zebra_vxlan_if_vni_entry_add(zif, &vni_tmp);
|
||||
@ -521,17 +521,39 @@ static int zebra_vxlan_if_add_update_vni(struct zebra_if *zif,
|
||||
|
||||
if (old_vni->access_vlan != vni->access_vlan) {
|
||||
if (IS_ZEBRA_DEBUG_VXLAN)
|
||||
zlog_debug(
|
||||
"vxlan %s updating vni(%d, %d) -> vni(%d, %d)",
|
||||
zif->ifp->name, old_vni->vni,
|
||||
old_vni->access_vlan, vni->vni,
|
||||
vni->access_vlan);
|
||||
zlog_debug("%s vxlan %s updating vni(%d, %d) -> vni(%d, %d)",
|
||||
__func__, zif->ifp->name, old_vni->vni,
|
||||
old_vni->access_vlan, vni->vni,
|
||||
vni->access_vlan);
|
||||
|
||||
zebra_evpn_vl_vxl_deref(old_vni->access_vlan, old_vni->vni,
|
||||
zif);
|
||||
zebra_evpn_vl_vxl_ref(vni->access_vlan, vni->vni, zif);
|
||||
zebra_vxlan_if_update_vni(zif->ifp, vni, ctx);
|
||||
zebra_vxlan_vni_free(old_vni);
|
||||
} else {
|
||||
int ret;
|
||||
|
||||
ret = zebra_evpn_vl_vxl_bridge_lookup(vni->access_vlan, zif);
|
||||
/* Here ret value 0 implied bridge vlan mapping is not present
|
||||
* repopulated. Ignore ret value 1 as it means vlan mapping is
|
||||
* present in bridge table.
|
||||
*/
|
||||
if (ret < 0) {
|
||||
if (IS_ZEBRA_DEBUG_VXLAN)
|
||||
zlog_debug("%s vxlan %s vni %u has error accessing bridge table.",
|
||||
__func__, zif->ifp->name, vni->vni);
|
||||
} else if (ret == 0) {
|
||||
if (IS_ZEBRA_DEBUG_VXLAN)
|
||||
zlog_debug("%s vxlan %s vni (%u, %u) not present in bridge table",
|
||||
__func__, zif->ifp->name, vni->vni,
|
||||
vni->access_vlan);
|
||||
zebra_evpn_vl_vxl_deref(old_vni->access_vlan,
|
||||
old_vni->vni, zif);
|
||||
zebra_evpn_vl_vxl_ref(vni->access_vlan, vni->vni, zif);
|
||||
zebra_vxlan_if_update_vni(zif->ifp, vni, ctx);
|
||||
zebra_vxlan_vni_free(old_vni);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -768,6 +790,7 @@ vni_t zebra_vxlan_if_access_vlan_vni_find(struct zebra_if *zif,
|
||||
return vni->vni;
|
||||
}
|
||||
|
||||
/* SVD VLAN-VNI mapping update */
|
||||
int zebra_vxlan_if_vni_table_add_update(struct interface *ifp,
|
||||
struct hash *vni_table)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user