diff options
author | Donald Sharp <sharpd@cumulusnetworks.com> | 2018-07-31 23:40:37 +0200 |
---|---|---|
committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2018-07-31 23:40:37 +0200 |
commit | 74389231689bfbe8a22159190943c39255bd40e5 (patch) | |
tree | 59a56d8d61312e9944824d4b15a9b5dd441bed88 /pimd/pim_zebra.c | |
parent | Merge pull request #2753 from qlyoung/fix-zebra-shutdown-crash-2 (diff) | |
download | frr-74389231689bfbe8a22159190943c39255bd40e5.tar.xz frr-74389231689bfbe8a22159190943c39255bd40e5.zip |
pimd: Abstract sending of data to peers
After we have decided what has changed as part of a update
we need to send the j/p messages to our peers.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'pimd/pim_zebra.c')
-rw-r--r-- | pimd/pim_zebra.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index b947ca062..f383c367a 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -425,13 +425,35 @@ static int pim_zebra_if_address_del(int command, struct zclient *client, return 0; } +void pim_zebra_update_all_interfaces(struct pim_instance *pim) +{ + struct interface *ifp; + + FOR_ALL_INTERFACES (pim->vrf, ifp) { + struct pim_interface *pim_ifp = ifp->info; + struct pim_iface_upstream_switch *us; + struct listnode *node; + + if (!pim_ifp) + continue; + + for (ALL_LIST_ELEMENTS_RO(pim_ifp->upstream_switch_list, node, + us)) { + struct pim_rpf rpf; + + rpf.source_nexthop.interface = ifp; + rpf.rpf_addr.u.prefix4 = us->address; + pim_joinprune_send(&rpf, us->us); + pim_jp_agg_clear_group(us->us); + } + } +} + static void scan_upstream_rpf_cache(struct pim_instance *pim) { struct listnode *up_node; struct listnode *up_nextnode; - struct listnode *node; struct pim_upstream *up; - struct interface *ifp; for (ALL_LIST_ELEMENTS(pim->upstream_list, up_node, up_nextnode, up)) { enum pim_rpf_result rpf_result; @@ -509,21 +531,7 @@ static void scan_upstream_rpf_cache(struct pim_instance *pim) } /* for (qpim_upstream_list) */ - FOR_ALL_INTERFACES (pim->vrf, ifp) - if (ifp->info) { - struct pim_interface *pim_ifp = ifp->info; - struct pim_iface_upstream_switch *us; - - for (ALL_LIST_ELEMENTS_RO(pim_ifp->upstream_switch_list, - node, us)) { - struct pim_rpf rpf; - - rpf.source_nexthop.interface = ifp; - rpf.rpf_addr.u.prefix4 = us->address; - pim_joinprune_send(&rpf, us->us); - pim_jp_agg_clear_group(us->us); - } - } + pim_zebra_update_all_interfaces(pim); } void pim_scan_individual_oil(struct channel_oil *c_oil, int in_vif_index) |