diff options
| author | Donald Sharp <sharpd@cumulusnetwroks.com> | 2016-07-14 10:30:37 -0400 | 
|---|---|---|
| committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2016-12-21 20:26:02 -0500 | 
| commit | 4dffc8807e4c265002247d19dad4275308b6d818 (patch) | |
| tree | daed91ad7566ed0206e73549894664198d8f5ff2 | |
| parent | 13c2408c1d3fdf1c5b259e94eaa4aeb02523fd5d (diff) | |
pimd: Refactor pim message receive
We were using a variety of techniques to handle
incoming pim packets.  Refactor to use a switch
statement to handle the incoming packets.
Also add the ability to notice that we are getting
a register stop.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
| -rw-r--r-- | pimd/pim_pim.c | 91 | ||||
| -rw-r--r-- | pimd/pim_register.c | 7 | ||||
| -rw-r--r-- | pimd/pim_register.h | 1 | 
3 files changed, 52 insertions, 47 deletions
diff --git a/pimd/pim_pim.c b/pimd/pim_pim.c index c1b9e04e23..f0db822cb4 100644 --- a/pimd/pim_pim.c +++ b/pimd/pim_pim.c @@ -208,60 +208,57 @@ int pim_pim_packet(struct interface *ifp, uint8_t *buf, size_t len)  	       pim_version, pim_type, pim_msg_len, checksum);    } -  if (pim_type == PIM_MSG_TYPE_REG_STOP  || -      pim_type == PIM_MSG_TYPE_BOOTSTRAP || -      pim_type == PIM_MSG_TYPE_GRAFT     || -      pim_type == PIM_MSG_TYPE_GRAFT_ACK || -      pim_type == PIM_MSG_TYPE_CANDIDATE) +  switch (pim_type)      { +    case PIM_MSG_TYPE_HELLO: +      return pim_hello_recv (ifp, +			     ip_hdr->ip_src, +			     pim_msg + PIM_MSG_HEADER_LEN, +			     pim_msg_len - PIM_MSG_HEADER_LEN); +      break; +    case PIM_MSG_TYPE_REGISTER: +      return pim_register_recv (ifp, +				ip_hdr->ip_dst, +				ip_hdr->ip_src, +				pim_msg + PIM_MSG_HEADER_LEN, +				pim_msg_len - PIM_MSG_HEADER_LEN); +      break; +    case PIM_MSG_TYPE_REG_STOP: +      return pim_register_stop_recv (); +      break; +    case PIM_MSG_TYPE_JOIN_PRUNE: +      neigh = pim_neighbor_find(ifp, ip_hdr->ip_src); +      if (!neigh) { +	zlog_warn("%s %s: non-hello PIM message type=%d from non-neighbor %s on %s", +		  __FILE__, __PRETTY_FUNCTION__, +		  pim_type, src_str, ifp->name); +	return -1; +      } +      return pim_joinprune_recv(ifp, neigh, +				ip_hdr->ip_src, +				pim_msg + PIM_MSG_HEADER_LEN, +				pim_msg_len - PIM_MSG_HEADER_LEN); +      break; +    case PIM_MSG_TYPE_ASSERT: +      neigh = pim_neighbor_find(ifp, ip_hdr->ip_src); +      if (!neigh) { +	zlog_warn("%s %s: non-hello PIM message type=%d from non-neighbor %s on %s", +		  __FILE__, __PRETTY_FUNCTION__, +		  pim_type, src_str, ifp->name); +	return -1; +      } +      return pim_assert_recv(ifp, neigh, +			     ip_hdr->ip_src, +			     pim_msg + PIM_MSG_HEADER_LEN, +			     pim_msg_len - PIM_MSG_HEADER_LEN); +      break; +    default:        if (PIM_DEBUG_PIM_PACKETS) {  	zlog_debug("Recv PIM packet type %d which is not currently understood",  		   pim_type);        }        return -1;      } - -  if (pim_type == PIM_MSG_TYPE_HELLO) { -    return pim_hello_recv(ifp, -			  ip_hdr->ip_src, -			  pim_msg + PIM_MSG_HEADER_LEN, -			  pim_msg_len - PIM_MSG_HEADER_LEN); -  } else if (pim_type == PIM_MSG_TYPE_REGISTER) { -    return pim_register_recv(ifp, -			     ip_hdr->ip_dst, -			     ip_hdr->ip_src, -			     pim_msg + PIM_MSG_HEADER_LEN, -			     pim_msg_len - PIM_MSG_HEADER_LEN); -  } - -  neigh = pim_neighbor_find(ifp, ip_hdr->ip_src); -  if (!neigh) { -    zlog_warn("%s %s: non-hello PIM message type=%d from non-neighbor %s on %s", -	      __FILE__, __PRETTY_FUNCTION__, -	      pim_type, src_str, ifp->name); -    return -1; -  } - -  switch (pim_type) { -  case PIM_MSG_TYPE_JOIN_PRUNE: -    return pim_joinprune_recv(ifp, neigh, -			      ip_hdr->ip_src, -			      pim_msg + PIM_MSG_HEADER_LEN, -			      pim_msg_len - PIM_MSG_HEADER_LEN); -    break; -  case PIM_MSG_TYPE_ASSERT: -    return pim_assert_recv(ifp, neigh, -			   ip_hdr->ip_src, -			   pim_msg + PIM_MSG_HEADER_LEN, -			   pim_msg_len - PIM_MSG_HEADER_LEN); -    break; -  default: -    zlog_warn("%s %s: unsupported PIM message type=%d from %s on %s", -	      __FILE__, __PRETTY_FUNCTION__, -	      pim_type, src_str, ifp->name); -    break; -  } -    return -1;  } diff --git a/pimd/pim_register.c b/pimd/pim_register.c index 233db88d3e..a3e63f0285 100644 --- a/pimd/pim_register.c +++ b/pimd/pim_register.c @@ -111,6 +111,13 @@ pim_register_stop_send (struct interface *ifp, struct in_addr source,      }  } +int +pim_register_stop_recv (void) +{ +  zlog_debug ("Received Register Stop"); +  return 0; +} +  void  pim_register_send (const struct ip *ip_hdr, struct pim_rpf *rpg)  { diff --git a/pimd/pim_register.h b/pimd/pim_register.h index 039c0006e0..4749480b9d 100644 --- a/pimd/pim_register.h +++ b/pimd/pim_register.h @@ -35,6 +35,7 @@ void pim_register_send_test_packet_start (struct in_addr source,  					  struct in_addr group,  					  uint32_t pps); +int pim_register_stop_recv (void);  int pim_register_recv (struct interface *ifp,  		       struct in_addr dest_addr,  		       struct in_addr src_addr,  | 
