HardenedBSD/sys/contrib/dpdk_rte_lpm/rte_shim.h
Alexander V. Chernikov 537d134373 Bring DPDK route lookups to FreeBSD.
This change introduces loadable fib lookup modules based on
 DPDK rte_lpm lib targeted for high-speed lookups in large-scale tables.
It is based on the lookup framework described in D27401.

IPv4 module is called dpdk_lpm4. It wraps around rte_lpm [1] library.
This library implements variation of DIR24-8 [2] lookup algorithm.
Module provide lockless route lookups and in-place incremental updates,
 allowing for good RIB performance.

IPv6 module is called dpdk_lpm6. It wraps around rte_lpm6 [3] library.
Implementation can be seen as multi-bit trie where the stride or number of bits
 inspected on each level varies from level to level.
It can vary from 1 to 14 memory accesses, with 5 being the average value
 for the lengths that are most commonly used in IPv6.
Module provide lockless route lookups for global unicast addresses
 and in-place incremental updates, allowing for good RIB performance.

Implementation details:
* wrapper code lives in `sys/contrib/dpdk_rte_lpm/dpdk_lpm[6].c`.
* rte_lpm[6] implementation contains both RIB and FIB code.
 . RIB ("rule_") code, backed by array of hash tables part has been commented out,
 as base radix already provides all the necessary primitives.
* link-local lookups are currently implemented as base radix lookup.
 This part should be converted to something like read-only radix trie.

Usage detail:
Compile kernel with option FIB_ALGO and load dpdk_lpm4/dpdk_lpm6
 module at any time. They will be picked up automatically when
 amount of routes raises to several thousand.

[1]: https://doc.dpdk.org/guides/prog_guide/lpm_lib.html
[2]: http://yuba.stanford.edu/~nickm/papers/Infocom98_lookup.pdf
[3]: https://doc.dpdk.org/guides/prog_guide/lpm6_lib.html

Differential Revision: https://reviews.freebsd.org/D27412
2021-01-09 12:41:04 +00:00

32 lines
998 B
C

#ifndef _RTE_SHIM_H_
#define _RTE_SHIM_H_
#define rte_malloc(_type, _size, _align) malloc(_size, M_TEMP, M_NOWAIT)
#define rte_free(_ptr) free(_ptr, M_TEMP)
#define rte_zmalloc(_type, _size, _align) malloc(_size, M_TEMP, M_NOWAIT | M_ZERO)
#define rte_zmalloc_socket(_type, _size, _align, _s) malloc(_size, M_TEMP, M_NOWAIT | M_ZERO)
#define rte_mcfg_tailq_write_unlock()
#define rte_mcfg_tailq_write_lock()
#define RTE_CACHE_LINE_SIZE CACHE_LINE_SIZE
#define strtoull strtoul
#define assert(_s) KASSERT((_s), ("DPDK: assert failed"))
#define rte_memcpy memcpy
#define rte_strerror(_err) "strerror_not_implemented"
#define RTE_LOG(_sev, _sub, _fmt, ...) printf("DPDK::" #_sev "::" #_sub " %s: " _fmt, __func__ , ## __VA_ARGS__)
#include "sys/endian.h"
#define RTE_BYTE_ORDER BYTE_ORDER
#define RTE_LITTLE_ENDIAN LITTLE_ENDIAN
#define RTE_BIG_ENDIAN BIG_ENDIAN
#include "sys/limits.h" // CHAR_BIT
#define rte_le_to_cpu_32 le32toh
#include "rte_jhash.h"
#include "rte_common.h"
#endif