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>
This commit is contained in:
Donald Sharp 2018-07-31 17:40:37 -04:00
parent 0329ff96a9
commit 7438923168
3 changed files with 28 additions and 34 deletions

View File

@ -367,25 +367,9 @@ static int pim_update_upstream_nh_helper(struct hash_backet *backet, void *arg)
static int pim_update_upstream_nh(struct pim_instance *pim, static int pim_update_upstream_nh(struct pim_instance *pim,
struct pim_nexthop_cache *pnc) struct pim_nexthop_cache *pnc)
{ {
struct listnode *node;
struct interface *ifp;
hash_walk(pnc->upstream_hash, pim_update_upstream_nh_helper, pim); hash_walk(pnc->upstream_hash, pim_update_upstream_nh_helper, pim);
FOR_ALL_INTERFACES (pim->vrf, ifp) pim_zebra_update_all_interfaces(pim);
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);
}
}
return 0; return 0;
} }

View File

@ -425,13 +425,35 @@ static int pim_zebra_if_address_del(int command, struct zclient *client,
return 0; 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) static void scan_upstream_rpf_cache(struct pim_instance *pim)
{ {
struct listnode *up_node; struct listnode *up_node;
struct listnode *up_nextnode; struct listnode *up_nextnode;
struct listnode *node;
struct pim_upstream *up; struct pim_upstream *up;
struct interface *ifp;
for (ALL_LIST_ELEMENTS(pim->upstream_list, up_node, up_nextnode, up)) { for (ALL_LIST_ELEMENTS(pim->upstream_list, up_node, up_nextnode, up)) {
enum pim_rpf_result rpf_result; 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 (qpim_upstream_list) */
FOR_ALL_INTERFACES (pim->vrf, ifp) pim_zebra_update_all_interfaces(pim);
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);
}
}
} }
void pim_scan_individual_oil(struct channel_oil *c_oil, int in_vif_index) void pim_scan_individual_oil(struct channel_oil *c_oil, int in_vif_index)

View File

@ -46,4 +46,6 @@ void pim_forward_stop(struct pim_ifchannel *ch, bool install_it);
void sched_rpf_cache_refresh(struct pim_instance *pim); void sched_rpf_cache_refresh(struct pim_instance *pim);
struct zclient *pim_zebra_zclient_get(void); struct zclient *pim_zebra_zclient_get(void);
void pim_zebra_update_all_interfaces(struct pim_instance *pim);
#endif /* PIM_ZEBRA_H */ #endif /* PIM_ZEBRA_H */