diff options
| author | Acee Lindem <acee@lindem.com> | 2025-01-22 20:41:47 +0000 |
|---|---|---|
| committer | Acee Lindem <acee@lindem.com> | 2025-01-23 15:13:53 +0000 |
| commit | 1c55cf27a207323ab640a6e558c2e7001a3c0c6e (patch) | |
| tree | d5fb36d20549a998d5831d264179f0ca3f1e0dc4 /ospfd | |
| parent | 1d96c58375baf7eeab65a614a89a5fc4cb7f7031 (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.c | 21 |
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)) { |
