rte_lpm6.h(3)

πŸ’– rte_lpm6.h β€” Library Functions Manual πŸ’–

okay bestie, sit down, hydrate, because today we're learning about rte_lpm6.h, which is the header for the RTE Longest Prefix Match for IPv6 (LPM6). it lives in the DPDK library functions manual and it's genuinely iconic. no cap. πŸ¦‹


✨ NAME ✨

rte_lpm6.h β€” the glow-up header file for IPv6 longest-prefix-match shenanigans πŸ‘‘


🌸 SYNOPSIS 🌸

#include <stdint.h>
#include <rte_common.h>
#include <rte_ip6.h>

πŸŽ€ Data Structures

  • struct rte_lpm6_config

πŸŽ€ Macros

  • #define RTE_LPM6_NAMESIZE 32

πŸŽ€ Functions

void rte_lpm6_free (struct rte_lpm6 *lpm)

struct rte_lpm6 * rte_lpm6_create (const char *name, int socket_id,
    const struct rte_lpm6_config *config) __rte_malloc
    __rte_dealloc(rte_lpm6_free

struct rte_lpm6 struct rte_lpm6 * rte_lpm6_find_existing (const char
    *name)

int rte_lpm6_add (struct rte_lpm6 *lpm, const struct rte_ipv6_addr *ip,
    uint8_t depth, uint32_t next_hop)

int rte_lpm6_is_rule_present (struct rte_lpm6 *lpm, const struct
    rte_ipv6_addr *ip, uint8_t depth, uint32_t *next_hop)

int rte_lpm6_delete (struct rte_lpm6 *lpm, const struct rte_ipv6_addr
    *ip, uint8_t depth)

int rte_lpm6_delete_bulk_func (struct rte_lpm6 *lpm, struct
    rte_ipv6_addr *ips, uint8_t *depths, unsigned int n)

void rte_lpm6_delete_all (struct rte_lpm6 *lpm)

int rte_lpm6_lookup (const struct rte_lpm6 *lpm, const struct
    rte_ipv6_addr *ip, uint32_t *next_hop)

int rte_lpm6_lookup_bulk_func (const struct rte_lpm6 *lpm, struct
    rte_ipv6_addr *ips, int32_t *next_hops, unsigned int n)

πŸ’… Detailed Description πŸ’…

RTE Longest Prefix Match for IPv6 (LPM6)

Definition in file rte_lpm6.h.


πŸ”₯ Macro Definition Documentation πŸ”₯

#define RTE_LPM6_NAMESIZE 32

Max number of characters in LPM name. don't get cute and write a novel in there, bestie, 32 is the limit πŸ‘€

Definition at line 25 of file rte_lpm6.h.


🧚 Function Documentation 🧚

void rte_lpm6_free (struct rte_lpm6 * lpm)

Free an LPM object. bye bye, you served πŸ’œ

Parameters

  • lpm β€” LPM object handle. If lpm is NULL, no operation is performed. (it's giving "if you have nothing to free, don't free anything" 😌)

struct rte_lpm6 * rte_lpm6_create (const char * name, int socket_id, const struct rte_lpm6_config * config)

Create an LPM object. manifesting a whole routing table 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
so yeah, if it comes back NULL, check your rte_errno before you start spiraling 😭

struct rte_lpm6 struct rte_lpm6 * rte_lpm6_find_existing (const char * name)

Find an existing LPM object and return a pointer to it. like spotting your friend in a crowd but for memory zones 🫢

Parameters

  • name β€” Name of the lpm object as passed to rte_lpm6_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_lpm6_add (struct rte_lpm6 * lpm, const struct rte_ipv6_addr * 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_lpm6_is_rule_present (struct rte_lpm6 * lpm, const struct rte_ipv6_addr * 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. a vibe check, but for routing 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_lpm6_delete (struct rte_lpm6 * lpm, const struct rte_ipv6_addr * ip, uint8_t depth)

Delete a rule from the LPM table. it's not you, it's the routing table πŸ’€

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


int rte_lpm6_delete_bulk_func (struct rte_lpm6 * lpm, struct rte_ipv6_addr * ips, uint8_t * depths, unsigned int n)

Delete a rule from the LPM table. (yes bestie, the description really does say "a rule" again even though it's a bulk function β€” we keep it exactly as written, no editing the source's lore πŸ™ˆ)

Parameters

  • lpm β€” LPM object handle
  • ips β€” Array of IPs to be deleted from the LPM table
  • depths β€” Array of depths of the rules to be deleted from the LPM table
  • n β€” Number of rules to be deleted from the LPM table

Returns

0 on success, negative value otherwise.


void rte_lpm6_delete_all (struct rte_lpm6 * lpm)

Delete all rules from the LPM table. scorched earth, but make it elegant 🌈

Parameters

  • lpm β€” LPM object handle

int rte_lpm6_lookup (const struct rte_lpm6 * lpm, const struct rte_ipv6_addr * ip, uint32_t * next_hop)

Lookup an IP into the LPM table. the moment of truth 🌟

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


int rte_lpm6_lookup_bulk_func (const struct rte_lpm6 * lpm, struct rte_ipv6_addr * ips, int32_t * next_hops, unsigned int n)

Lookup multiple IP addresses in an LPM table. group lookup, main character energy for everyone πŸŽ€

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 next hop will be stored on each position on success; otherwise the position will be set to -1.
  • n β€” Number of elements in ips (and next_hops) array to lookup.

Returns

-EINVAL for incorrect arguments, otherwise 0


🌟 Author 🌟

Generated automatically by Doxygen for DPDK from the source code. (not a human, just a very diligent little doc generator doing its thing πŸ’–)


and that's the whole page, bestie!! every flag, every return value, every rte_errno β€” all of it, preserved, periodt. this little manual page came straight from DPDK Version 25.11.3, and its name is rte_lpm6.h(3). go forth and route your IPv6 packets responsibly πŸ¦‹βœ¨πŸ‘‘

πŸ“¦ where this page comes from