[PATCH] fib6: fix adding default route as first route

Vladimir Medvedkin vladimir.medvedkin at intel.com
Mon Oct 2 17:12:01 CEST 2023


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 at dpdk.org

Signed-off-by: Vladimir Medvedkin <vladimir.medvedkin at intel.com>
---
 lib/fib/trie.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/lib/fib/trie.c b/lib/fib/trie.c
index 3e780afdaf..09470e7287 100644
--- a/lib/fib/trie.c
+++ b/lib/fib/trie.c
@@ -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)
-- 
2.34.1



More information about the stable mailing list