summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Stapp <mjs.ietf@gmail.com>2024-07-09 13:48:37 -0400
committerGitHub <noreply@github.com>2024-07-09 13:48:37 -0400
commit7d08b297219ee58ece6c6548557075fe6f46a0f6 (patch)
tree4f5cdf1016881b77750a485e660994145dd42c94
parent685712df44c4b4da91853db6ca30bf23e388d826 (diff)
parent731f74e35fa2c1636208f4bf64650d2d00a199b4 (diff)
Merge pull request #16342 from pguibert6WIND/duplicate_fib_proposal
Duplicate fib proposal
-rw-r--r--tests/topotests/bgp_duplicate_nexthop/test_bgp_duplicate_nexthop.py2
-rw-r--r--tests/topotests/bgp_peer_type_multipath_relax/r1/prefix1-eBGP-confed.json2
-rw-r--r--tests/topotests/bgp_peer_type_multipath_relax/r1/prefix1-eBGP-iBGP.json2
-rw-r--r--tests/topotests/lib/common_check.py27
-rw-r--r--zebra/zebra_dplane.c4
-rw-r--r--zebra/zebra_rib.c3
6 files changed, 32 insertions, 8 deletions
diff --git a/tests/topotests/bgp_duplicate_nexthop/test_bgp_duplicate_nexthop.py b/tests/topotests/bgp_duplicate_nexthop/test_bgp_duplicate_nexthop.py
index 955881e6f9..83fae71bf5 100644
--- a/tests/topotests/bgp_duplicate_nexthop/test_bgp_duplicate_nexthop.py
+++ b/tests/topotests/bgp_duplicate_nexthop/test_bgp_duplicate_nexthop.py
@@ -320,7 +320,7 @@ def check_ipv4_prefix_recursive_with_multiple_nexthops(
)
test_func = functools.partial(
- ip_check_path_selection, tgen.gears["r1"], prefix, expected
+ ip_check_path_selection, tgen.gears["r1"], prefix, expected, check_fib=True
)
_, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
assert (
diff --git a/tests/topotests/bgp_peer_type_multipath_relax/r1/prefix1-eBGP-confed.json b/tests/topotests/bgp_peer_type_multipath_relax/r1/prefix1-eBGP-confed.json
index 22ec2c298b..483165c0f3 100644
--- a/tests/topotests/bgp_peer_type_multipath_relax/r1/prefix1-eBGP-confed.json
+++ b/tests/topotests/bgp_peer_type_multipath_relax/r1/prefix1-eBGP-confed.json
@@ -23,7 +23,7 @@
"recursive":true
},
{
- "fib":true,
+ "duplicate":true,
"ip":"10.0.3.2",
"active":true
}
diff --git a/tests/topotests/bgp_peer_type_multipath_relax/r1/prefix1-eBGP-iBGP.json b/tests/topotests/bgp_peer_type_multipath_relax/r1/prefix1-eBGP-iBGP.json
index facddcda46..638a825395 100644
--- a/tests/topotests/bgp_peer_type_multipath_relax/r1/prefix1-eBGP-iBGP.json
+++ b/tests/topotests/bgp_peer_type_multipath_relax/r1/prefix1-eBGP-iBGP.json
@@ -23,7 +23,7 @@
"recursive":true
},
{
- "fib":true,
+ "duplicate":true,
"ip":"10.0.3.2",
"active":true
}
diff --git a/tests/topotests/lib/common_check.py b/tests/topotests/lib/common_check.py
index be3241fd20..19f02dbadc 100644
--- a/tests/topotests/lib/common_check.py
+++ b/tests/topotests/lib/common_check.py
@@ -10,11 +10,13 @@ import json
from lib import topotest
-def ip_check_path_selection(router, ipaddr_str, expected, vrf_name=None):
+def ip_check_path_selection(
+ router, ipaddr_str, expected, vrf_name=None, check_fib=False
+):
if vrf_name:
- cmdstr = f'show ip route vrf {vrf_name} {ipaddr_str} json'
+ cmdstr = f"show ip route vrf {vrf_name} {ipaddr_str} json"
else:
- cmdstr = f'show ip route {ipaddr_str} json'
+ cmdstr = f"show ip route {ipaddr_str} json"
try:
output = json.loads(router.vtysh_cmd(cmdstr))
except:
@@ -25,6 +27,21 @@ def ip_check_path_selection(router, ipaddr_str, expected, vrf_name=None):
num_nh_expected = len(expected[ipaddr_str][0]["nexthops"])
num_nh_observed = len(output[ipaddr_str][0]["nexthops"])
if num_nh_expected == num_nh_observed:
+ if check_fib:
+ # special case: when fib flag is unset,
+ # an extra test should be done to check that the flag is really unset
+ for nh_output, nh_expected in zip(
+ output[ipaddr_str][0]["nexthops"],
+ expected[ipaddr_str][0]["nexthops"],
+ ):
+ if (
+ "fib" in nh_output.keys()
+ and nh_output["fib"]
+ and ("fib" not in nh_expected.keys() or not nh_expected["fib"])
+ ):
+ return "{}, prefix {} nexthop {} has the fib flag set, whereas it is not expected".format(
+ router.name, ipaddr_str, nh_output["ip"]
+ )
return ret
return "{}, prefix {} does not have the correct number of nexthops : observed {}, expected {}".format(
router.name, ipaddr_str, num_nh_observed, num_nh_expected
@@ -37,9 +54,9 @@ def iproute2_check_path_selection(router, ipaddr_str, expected, vrf_name=None):
return None
if vrf_name:
- cmdstr = f'ip -json route show vrf {vrf_name} {ipaddr_str}'
+ cmdstr = f"ip -json route show vrf {vrf_name} {ipaddr_str}"
else:
- cmdstr = f'ip -json route show {ipaddr_str}'
+ cmdstr = f"ip -json route show {ipaddr_str}"
try:
output = json.loads(cmdstr)
except:
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c
index 7910559c4b..0844b34672 100644
--- a/zebra/zebra_dplane.c
+++ b/zebra/zebra_dplane.c
@@ -4315,6 +4315,10 @@ dplane_route_update_internal(struct route_node *rn,
continue;
if (CHECK_FLAG(nexthop->flags,
+ NEXTHOP_FLAG_DUPLICATE))
+ continue;
+
+ if (CHECK_FLAG(nexthop->flags,
NEXTHOP_FLAG_ACTIVE))
SET_FLAG(nexthop->flags,
NEXTHOP_FLAG_FIB);
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index b176ea2fe6..142f83fb36 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -1659,6 +1659,9 @@ static bool rib_update_nhg_from_ctx(struct nexthop_group *re_nhg,
if (!CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE))
continue;
+ if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_DUPLICATE))
+ continue;
+
/* Check for a FIB nexthop corresponding to the RIB nexthop */
if (!nexthop_same(ctx_nexthop, nexthop)) {
/* If the FIB doesn't know about the nexthop,