]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: allow resolving bsr via directly connected secondary address
authorJafar Al-Gharaibeh <jafar@atcorp.com>
Wed, 23 Oct 2024 04:09:53 +0000 (23:09 -0500)
committerJafar Al-Gharaibeh <jafar@atcorp.com>
Fri, 25 Oct 2024 13:59:17 +0000 (08:59 -0500)
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>
pimd/pim_nht.c

index 5a161c4f16dc2e604b5e3843482155be8a80b6e7..f2dbfa9765c8d954bef958f92697d6afee9afae4 100644 (file)
@@ -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;
 }