From 76e4076d26dfbcf22fefd1eaecb3a490b57d2385 Mon Sep 17 00:00:00 2001 From: Nathan Bahr Date: Fri, 21 Feb 2025 17:55:16 +0000 Subject: [PATCH] pim: Fix vrf binding of autorp and mroute socket Bind the autorp socket to the vrf device. Also fixed mroute socket to use vrf_bind instead of directly setting the socket option. Signed-off-by: Nathan Bahr (cherry picked from commit 7e181a771c2e525aeda6e8f6c2d58e9ee2503949) --- pimd/pim_autorp.c | 10 ++++++++++ pimd/pim_autorp.h | 1 + pimd/pim_instance.c | 4 ++++ pimd/pim_mroute.c | 10 ++-------- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/pimd/pim_autorp.c b/pimd/pim_autorp.c index dc077dbbd623..7bc28ff819b5 100644 --- a/pimd/pim_autorp.c +++ b/pimd/pim_autorp.c @@ -980,6 +980,13 @@ static bool pim_autorp_socket_enable(struct pim_autorp *autorp) return false; } + if (vrf_bind(autorp->pim->vrf->vrf_id, fd, NULL)) { + zlog_warn("Could not bind autorp socket to vrf fd=%d: vrf_id=%d: errno=%d: %s", + fd, autorp->pim->vrf->vrf_id, errno, safe_strerror(errno)); + close(fd); + return false; + } + if (!pim_autorp_setup(fd)) { zlog_warn("Could not setup autorp socket fd=%d: errno=%d: %s", fd, errno, safe_strerror(errno)); @@ -1549,7 +1556,10 @@ void pim_autorp_init(struct pim_instance *pim) if (PIM_DEBUG_AUTORP) zlog_debug("%s: AutoRP Initialized", __func__); +} +void pim_autorp_enable(struct pim_instance *pim) +{ /* Start AutoRP discovery by default on startup */ pim_autorp_start_discovery(pim); } diff --git a/pimd/pim_autorp.h b/pimd/pim_autorp.h index e4c653010924..88aebe5b7d77 100644 --- a/pimd/pim_autorp.h +++ b/pimd/pim_autorp.h @@ -173,6 +173,7 @@ void pim_autorp_rm_ifp(struct interface *ifp); void pim_autorp_start_discovery(struct pim_instance *pim); void pim_autorp_stop_discovery(struct pim_instance *pim); void pim_autorp_init(struct pim_instance *pim); +void pim_autorp_enable(struct pim_instance *pim); void pim_autorp_finish(struct pim_instance *pim); int pim_autorp_config_write(struct pim_instance *pim, struct vty *vty); void pim_autorp_show_autorp(struct vty *vty, struct pim_instance *pim, const char *component, diff --git a/pimd/pim_instance.c b/pimd/pim_instance.c index 3945c5923d5e..358821142eff 100644 --- a/pimd/pim_instance.c +++ b/pimd/pim_instance.c @@ -183,6 +183,10 @@ static int pim_vrf_enable(struct vrf *vrf) pim_mroute_socket_enable(pim); +#if PIM_IPV == 4 + pim_autorp_enable(pim); +#endif + FOR_ALL_INTERFACES (vrf, ifp) { if (!ifp->info) continue; diff --git a/pimd/pim_mroute.c b/pimd/pim_mroute.c index 6c13e1324f40..30daa3a929dc 100644 --- a/pimd/pim_mroute.c +++ b/pimd/pim_mroute.c @@ -876,17 +876,11 @@ int pim_mroute_socket_enable(struct pim_instance *pim) pim->vrf->name); #endif -#ifdef SO_BINDTODEVICE - if (pim->vrf->vrf_id != VRF_DEFAULT - && setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, - pim->vrf->name, strlen(pim->vrf->name))) { - zlog_warn("Could not setsockopt SO_BINDTODEVICE: %s", - safe_strerror(errno)); + if (vrf_bind(pim->vrf->vrf_id, fd, NULL)) { + zlog_warn("Could not bind to vrf: %s", safe_strerror(errno)); close(fd); return -3; } -#endif - } pim->mroute_socket = fd;