diff options
| author | Donald Sharp <donaldsharp72@gmail.com> | 2025-02-25 10:20:46 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-25 10:20:46 -0500 | 
| commit | 483b89751f7e1367289660ff4663e24926c5bf99 (patch) | |
| tree | 3f7ae55cb3e94de7925d6c3fbf4b8a46799554d1 | |
| parent | bedc596a5e5711c027cc650d910d4b0525ea743d (diff) | |
| parent | 06956e881c139674e67f017d387a28e1a60531c8 (diff) | |
Merge pull request #18252 from nabahr/pr-18226-10.2-backport-fixed
pim: Fix vrf binding of autorp and mroute socket (backport #18226)
| -rw-r--r-- | pimd/pim_autorp.c | 16 | ||||
| -rw-r--r-- | pimd/pim_autorp.h | 1 | ||||
| -rw-r--r-- | pimd/pim_instance.c | 4 | ||||
| -rw-r--r-- | pimd/pim_mroute.c | 10 | 
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;  | 
