]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Find the parent on newly created upstream's
authorDonald Sharp <sharpd@cumulusnetwroks.com>
Sun, 24 Jul 2016 05:15:09 +0000 (01:15 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 22 Dec 2016 01:26:03 +0000 (20:26 -0500)
When we create a new upstream data structure find the parent.

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

index 7d20de6bda48ddd456b5a022756548febc7413a3..b404e144e89bbe9949d73abe79e394310394acf9 100644 (file)
 static void join_timer_start(struct pim_upstream *up);
 static void pim_upstream_update_assert_tracking_desired(struct pim_upstream *up);
 
+/*
+ * If we have a (*,*) || (S,*) there is no parent
+ * If we have a (S,G), find the (*,G)
+ * If we have a (*,G), find the (*,*)
+ */
+static struct pim_upstream *
+pim_upstream_find_parent (struct prefix *sg)
+{
+  struct prefix any = *sg;
+
+  // (*,*) || (S,*)
+  if (((sg->u.sg.src.s_addr == INADDR_ANY) &&
+       (sg->u.sg.grp.s_addr == INADDR_ANY)) ||
+      ((sg->u.sg.src.s_addr != INADDR_ANY) &&
+       (sg->u.sg.grp.s_addr == INADDR_ANY)))
+    return NULL;
+
+  // (S,G)
+  if ((sg->u.sg.src.s_addr != INADDR_ANY) &&
+      (sg->u.sg.grp.s_addr != INADDR_ANY))
+    {
+      any.u.sg.src.s_addr = INADDR_ANY;
+      return pim_upstream_find (&any);
+    }
+
+  // (*,G)
+  any.u.sg.grp.s_addr = INADDR_ANY;
+  return pim_upstream_find (&any);
+}
+
 void pim_upstream_free(struct pim_upstream *up)
 {
   XFREE(MTYPE_PIM_UPSTREAM, up);
@@ -347,6 +377,7 @@ static struct pim_upstream *pim_upstream_new(struct prefix *sg,
       return NULL;
     }
 
+  up->parent                     = pim_upstream_find_parent (sg);
   up->flags                      = 0;
   up->ref_count                  = 1;
   up->t_join_timer               = NULL;
index 2fb193d42d9924147a73c147d0a972bff2b47735..92535c46b0ff72f0a870b965408f8db55fdef959 100644 (file)
@@ -87,6 +87,7 @@ enum pim_upstream_sptbit {
   See RFC 4601: 4.5.7.  Sending (S,G) Join/Prune Message
 */
 struct pim_upstream {
+  struct pim_upstream      *parent;
   int                      fhr;
   struct in_addr           upstream_addr;/* Who we are talking to */
   struct prefix            sg;           /* (S,G) group key */