From be01e62c4325973848f2039ce07660c72e8a021e Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Mon, 3 May 2021 14:39:47 -0400 Subject: [PATCH] pimd: There exists a path where on vrf bringup we do not create the pimreg When creating configuration for a vrf *Before* the vrf has been created, pim will not properly create the pimreg device and we will promptly crash when we try to pass data. Put some code checks in place to ensure that the pimreg is created for vrf's. Signed-off-by: Donald Sharp --- pimd/pim_iface.c | 10 ++++++++++ pimd/pim_instance.c | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index 834399053b..4a04c7a91e 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -1566,6 +1566,16 @@ int pim_ifp_create(struct interface *ifp) if (pim_ifp) pim_ifp->pim = pim; pim_if_addr_add_all(ifp); + + /* + * Due to ordering issues based upon when + * a command is entered we should ensure that + * the pim reg is created for this vrf if we + * have configuration for it already. + * + * this is a no-op if it's already been done. + */ + pim_if_create_pimreg(pim); } /* diff --git a/pimd/pim_instance.c b/pimd/pim_instance.c index 019048abf1..a7048ecefa 100644 --- a/pimd/pim_instance.c +++ b/pimd/pim_instance.c @@ -175,9 +175,18 @@ static int pim_vrf_delete(struct vrf *vrf) static int pim_vrf_enable(struct vrf *vrf) { struct pim_instance *pim = (struct pim_instance *)vrf->info; + struct interface *ifp; zlog_debug("%s: for %s", __func__, vrf->name); + FOR_ALL_INTERFACES (vrf, ifp) { + if (!ifp->info) + continue; + + pim_if_create_pimreg(pim); + break; + } + pim_mroute_socket_enable(pim); return 0; -- 2.39.5