]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: provide a per-SG control to disabled register encapsulation of data
authorAnuradha Karuppiah <anuradhak@cumulusnetworks.com>
Tue, 26 Mar 2019 20:43:23 +0000 (13:43 -0700)
committerAnuradha Karuppiah <anuradhak@cumulusnetworks.com>
Sat, 20 Apr 2019 15:33:21 +0000 (08:33 -0700)
In a MLAG setup both of the VTEPs can rx and reg-encapsulate BUM traffic
toward the RP. To prevent these duplicates we need a mechanism to disable
register encaps on specific mroutes.

Signed-off-by: Anuradha Karuppiah <anuradhak@cumulusnetworks.com>
pimd/pim_mroute.c
pimd/pim_upstream.h

index a2d50aba5159c5b8f5d7b3360ee2122914836303..af75dc63f88fe9c78184861340a5578ddd99ff72 100644 (file)
@@ -896,6 +896,9 @@ int pim_mroute_add(struct channel_oil *c_oil, const char *name)
        int err;
        int orig = 0;
        int orig_iif_vif = 0;
+       struct pim_interface *pim_reg_ifp;
+       int orig_pimreg_ttl;
+       bool pimreg_ttl_reset = false;
 
        pim->mroute_add_last = pim_time_monotonic_sec();
        ++pim->mroute_add_events;
@@ -921,6 +924,20 @@ int pim_mroute_add(struct channel_oil *c_oil, const char *name)
                c_oil->oil.mfcc_ttls[c_oil->oil.mfcc_parent] = 1;
        }
 
+       if (c_oil->up) {
+               /* suppress pimreg in the OIL if the mroute is not supposed to
+                * trigger register encapsulated data
+                */
+               if (PIM_UPSTREAM_FLAG_TEST_NO_PIMREG_DATA(c_oil->up->flags)) {
+                       pim_reg_ifp = pim->regiface->info;
+                       orig_pimreg_ttl =
+                               c_oil->oil.mfcc_ttls[pim_reg_ifp->mroute_vif_index];
+                       c_oil->oil.mfcc_ttls[pim_reg_ifp->mroute_vif_index] = 0;
+                       /* remember to flip it back after MFC programming */
+                       pimreg_ttl_reset = true;
+               }
+       }
+
        /*
         * If we have an unresolved cache entry for the S,G
         * it is owned by the pimreg for the incoming IIF
@@ -947,6 +964,9 @@ int pim_mroute_add(struct channel_oil *c_oil, const char *name)
        if (c_oil->oil.mfcc_origin.s_addr == INADDR_ANY)
                c_oil->oil.mfcc_ttls[c_oil->oil.mfcc_parent] = orig;
 
+       if (pimreg_ttl_reset)
+               c_oil->oil.mfcc_ttls[pim_reg_ifp->mroute_vif_index] =
+                       orig_pimreg_ttl;
        if (err) {
                zlog_warn(
                        "%s %s: failure: setsockopt(fd=%d,IPPROTO_IP,MRT_ADD_MFC): errno=%d: %s",
index 8dc2f7635cb8e1616be1594764b261595f8b3267..c40c3c82fd94b069144d233db2295ea944bf803a 100644 (file)
@@ -49,6 +49,8 @@
  */
 #define PIM_UPSTREAM_FLAG_MASK_STATIC_IIF              (1 << 10)
 #define PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL        (1 << 11)
+/* Disable pimreg encasulation for a flow */
+#define PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA          (1 << 12)
 #define PIM_UPSTREAM_FLAG_ALL 0xFFFFFFFF
 
 #define PIM_UPSTREAM_FLAG_TEST_DR_JOIN_DESIRED(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED)
@@ -63,6 +65,7 @@
 #define PIM_UPSTREAM_FLAG_TEST_DISABLE_KAT_EXPIRY(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY)
 #define PIM_UPSTREAM_FLAG_TEST_STATIC_IIF(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_STATIC_IIF)
 #define PIM_UPSTREAM_FLAG_TEST_ALLOW_IIF_IN_OIL(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL)
+#define PIM_UPSTREAM_FLAG_TEST_NO_PIMREG_DATA(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA)
 
 #define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED)
 #define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED_UPDATED(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED)
@@ -76,6 +79,7 @@
 #define PIM_UPSTREAM_FLAG_SET_DISABLE_KAT_EXPIRY(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY)
 #define PIM_UPSTREAM_FLAG_SET_STATIC_IIF(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_STATIC_IIF)
 #define PIM_UPSTREAM_FLAG_SET_ALLOW_IIF_IN_OIL(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL)
+#define PIM_UPSTREAM_FLAG_SET_NO_PIMREG_DATA(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA)
 
 #define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED)
 #define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED_UPDATED(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED)
@@ -89,6 +93,7 @@
 #define PIM_UPSTREAM_FLAG_UNSET_DISABLE_KAT_EXPIRY(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DISABLE_KAT_EXPIRY)
 #define PIM_UPSTREAM_FLAG_UNSET_STATIC_IIF(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_STATIC_IIF)
 #define PIM_UPSTREAM_FLAG_UNSET_ALLOW_IIF_IN_OIL(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_ALLOW_IIF_IN_OIL)
+#define PIM_UPSTREAM_FLAG_UNSET_NO_PIMREG_DATA(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_NO_PIMREG_DATA)
 
 enum pim_upstream_state {
        PIM_UPSTREAM_NOTJOINED,