From: Donald Sharp Date: Thu, 14 Jul 2016 14:30:37 +0000 (-0400) Subject: pimd: Refactor pim message receive X-Git-Tag: frr-3.0-branchpoint~64^2~10^2~383 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=4dffc8807e4c265002247d19dad4275308b6d818;p=matthieu%2Ffrr.git 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 --- 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,