Skip to content

Commit

Permalink
Merge pull request #15607 from chiragshah6/evpn_dev4
Browse files Browse the repository at this point in the history
zebra: bridge flap handle vlan membership update
  • Loading branch information
ton31337 authored May 4, 2024
2 parents 53820a5 + 0700528 commit d0401cb
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 14 deletions.
37 changes: 31 additions & 6 deletions zebra/zebra_evpn_mh.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand All @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion zebra/zebra_evpn_mh.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion zebra/zebra_l2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
35 changes: 29 additions & 6 deletions zebra/zebra_vxlan_if.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit d0401cb

Please sign in to comment.