summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMobashshera Rasool <mrasool@vmware.com>2022-07-05 23:08:52 -0700
committerMobashshera Rasool <mrasool@vmware.com>2022-07-06 05:18:38 -0700
commit8d0f0b02f3322b13c33fb215cf78ceedc685c950 (patch)
tree20905402c2e3e25716c25d7c914591d86433d63c
parente894ef7e77157f0a5d7a2be7b572a949c645dbe3 (diff)
pimd: During prune pending, behave as NOINFO state
Fixed ANVL Conformance PIM-SM 16.3 test case. When (S,G,rpt) prune is received, we were installing the mroute immediately with none as OIF. This leads to dropping the (S,G) traffic during prune pending time as well. Also we should not install the mroute if there is no change in the rpf update. These 2 things lead to the failure of the test case. Fixed it by blocking the installation in this scenario. When prune pending timer pops, it will take care of installing the mroute with none as OIF. Fixes: #11535 Signed-off-by: Mobashshera Rasool <mrasool@vmware.com>
-rw-r--r--pimd/pim_nht.c2
-rw-r--r--pimd/pim_upstream.c11
2 files changed, 11 insertions, 2 deletions
diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c
index 564d16a60b..90eb8ae407 100644
--- a/pimd/pim_nht.c
+++ b/pimd/pim_nht.c
@@ -449,7 +449,7 @@ static int pim_update_upstream_nh_helper(struct hash_bucket *bucket, void *arg)
* RPF nbr is now unreachable the MFC has already been updated
* by pim_rpf_clear
*/
- if (rpf_result != PIM_RPF_FAILURE)
+ if (rpf_result != PIM_RPF_CHANGED)
pim_upstream_mroute_iif_update(up->channel_oil, __func__);
if (rpf_result == PIM_RPF_CHANGED ||
diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c
index 54a7f59ca4..d447357c69 100644
--- a/pimd/pim_upstream.c
+++ b/pimd/pim_upstream.c
@@ -947,7 +947,16 @@ static struct pim_upstream *pim_upstream_new(struct pim_instance *pim,
__func__, up->sg_str);
}
- if (up->rpf.source_nexthop.interface) {
+ /* Consider a case where (S,G,rpt) prune is received and this
+ * upstream is getting created due to that, then as per RFC
+ * until prune pending time we need to behave same as NOINFO
+ * state, therefore do not install if OIF is NULL until then
+ * This is for PIM Conformance PIM-SM 16.3 fix
+ * When the prune pending timer pop, this mroute will get
+ * installed with none as OIF */
+ if (up->rpf.source_nexthop.interface &&
+ !(pim_upstream_empty_inherited_olist(up) && (ch != NULL) &&
+ PIM_IF_FLAG_TEST_S_G_RPT(ch->flags))) {
pim_upstream_mroute_iif_update(up->channel_oil,
__func__);
}