]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_register.c
Merge pull request #486 from LabNConsulting/working/3.0/patch/issue483
[mirror_frr.git] / pimd / pim_register.c
index c941388dc45a9ce5a4d6b81eea4d15352e7e8f1b..8dc179c1444ccec91166b93a72e5ee3a35c5de33 100644 (file)
 #include "pim_zebra.h"
 #include "pim_join.h"
 #include "pim_util.h"
+#include "pim_ssm.h"
 
 struct thread *send_test_packet_timer = NULL;
 
+void
+pim_register_join (struct pim_upstream *up)
+{
+  if (pim_is_grp_ssm (up->sg.grp))
+    {
+      if (PIM_DEBUG_PIM_EVENTS)
+       zlog_debug ("%s register setup skipped as group is SSM", up->sg_str);
+      return;
+    }
+
+  pim_channel_add_oif (up->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
+  up->reg_state = PIM_REG_JOIN;
+}
+
 void
 pim_register_stop_send (struct interface *ifp, struct prefix_sg *sg,
                        struct in_addr src, struct in_addr originator)
@@ -102,23 +117,15 @@ pim_register_stop_recv (uint8_t *buf, int buf_size)
 {
   struct pim_upstream *upstream = NULL;
   struct prefix source;
-  struct prefix group;
   struct prefix_sg sg;
   int l;
 
-  l = pim_parse_addr_group (&group, buf, buf_size);
+  memset (&sg, 0, sizeof (struct prefix_sg));
+  l = pim_parse_addr_group (&sg, buf, buf_size);
   buf += l;
   buf_size -= l;
   pim_parse_addr_ucast (&source, buf, buf_size);
-  memset (&sg, 0, sizeof (struct prefix_sg));
   sg.src = source.u.prefix4;
-  sg.grp = group.u.prefix4;
-
-  if (PIM_DEBUG_PIM_REG)
-    {
-      zlog_debug ("Received Register stop for %s",
-                 pim_str_sg_dump (&sg));
-    }
 
   upstream = pim_upstream_find (&sg);
   if (!upstream)
@@ -126,18 +133,23 @@ pim_register_stop_recv (uint8_t *buf, int buf_size)
       return 0;
     }
 
-  switch (upstream->join_state)
+  if (PIM_DEBUG_PIM_REG)
+    zlog_debug ("Received Register stop for %s",
+               upstream->sg_str);
+
+  switch (upstream->reg_state)
     {
-    case PIM_UPSTREAM_NOTJOINED:
-    case PIM_UPSTREAM_PRUNE:
+    case PIM_REG_NOINFO:
+    case PIM_REG_PRUNE:
       return 0;
       break;
-    case PIM_UPSTREAM_JOINED:
-      upstream->join_state = PIM_UPSTREAM_PRUNE;
+    case PIM_REG_JOIN:
+      upstream->reg_state = PIM_REG_PRUNE;
       pim_channel_del_oif (upstream->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM);
       pim_upstream_start_register_stop_timer (upstream, 0);
-    case PIM_UPSTREAM_JOIN_PENDING:
-      upstream->join_state = PIM_UPSTREAM_PRUNE;
+      break;
+    case PIM_REG_JOIN_PENDING:
+      upstream->reg_state = PIM_REG_PRUNE;
       pim_upstream_start_register_stop_timer (upstream, 0);
       return 0;
       break;
@@ -147,7 +159,7 @@ pim_register_stop_recv (uint8_t *buf, int buf_size)
 }
 
 void
-pim_register_send (const uint8_t *buf, int buf_size, struct in_addr src, struct pim_rpf *rpg, int null_register)
+pim_register_send (const uint8_t *buf, int buf_size, struct in_addr src, struct pim_rpf *rpg, int null_register, struct pim_upstream *up)
 {
   unsigned char buffer[10000];
   unsigned char *b1;
@@ -156,9 +168,9 @@ pim_register_send (const uint8_t *buf, int buf_size, struct in_addr src, struct
 
   if (PIM_DEBUG_PIM_REG)
     {
-       char rp_str[INET_ADDRSTRLEN];
-       strcpy (rp_str, inet_ntoa (rpg->rpf_addr.u.prefix4));
-       zlog_debug ("Sending %sRegister Packet to %s", null_register ? "NULL " : "", rp_str);
+       zlog_debug ("Sending %s %sRegister Packet to %s",
+                  up->sg_str, null_register ? "NULL " : "",
+                   inet_ntoa (rpg->rpf_addr.u.prefix4));
     }
 
   ifp = rpg->source_nexthop.interface;
@@ -175,6 +187,15 @@ pim_register_send (const uint8_t *buf, int buf_size, struct in_addr src, struct
     return;
   }
 
+  if (PIM_DEBUG_PIM_REG)
+    {
+      char rp_str[INET_ADDRSTRLEN];
+      strncpy (rp_str, inet_ntoa (rpg->rpf_addr.u.prefix4), INET_ADDRSTRLEN-1);
+      zlog_debug ("%s: Sending %s %sRegister Packet to %s on %s",
+              __PRETTY_FUNCTION__, up->sg_str,
+              null_register ? "NULL " : "", rp_str, ifp->name);
+    }
+
   memset(buffer, 0, 10000);
   b1 = buffer + PIM_MSG_HEADER_LEN;
   *b1 |= null_register << 6;
@@ -268,14 +289,6 @@ pim_register_recv (struct interface *ifp,
     return 0;
   }
 
-  if (PIM_DEBUG_PIM_REG)
-    {
-      char src_str[INET_ADDRSTRLEN];
-
-      pim_inet4_dump ("<src?>", src_addr, src_str, sizeof (src_str));
-      zlog_debug ("Received Register message from %s on %s", src_str, ifp->name);
-    }
-
   /*
    * Please note this is not drawn to get the correct bit/data size
    *
@@ -307,6 +320,16 @@ pim_register_recv (struct interface *ifp,
   sg.grp = ip_hdr->ip_dst;
 
   i_am_rp = I_am_RP (sg.grp);
+
+  if (PIM_DEBUG_PIM_REG)
+    {
+      char src_str[INET_ADDRSTRLEN];
+
+      pim_inet4_dump ("<src?>", src_addr, src_str, sizeof (src_str));
+      zlog_debug ("Received Register message(%s) from %s on %s, rp: %d",
+                  pim_str_sg_dump (&sg), src_str, ifp->name, i_am_rp);
+    }
+
   if (i_am_rp && (dest_addr.s_addr == ((RP (sg.grp))->rpf_addr.u.prefix4.s_addr))) {
     sentRegisterStop = 0;
 
@@ -333,25 +356,16 @@ pim_register_recv (struct interface *ifp,
      */
     if (!upstream)
       {
-       upstream = pim_upstream_add (&sg, ifp,
-                                    PIM_UPSTREAM_FLAG_MASK_SRC_STREAM,
-                                    __PRETTY_FUNCTION__);
+        upstream = pim_upstream_add (&sg, ifp,
+                                     PIM_UPSTREAM_FLAG_MASK_SRC_STREAM,
+                                     __PRETTY_FUNCTION__);
         if (!upstream)
           {
             zlog_warn ("Failure to create upstream state");
             return 1;
           }
-       PIM_UPSTREAM_FLAG_SET_CREATED_BY_UPSTREAM(upstream->flags);
 
         upstream->upstream_register = src_addr;
-       pim_rp_set_upstream_addr (&upstream->upstream_addr, sg.src, sg.grp);
-       pim_nexthop_lookup (&upstream->rpf.source_nexthop,
-                           upstream->upstream_addr, 1);
-       upstream->sg.src = sg.src;
-       upstream->rpf.rpf_addr = upstream->rpf.source_nexthop.mrib_nexthop_addr;
-
-       upstream->join_state = PIM_UPSTREAM_PRUNE;
-
       }
 
     if ((upstream->sptbit == PIM_UPSTREAM_SPTBIT_TRUE) ||
@@ -360,8 +374,10 @@ pim_register_recv (struct interface *ifp,
       //pim_scan_individual_oil (upstream->channel_oil);
       pim_register_stop_send (ifp, &sg, dest_addr, src_addr);
       sentRegisterStop = 1;
+    } else {
+      if (PIM_DEBUG_PIM_REG)
+         zlog_debug ("(%s) sptbit: %d", upstream->sg_str, upstream->sptbit);
     }
-
     if ((upstream->sptbit == PIM_UPSTREAM_SPTBIT_TRUE) ||
        (SwitchToSptDesired(&sg))) {
       if (sentRegisterStop) {
@@ -378,6 +394,7 @@ pim_register_recv (struct interface *ifp,
        //inherited_olist(S,G,rpt)
        // This is taken care of by the kernel for us
       }
+     pim_upstream_msdp_reg_timer_start(upstream);
   } else {
     if (PIM_DEBUG_PIM_REG)
       {
@@ -393,34 +410,3 @@ pim_register_recv (struct interface *ifp,
 
   return 1;
 }
-
-
-static int
-pim_register_send_test_packet (struct thread *t)
-{
-  uint8_t *packet;
-
-  packet = THREAD_ARG(t);
-
-  *packet = 4;
-
-  return 1;
-}
-
-/*
- * pim_register_send_test_packet
- *
- * Send a test packet to the RP from source, in group and pps packets per second
- */
-void
-pim_register_send_test_packet_start (struct in_addr source,
-                                    struct in_addr group,
-                                    uint32_t pps)
-{
-  uint8_t *packet = NULL;
-
-  THREAD_TIMER_MSEC_ON(master, send_test_packet_timer,
-                      pim_register_send_test_packet, packet, 1000/pps);
-
-  return;
-}