]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #6054 from sarav511/dr2ndr
authorDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 1 Jun 2020 11:58:32 +0000 (07:58 -0400)
committerGitHub <noreply@github.com>
Mon, 1 Jun 2020 11:58:32 +0000 (07:58 -0400)
pimd: When DR becomes non DR, Still sends register packets to RP

pimd/pim_iface.c
pimd/pim_iface.h
pimd/pim_neighbor.c
pimd/pim_pim.c
pimd/pim_register.c
pimd/pim_register.h
pimd/pim_upstream.c
pimd/pim_upstream.h

index b25b6eaa8c566d477e78a6a374535cc5c8cafc06..b79fb689dc211b698e27a986edc9fcd9f651a791 100644 (file)
@@ -138,6 +138,7 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim,
        /* BSM config on interface: true by default */
        pim_ifp->bsm_enable = true;
        pim_ifp->ucast_bsm_accept = true;
+       pim_ifp->am_i_dr = false;
 
        /*
          RFC 3376: 8.3. Query Response Interval
index 570bf5eac31135bdc1450169fb13b76ded57d23c..13aaf8d3b252d88744ed667d4ef5d9524add0689 100644 (file)
@@ -133,6 +133,7 @@ struct pim_interface {
 
        /* Turn on Active-Active for this interface */
        bool activeactive;
+       bool am_i_dr;
 
        int64_t pim_ifstat_start; /* start timestamp for stats */
        uint64_t pim_ifstat_bsm_rx;
index d8a797f9801211a8b197a80c92962ad5e0c8ef98..4d6625bf6fa5b1758c90f25b0f860bca82982764 100644 (file)
@@ -40,6 +40,7 @@
 #include "pim_join.h"
 #include "pim_jp_agg.h"
 #include "pim_bfd.h"
+#include "pim_register.h"
 
 static void dr_election_by_addr(struct interface *ifp)
 {
@@ -141,6 +142,16 @@ int pim_if_dr_election(struct interface *ifp)
                pim_if_update_join_desired(pim_ifp);
                pim_if_update_could_assert(ifp);
                pim_if_update_assert_tracking_desired(ifp);
+
+               if (PIM_I_am_DR(pim_ifp))
+                       pim_ifp->am_i_dr = true;
+               else {
+                       if (pim_ifp->am_i_dr == true) {
+                               pim_reg_del_on_couldreg_fail(ifp);
+                               pim_ifp->am_i_dr = false;
+                       }
+               }
+
                return 1;
        }
 
index 3976b262e31235a5419b4e8855ef26d12be28a39..bf31d4e4505eea28e3a92b59942f9e0634cd1daa 100644 (file)
@@ -501,6 +501,7 @@ void pim_sock_reset(struct interface *ifp)
        pim_ifp->pim_dr_num_nondrpri_neighbors =
                0; /* neighbors without dr_pri */
        pim_ifp->pim_dr_addr = pim_ifp->primary_address;
+       pim_ifp->am_i_dr = true;
 
        pim_ifstat_reset(ifp);
 }
index cb6aae7fae688fe4242e26ce75c5b523afbbc509..19e15f3edec041edfd955d49da714fbe01f345a1 100644 (file)
@@ -520,3 +520,32 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
 
        return 0;
 }
+
+/*
+ * This routine scan all upstream and update register state and remove pimreg
+ * when couldreg becomes false.
+ */
+void pim_reg_del_on_couldreg_fail(struct interface *ifp)
+{
+       struct pim_interface *pim_ifp = ifp->info;
+       struct pim_instance *pim;
+       struct pim_upstream *up;
+
+       if (!pim_ifp)
+               return;
+
+       pim = pim_ifp->pim;
+
+       frr_each (rb_pim_upstream, &pim->upstream_head, up) {
+               if (ifp != up->rpf.source_nexthop.interface)
+                       continue;
+
+               if (!pim_upstream_could_register(up)
+                   && (up->reg_state != PIM_REG_NOINFO)) {
+                       pim_channel_del_oif(up->channel_oil, pim->regiface,
+                                           PIM_OIF_FLAG_PROTO_PIM, __func__);
+                       THREAD_OFF(up->t_rs_timer);
+                       up->reg_state = PIM_REG_NOINFO;
+               }
+       }
+}
index c5a28fee41b4c78dfebfa7396918169d2c74bb1c..caaacd9d5460453d60f3e56c51267108af6d6e84 100644 (file)
@@ -43,5 +43,6 @@ void pim_register_stop_send(struct interface *ifp, struct prefix_sg *sg,
                            struct in_addr src, struct in_addr originator);
 void pim_register_join(struct pim_upstream *up);
 void pim_null_register_send(struct pim_upstream *up);
+void pim_reg_del_on_couldreg_fail(struct interface *ifp);
 
 #endif
index 8d462b1698ea8adf8611c1b2b719bdfd9dccad47..d3fb0d46de9652a997f17bd56d45c9920dc1e3c3 100644 (file)
@@ -547,7 +547,7 @@ static void forward_off(struct pim_upstream *up)
        } /* scan iface channel list */
 }
 
-static int pim_upstream_could_register(struct pim_upstream *up)
+int pim_upstream_could_register(struct pim_upstream *up)
 {
        struct pim_interface *pim_ifp = NULL;
 
index ca693ee73f9a4346536ec635443370c1bc23f440..b3379c67b215a480d03f3f05e1dd57d034cc1378 100644 (file)
@@ -394,4 +394,5 @@ void pim_upstream_update_use_rpt(struct pim_upstream *up,
 uint32_t pim_up_mlag_local_cost(struct pim_upstream *up);
 uint32_t pim_up_mlag_peer_cost(struct pim_upstream *up);
 void pim_upstream_reeval_use_rpt(struct pim_instance *pim);
+int pim_upstream_could_register(struct pim_upstream *up);
 #endif /* PIM_UPSTREAM_H */