mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-16 02:30:52 +00:00
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:
parent
0329ff96a9
commit
7438923168
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user