DPDK  20.05.0
Data Structures | Enumerations | Functions
rte_rib6.h File Reference
#include <rte_memcpy.h>
#include <rte_compat.h>

Go to the source code of this file.

Data Structures

struct  rte_rib6_conf
 

Enumerations

enum  { RTE_RIB6_GET_NXT_ALL, RTE_RIB6_GET_NXT_COVER }
 

Functions

static void rte_rib6_copy_addr (uint8_t *dst, const uint8_t *src)
 
static int rte_rib6_is_equal (uint8_t *ip1, uint8_t *ip2)
 
static uint8_t get_msk_part (uint8_t depth, int byte)
 
__rte_experimental struct rte_rib6_node * rte_rib6_lookup (struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE])
 
__rte_experimental struct rte_rib6_node * rte_rib6_lookup_parent (struct rte_rib6_node *ent)
 
__rte_experimental struct rte_rib6_node * rte_rib6_lookup_exact (struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth)
 
__rte_experimental struct rte_rib6_node * rte_rib6_get_nxt (struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth, struct rte_rib6_node *last, int flag)
 
__rte_experimental void rte_rib6_remove (struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth)
 
__rte_experimental struct rte_rib6_node * rte_rib6_insert (struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth)
 
__rte_experimental int rte_rib6_get_ip (struct rte_rib6_node *node, uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE])
 
__rte_experimental int rte_rib6_get_depth (struct rte_rib6_node *node, uint8_t *depth)
 
__rte_experimental void * rte_rib6_get_ext (struct rte_rib6_node *node)
 
__rte_experimental int rte_rib6_get_nh (struct rte_rib6_node *node, uint64_t *nh)
 
__rte_experimental int rte_rib6_set_nh (struct rte_rib6_node *node, uint64_t nh)
 
__rte_experimental struct rte_rib6 * rte_rib6_create (const char *name, int socket_id, struct rte_rib6_conf *conf)
 
__rte_experimental struct rte_rib6 * rte_rib6_find_existing (const char *name)
 
__rte_experimental void rte_rib6_free (struct rte_rib6 *rib)
 

Detailed Description

Level compressed tree implementation for IPv6 Longest Prefix Match

Definition in file rte_rib6.h.

Enumeration Type Documentation

anonymous enum

rte_rib6_get_nxt() flags

Enumerator
RTE_RIB6_GET_NXT_ALL 

flag to get all subroutes in a RIB tree

RTE_RIB6_GET_NXT_COVER 

flag to get first matched subroutes in a RIB tree

Definition at line 22 of file rte_rib6.h.

Function Documentation

static void rte_rib6_copy_addr ( uint8_t *  dst,
const uint8_t *  src 
)
inlinestatic

Copy IPv6 address from one location to another

Parameters
dstpointer to the place to copy
srcpointer from where to copy

Definition at line 53 of file rte_rib6.h.

static int rte_rib6_is_equal ( uint8_t *  ip1,
uint8_t *  ip2 
)
inlinestatic

Compare two IPv6 addresses

Parameters
ip1pointer to the first ipv6 address
ip2pointer to the second ipv6 address
Returns
1 if equal 0 otherwise

Definition at line 73 of file rte_rib6.h.

static uint8_t get_msk_part ( uint8_t  depth,
int  byte 
)
inlinestatic

Get 8-bit part of 128-bit IPv6 mask

Parameters
depthipv6 prefix length
byteposition of a 8-bit chunk in the 128-bit mask
Returns
8-bit chunk of the 128-bit IPv6 mask

Definition at line 97 of file rte_rib6.h.

__rte_experimental struct rte_rib6_node* rte_rib6_lookup ( struct rte_rib6 *  rib,
const uint8_t  ip[RTE_RIB6_IPV6_ADDR_SIZE] 
)

Lookup an IP into the RIB structure

Parameters
ribRIB object handle
ipIP to be looked up in the RIB
Returns
pointer to struct rte_rib6_node on success NULL otherwise
__rte_experimental struct rte_rib6_node* rte_rib6_lookup_parent ( struct rte_rib6_node *  ent)

Lookup less specific route into the RIB structure

Parameters
entPointer to struct rte_rib6_node that represents target route
Returns
pointer to struct rte_rib6_node that represents less specific route on success NULL otherwise
__rte_experimental struct rte_rib6_node* rte_rib6_lookup_exact ( struct rte_rib6 *  rib,
const uint8_t  ip[RTE_RIB6_IPV6_ADDR_SIZE],
uint8_t  depth 
)

Provides exact mach lookup of the prefix into the RIB structure

Parameters
ribRIB object handle
ipnet to be looked up in the RIB
depthprefix length
Returns
pointer to struct rte_rib6_node on success NULL otherwise
__rte_experimental struct rte_rib6_node* rte_rib6_get_nxt ( struct rte_rib6 *  rib,
const uint8_t  ip[RTE_RIB6_IPV6_ADDR_SIZE],
uint8_t  depth,
struct rte_rib6_node *  last,
int  flag 
)

Retrieve next more specific prefix from the RIB that is covered by ip/depth supernet in an ascending order

Parameters
ribRIB object handle
ipnet address of supernet prefix that covers returned more specific prefixes
depthsupernet prefix length
lastpointer to the last returned prefix to get next prefix or NULL to get first more specific prefix
flag-RTE_RIB6_GET_NXT_ALL get all prefixes from subtrie -RTE_RIB6_GET_NXT_COVER get only first more specific prefix even if it have more specifics
Returns
pointer to the next more specific prefix NULL if there is no prefixes left
__rte_experimental void rte_rib6_remove ( struct rte_rib6 *  rib,
const uint8_t  ip[RTE_RIB6_IPV6_ADDR_SIZE],
uint8_t  depth 
)

Remove prefix from the RIB

Parameters
ribRIB object handle
ipnet to be removed from the RIB
depthprefix length
__rte_experimental struct rte_rib6_node* rte_rib6_insert ( struct rte_rib6 *  rib,
const uint8_t  ip[RTE_RIB6_IPV6_ADDR_SIZE],
uint8_t  depth 
)

Insert prefix into the RIB

Parameters
ribRIB object handle
ipnet to be inserted to the RIB
depthprefix length
Returns
pointer to new rte_rib6_node on success NULL otherwise
__rte_experimental int rte_rib6_get_ip ( struct rte_rib6_node *  node,
uint8_t  ip[RTE_RIB6_IPV6_ADDR_SIZE] 
)

Get an ip from rte_rib6_node

Parameters
nodepointer to the rib6 node
ippointer to the ipv6 to save
Returns
0 on success -1 on failure with rte_errno indicating reason for failure.
__rte_experimental int rte_rib6_get_depth ( struct rte_rib6_node *  node,
uint8_t *  depth 
)

Get a depth from rte_rib6_node

Parameters
nodepointer to the rib6 node
depthpointer to the depth to save
Returns
0 on success -1 on failure with rte_errno indicating reason for failure.
__rte_experimental void* rte_rib6_get_ext ( struct rte_rib6_node *  node)

Get ext field from the rte_rib6_node It is caller responsibility to make sure there are necessary space for the ext field inside rib6 node.

Parameters
nodepointer to the rte_rib6_node
Returns
pointer to the ext
__rte_experimental int rte_rib6_get_nh ( struct rte_rib6_node *  node,
uint64_t *  nh 
)

Get nexthop from the rte_rib6_node

Parameters
nodepointer to the rib6 node
nhpointer to the nexthop to save
Returns
0 on success -1 on failure, with rte_errno indicating reason for failure.
__rte_experimental int rte_rib6_set_nh ( struct rte_rib6_node *  node,
uint64_t  nh 
)

Set nexthop into the rte_rib6_node

Parameters
nodepointer to the rib6 node
nhnexthop value to set to the rib6 node
Returns
0 on success -1 on failure, with rte_errno indicating reason for failure.
__rte_experimental struct rte_rib6* rte_rib6_create ( const char *  name,
int  socket_id,
struct rte_rib6_conf conf 
)

Create RIB

Parameters
nameRIB name
socket_idNUMA socket ID for RIB table memory allocation
confStructure containing the configuration
Returns
Pointer to RIB object on success NULL otherwise with rte_errno indicating reason for failure.
__rte_experimental struct rte_rib6* rte_rib6_find_existing ( const char *  name)

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

Parameters
nameName of the rib object as passed to rte_rib_create()
Returns
Pointer to RIB object on success NULL otherwise with rte_errno indicating reason for failure.
__rte_experimental void rte_rib6_free ( struct rte_rib6 *  rib)

Free an RIB object.

Parameters
ribRIB object handle
Returns
None