summaryrefslogtreecommitdiff
path: root/pimd/pim_rp.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_rp.c')
-rw-r--r--pimd/pim_rp.c39
1 files changed, 14 insertions, 25 deletions
diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c
index 09529055e0..2db39bac4b 100644
--- a/pimd/pim_rp.c
+++ b/pimd/pim_rp.c
@@ -274,6 +274,7 @@ struct rp_info *pim_rp_find_match_group(struct pim_instance *pim,
static void pim_rp_refresh_group_to_rp_mapping(struct pim_instance *pim)
{
pim_msdp_i_am_rp_changed(pim);
+ pim_upstream_reeval_use_rpt(pim);
}
void pim_rp_prefix_list_update(struct pim_instance *pim,
@@ -381,27 +382,17 @@ void pim_upstream_update(struct pim_instance *pim, struct pim_upstream *up)
old_rpf.source_nexthop.interface = up->rpf.source_nexthop.interface;
- rpf_result = pim_rpf_update(pim, up, &old_rpf);
+ rpf_result = pim_rpf_update(pim, up, &old_rpf, __func__);
if (rpf_result == PIM_RPF_FAILURE)
pim_mroute_del(up->channel_oil, __PRETTY_FUNCTION__);
/* update kernel multicast forwarding cache (MFC) */
- if (up->rpf.source_nexthop.interface && up->channel_oil) {
- ifindex_t ifindex = up->rpf.source_nexthop.interface->ifindex;
- int vif_index = pim_if_find_vifindex_by_ifindex(pim, ifindex);
- /* Pass Current selected NH vif index to mroute download */
- if (vif_index)
- pim_scan_individual_oil(up->channel_oil, vif_index);
- else {
- if (PIM_DEBUG_PIM_NHT)
- zlog_debug(
- "%s: NHT upstream %s channel_oil IIF %s vif_index is not valid",
- __PRETTY_FUNCTION__, up->sg_str,
- up->rpf.source_nexthop.interface->name);
- }
- }
+ if (up->rpf.source_nexthop.interface && up->channel_oil)
+ pim_upstream_mroute_iif_update(up->channel_oil, __func__);
- if (rpf_result == PIM_RPF_CHANGED)
+ if (rpf_result == PIM_RPF_CHANGED ||
+ (rpf_result == PIM_RPF_FAILURE &&
+ old_rpf.source_nexthop.interface))
pim_zebra_upstream_rpf_changed(pim, up, &old_rpf);
pim_zebra_update_all_interfaces(pim);
@@ -455,7 +446,6 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
struct prefix nht_p;
struct route_node *rn;
struct pim_upstream *up;
- struct listnode *upnode;
if (rp_addr.s_addr == INADDR_ANY ||
rp_addr.s_addr == INADDR_NONE)
@@ -563,8 +553,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
__PRETTY_FUNCTION__, buf, buf1);
}
- for (ALL_LIST_ELEMENTS_RO(pim->upstream_list, upnode,
- up)) {
+ frr_each (rb_pim_upstream, &pim->upstream_head, up) {
/* Find (*, G) upstream whose RP is not
* configured yet
*/
@@ -659,7 +648,7 @@ int pim_rp_new(struct pim_instance *pim, struct in_addr rp_addr,
rn->lock);
}
- for (ALL_LIST_ELEMENTS_RO(pim->upstream_list, upnode, up)) {
+ frr_each (rb_pim_upstream, &pim->upstream_head, up) {
if (up->sg.src.s_addr == INADDR_ANY) {
struct prefix grp;
struct rp_info *trp_info;
@@ -732,7 +721,6 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr,
bool was_plist = false;
struct rp_info *trp_info;
struct pim_upstream *up;
- struct listnode *upnode;
struct bsgrp_node *bsgrp = NULL;
struct bsm_rpinfo *bsrp = NULL;
char grp_str[PREFIX2STR_BUFFER];
@@ -809,7 +797,7 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr,
rp_all = pim_rp_find_match_group(pim, &g_all);
if (rp_all == rp_info) {
- for (ALL_LIST_ELEMENTS_RO(pim->upstream_list, upnode, up)) {
+ frr_each (rb_pim_upstream, &pim->upstream_head, up) {
/* Find the upstream (*, G) whose upstream address is
* same as the deleted RP
*/
@@ -861,7 +849,7 @@ int pim_rp_del(struct pim_instance *pim, struct in_addr rp_addr,
pim_rp_refresh_group_to_rp_mapping(pim);
- for (ALL_LIST_ELEMENTS_RO(pim->upstream_list, upnode, up)) {
+ frr_each (rb_pim_upstream, &pim->upstream_head, up) {
/* Find the upstream (*, G) whose upstream address is same as
* the deleted RP
*/
@@ -902,7 +890,6 @@ int pim_rp_change(struct pim_instance *pim, struct in_addr new_rp_addr,
int result = 0;
struct rp_info *rp_info = NULL;
struct pim_upstream *up;
- struct listnode *upnode;
rn = route_node_lookup(pim->rp_table, &group);
if (!rn) {
@@ -951,7 +938,7 @@ int pim_rp_change(struct pim_instance *pim, struct in_addr new_rp_addr,
listnode_add_sort(pim->rp_list, rp_info);
- for (ALL_LIST_ELEMENTS_RO(pim->upstream_list, upnode, up)) {
+ frr_each (rb_pim_upstream, &pim->upstream_head, up) {
if (up->sg.src.s_addr == INADDR_ANY) {
struct prefix grp;
struct rp_info *trp_info;
@@ -1057,6 +1044,7 @@ void pim_rp_check_on_if_add(struct pim_interface *pim_ifp)
if (i_am_rp_changed) {
pim_msdp_i_am_rp_changed(pim);
+ pim_upstream_reeval_use_rpt(pim);
}
}
@@ -1099,6 +1087,7 @@ void pim_i_am_rp_re_evaluate(struct pim_instance *pim)
if (i_am_rp_changed) {
pim_msdp_i_am_rp_changed(pim);
+ pim_upstream_reeval_use_rpt(pim);
}
}