]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pim: Fix vrf binding of autorp and mroute socket
authorNathan Bahr <nbahr@atcorp.com>
Mon, 24 Feb 2025 20:23:52 +0000 (20:23 +0000)
committerNathan Bahr <nbahr@atcorp.com>
Mon, 24 Feb 2025 20:23:52 +0000 (20:23 +0000)
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 <nbahr@atcorp.com>
(cherry picked from commit 7e181a771c2e525aeda6e8f6c2d58e9ee2503949)

Fixed merge conflicts

pimd/pim_autorp.c
pimd/pim_autorp.h
pimd/pim_instance.c
pimd/pim_mroute.c

index e06f48fdc64487e57f993348a8a9e251af6bec4e..454bb35d938a899ed11615c98526837585c02c8a 100644 (file)
@@ -508,10 +508,19 @@ 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;
+               }
+
                autorp->sock = fd;
+
                if (!pim_autorp_setup(autorp)) {
-                       zlog_warn("Could not setup autorp socket fd=%d: errno=%d: %s",
-                                 fd, errno, safe_strerror(errno));
+                       zlog_warn("Could not setup autorp socket fd=%d: errno=%d: %s", fd, errno,
+                                 safe_strerror(errno));
+
                        close(fd);
                        autorp->sock = -1;
                        return false;
@@ -1042,7 +1051,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);
 }
index a0b029d00ae636c1299bd3971c7b31657a8bf25e..5b8633b576c3a89d4c2d51447187382326e1146f 100644 (file)
@@ -150,6 +150,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,
index f7c5ea3bcf345ee81dcf476ec5e2cf6c59d6fcb4..37b179a827d5f947de04002bb8de2803bd13b7eb 100644 (file)
@@ -188,6 +188,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;
index adc47e719d24475c9eb73103a6ef9fc1f188c460..77e5123e46f04a2277ef784589631029e16ced1c 100644 (file)
@@ -864,17 +864,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;