diff options
| author | Jafar Al-Gharaibeh <jafar@atcorp.com> | 2024-08-29 00:10:36 -0500 | 
|---|---|---|
| committer | Jafar Al-Gharaibeh <jafar@atcorp.com> | 2024-09-09 13:27:49 -0500 | 
| commit | d97bea338de84b8ed33a0f1372ca6b8b56fb7d1d (patch) | |
| tree | 859b88978571b8b15991d432f39c8b66b3775827 /pimd | |
| parent | 865bae9657249ab2b956debca49157b0c7d1cc92 (diff) | |
pimd: refactor pim_sock_read to be used with unicast bsr msgs
Signed-off-by: Jafar Al-Gharaibeh <jafar@atcorp.com>
Diffstat (limited to 'pimd')
| -rw-r--r-- | pimd/pim_bsm.c | 59 | ||||
| -rw-r--r-- | pimd/pim_pim.c | 72 | ||||
| -rw-r--r-- | pimd/pim_pim.h | 3 | 
3 files changed, 42 insertions, 92 deletions
diff --git a/pimd/pim_bsm.c b/pimd/pim_bsm.c index e742e9888a..115aec8933 100644 --- a/pimd/pim_bsm.c +++ b/pimd/pim_bsm.c @@ -258,66 +258,11 @@ static inline void pim_bs_timer_restart(struct bsm_scope *scope, int bs_timeout)  static void bsm_unicast_sock_read(struct event *t)  {  	struct bsm_scope *scope = EVENT_ARG(t); -	struct sockaddr_storage from; -	struct sockaddr_storage to; -	socklen_t fromlen = sizeof(from); -	socklen_t tolen = sizeof(to); -	ifindex_t ifindex = 0; -	struct interface *ifp; -	uint8_t buf[PIM_PIM_BUFSIZE_READ]; -	int len, i; + +	pim_sock_read_helper(scope->unicast_sock, scope->pim, false);  	event_add_read(router->master, bsm_unicast_sock_read, scope,  		       scope->unicast_sock, &scope->unicast_read); - -	for (i = 0; i < router->packet_process; i++) { -		pim_sgaddr sg; - -		len = pim_socket_recvfromto(scope->unicast_sock, buf, -					    sizeof(buf), &from, &fromlen, &to, -					    &tolen, &ifindex); -		if (len < 0) { -			if (errno == EINTR) -				continue; -			if (errno == EWOULDBLOCK || errno == EAGAIN) -				break; - -			if (PIM_DEBUG_PIM_PACKETS) -				zlog_debug("Received errno: %d %s", errno, -					   safe_strerror(errno)); -			break; -		} - -#if PIM_IPV == 4 -		sg.src = ((struct sockaddr_in *)&from)->sin_addr; -		sg.grp = ((struct sockaddr_in *)&to)->sin_addr; -#else -		sg.src = ((struct sockaddr_in6 *)&from)->sin6_addr; -		sg.grp = ((struct sockaddr_in6 *)&to)->sin6_addr; -#endif - -		/* -		 * What?  So with vrf's the incoming packet is received -		 * on the vrf interface but recvfromto above returns -		 * the right ifindex, so just use it.  We know -		 * it's the right interface because we bind to it -		 */ -		ifp = if_lookup_by_index(ifindex, scope->pim->vrf->vrf_id); -		if (!ifp) { -			zlog_warn("Received incoming PIM packet on unknown ifindex %d", -				  ifindex); -			break; -		} - -		int fail = pim_pim_packet(ifp, buf, len, sg, false); - -		if (fail) { -			if (PIM_DEBUG_PIM_PACKETS) -				zlog_debug("%s: pim_pim_packet() return=%d", -					   __func__, fail); -			break; -		} -	}  }  void pim_bsm_proc_init(struct pim_instance *pim) diff --git a/pimd/pim_pim.c b/pimd/pim_pim.c index e70abab1b9..a41bbacea7 100644 --- a/pimd/pim_pim.c +++ b/pimd/pim_pim.c @@ -13,7 +13,6 @@  #include "network.h"  #include "pimd.h" -#include "pim_instance.h"  #include "pim_pim.h"  #include "pim_time.h"  #include "pim_iface.h" @@ -355,13 +354,9 @@ int pim_pim_packet(struct interface *ifp, uint8_t *buf, size_t len,  	}  } -static void pim_sock_read_on(struct interface *ifp); - -static void pim_sock_read(struct event *t) +int pim_sock_read_helper(int fd, struct pim_instance *pim, bool is_mcast)  { -	struct interface *ifp, *orig_ifp; -	struct pim_interface *pim_ifp; -	int fd; +	struct interface *ifp = NULL;  	struct sockaddr_storage from;  	struct sockaddr_storage to;  	socklen_t fromlen = sizeof(from); @@ -369,16 +364,9 @@ static void pim_sock_read(struct event *t)  	uint8_t buf[PIM_PIM_BUFSIZE_READ];  	int len;  	ifindex_t ifindex = -1; -	int result = -1; /* defaults to bad */ -	static long long count = 0; -	int cont = 1; - -	orig_ifp = ifp = EVENT_ARG(t); -	fd = EVENT_FD(t); - -	pim_ifp = ifp->info; +	int i; -	while (cont) { +	for (i = 0; i < router->packet_process; i++) {  		pim_sgaddr sg;  		len = pim_socket_recvfromto(fd, buf, sizeof(buf), &from, @@ -392,7 +380,7 @@ static void pim_sock_read(struct event *t)  			if (PIM_DEBUG_PIM_PACKETS)  				zlog_debug("Received errno: %d %s", errno,  					   safe_strerror(errno)); -			goto done; +			return -1;  		}  		/* @@ -401,14 +389,21 @@ static void pim_sock_read(struct event *t)  		 * the right ifindex, so just use it.  We know  		 * it's the right interface because we bind to it  		 */ -		ifp = if_lookup_by_index(ifindex, pim_ifp->pim->vrf->vrf_id); -		if (!ifp || !ifp->info) { +		if (pim != NULL) +			ifp = if_lookup_by_index(ifindex, pim->vrf->vrf_id); + +		/* +		 * unicast BSM pkts (C-RP) may arrive on non pim interfaces +		 * mcast pkts are only expected in pim interfaces +		 */ +		if (!ifp || (is_mcast && !ifp->info)) {  			if (PIM_DEBUG_PIM_PACKETS) -				zlog_debug( -					"%s: Received incoming pim packet on interface(%s:%d) not yet configured for pim", -					__func__, ifp ? ifp->name : "Unknown", -					ifindex); -			goto done; +				zlog_debug("%s: Received incoming pim packet on interface(%s:%d)%s", +					   __func__, +					   ifp ? ifp->name : "Unknown", ifindex, +					   is_mcast ? " not yet configured for pim" +						    : ""); +			return -1;  		}  #if PIM_IPV == 4  		sg.src = ((struct sockaddr_in *)&from)->sin_addr; @@ -418,27 +413,34 @@ static void pim_sock_read(struct event *t)  		sg.grp = ((struct sockaddr_in6 *)&to)->sin6_addr;  #endif -		int fail = pim_pim_packet(ifp, buf, len, sg, true); +		int fail = pim_pim_packet(ifp, buf, len, sg, is_mcast);  		if (fail) {  			if (PIM_DEBUG_PIM_PACKETS)  				zlog_debug("%s: pim_pim_packet() return=%d",  					   __func__, fail); -			goto done; +			return -1;  		} - -		count++; -		if (count % router->packet_process == 0) -			cont = 0;  	} +	return 0; +} + +static void pim_sock_read_on(struct interface *ifp); + +static void pim_sock_read(struct event *t) +{ +	struct interface *ifp; +	struct pim_interface *pim_ifp; +	int fd; -	result = 0; /* good */ +	ifp = EVENT_ARG(t); +	fd = EVENT_FD(t); -done: -	pim_sock_read_on(orig_ifp); +	pim_ifp = ifp->info; -	if (result) { +	if (pim_sock_read_helper(fd, pim_ifp->pim, true) == 0)  		++pim_ifp->pim_ifstat_hello_recvfail; -	} + +	pim_sock_read_on(ifp);  }  static void pim_sock_read_on(struct interface *ifp) diff --git a/pimd/pim_pim.h b/pimd/pim_pim.h index 13ccbb81b3..39b27bceda 100644 --- a/pimd/pim_pim.h +++ b/pimd/pim_pim.h @@ -10,6 +10,7 @@  #include <zebra.h>  #include "if.h" +#include "pim_instance.h"  #define PIM_PIM_BUFSIZE_READ  (20000)  #define PIM_PIM_BUFSIZE_WRITE (20000) @@ -48,4 +49,6 @@ int pim_msg_send(int fd, pim_addr src, pim_addr dst, uint8_t *pim_msg,  		 int pim_msg_size, struct interface *ifp);  int pim_hello_send(struct interface *ifp, uint16_t holdtime); + +int pim_sock_read_helper(int fd, struct pim_instance *pim, bool is_mcast);  #endif /* PIM_PIM_H */  | 
