DPDK 21.11.9
rte_rib6.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Vladimir Medvedkin <medvedkinv@gmail.com>
3 * Copyright(c) 2019 Intel Corporation
4 */
5
6#ifndef _RTE_RIB6_H_
7#define _RTE_RIB6_H_
8
17#include <rte_memcpy.h>
18#include <rte_compat.h>
19#include <rte_common.h>
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
25#define RTE_RIB6_IPV6_ADDR_SIZE 16
26
30enum {
35};
36
37struct rte_rib6;
38struct rte_rib6_node;
39
47 size_t ext_sz;
48 /* size of rte_rib6_node's pool */
49 int max_nodes;
50};
51
60static inline void
61rte_rib6_copy_addr(uint8_t *dst, const uint8_t *src)
62{
63 if ((dst == NULL) || (src == NULL))
64 return;
65 rte_memcpy(dst, src, RTE_RIB6_IPV6_ADDR_SIZE);
66}
67
80static inline int
81rte_rib6_is_equal(const uint8_t *ip1, const uint8_t *ip2) {
82 int i;
83
84 if ((ip1 == NULL) || (ip2 == NULL))
85 return 0;
86 for (i = 0; i < RTE_RIB6_IPV6_ADDR_SIZE; i++) {
87 if (ip1[i] != ip2[i])
88 return 0;
89 }
90 return 1;
91}
92
104static inline uint8_t
105get_msk_part(uint8_t depth, int byte) {
106 uint8_t part;
107
108 byte &= 0xf;
109 depth = RTE_MIN(depth, 128);
110 part = RTE_MAX((int16_t)depth - (byte * 8), 0);
111 part = (part > 8) ? 8 : part;
112 return (uint16_t)(~UINT8_MAX) >> part;
113}
114
126struct rte_rib6_node *
127rte_rib6_lookup(struct rte_rib6 *rib,
128 const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
129
140struct rte_rib6_node *
141rte_rib6_lookup_parent(struct rte_rib6_node *ent);
142
156struct rte_rib6_node *
157rte_rib6_lookup_exact(struct rte_rib6 *rib,
158 const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
159
183struct rte_rib6_node *
184rte_rib6_get_nxt(struct rte_rib6 *rib,
185 const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE],
186 uint8_t depth, struct rte_rib6_node *last, int flag);
187
198void
199rte_rib6_remove(struct rte_rib6 *rib,
200 const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
201
215struct rte_rib6_node *
216rte_rib6_insert(struct rte_rib6 *rib,
217 const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
218
230int
231rte_rib6_get_ip(const struct rte_rib6_node *node,
232 uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
233
245int
246rte_rib6_get_depth(const struct rte_rib6_node *node, uint8_t *depth);
247
258void *
259rte_rib6_get_ext(struct rte_rib6_node *node);
260
272int
273rte_rib6_get_nh(const struct rte_rib6_node *node, uint64_t *nh);
274
286int
287rte_rib6_set_nh(struct rte_rib6_node *node, uint64_t nh);
288
302struct rte_rib6 *
303rte_rib6_create(const char *name, int socket_id,
304 const struct rte_rib6_conf *conf);
305
315struct rte_rib6 *
316rte_rib6_find_existing(const char *name);
317
324void
325rte_rib6_free(struct rte_rib6 *rib);
326
327#ifdef __cplusplus
328}
329#endif
330
331#endif /* _RTE_RIB6_H_ */
#define RTE_MIN(a, b)
Definition: rte_common.h:593
#define RTE_MAX(a, b)
Definition: rte_common.h:603
static void * rte_memcpy(void *dst, const void *src, size_t n)
static uint8_t get_msk_part(uint8_t depth, int byte)
Definition: rte_rib6.h:105
int rte_rib6_get_nh(const struct rte_rib6_node *node, uint64_t *nh)
int rte_rib6_set_nh(struct rte_rib6_node *node, uint64_t nh)
struct rte_rib6_node * rte_rib6_insert(struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth)
struct rte_rib6 * rte_rib6_create(const char *name, int socket_id, const struct rte_rib6_conf *conf)
static void rte_rib6_copy_addr(uint8_t *dst, const uint8_t *src)
Definition: rte_rib6.h:61
void * rte_rib6_get_ext(struct rte_rib6_node *node)
void rte_rib6_remove(struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth)
int rte_rib6_get_ip(const struct rte_rib6_node *node, uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE])
struct rte_rib6 * rte_rib6_find_existing(const char *name)
struct rte_rib6_node * rte_rib6_lookup_exact(struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth)
struct rte_rib6_node * rte_rib6_lookup_parent(struct rte_rib6_node *ent)
static int rte_rib6_is_equal(const uint8_t *ip1, const uint8_t *ip2)
Definition: rte_rib6.h:81
void rte_rib6_free(struct rte_rib6 *rib)
@ RTE_RIB6_GET_NXT_COVER
Definition: rte_rib6.h:34
@ RTE_RIB6_GET_NXT_ALL
Definition: rte_rib6.h:32
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)
int rte_rib6_get_depth(const struct rte_rib6_node *node, uint8_t *depth)
struct rte_rib6_node * rte_rib6_lookup(struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE])
size_t ext_sz
Definition: rte_rib6.h:47