DPDK  1.7.1
Macros | Functions
rte_lpm.h File Reference
#include <errno.h>
#include <sys/queue.h>
#include <stdint.h>
#include <stdlib.h>
#include <rte_branch_prediction.h>
#include <rte_memory.h>
#include <rte_common.h>
#include <rte_common_vect.h>

Macros

#define RTE_LPM_NAMESIZE   32
#define RTE_LPM_HEAP   0
#define RTE_LPM_MEMZONE   1
#define RTE_LPM_MAX_DEPTH   32
#define RTE_LPM_LOOKUP_SUCCESS   0x0100
#define rte_lpm_lookup_bulk(lpm, ips, next_hops, n)   rte_lpm_lookup_bulk_func(lpm, ips, next_hops, n)

Functions

struct rte_lpm * rte_lpm_create (const char *name, int socket_id, int max_rules, int flags)
struct rte_lpm * rte_lpm_find_existing (const char *name)
void rte_lpm_free (struct rte_lpm *lpm)
int rte_lpm_add (struct rte_lpm *lpm, uint32_t ip, uint8_t depth, uint8_t next_hop)
int rte_lpm_is_rule_present (struct rte_lpm *lpm, uint32_t ip, uint8_t depth, uint8_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 (struct rte_lpm *lpm, uint32_t ip, uint8_t *next_hop)
static void rte_lpm_lookupx4 (const struct rte_lpm *lpm, __m128i ip, uint16_t hop[4], uint16_t defv)

Detailed Description

RTE Longest Prefix Match (LPM)

Macro Definition Documentation

#define RTE_LPM_HEAP   0
#define rte_lpm_lookup_bulk (   lpm,
  ips,
  next_hops,
 
)    rte_lpm_lookup_bulk_func(lpm, ips, next_hops, n)

Lookup multiple IP addresses in an LPM table. This may be implemented as a macro, so the address of the function should not be used.

Parameters
lpmLPM object handle
ipsArray of IPs to be looked up in the LPM table
next_hopsNext 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.
nNumber of elements in ips (and next_hops) array to lookup. This should be a compile time constant, and divisible by 8 for best performance.
Returns
-EINVAL for incorrect arguments, otherwise 0
#define RTE_LPM_LOOKUP_SUCCESS   0x0100

Bitmask used to indicate successful lookup

#define RTE_LPM_MAX_DEPTH   32

Maximum depth value possible for IPv4 LPM.

#define RTE_LPM_MEMZONE   1
#define RTE_LPM_NAMESIZE   32

Max number of characters in LPM name.

Function Documentation

int rte_lpm_add ( struct rte_lpm *  lpm,
uint32_t  ip,
uint8_t  depth,
uint8_t  next_hop 
)

Add a rule to the LPM table.

Parameters
lpmLPM object handle
ipIP of the rule to be added to the LPM table
depthDepth of the rule to be added to the LPM table
next_hopNext hop of the rule to be added to the LPM table
Returns
0 on success, negative value otherwise
struct rte_lpm* rte_lpm_create ( const char *  name,
int  socket_id,
int  max_rules,
int  flags 
)
read

Create an LPM object.

Parameters
nameLPM object name
socket_idNUMA socket ID for LPM table memory allocation
max_rulesMaximum number of LPM rules that can be added
flagsThis parameter is currently unused
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
  • E_RTE_NO_TAILQ - no tailq list could be got for the lpm object list
  • 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
int rte_lpm_delete ( struct rte_lpm *  lpm,
uint32_t  ip,
uint8_t  depth 
)

Delete a rule from the LPM table.

Parameters
lpmLPM object handle
ipIP of the rule to be deleted from the LPM table
depthDepth 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.

Parameters
lpmLPM object handle
struct rte_lpm* rte_lpm_find_existing ( const char *  name)
read

Find an existing LPM object and return a pointer to it.

Parameters
nameName 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.
void rte_lpm_free ( struct rte_lpm *  lpm)

Free an LPM object.

Parameters
lpmLPM object handle
Returns
None
int rte_lpm_is_rule_present ( struct rte_lpm *  lpm,
uint32_t  ip,
uint8_t  depth,
uint8_t *  next_hop 
)

Check if a rule is present in the LPM table, and provide its next hop if it is.

Parameters
lpmLPM object handle
ipIP of the rule to be searched
depthDepth of the rule to searched
next_hopNext 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
static int rte_lpm_lookup ( struct rte_lpm *  lpm,
uint32_t  ip,
uint8_t *  next_hop 
)
inlinestatic

Lookup an IP into the LPM table.

Parameters
lpmLPM object handle
ipIP to be looked up in the LPM table
next_hopNext 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
static void rte_lpm_lookupx4 ( const struct rte_lpm *  lpm,
__m128i  ip,
uint16_t  hop[4],
uint16_t  defv 
)
inlinestatic

Lookup four IP addresses in an LPM table.

Parameters
lpmLPM object handle
ipFour IPs to be looked up in the LPM table
hopNext 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 succesfull 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.
defvDefault value to populate into corresponding element of hop[] array, if lookup would fail.