]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: Refactor pim message receive
authorDonald Sharp <sharpd@cumulusnetwroks.com>
Thu, 14 Jul 2016 14:30:37 +0000 (10:30 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 22 Dec 2016 01:26:02 +0000 (20:26 -0500)
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>
pimd/pim_pim.c
pimd/pim_register.c
pimd/pim_register.h

index c1b9e04e23bd1707a019c00a74c64dc2ef8abead..f0db822cb42de41a73bc68a234bdb9cd40d9d368 100644 (file)
@@ -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;
 }
 
index 233db88d3e1aacf10390608f7ceb28be6f72692f..a3e63f0285ff25ee26f74eb5d43f83bbba003d77 100644 (file)
@@ -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)
 {
index 039c0006e0670e694b83fbe50f71f63f33baf8dc..4749480b9d70db4cf0262ea095ffdb5638ff8d1c 100644 (file)
@@ -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,