]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_register.c
Merge pull request #3359 from qlyoung/true-atomics
[mirror_frr.git] / pimd / pim_register.c
index c753358ec0b1443e6572310049cef221a3e6dacf..b9908ae22be4ea5bbabee4b65f08624c170b82e1 100644 (file)
@@ -48,14 +48,16 @@ struct thread *send_test_packet_timer = NULL;
 
 void pim_register_join(struct pim_upstream *up)
 {
-       if (pim_is_grp_ssm(up->sg.grp)) {
+       struct pim_instance *pim = up->channel_oil->pim;
+
+       if (pim_is_grp_ssm(pim, up->sg.grp)) {
                if (PIM_DEBUG_PIM_EVENTS)
                        zlog_debug("%s register setup skipped as group is SSM",
                                   up->sg_str);
                return;
        }
 
-       pim_channel_add_oif(up->channel_oil, pimg->regiface,
+       pim_channel_add_oif(up->channel_oil, pim->regiface,
                            PIM_OIF_FLAG_PROTO_PIM);
        up->reg_state = PIM_REG_JOIN;
 }
@@ -366,14 +368,37 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
                 */
                if (!upstream) {
                        upstream = pim_upstream_add(
-                               &sg, ifp, PIM_UPSTREAM_FLAG_MASK_SRC_STREAM,
-                               __PRETTY_FUNCTION__);
+                               pim_ifp->pim, &sg, ifp,
+                               PIM_UPSTREAM_FLAG_MASK_SRC_STREAM,
+                               __PRETTY_FUNCTION__, NULL);
                        if (!upstream) {
                                zlog_warn("Failure to create upstream state");
                                return 1;
                        }
 
                        upstream->upstream_register = src_addr;
+               } else {
+                       /*
+                        * If the FHR has set a very very fast register timer
+                        * there exists a possibility that the incoming NULL
+                        * register
+                        * is happening before we set the spt bit.  If so
+                        * Do a quick check to update the counters and
+                        * then set the spt bit as appropriate
+                        */
+                       if (upstream->sptbit != PIM_UPSTREAM_SPTBIT_TRUE) {
+                               pim_mroute_update_counters(
+                                       upstream->channel_oil);
+                               /*
+                                * Have we seen packets?
+                                */
+                               if (upstream->channel_oil->cc.oldpktcnt
+                                   < upstream->channel_oil->cc.pktcnt)
+                                       pim_upstream_set_sptbit(
+                                               upstream,
+                                               upstream->rpf.source_nexthop
+                                                       .interface);
+                       }
                }
 
                if ((upstream->sptbit == PIM_UPSTREAM_SPTBIT_TRUE)
@@ -392,10 +417,12 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
                    || (SwitchToSptDesired(pim_ifp->pim, &sg))) {
                        if (sentRegisterStop) {
                                pim_upstream_keep_alive_timer_start(
-                                       upstream, qpim_rp_keep_alive_time);
+                                       upstream,
+                                       pim_ifp->pim->rp_keep_alive_time);
                        } else {
                                pim_upstream_keep_alive_timer_start(
-                                       upstream, qpim_keep_alive_time);
+                                       upstream,
+                                       pim_ifp->pim->keep_alive_time);
                        }
                }