]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Allow further refinement of pim join order
authorDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 7 Nov 2016 15:01:50 +0000 (10:01 -0500)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 22 Dec 2016 01:26:14 +0000 (20:26 -0500)
When a 'show ip pim join' is issued and we have
(S,G,rpt) being sent back up to us.  We need
to order correctly for this situation.

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

index 5e2fc19f2ea23f19129d9a6bd174386d8754021b..599b18ddce61dab9e2a8a83f9faa4c9e151e5c78 100644 (file)
@@ -76,17 +76,34 @@ static void *if_list_clean(struct pim_interface *pim_ifp)
 static int
 pim_ifchannel_compare (struct pim_ifchannel *ch1, struct pim_ifchannel *ch2)
 {
-   if (ntohl(ch1->sg.grp.s_addr) < ntohl(ch2->sg.grp.s_addr))
-     return -1;
+  struct pim_interface *pim_ifp1;
+  struct pim_interface *pim_ifp2;
 
-   if (ntohl(ch1->sg.grp.s_addr) > ntohl(ch2->sg.grp.s_addr))
-     return 1;
+  if (ntohl(ch1->sg.grp.s_addr) < ntohl(ch2->sg.grp.s_addr))
+    return -1;
+
+  if (ntohl(ch1->sg.grp.s_addr) > ntohl(ch2->sg.grp.s_addr))
+    return 1;
+
+  if (ntohl(ch1->sg.src.s_addr) < ntohl(ch2->sg.src.s_addr))
+    return -1;
+
+  if (ntohl(ch1->sg.src.s_addr) > ntohl(ch2->sg.src.s_addr))
+    return 1;
 
-   if (ntohl(ch1->sg.src.s_addr) < ntohl(ch2->sg.src.s_addr))
-     return -1;
+  pim_ifp1 = ch1->interface->info;
+  pim_ifp2 = ch2->interface->info;
+  if (ntohl(pim_ifp1->primary_address.s_addr) < ntohl(pim_ifp2->primary_address.s_addr))
+    return -1;
+
+  if (ntohl(pim_ifp1->primary_address.s_addr) > ntohl(pim_ifp2->primary_address.s_addr))
+    return 1;
+
+  if (pim_ifp1->mroute_vif_index < pim_ifp2->mroute_vif_index)
+    return -1;
 
-   if (ntohl(ch1->sg.src.s_addr) > ntohl(ch2->sg.src.s_addr))
-     return 1;
+  if (pim_ifp1->mroute_vif_index > pim_ifp2->mroute_vif_index)
+    return 1;
 
   return 0;
 }