From: Donald Sharp Date: Sun, 21 May 2017 12:57:18 +0000 (-0400) Subject: pimd: Make XX_forward_start 'struct pim_instance *' aware X-Git-Tag: frr-4.0-dev~468^2~107 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=6f932b0c9112c3c14cd9f51778f2e28a53151921;p=mirror%2Ffrr.git pimd: Make XX_forward_start 'struct pim_instance *' aware Signed-off-by: Donald Sharp --- diff --git a/pimd/pim_igmpv3.c b/pimd/pim_igmpv3.c index 880d840eac..ecdf4fb673 100644 --- a/pimd/pim_igmpv3.c +++ b/pimd/pim_igmpv3.c @@ -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); } } diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index 6692c3e795..ab7abb9a64 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -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) diff --git a/pimd/pim_zebra.h b/pimd/pim_zebra.h index 9b5450d66a..d4de989d9d 100644 --- a/pimd/pim_zebra.h +++ b/pimd/pim_zebra.h @@ -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);