]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Move group handling to it's own function for J/P message
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 15 Feb 2017 02:32:16 +0000 (21:32 -0500)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 24 Feb 2017 15:03:41 +0000 (10:03 -0500)
When we are handling a J/P message, move the group handling
to it's own function.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
pimd/pim_msg.c

index 3a8ccb887e9e69dae87f0a35a258209a48c3d04c..e6b13f312167d93ef5eb63113e03331e1c8c7ccb 100644 (file)
@@ -93,6 +93,106 @@ pim_msg_addr_encode_ipv4_source(uint8_t *buf,
   return buf + PIM_ENCODED_IPV4_SOURCE_SIZE;
 }
 
+static size_t
+pim_msg_build_jp_groups (struct pim_jp_groups *grp, struct pim_upstream *up, int is_join)
+{
+  struct in_addr stosend;
+  uint8_t bits;
+
+  /* number of joined/pruned sources */
+  grp->joins  = htons(is_join ? 1 : 0);
+  grp->prunes = htons(is_join ? 0 : 1);
+
+  if (up->sg.src.s_addr == INADDR_ANY)
+    {
+      struct pim_rpf *rpf = pim_rp_g (up->sg.grp);
+      bits = PIM_ENCODE_SPARSE_BIT | PIM_ENCODE_WC_BIT | PIM_ENCODE_RPT_BIT;
+      stosend = rpf->rpf_addr.u.prefix4;
+    }
+  else
+    {
+      bits = PIM_ENCODE_SPARSE_BIT;
+      stosend = up->sg.src;
+    }
+
+  if (!pim_msg_addr_encode_ipv4_source ((uint8_t *)&grp->s[0], stosend, bits)) {
+    char source_str[INET_ADDRSTRLEN];
+    pim_inet4_dump("<src?>", up->sg.src, source_str, sizeof(source_str));
+    zlog_warn("%s: failure encoding source address %s",
+              __PRETTY_FUNCTION__, source_str);
+    return 0;
+  }
+
+  /*
+   * This is not implemented correctly at this point in time
+   * Make it stop.
+   */
+#if 0
+  if (up->sg.src.s_addr == INADDR_ANY)
+    {
+      struct pim_upstream *child;
+      struct listnode *up_node;
+      int send_prune = 0;
+
+      zlog_debug ("%s: Considering (%s) children for (S,G,rpt) prune",
+                  __PRETTY_FUNCTION__, up->sg_str);
+      for (ALL_LIST_ELEMENTS_RO (up->sources, up_node, child))
+        {
+          if (child->sptbit == PIM_UPSTREAM_SPTBIT_TRUE)
+            {
+              if (!pim_rpf_is_same(&up->rpf, &child->rpf))
+                {
+                  send_prune = 1;
+                  if (PIM_DEBUG_PIM_PACKETS)
+                    zlog_debug ("%s: SPT Bit and RPF'(%s) != RPF'(S,G): Add Prune (%s,rpt) to compound message",
+                                __PRETTY_FUNCTION__, up->sg_str, child->sg_str);
+                }
+              else
+                if (PIM_DEBUG_PIM_PACKETS)
+                  zlog_debug ("%s: SPT Bit and RPF'(%s) == RPF'(S,G): Not adding Prune for (%s,rpt)",
+                              __PRETTY_FUNCTION__, up->sg_str, child->sg_str);
+            }
+          else if (pim_upstream_is_sg_rpt (child))
+            {
+              if (pim_upstream_empty_inherited_olist (child))
+                {
+                  send_prune = 1;
+                  if (PIM_DEBUG_PIM_PACKETS)
+                    zlog_debug ("%s: inherited_olist(%s,rpt) is NULL, Add Prune to compound message",
+                                __PRETTY_FUNCTION__, child->sg_str);
+                }
+              else if (!pim_rpf_is_same (&up->rpf, &child->rpf))
+                {
+                  send_prune = 1;
+                  if (PIM_DEBUG_PIM_PACKETS)
+                    zlog_debug ("%s: RPF'(%s) != RPF'(%s,rpt), Add Prune to compound message",
+                                __PRETTY_FUNCTION__, up->sg_str, child->sg_str);
+                }
+              else
+                if (PIM_DEBUG_PIM_PACKETS)
+                  zlog_debug ("%s: RPF'(%s) == RPF'(%s,rpt), Do not add Prune to compound message",
+                              __PRETTY_FUNCTION__, up->sg_str, child->sg_str);
+            }
+          else
+            if (PIM_DEBUG_PIM_PACKETS)
+              zlog_debug ("%s: SPT bit is not set for (%s)",
+                          __PRETTY_FUNCTION__, child->sg_str);
+          if (send_prune)
+            {
+              pim_msg_curr = pim_msg_addr_encode_ipv4_source (pim_msg_curr, remain,
+                                                              child->sg.src,
+                                                              PIM_ENCODE_SPARSE_BIT | PIM_ENCODE_RPT_BIT);
+              remain = pim_msg_curr - pim_msg;
+              *prunes = htons(ntohs(*prunes) + 1);
+              send_prune = 0;
+            }
+        }
+    }
+#endif
+
+  return sizeof (*grp);
+}
+
 /*
  * J/P Message Format
  *
@@ -165,8 +265,6 @@ pim_msg_join_prune_encode (uint8_t *buf, size_t buf_size, int is_join,
                            struct in_addr upstream, int holdtime)
 {
   struct pim_jp *msg = (struct pim_jp *)buf;
-  struct in_addr stosend;
-  uint8_t bits;
 
   assert(buf_size > sizeof (struct pim_jp));
 
@@ -190,96 +288,8 @@ pim_msg_join_prune_encode (uint8_t *buf, size_t buf_size, int is_join,
     return -5;
   }
 
-  /* number of joined/pruned sources */
-  msg->groups[0].joins  = htons(is_join ? 1 : 0);
-  msg->groups[0].prunes = htons(is_join ? 0 : 1);
+  pim_msg_build_jp_groups (&msg->groups[0], up, is_join);
 
-  if (up->sg.src.s_addr == INADDR_ANY)
-    {
-      struct pim_rpf *rpf = pim_rp_g (up->sg.grp);
-      bits = PIM_ENCODE_SPARSE_BIT | PIM_ENCODE_WC_BIT | PIM_ENCODE_RPT_BIT;
-      stosend = rpf->rpf_addr.u.prefix4;
-    }
-  else
-    {
-      bits = PIM_ENCODE_SPARSE_BIT;
-      stosend = up->sg.src;
-    }
-
-  if (!pim_msg_addr_encode_ipv4_source ((uint8_t *)&msg->groups[0].s[0], stosend, bits)) {
-    char source_str[INET_ADDRSTRLEN];
-    pim_inet4_dump("<src?>", up->sg.src, source_str, sizeof(source_str));
-    zlog_warn("%s: failure encoding source address %s",
-              __PRETTY_FUNCTION__, source_str);
-    return -7;
-  }
-
-  /*
-   * This is not implemented correctly at this point in time
-   * Make it stop.
-   */
-#if 0
-  if (up->sg.src.s_addr == INADDR_ANY)
-    {
-      struct pim_upstream *child;
-      struct listnode *up_node;
-      int send_prune = 0;
-
-      zlog_debug ("%s: Considering (%s) children for (S,G,rpt) prune",
-                  __PRETTY_FUNCTION__, up->sg_str);
-      for (ALL_LIST_ELEMENTS_RO (up->sources, up_node, child))
-        {
-          if (child->sptbit == PIM_UPSTREAM_SPTBIT_TRUE)
-            {
-              if (!pim_rpf_is_same(&up->rpf, &child->rpf))
-                {
-                  send_prune = 1;
-                  if (PIM_DEBUG_PIM_PACKETS)
-                    zlog_debug ("%s: SPT Bit and RPF'(%s) != RPF'(S,G): Add Prune (%s,rpt) to compound message",
-                                __PRETTY_FUNCTION__, up->sg_str, child->sg_str);
-                }
-              else
-                if (PIM_DEBUG_PIM_PACKETS)
-                  zlog_debug ("%s: SPT Bit and RPF'(%s) == RPF'(S,G): Not adding Prune for (%s,rpt)",
-                              __PRETTY_FUNCTION__, up->sg_str, child->sg_str);
-            }
-          else if (pim_upstream_is_sg_rpt (child))
-            {
-              if (pim_upstream_empty_inherited_olist (child))
-                {
-                  send_prune = 1;
-                  if (PIM_DEBUG_PIM_PACKETS)
-                    zlog_debug ("%s: inherited_olist(%s,rpt) is NULL, Add Prune to compound message",
-                                __PRETTY_FUNCTION__, child->sg_str);
-                }
-              else if (!pim_rpf_is_same (&up->rpf, &child->rpf))
-                {
-                  send_prune = 1;
-                  if (PIM_DEBUG_PIM_PACKETS)
-                    zlog_debug ("%s: RPF'(%s) != RPF'(%s,rpt), Add Prune to compound message",
-                                __PRETTY_FUNCTION__, up->sg_str, child->sg_str);
-                }
-              else
-                if (PIM_DEBUG_PIM_PACKETS)
-                  zlog_debug ("%s: RPF'(%s) == RPF'(%s,rpt), Do not add Prune to compound message",
-                              __PRETTY_FUNCTION__, up->sg_str, child->sg_str);
-            }
-          else
-            if (PIM_DEBUG_PIM_PACKETS)
-              zlog_debug ("%s: SPT bit is not set for (%s)",
-                          __PRETTY_FUNCTION__, child->sg_str);
-          if (send_prune)
-            {
-              pim_msg_curr = pim_msg_addr_encode_ipv4_source (pim_msg_curr, remain,
-                                                              child->sg.src,
-                                                              PIM_ENCODE_SPARSE_BIT | PIM_ENCODE_RPT_BIT);
-              remain = pim_msg_curr - pim_msg;
-              *prunes = htons(ntohs(*prunes) + 1);
-              send_prune = 0;
-            }
-        }
-    }
-#endif
   pim_msg_build_header (buf, sizeof (struct pim_jp), PIM_MSG_TYPE_JOIN_PRUNE);
 
   return sizeof (struct pim_jp);