]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: Allow (*,G) to work properly.
authorDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 27 Jun 2016 16:54:30 +0000 (12:54 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 27 Jun 2016 17:28:14 +0000 (13:28 -0400)
When the kernel looks up a *,G route it
expects the incoming interface to be part
of the outgoing interface ttl list.

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

index f85f422298117d0a54e03ed9f876b24cb79f0a9f..4bf490f4569fd51a9bea4a3fd7f6ce1d606a7fd6 100644 (file)
@@ -524,6 +524,7 @@ int pim_mroute_del_vif(int vif_index)
 int pim_mroute_add(struct mfcctl *mc)
 {
   int err;
+  int orig;
 
   qpim_mroute_add_last = pim_time_monotonic_sec();
   ++qpim_mroute_add_events;
@@ -534,8 +535,22 @@ int pim_mroute_add(struct mfcctl *mc)
     return -1;
   }
 
+  /* The linux kernel *expects* the incoming
+   * vif to be part of the outgoing list
+   * in the case of a (*,G).
+   */
+  if (mc->mfcc_origin.s_addr == INADDR_ANY)
+    {
+      orig = mc->mfcc_ttls[mc->mfcc_parent];
+      mc->mfcc_ttls[mc->mfcc_parent] = 1;
+    }
+
   err = setsockopt(qpim_mroute_socket_fd, IPPROTO_IP, MRT_ADD_MFC,
                   mc, sizeof(*mc));
+
+  if (mc->mfcc_origin.s_addr == INADDR_ANY)
+      mc->mfcc_ttls[mc->mfcc_parent] = orig;
+
   if (err) {
     int e = errno;
     zlog_warn("%s %s: failure: setsockopt(fd=%d,IPPROTO_IP,MRT_ADD_MFC): errno=%d: %s",