]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: Register with kernel to get unknown multicast packets
authorDonald Sharp <sharpd@cumulusnetworks.com>
Tue, 20 Oct 2015 01:23:16 +0000 (18:23 -0700)
committerDonald Sharp <sharpd@cumulusnetwroks.com>
Thu, 26 May 2016 00:38:34 +0000 (20:38 -0400)
Start the process of creating the pimreg vif device so that
we can get the callbacks from the kernel with the multicast packets

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

index 854cf917cbeea530fe2fe72bf3235c86e41e6d04..9e9b1ed08ca619e43c28a30f69b583eebd684dbf 100644 (file)
@@ -2143,7 +2143,7 @@ DEFUN (show_ip_multicast,
          qpim_mroute_oif_highest_vif_index,
          VTY_NEWLINE);
   vty_out(vty, "Maximum highest VifIndex: %d%s",
-         MAXVIFS - 1,
+         MAXVIFS - 2,
          VTY_NEWLINE);
 
   vty_out(vty, "%s", VTY_NEWLINE);
index 9ef3115815f621e98475547393e7219827058de0..e9e1b491dc65a115ef611804977f10fc1aa85e4b 100644 (file)
@@ -647,7 +647,7 @@ int pim_if_add_vif(struct interface *ifp)
     return -4;
   }
 
-  if (pim_mroute_add_vif(ifp->ifindex, ifaddr)) {
+  if (pim_mroute_add_vif(ifp->ifindex, ifaddr, 0)) {
     /* pim_mroute_add_vif reported error */
     return -5;
   }
index fa460e28f336398df58d2bf041f0786790090154..2f04323db20e19eaf9fcd1442a769fb7f4c7fd76 100644 (file)
@@ -259,6 +259,7 @@ static void mroute_read_off()
 int pim_mroute_socket_enable()
 {
   int fd;
+  struct in_addr pimreg = { .s_addr = 0 };
 
   if (PIM_MROUTE_IS_ENABLED)
     return -1;
@@ -287,6 +288,8 @@ int pim_mroute_socket_enable()
   }
 
   qpim_mroute_socket_fd       = fd;
+  pim_mroute_add_vif(MAXVIFS-1, pimreg, VIFF_REGISTER);
+
   qpim_mroute_socket_creation = pim_time_monotonic_sec();
   mroute_read_on();
 
@@ -325,7 +328,7 @@ int pim_mroute_socket_disable()
   would be used for multicast forwarding, a corresponding multicast
   interface must be added to the kernel.
  */
-int pim_mroute_add_vif(int vif_index, struct in_addr ifaddr)
+int pim_mroute_add_vif(int vif_index, struct in_addr ifaddr, unsigned char flags)
 {
   struct vifctl vc;
   int err;
@@ -338,7 +341,7 @@ int pim_mroute_add_vif(int vif_index, struct in_addr ifaddr)
 
   memset(&vc, 0, sizeof(vc));
   vc.vifc_vifi = vif_index;
-  vc.vifc_flags = 0;
+  vc.vifc_flags = flags;
   vc.vifc_threshold = PIM_MROUTE_MIN_TTL;
   vc.vifc_rate_limit = 0;
   memcpy(&vc.vifc_lcl_addr, &ifaddr, sizeof(vc.vifc_lcl_addr));
@@ -349,7 +352,7 @@ int pim_mroute_add_vif(int vif_index, struct in_addr ifaddr)
   }
 #endif
 
-  err = setsockopt(qpim_mroute_socket_fd, IPPROTO_IP, MRT_ADD_VIF, (void*) &vc, sizeof(vc)); 
+  err = setsockopt(qpim_mroute_socket_fd, IPPROTO_IP, MRT_ADD_VIF, (void*) &vc, sizeof(vc));
   if (err) {
     char ifaddr_str[100];
     int e = errno;
index 125d1901bf965a578d9e0fa8bf4f879fe04c14f5..c6fd19b22ceb75c33b2f872c1524a83e9d31455b 100644 (file)
@@ -166,7 +166,7 @@ struct igmpmsg
 int pim_mroute_socket_enable(void);
 int pim_mroute_socket_disable(void);
 
-int pim_mroute_add_vif(int vif_index, struct in_addr ifaddr);
+int pim_mroute_add_vif(int vif_index, struct in_addr ifaddr, unsigned char flags);
 int pim_mroute_del_vif(int vif_index);
 
 int pim_mroute_add(struct mfcctl *mc);