diff options
| author | Donatas Abraitis <donatas@opensourcerouting.org> | 2024-05-08 22:36:58 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-08 22:36:58 +0300 |
| commit | 5ed6db5e9ee6cf916a32d40ac8b573095fb240c7 (patch) | |
| tree | 90ac07fcd2f24b6c64e66c4446621082a2300ea8 | |
| parent | 8ac0a1d50e9ce4fd2c30a960d75933882972ebb9 (diff) | |
| parent | fde6dd7bb9161cf58fdd8ca066cce77bad159c9d (diff) | |
Merge pull request #15920 from chiragshah6/fdev2
zebra: fix EVPN svd based remote nh neigh del
| -rw-r--r-- | zebra/zebra_vxlan.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/zebra/zebra_vxlan.c b/zebra/zebra_vxlan.c index 89b43f6d22..65dc6638bc 100644 --- a/zebra/zebra_vxlan.c +++ b/zebra/zebra_vxlan.c @@ -1759,9 +1759,9 @@ static int svd_remote_nh_add(struct zebra_l3vni *zl3vni, } else if (memcmp(&nh->emac, rmac, ETH_ALEN) != 0) { if (IS_ZEBRA_DEBUG_VXLAN) - zlog_debug( - "SVD RMAC change(%pEA --> %pEA) for nexthop %pIA, prefix %pFX", - &nh->emac, rmac, vtep_ip, host_prefix); + zlog_debug("SVD RMAC change(%pEA --> %pEA) for nexthop %pIA, prefix %pFX refcnt %u", + &nh->emac, rmac, vtep_ip, host_prefix, + nh->refcnt); memcpy(&nh->emac, rmac, ETH_ALEN); /* install (update) the nh neigh in kernel */ @@ -2469,11 +2469,26 @@ static void zl3vni_del_rmac_hash_entry(struct hash_bucket *bucket, void *ctx) /* delete and uninstall nh hash entry */ static void zl3vni_del_nh_hash_entry(struct hash_bucket *bucket, void *ctx) { - struct zebra_neigh *n = NULL; + struct zebra_neigh *n = NULL, *svd_nh = NULL; struct zebra_l3vni *zl3vni = NULL; n = (struct zebra_neigh *)bucket->data; zl3vni = (struct zebra_l3vni *)ctx; + + /* remove SVD based remote nexthop neigh entry */ + svd_nh = svd_nh_lookup(&n->ip); + if (svd_nh) { + svd_nh->refcnt--; + if (IS_ZEBRA_DEBUG_VXLAN) + zlog_debug("%s L3VNI %u remove svd nh %pIA refcnt %u", + __func__, zl3vni->vni, &n->ip, + svd_nh->refcnt); + if (svd_nh->refcnt == 0) { + svd_nh_uninstall(zl3vni, svd_nh); + svd_nh_del(svd_nh); + } + } + zl3vni_nh_uninstall(zl3vni, n); zl3vni_nh_del(zl3vni, n); } |
