rte_lpm.h(3)

πŸ’– rte_lpm.h πŸ’–

okay so bestie, welcome to the rte_lpm.h manual page (that's from the DPDK crew's library functions manual, section 3, iykyk). this is the Longest Prefix Match header and it is genuinely iconic. come sit, we're doing this together 🫢


✨ NAME ✨

rte_lpm.h β€” the header that runs RTE Longest Prefix Match. that's the whole name. short, sweet, powerful. main character energy fr fr πŸ‘‘


✨ SYNOPSIS ✨

the includes you need, bestie, all of them, no skipping πŸ’…

#include <errno.h>
#include <stdalign.h>
#include <stdint.h>
#include <rte_branch_prediction.h>
#include <rte_byteorder.h>
#include <rte_common.h>
#include <rte_vect.h>
#include <rte_rcu_qsbr.h>
#include 'rte_lpm_scalar.h'
not me pointing out that last include is written with single quotes exactly like in the source πŸ’€ keeping it character for character, that's the rule.

🌸 Data Structures

literally just these two cuties:

  • struct rte_lpm_config
  • struct rte_lpm_rcu_config

🌸 Macros

  • #define RTE_LPM_NAMESIZE 32
  • #define RTE_LPM_MAX_DEPTH 32
  • #define RTE_LPM_LOOKUP_SUCCESS 0x01000000
  • #define rte_lpm_lookup_bulk(lpm, ips, next_hops, n)

🌸 Enumerations

one single enum, and she's serving:

enum rte_lpm_qsbr_mode { RTE_LPM_QSBR_MODE_DQ = 0,
    RTE_LPM_QSBR_MODE_SYNC }

🌸 Functions

the whole lineup, and yes we're naming all of them πŸŽ€

void rte_lpm_free (struct rte_lpm *lpm)
struct rte_lpm * rte_lpm_create (const char *name, int socket_id, const
    struct rte_lpm_config *config) __rte_malloc
    __rte_dealloc(rte_lpm_free
struct rte_lpm struct rte_lpm * rte_lpm_find_existing (const char *name)
int rte_lpm_rcu_qsbr_add (struct rte_lpm *lpm, struct rte_lpm_rcu_config
    *cfg)
int rte_lpm_add (struct rte_lpm *lpm, uint32_t ip, uint8_t depth,
    uint32_t next_hop)
int rte_lpm_is_rule_present (struct rte_lpm *lpm, uint32_t ip, uint8_t
    depth, uint32_t *next_hop)
int rte_lpm_delete (struct rte_lpm *lpm, uint32_t ip, uint8_t depth)
void rte_lpm_delete_all (struct rte_lpm *lpm)
static int rte_lpm_lookup (const struct rte_lpm *lpm, uint32_t ip,
    uint32_t *next_hop)
static void rte_lpm_lookupx4 (const struct rte_lpm *lpm, xmm_t ip,
    uint32_t hop[4], uint32_t defv)

✨ Detailed Description ✨

RTE Longest Prefix Match (LPM) β€” that's the whole vibe. πŸ’–

Definition in file rte_lpm.h.


✨ Macro Definition Documentation ✨

πŸ¦‹ #define RTE_LPM_NAMESIZE 32

Max number of characters in LPM name. thirty-two characters of pure name potential, bestie.

Definition at line 29 of file rte_lpm.h.

πŸ¦‹ #define RTE_LPM_MAX_DEPTH 32

Maximum depth value possible for IPv4 LPM. that's the ceiling, don't test it.

Definition at line 32 of file rte_lpm.h.

πŸ¦‹ #define RTE_LPM_LOOKUP_SUCCESS 0x01000000

Bitmask used to indicate successful lookup. this is the little flag that says "we ate ✨".

Definition at line 63 of file rte_lpm.h.

πŸ¦‹ #define rte_lpm_lookup_bulk( lpm, ips, next_hops, n)

Value:

rte_lpm_lookup_bulk_func(lpm, ips, next_hops, n)

Lookup multiple IP addresses in an LPM table. lowkey important note: this may be implemented as a macro, so the address of the function should not be used. don't do it, she's not that kind of girl πŸ™ˆ

Parameters

  • lpm β€” LPM object handle
  • ips β€” Array of IPs to be looked up in the LPM table
  • next_hops β€” Next hop of the most specific rule found for IP (valid on lookup hit only). This is an array of two byte values. The most significant byte in each value says whether the lookup was successful (bitmask RTE_LPM_LOOKUP_SUCCESS is set). The least significant byte is the actual next hop.
  • n β€” Number of elements in ips (and next_hops) array to lookup. This should be a compile time constant, and divisible by 8 for best performance. like, for real, divisible by 8 or you're leaving speed on the table.

Returns

-EINVAL for incorrect arguments, otherwise 0

Definition at line 345 of file rte_lpm.h.


✨ Enumeration Type Documentation ✨

πŸ’œ enum rte_lpm_qsbr_mode

RCU reclamation modes. pick your fighter 🌈

Enumerator

  • RTE_LPM_QSBR_MODE_DQ β€” Create defer queue for reclaim.
  • RTE_LPM_QSBR_MODE_SYNC β€” Use blocking mode reclaim. No defer queue created.

Definition at line 69 of file rte_lpm.h.


✨ Function Documentation ✨

πŸ“ void rte_lpm_free (struct rte_lpm * lpm)

Free an LPM object. releasing her back into the wild πŸ•ŠοΈ

Parameters

  • lpm β€” LPM object handle. If lpm is NULL, no operation is performed. (so a NULL here is a no-op, not a crisis, okay?)

πŸ“ struct rte_lpm * rte_lpm_create (const char * name, int socket_id, const struct rte_lpm_config * config)

Create an LPM object. manifesting her into existence ✨

Parameters

  • name β€” LPM object name
  • socket_id β€” NUMA socket ID for LPM table memory allocation
  • config β€” Structure containing the configuration

Returns

Handle to LPM object on success, NULL otherwise with rte_errno set to an appropriate values. Possible rte_errno values include:

  • E_RTE_NO_CONFIG - function could not get pointer to rte_config structure
  • E_RTE_SECONDARY - function was called from a secondary process instance
  • EINVAL - invalid parameter passed to function
  • ENOSPC - the maximum number of memzones has already been allocated
  • EEXIST - a memzone with the same name already exists
  • ENOMEM - no appropriate memory area found in which to create memzone
that's a lot of ways for it to go wrong, and every single one of them is listed here because we do not gatekeep errors πŸ’…

πŸ“ struct rte_lpm struct rte_lpm * rte_lpm_find_existing (const char * name)

Find an existing LPM object and return a pointer to it. like running into your friend at the function πŸ₯Ή

Parameters

  • name β€” Name of the lpm object as passed to rte_lpm_create()

Returns

Pointer to lpm object or NULL if object not found with rte_errno set appropriately. Possible rte_errno values include:

  • ENOENT - required entry not available to return.

πŸ“ int rte_lpm_rcu_qsbr_add (struct rte_lpm * lpm, struct rte_lpm_rcu_config * cfg)

Associate RCU QSBR variable with an LPM object. matching them up, they're a package deal 🫢

Parameters

  • lpm β€” the lpm object to add RCU QSBR
  • cfg β€” RCU QSBR configuration

Returns

On success - 0 On error - 1 with error code set in rte_errno. Possible rte_errno codes are:

  • EINVAL - invalid pointer
  • EEXIST - already added QSBR
  • ENOMEM - memory allocation failure

πŸ“ int rte_lpm_add (struct rte_lpm * lpm, uint32_t ip, uint8_t depth, uint32_t next_hop)

Add a rule to the LPM table. new rule just dropped πŸ”₯

Parameters

  • lpm β€” LPM object handle
  • ip β€” IP of the rule to be added to the LPM table
  • depth β€” Depth of the rule to be added to the LPM table
  • next_hop β€” Next hop of the rule to be added to the LPM table

Returns

0 on success, negative value otherwise

πŸ“ int rte_lpm_is_rule_present (struct rte_lpm * lpm, uint32_t ip, uint8_t depth, uint32_t * next_hop)

Check if a rule is present in the LPM table, and provide its next hop if it is. vibe check but for rules πŸ‘€

Parameters

  • lpm β€” LPM object handle
  • ip β€” IP of the rule to be searched
  • depth β€” Depth of the rule to searched
  • next_hop β€” Next hop of the rule (valid only if it is found)

Returns

1 if the rule exists, 0 if it does not, a negative value on failure

πŸ“ int rte_lpm_delete (struct rte_lpm * lpm, uint32_t ip, uint8_t depth)

Delete a rule from the LPM table. we're removing the rule, not the whole table, calm down 😭

Parameters

  • lpm β€” LPM object handle
  • ip β€” IP of the rule to be deleted from the LPM table
  • depth β€” Depth of the rule to be deleted from the LPM table

Returns

0 on success, negative value otherwise

πŸ“ void rte_lpm_delete_all (struct rte_lpm * lpm)

Delete all rules from the LPM table. the full reset, the clean slate, the "new year new me" 🌸

Parameters

  • lpm β€” LPM object handle

πŸ“ int rte_lpm_lookup (const struct rte_lpm * lpm, uint32_t ip, uint32_t * next_hop) [inline], [static]

Lookup an IP into the LPM table.

Parameters

  • lpm β€” LPM object handle
  • ip β€” IP to be looked up in the LPM table
  • next_hop β€” Next hop of the most specific rule found for IP (valid on lookup hit only)

Returns

-EINVAL for incorrect arguments, -ENOENT on lookup miss, 0 on lookup hit

Definition at line 292 of file rte_lpm.h.

πŸ“ void rte_lpm_lookupx4 (const struct rte_lpm * lpm, xmm_t ip, uint32_t hop[4], uint32_t defv) [inline], [static]

Lookup four IP addresses in an LPM table. four at once, she's efficient, she's booked and busy πŸ’…

Parameters

  • lpm β€” LPM object handle
  • ip β€” Four IPs to be looked up in the LPM table
  • hop β€” Next hop of the most specific rule found for IP (valid on lookup hit only). This is an 4 elements array of two byte values. If the lookup was successful for the given IP, then least significant byte of the corresponding element is the actual next hop and the most significant byte is zero. If the lookup for the given IP failed, then corresponding element would contain default value, see description of then next parameter.
  • defv β€” Default value to populate into corresponding element of hop[] array, if lookup would fail.

✨ Author ✨

Generated automatically by Doxygen for DPDK from the source code. yeah, a robot wrote it, but i made it cute πŸŽ€


okay bestie that's the whole page, every flag, every rte_errno, every default, all of it, nothing skipped, we do not gatekeep 🌈 that was DPDK Version 25.11.3, rte_lpm.h(3), and honestly? she ate. go build something iconic with your longest prefix matches, ily, bye πŸ’–πŸ¦‹βœ¨

πŸ“¦ where this page comes from