Hi folks,

while working on IPv6 support for grout [1], I noticed that all DPDK IPv6 APIs used fixed sized arrays in the route lookup functions [2].

int rte_fib6_lookup_bulk(struct rte_fib6 *fib,
                         uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE],
                         uint64_t *next_hops,
                         int n);

If I'm not mistaken, using sized arrays in function signatures is only for documentation purposes and does not result in any specific compiler checks. In the above example, the ips parameter is considered as a plain old `uint8_t **` pointer.

Also, not having a dedicated type for IPv6 addresses requires obscure pointer arithmetic [3] and casting [4].

I'd like to introduce a real IPv6 address structure that has the same alignment than a dumb `uint8_t *` pointer but has an union to ease casting and most importantly presents the whole thing as an explicit typed structure:

   #define RTE_IPV6_ADDR_SIZE 16

   struct rte_ipv6_addr {
       union {
           uint8_t u8[RTE_IPV6_ADDR_SIZE];
           uint16_t u16[RTE_IPV6_ADDR_SIZE / sizeof(uint16_t)];
           uint32_t u32[RTE_IPV6_ADDR_SIZE / sizeof(uint32_t)];
           uint64_t u64[RTE_IPV6_ADDR_SIZE / sizeof(uint64_t)];
       };
   } __rte_packed __rte_aligned(1);

This would require some breakage of the APIs but I think it would benefit code readability and maintainability in the long term.

int rte_fib6_lookup_bulk(struct rte_fib6 *fib,
                         const struct rte_ipv6_addr *ips,
                         uint64_t *next_hops,
                         int n);

I already have a semi-working draft and am in the process of splitting the changes into small chunks to make them easier to review.

https://github.com/DPDK/dpdk/compare/main...rjarry:dpdk:ipv6-address-rework

Is that something that would be of interest? If yes, I would like to announce API breakage before the release of 24.07 so that the changes can be integrated into 24.11.

Cheers!

[1] https://github.com/rjarry/grout
[2] https://doc.dpdk.org/api/rte__fib6_8h.html#a924678410ccb9551cda3e75d742a11e3
[3] https://git.dpdk.org/dpdk/tree/lib/fib/trie_avx512.c?h=v24.07-rc2#n340
[4] https://git.dpdk.org/dpdk/tree/lib/hash/rte_thash.h?h=v24.07-rc2#n156

--
Robin

Reply via email to