]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: blackhole traffic when we are not DR for Stream received 3067/head
authorDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 21 Sep 2018 15:41:46 +0000 (11:41 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 21 Sep 2018 15:41:46 +0000 (11:41 -0400)
Suppose we have a bridge with a host and two routers attached
to it.

r1     r2
|      |
--------
    |
  host

host is sending traffic.
r1 and r2 are pim neighbors and r2 is the DR.

Both r1 and r2 will receive data from the stream up the pim
kernel socket.  r1 will notice that it is not the DR and
stop processing in pim.  This code adds a bit more code to blackhole
the route when r1 detects it is not the DR in this scenario.

This is being done because the kernel is both keeping state and
sending data to the pim process to continue processing this.
Additionally if we happen to be running this on a asic, then
blackholing the route in the asic can save a significant amount
of cpu time handling this situation.

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

index c69e2939e4e5325d42a2d68877352a8322951bd7..436e0508f3dd378cfaecf736f8610e83ade7bcf6 100644 (file)
@@ -154,12 +154,12 @@ static int pim_mroute_msg_nocache(int fd, struct interface *ifp,
         * the Interface type is SSM we don't need to
         * do anything here
         */
-       if (!rpg || (pim_rpf_addr_is_inaddr_none(rpg))
-           || (!(PIM_I_am_DR(pim_ifp)))) {
+       if (!rpg || pim_rpf_addr_is_inaddr_none(rpg)) {
                if (PIM_DEBUG_MROUTE_DETAIL)
                        zlog_debug(
-                               "%s: Interface is not configured correctly to handle incoming packet: Could be !DR, !pim_ifp, !SM, !RP",
+                               "%s: Interface is not configured correctly to handle incoming packet: Could be !pim_ifp, !SM, !RP",
                                __PRETTY_FUNCTION__);
+
                return 0;
        }
 
@@ -179,6 +179,26 @@ static int pim_mroute_msg_nocache(int fd, struct interface *ifp,
        sg.src = msg->im_src;
        sg.grp = msg->im_dst;
 
+       if (!(PIM_I_am_DR(pim_ifp))) {
+               struct channel_oil *c_oil;
+
+               if (PIM_DEBUG_MROUTE_DETAIL)
+                       zlog_debug("%s: Interface is not the DR blackholing incoming traffic for %s",
+                                  __PRETTY_FUNCTION__, pim_str_sg_dump(&sg));
+
+               /*
+                * We are not the DR, but we are still receiving packets
+                * Let's blackhole those packets for the moment
+                * As that they will be coming up to the cpu
+                * and causing us to consider them.
+                */
+               c_oil = pim_channel_oil_add(pim_ifp->pim, &sg,
+                                           pim_ifp->mroute_vif_index);
+               pim_mroute_add(c_oil, __PRETTY_FUNCTION__);
+
+               return 0;
+       }
+
        up = pim_upstream_find_or_add(&sg, ifp, PIM_UPSTREAM_FLAG_MASK_FHR,
                                      __PRETTY_FUNCTION__);
        if (!up) {