summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJafar Al-Gharaibeh <jafar@atcorp.com>2024-10-22 23:09:53 -0500
committerMergify <37929162+mergify[bot]@users.noreply.github.com>2024-10-27 19:12:48 +0000
commit943b96b1812d71e780ff49559fd7f8982c8bf55c (patch)
tree5d139ed2283384db572f2f1379ae7c0cff36673e
parent4309d9148b418640be4c04f820cf839b82165e32 (diff)
pimd: allow resolving bsr via directly connected secondary address
This only matters to single hop nodes that are adjacent to the bsr. More common with IPv6 where LL address is used in PIM as the primary address. If the BSR IP happens to be an address on the same interface, the receiving pim router rejects the BSR address because it expects the BSR IP to resolve via the LL address even if we have a connected route for the same BSR IP subnet. Effectively, we want to allow rpf to be resolved via secondary IPs with connected routes on the same interface, and not limit them to primary addresses. Signed-off-by: Jafar Al-Gharaibeh <jafar@atcorp.com> (cherry picked from commit 8fbd88c5a73ec9a6d88b8fd310a943a6765caf8a)
-rw-r--r--pimd/pim_nht.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c
index 5a161c4f16..f2dbfa9765 100644
--- a/pimd/pim_nht.c
+++ b/pimd/pim_nht.c
@@ -342,9 +342,19 @@ bool pim_nht_bsr_rpf_check(struct pim_instance *pim, pim_addr bsr_addr,
nbr = pim_neighbor_find(ifp, znh->nexthop_addr, true);
if (!nbr)
continue;
-
- return znh->ifindex == src_ifp->ifindex &&
- (!pim_addr_cmp(znh->nexthop_addr, src_ip));
+ /* Are we on the correct interface? */
+ if (znh->ifindex == src_ifp->ifindex) {
+ /* Do we have the correct NH ? */
+ if (!pim_addr_cmp(znh->nexthop_addr, src_ip))
+ return true;
+ /*
+ * check If the packet came from the neighbor,
+ * and the dst is a secondary address on the connected interface
+ */
+ return (!pim_addr_cmp(nbr->source_addr, src_ip) &&
+ pim_if_connected_to_source(ifp, znh->nexthop_addr));
+ }
+ return false;
}
return false;
}
@@ -409,8 +419,19 @@ bool pim_nht_bsr_rpf_check(struct pim_instance *pim, pim_addr bsr_addr,
if (!nbr)
continue;
- return nh->ifindex == src_ifp->ifindex &&
- (!pim_addr_cmp(nhaddr, src_ip));
+ /* Are we on the correct interface? */
+ if (nh->ifindex == src_ifp->ifindex) {
+ /* Do we have the correct NH ? */
+ if (!pim_addr_cmp(nhaddr, src_ip))
+ return true;
+ /*
+ * check If the packet came from the neighbor,
+ * and the dst is a secondary address on the connected interface
+ */
+ return (!pim_addr_cmp(nbr->source_addr, src_ip) &&
+ pim_if_connected_to_source(ifp, nhaddr));
+ }
+ return false;
}
return false;
}