]> git.puffer.fish Git - mirror/frr.git/commitdiff
pim: Fix vrf binding of autorp and mroute socket 18246/head
authorNathan Bahr <nbahr@atcorp.com>
Fri, 21 Feb 2025 17:55:16 +0000 (17:55 +0000)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Mon, 24 Feb 2025 18:55:16 +0000 (18:55 +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)

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

index dc077dbbd623aa8639b1af401a92b0a11769e2f2..7bc28ff819b593d5038527cb1f51d16b3580cf9f 100644 (file)
@@ -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);
 }
index e4c65301092471e703b6d47407f528196b58729e..88aebe5b7d771a6e2af7c1111d1bee4e9cb8682c 100644 (file)
@@ -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,
index 3945c5923d5e68c0e6130359d6be25f41fdc01ea..358821142efff8a7fc962521c2ac381bf6467d94 100644 (file)
@@ -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;
index 6c13e1324f40127a6a91846d8cf7ed043de2aae8..30daa3a929dcaabaaccd3b7c22255c70ee22946a 100644 (file)
@@ -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;