]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Make XX_forward_start 'struct pim_instance *' aware
authorDonald Sharp <sharpd@cumulusnetworks.com>
Sun, 21 May 2017 12:57:18 +0000 (08:57 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 24 Jul 2017 17:51:36 +0000 (13:51 -0400)
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
pimd/pim_igmpv3.c
pimd/pim_zebra.c
pimd/pim_zebra.h

index 880d840eacd6528a058e2170db38699751fbe8bf..ecdf4fb673b3a83743afe22c767d38bf3716691b 100644 (file)
@@ -220,7 +220,7 @@ static void igmp_source_timer_on(struct igmp_group *group,
 
          Source timer switched from (T == 0) to (T > 0): enable forwarding.
        */
-       igmp_source_forward_start(source);
+       igmp_source_forward_start(pimg, source);
 }
 
 void igmp_source_reset_gmi(struct igmp_sock *igmp, struct igmp_group *group,
@@ -313,7 +313,7 @@ static void group_exclude_fwd_anysrc_ifempty(struct igmp_group *group)
        zassert(group->group_filtermode_isexcl);
 
        if (listcount(group->group_source_list) < 1) {
-               igmp_anysource_forward_start(group);
+               igmp_anysource_forward_start(pimg, group);
        }
 }
 
index 6692c3e7950087946bbd5b639a9d2d3b9c66570f..ab7abb9a6444fcbc45ffbb824703f3450a991bd1 100644 (file)
@@ -758,7 +758,8 @@ void pim_zebra_init(void)
        zclient_lookup_new();
 }
 
-void igmp_anysource_forward_start(struct igmp_group *group)
+void igmp_anysource_forward_start(struct pim_instance *pim,
+                                 struct igmp_group *group)
 {
        struct igmp_source *source;
        struct in_addr src_addr = {.s_addr = 0};
@@ -773,7 +774,7 @@ void igmp_anysource_forward_start(struct igmp_group *group)
                return;
        }
 
-       igmp_source_forward_start(source);
+       igmp_source_forward_start(pim, source);
 }
 
 void igmp_anysource_forward_stop(struct igmp_group *group)
@@ -830,39 +831,51 @@ void igmp_source_forward_reevaluate_all(void)
 {
        struct listnode *ifnode;
        struct interface *ifp;
+       struct vrf *vrf;
+       struct pim_instance *pim;
 
-       for (ALL_LIST_ELEMENTS_RO(vrf_iflist(pimg->vrf_id), ifnode, ifp)) {
-               struct pim_interface *pim_ifp = ifp->info;
-               struct listnode *sock_node;
-               struct igmp_sock *igmp;
-
-               if (!pim_ifp)
+       RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name)
+       {
+               pim = vrf->info;
+               if (!pim)
                        continue;
 
-               /* scan igmp sockets */
-               for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node,
-                                         igmp)) {
-                       struct listnode *grpnode;
-                       struct igmp_group *grp;
+               for (ALL_LIST_ELEMENTS_RO(vrf_iflist(pim->vrf_id), ifnode,
+                                         ifp)) {
+                       struct pim_interface *pim_ifp = ifp->info;
+                       struct listnode *sock_node;
+                       struct igmp_sock *igmp;
 
-                       /* scan igmp groups */
-                       for (ALL_LIST_ELEMENTS_RO(igmp->igmp_group_list,
-                                                 grpnode, grp)) {
-                               struct listnode *srcnode;
-                               struct igmp_source *src;
+                       if (!pim_ifp)
+                               continue;
 
-                               /* scan group sources */
-                               for (ALL_LIST_ELEMENTS_RO(
-                                            grp->group_source_list, srcnode,
-                                            src)) {
-                                       igmp_source_forward_reevaluate_one(src);
-                               } /* scan group sources */
-                       }        /* scan igmp groups */
-               }                 /* scan igmp sockets */
-       }                         /* scan interfaces */
+                       /* scan igmp sockets */
+                       for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list,
+                                                 sock_node, igmp)) {
+                               struct listnode *grpnode;
+                               struct igmp_group *grp;
+
+                               /* scan igmp groups */
+                               for (ALL_LIST_ELEMENTS_RO(igmp->igmp_group_list,
+                                                         grpnode, grp)) {
+                                       struct listnode *srcnode;
+                                       struct igmp_source *src;
+
+                                       /* scan group sources */
+                                       for (ALL_LIST_ELEMENTS_RO(
+                                                    grp->group_source_list,
+                                                    srcnode, src)) {
+                                               igmp_source_forward_reevaluate_one(
+                                                       src);
+                                       } /* scan group sources */
+                               }        /* scan igmp groups */
+                       }                 /* scan igmp sockets */
+               }                         /* scan interfaces */
+       }
 }
 
-void igmp_source_forward_start(struct igmp_source *source)
+void igmp_source_forward_start(struct pim_instance *pim,
+                              struct igmp_source *source)
 {
        struct igmp_group *group;
        struct prefix_sg sg;
@@ -898,7 +911,7 @@ void igmp_source_forward_start(struct igmp_source *source)
                struct pim_nexthop nexthop;
                struct pim_upstream *up = NULL;
 
-               if (!pim_rp_set_upstream_addr(pimg, &vif_source,
+               if (!pim_rp_set_upstream_addr(pim, &vif_source,
                                              source->source_addr, sg.grp))
                        return;
 
@@ -915,22 +928,21 @@ void igmp_source_forward_start(struct igmp_source *source)
                grp.prefixlen = IPV4_MAX_BITLEN;
                grp.u.prefix4 = sg.grp;
 
-               if (pim_find_or_track_nexthop(pimg, &nht_p, NULL, NULL,
+               if (pim_find_or_track_nexthop(pim, &nht_p, NULL, NULL,
                                              &out_pnc)) {
                        if (out_pnc.nexthop_num) {
-                               up = pim_upstream_find(pimg, &sg);
+                               up = pim_upstream_find(pim, &sg);
                                memset(&nexthop, 0, sizeof(nexthop));
                                if (up)
                                        memcpy(&nexthop,
                                               &up->rpf.source_nexthop,
                                               sizeof(struct pim_nexthop));
-                               pim_ecmp_nexthop_search(pimg, &out_pnc,
-                                                       &nexthop, &src, &grp,
-                                                       0);
+                               pim_ecmp_nexthop_search(pim, &out_pnc, &nexthop,
+                                                       &src, &grp, 0);
                                if (nexthop.interface)
                                        input_iface_vif_index =
                                                pim_if_find_vifindex_by_ifindex(
-                                                       pimg,
+                                                       pim,
                                                        nexthop.interface->ifindex);
                        } else {
                                if (PIM_DEBUG_ZEBRA) {
@@ -951,7 +963,7 @@ void igmp_source_forward_start(struct igmp_source *source)
                } else
                        input_iface_vif_index =
                                pim_ecmp_fib_lookup_if_vif_index(
-                                       pimg, vif_source, &src, &grp);
+                                       pim, vif_source, &src, &grp);
 
                if (PIM_DEBUG_ZEBRA) {
                        char buf2[INET_ADDRSTRLEN];
@@ -1010,7 +1022,7 @@ void igmp_source_forward_start(struct igmp_source *source)
                }
 
                source->source_channel_oil =
-                       pim_channel_oil_add(pimg, &sg, input_iface_vif_index);
+                       pim_channel_oil_add(pim, &sg, input_iface_vif_index);
                if (!source->source_channel_oil) {
                        if (PIM_DEBUG_IGMP_TRACE) {
                                zlog_debug(
@@ -1116,6 +1128,11 @@ void pim_forward_start(struct pim_ifchannel *ch)
        struct pim_upstream *up = ch->upstream;
        uint32_t mask = PIM_OIF_FLAG_PROTO_PIM;
        int input_iface_vif_index = 0;
+       struct pim_instance *pim;
+       struct pim_interface *pim_ifp;
+
+       pim_ifp = ch->interface->info;
+       pim = pim_ifp->pim;
 
        if (PIM_DEBUG_PIM_TRACE) {
                char source_str[INET_ADDRSTRLEN];
@@ -1151,7 +1168,7 @@ void pim_forward_start(struct pim_ifchannel *ch)
                grp.u.prefix4 = up->sg.grp;
                memset(&out_pnc, 0, sizeof(struct pim_nexthop_cache));
 
-               if (pim_find_or_track_nexthop(pimg, &nht_p, NULL, NULL,
+               if (pim_find_or_track_nexthop(pim, &nht_p, NULL, NULL,
                                              &out_pnc)) {
                        if (out_pnc.nexthop_num) {
                                src.family = AF_INET;
@@ -1163,12 +1180,12 @@ void pim_forward_start(struct pim_ifchannel *ch)
                                grp.u.prefix4 = up->sg.grp;
                                // Compute PIM RPF using Cached nexthop
                                if (pim_ecmp_nexthop_search(
-                                           pimg, &out_pnc,
+                                           pim, &out_pnc,
                                            &up->rpf.source_nexthop, &src, &grp,
                                            0))
                                        input_iface_vif_index =
                                                pim_if_find_vifindex_by_ifindex(
-                                                       pimg,
+                                                       pim,
                                                        up->rpf.source_nexthop
                                                                .interface->ifindex);
                                else {
@@ -1197,7 +1214,7 @@ void pim_forward_start(struct pim_ifchannel *ch)
                } else
                        input_iface_vif_index =
                                pim_ecmp_fib_lookup_if_vif_index(
-                                       pimg, up->upstream_addr, &src, &grp);
+                                       pim, up->upstream_addr, &src, &grp);
 
                if (input_iface_vif_index < 1) {
                        if (PIM_DEBUG_PIM_TRACE) {
@@ -1213,14 +1230,14 @@ void pim_forward_start(struct pim_ifchannel *ch)
                }
                if (PIM_DEBUG_TRACE) {
                        struct interface *in_intf = pim_if_find_by_vif_index(
-                               pimg, input_iface_vif_index);
+                               pim, input_iface_vif_index);
                        zlog_debug(
                                "%s: Update channel_oil IIF %s VIFI %d entry %s ",
                                __PRETTY_FUNCTION__,
                                in_intf ? in_intf->name : "NIL",
                                input_iface_vif_index, up->sg_str);
                }
-               up->channel_oil = pim_channel_oil_add(pimg, &up->sg,
+               up->channel_oil = pim_channel_oil_add(pim, &up->sg,
                                                      input_iface_vif_index);
                if (!up->channel_oil) {
                        if (PIM_DEBUG_PIM_TRACE)
index 9b5450d66a929069098ca6c9761b3c7461468d95..d4de989d9d1e5cafaa9ff3ba2cb1b12bcb5fa5e2 100644 (file)
@@ -32,10 +32,12 @@ void pim_zebra_zclient_update(struct vty *vty);
 void pim_scan_individual_oil(struct channel_oil *c_oil, int in_vif_index);
 void pim_scan_oil(void);
 
-void igmp_anysource_forward_start(struct igmp_group *group);
+void igmp_anysource_forward_start(struct pim_instance *pim,
+                                 struct igmp_group *group);
 void igmp_anysource_forward_stop(struct igmp_group *group);
 
-void igmp_source_forward_start(struct igmp_source *source);
+void igmp_source_forward_start(struct pim_instance *pim,
+                              struct igmp_source *source);
 void igmp_source_forward_stop(struct igmp_source *source);
 void igmp_source_forward_reevaluate_all(void);