summaryrefslogtreecommitdiff
path: root/ospfd
diff options
context:
space:
mode:
authorAcee Lindem <acee@lindem.com>2025-01-22 20:41:47 +0000
committerAcee Lindem <acee@lindem.com>2025-01-23 15:13:53 +0000
commit1c55cf27a207323ab640a6e558c2e7001a3c0c6e (patch)
treed5fb36d20549a998d5831d264179f0ca3f1e0dc4 /ospfd
parent1d96c58375baf7eeab65a614a89a5fc4cb7f7031 (diff)
ospfd: Prune duplicate next-hops when installing into zebra
Duplicate next-hops are maintained for OSPF inter-area and AS external routes in the OSPF routing table as long as they correspond to LSAs for different adverting routers. The intra-area route computation will not result in duplicate next-hops. Signed-off-by: Acee Lindem <acee@lindem.com>
Diffstat (limited to 'ospfd')
-rw-r--r--ospfd/ospf_zebra.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c
index b718d498ae..f45135f44f 100644
--- a/ospfd/ospf_zebra.c
+++ b/ospfd/ospf_zebra.c
@@ -304,6 +304,27 @@ void ospf_zebra_add(struct ospf *ospf, struct prefix_ipv4 *p,
if (api.nexthop_num >= ospf->max_multipath)
break;
+ /*
+ * Prune duplicate next-hops from the route that is
+ * installed in the zebra IP route table. OSPF Intra-Area
+ * routes never have duplicates.
+ */
+ if (or->path_type != OSPF_PATH_INTRA_AREA) {
+ struct zapi_nexthop *api_nh = &api.nexthops[0];
+ unsigned int nh_index;
+ bool duplicate_next_hop = false;
+
+ for (nh_index = 0; nh_index < api.nexthop_num; api_nh++, nh_index++) {
+ if (IPV4_ADDR_SAME(&api_nh->gate.ipv4, &path->nexthop) &&
+ (api_nh->ifindex == path->ifindex)) {
+ duplicate_next_hop = true;
+ break;
+ }
+ }
+ if (duplicate_next_hop)
+ continue;
+ }
+
ospf_zebra_add_nexthop(ospf, path, &api);
if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE)) {