]> git.proxmox.com Git - mirror_frr.git/commitdiff
bfdd: update vrf name of bfd session if necessary
authorPhilippe Guibert <philippe.guibert@6wind.com>
Wed, 19 Jun 2019 15:48:32 +0000 (17:48 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 27 Aug 2019 13:08:50 +0000 (15:08 +0200)
if the bfd session is already enabled, then dynamically change the vrf
name if the vrf where bfd is executed changed its name.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
bfdd/bfd.c
bfdd/bfd.h
bfdd/ptm_adapter.c

index a48dbb0ae2f78cac16203c45cd567352797fcf71..0b157ddafcae0502d7a554ed34533c75beb844de 100644 (file)
@@ -1749,3 +1749,14 @@ struct bfd_vrf_global *bfd_vrf_look_by_session(struct bfd_session *bfd)
                return NULL;
        return bfd->vrf->info;
 }
+
+void bfd_session_update_vrf_name(struct bfd_session *bs, struct vrf *vrf)
+{
+       if (!vrf || !bs)
+               return;
+       /* update key */
+       hash_release(bfd_key_hash, bs);
+       memset(bs->key.vrfname, 0, sizeof(bs->key.vrfname));
+       strlcpy(bs->key.vrfname, vrf->name, sizeof(bs->key.vrfname));
+       hash_get(bfd_key_hash, bs, hash_alloc_intern);
+}
index 10aeb3e52c9b6a704be4602764d63ba1738bdae7..cdec78d1226066ceb130c38f3cd5942628fbff20 100644 (file)
@@ -630,6 +630,7 @@ void bfdd_zclient_unregister(vrf_id_t vrf_id);
 void bfdd_zclient_register(vrf_id_t vrf_id);
 void bfdd_sessions_enable_vrf(struct vrf *vrf);
 void bfdd_sessions_disable_vrf(struct vrf *vrf);
+void bfd_session_update_vrf_name(struct bfd_session *bs, struct vrf *vrf);
 
 int ptm_bfd_notify(struct bfd_session *bs);
 
index 553033abfb41838d01c9dfb08b2fdf21deacc56f..ae6d04e77d5e72065a20304847d41b2c5fdf97c2 100644 (file)
@@ -630,6 +630,11 @@ void bfdd_sessions_enable_vrf(struct vrf *vrf)
        /* it may affect configs without interfaces */
        TAILQ_FOREACH(bso, &bglobal.bg_obslist, bso_entry) {
                bs = bso->bso_bs;
+               /* update name */
+               if (bs->vrf && bs->vrf == vrf) {
+                       if (!strmatch(bs->key.vrfname, vrf->name))
+                               bfd_session_update_vrf_name(bs, vrf);
+               }
                if (bs->vrf)
                        continue;
                if (bs->key.vrfname[0] &&