]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Allow the kernel to forward encap'ed packets for us
authorDonald Sharp <sharpd@cumulusnetworks.com>
Tue, 2 Aug 2016 13:21:51 +0000 (09:21 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 22 Dec 2016 01:26:04 +0000 (20:26 -0500)
When we get a pim register allow the kernel to forward the
saved packets.

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

index 1ffea6ab46c576e8fd4975d0d08837da15ec1a78..fae11b674a07ed65eebf28e1b1b5ea425595e1d6 100644 (file)
@@ -87,7 +87,6 @@ struct pim_interface *pim_if_new(struct interface *ifp, int igmp, int pim)
 
   pim_ifp->options                           = 0;
   pim_ifp->mroute_vif_index                  = -1;
-  pim_ifp->pim_raw_fd                        = -1;
 
   pim_ifp->igmp_default_robustness_variable           = IGMP_DEFAULT_ROBUSTNESS_VARIABLE;
   pim_ifp->igmp_default_query_interval                = IGMP_GENERAL_QUERY_INTERVAL;
@@ -163,12 +162,6 @@ void pim_if_delete(struct interface *ifp)
   pim_ifp = ifp->info;
   zassert(pim_ifp);
 
-  if (pim_ifp->pim_raw_fd == -1)
-    {
-      close (pim_ifp->pim_raw_fd);
-      pim_ifp->pim_raw_fd = -1;
-    }
-
   if (pim_ifp->igmp_join_list) {
     pim_if_igmp_join_del_all(ifp);
   }
index 7f3d6961fae3e31dfc098ac2b0de16c59dc0495a..75b85c306a396ceb456debcb955c6db3271306f6 100644 (file)
@@ -73,7 +73,6 @@ struct pim_interface {
   struct list *igmp_join_list;                              /* list of struct igmp_join */
 
   int            pim_sock_fd;       /* PIM socket file descriptor */
-  int            pim_raw_fd;        /* RP forwarding */
   struct thread *t_pim_sock_read;   /* thread for reading PIM socket */
   int64_t        pim_sock_creation; /* timestamp of PIM socket creation */
 
index 7893bc926b130efeeac752fc7e6a839c40acb087..8efe7635cdff53a65b6bca8fc6ab3261bbfddeb1 100644 (file)
@@ -570,6 +570,7 @@ int pim_mroute_add(struct channel_oil *c_oil)
 {
   int err;
   int orig = 0;
+  int orig_iif_vif = 0;
 
   qpim_mroute_add_last = pim_time_monotonic_sec();
   ++qpim_mroute_add_events;
@@ -590,9 +591,30 @@ int pim_mroute_add(struct channel_oil *c_oil)
       c_oil->oil.mfcc_ttls[c_oil->oil.mfcc_parent] = 1;
     }
 
+  /*
+   * If we have an unresolved cache entry for the S,G
+   * it is owned by the pimreg for the incoming IIF
+   * So set pimreg as the IIF temporarily to cause
+   * the packets to be forwarded.  Then set it
+   * to the correct IIF afterwords.
+   */
+  if (!c_oil->installed && c_oil->oil.mfcc_origin.s_addr != INADDR_ANY &&
+      c_oil->oil.mfcc_parent != 0)
+    {
+      orig_iif_vif = c_oil->oil.mfcc_parent;
+      c_oil->oil.mfcc_parent = 0;
+    }
   err = setsockopt(qpim_mroute_socket_fd, IPPROTO_IP, MRT_ADD_MFC,
                   &c_oil->oil, sizeof(c_oil->oil));
 
+  if (!err && !c_oil->installed && c_oil->oil.mfcc_origin.s_addr != INADDR_ANY &&
+      orig_iif_vif != 0)
+    {
+      c_oil->oil.mfcc_parent = orig_iif_vif;
+      err = setsockopt (qpim_mroute_socket_fd, IPPROTO_IP, MRT_ADD_MFC,
+                       &c_oil->oil, sizeof (c_oil->oil));
+    }
+
   if (c_oil->oil.mfcc_origin.s_addr == INADDR_ANY)
       c_oil->oil.mfcc_ttls[c_oil->oil.mfcc_parent] = orig;
 
index da84e245d4c2a80cf0e1c44cc7eede56efa981b1..aaf05bbb199bc36512d5a831c6df9e5d365befab 100644 (file)
@@ -348,9 +348,9 @@ pim_register_recv (struct interface *ifp,
     if (!(upstream->sptbit == PIM_UPSTREAM_SPTBIT_TRUE) &&
        !(*bits & PIM_REGISTER_NR_BIT))
       {
-       pim_rp_forward_packet (ip_hdr);
        //decapsulate and forward the iner packet to
        //inherited_olist(S,G,rpt)
+       // This is taken care of by the kernel for us
       }
   } else {
     pim_register_stop_send (ifp, &sg, src_addr);
index 929211cdd8d05fb4271c01a2d918fb2355184009..b98ff2859acec605613b82fbf6058ffa00cc742d 100644 (file)
 
 static int i_am_rp = 0;
 
-/*
- * The Raw socket to pump packets down
- * if we are the RP
- */
-static int fd_rp = -1;
-
-void
-pim_rp_forward_packet (struct ip *ip_hdr)
-{
-  struct sockaddr_in sin;
-
-  sin.sin_family = AF_INET;
-  sin.sin_addr.s_addr = ip_hdr->ip_dst.s_addr;
-
-  zlog_debug ("Sending Packet");
-  if (sendto (fd_rp, ip_hdr, ntohs (ip_hdr->ip_len), 0, (struct sockaddr *)&sin, sizeof (struct sockaddr)) < 0)
-    {
-      zlog_debug ("Failure to send packet: %s", safe_strerror (errno));
-    }
-}
-
-static void
-pim_rp_create_socket (void)
-{
-  fd_rp = pim_socket_raw (IPPROTO_RAW);
-
-  if (pim_socket_ip_hdr (fd_rp) != 0)
-    zlog_debug ("Unable to setup socket for ip hdr inclusion");
-
-  if (pim_socket_bind (fd_rp, qpim_rp.source_nexthop.interface) != 0)
-    zlog_debug ("Unable to Bind to a particular socket");
-}
 
 int
 pim_rp_setup (void)
@@ -75,8 +43,6 @@ pim_rp_setup (void)
       return 0;
     }
 
-  pim_rp_create_socket ();
-
   return 1;
 }
 
@@ -102,7 +68,6 @@ pim_rp_check_rp (struct in_addr old, struct in_addr new)
   if (new.s_addr == qpim_rp.rpf_addr.s_addr)
     {
       i_am_rp = 1;
-      pim_rp_create_socket();
       return;
     }