Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Duplicate fib proposal #16342

Merged
merged 2 commits into from
Jul 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"recursive":true
},
{
"fib":true,
"duplicate":true,
"ip":"10.0.3.2",
"active":true
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"recursive":true
},
{
"fib":true,
"duplicate":true,
"ip":"10.0.3.2",
"active":true
}
Expand Down
27 changes: 22 additions & 5 deletions tests/topotests/lib/common_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@
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:
Expand All @@ -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
Expand All @@ -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:
Expand Down
4 changes: 4 additions & 0 deletions zebra/zebra_dplane.c
Original file line number Diff line number Diff line change
Expand Up @@ -4314,6 +4314,10 @@ dplane_route_update_internal(struct route_node *rn,
NEXTHOP_FLAG_RECURSIVE))
continue;

if (CHECK_FLAG(nexthop->flags,
NEXTHOP_FLAG_DUPLICATE))
continue;

if (CHECK_FLAG(nexthop->flags,
NEXTHOP_FLAG_ACTIVE))
SET_FLAG(nexthop->flags,
Expand Down
3 changes: 3 additions & 0 deletions zebra/zebra_rib.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading