fib6: fix adding default route as first route
Checks
Commit Message
Currently when adding default route as first route
it is not added and no error is reported.
When we enter the loop over an address range in
the general case we will eventually reach the check
for when the range has ended, and exit the loop.
However when adding default route as first route,
since address range covered begins and ends at zero
this also triggers loop exit without writing to the table.
Fixed by adding check for default route,
i.e. both ledge and redge are equal to 0::0.
Bugzilla ID: 1272
Fixes: c3e12e0f0354 ("fib: add dataplane algorithm for IPv6")
Cc: stable@dpdk.org
Signed-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
---
lib/fib/trie.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
Comments
02/10/2023 17:12, Vladimir Medvedkin:
> Currently when adding default route as first route
> it is not added and no error is reported.
> When we enter the loop over an address range in
> the general case we will eventually reach the check
> for when the range has ended, and exit the loop.
> However when adding default route as first route,
> since address range covered begins and ends at zero
> this also triggers loop exit without writing to the table.
>
> Fixed by adding check for default route,
> i.e. both ledge and redge are equal to 0::0.
>
> Bugzilla ID: 1272
> Fixes: c3e12e0f0354 ("fib: add dataplane algorithm for IPv6")
> Cc: stable@dpdk.org
>
> Signed-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
Applied, thanks.
@@ -451,6 +451,14 @@ get_nxt_net(uint8_t *ip, uint8_t depth)
}
}
+static int
+v6_addr_is_zero(const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE])
+{
+ uint8_t ip_addr[RTE_FIB6_IPV6_ADDR_SIZE] = {0};
+
+ return rte_rib6_is_equal(ip, ip_addr);
+}
+
static int
modify_dp(struct rte_trie_tbl *dp, struct rte_rib6 *rib,
const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE],
@@ -484,11 +492,19 @@ modify_dp(struct rte_trie_tbl *dp, struct rte_rib6 *rib,
return ret;
get_nxt_net(redge, tmp_depth);
rte_rib6_copy_addr(ledge, redge);
+ /*
+ * we got to the end of address space
+ * and wrapped around
+ */
+ if (v6_addr_is_zero(ledge))
+ break;
} else {
rte_rib6_copy_addr(redge, ip);
get_nxt_net(redge, depth);
- if (rte_rib6_is_equal(ledge, redge))
+ if (rte_rib6_is_equal(ledge, redge) &&
+ !v6_addr_is_zero(ledge))
break;
+
ret = install_to_dp(dp, ledge, redge,
next_hop);
if (ret != 0)