summaryrefslogtreecommitdiff
path: root/pimd
diff options
context:
space:
mode:
authorDonald Sharp <donaldsharp72@gmail.com>2025-02-25 10:20:46 -0500
committerGitHub <noreply@github.com>2025-02-25 10:20:46 -0500
commit483b89751f7e1367289660ff4663e24926c5bf99 (patch)
tree3f7ae55cb3e94de7925d6c3fbf4b8a46799554d1 /pimd
parentbedc596a5e5711c027cc650d910d4b0525ea743d (diff)
parent06956e881c139674e67f017d387a28e1a60531c8 (diff)
Merge pull request #18252 from nabahr/pr-18226-10.2-backport-fixed
pim: Fix vrf binding of autorp and mroute socket (backport #18226)
Diffstat (limited to 'pimd')
-rw-r--r--pimd/pim_autorp.c16
-rw-r--r--pimd/pim_autorp.h1
-rw-r--r--pimd/pim_instance.c4
-rw-r--r--pimd/pim_mroute.c10
4 files changed, 21 insertions, 10 deletions
diff --git a/pimd/pim_autorp.c b/pimd/pim_autorp.c
index e06f48fdc6..454bb35d93 100644
--- a/pimd/pim_autorp.c
+++ b/pimd/pim_autorp.c
@@ -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);
}
diff --git a/pimd/pim_autorp.h b/pimd/pim_autorp.h
index a0b029d00a..5b8633b576 100644
--- a/pimd/pim_autorp.h
+++ b/pimd/pim_autorp.h
@@ -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,
diff --git a/pimd/pim_instance.c b/pimd/pim_instance.c
index 30726b1b71..535bcf8b8c 100644
--- a/pimd/pim_instance.c
+++ b/pimd/pim_instance.c
@@ -191,6 +191,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 adc47e719d..77e5123e46 100644
--- a/pimd/pim_mroute.c
+++ b/pimd/pim_mroute.c
@@ -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;