DPDK 22.11.4
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_common.h>
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
24#define RTE_RIB6_IPV6_ADDR_SIZE 16
25
29enum {
34};
35
36struct rte_rib6;
37struct rte_rib6_node;
38
46 size_t ext_sz;
47 /* size of rte_rib6_node's pool */
48 int max_nodes;
49};
50
59static inline void
60rte_rib6_copy_addr(uint8_t *dst, const uint8_t *src)
61{
62 if ((dst == NULL) || (src == NULL))
63 return;
64 rte_memcpy(dst, src, RTE_RIB6_IPV6_ADDR_SIZE);
65}
66
79static inline int
80rte_rib6_is_equal(const uint8_t *ip1, const uint8_t *ip2) {
81 int i;
82
83 if ((ip1 == NULL) || (ip2 == NULL))
84 return 0;
85 for (i = 0; i < RTE_RIB6_IPV6_ADDR_SIZE; i++) {
86 if (ip1[i] != ip2[i])
87 return 0;
88 }
89 return 1;
90}
91
103static inline uint8_t
104get_msk_part(uint8_t depth, int byte) {
105 uint8_t part;
106
107 byte &= 0xf;
108 depth = RTE_MIN(depth, 128);
109 part = RTE_MAX((int16_t)depth - (byte * 8), 0);
110 part = (part > 8) ? 8 : part;
111 return (uint16_t)(~UINT8_MAX) >> part;
112}
113
125struct rte_rib6_node *
126rte_rib6_lookup(struct rte_rib6 *rib,
127 const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
128
139struct rte_rib6_node *
140rte_rib6_lookup_parent(struct rte_rib6_node *ent);
141
155struct rte_rib6_node *
156rte_rib6_lookup_exact(struct rte_rib6 *rib,
157 const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
158
182struct rte_rib6_node *
183rte_rib6_get_nxt(struct rte_rib6 *rib,
184 const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE],
185 uint8_t depth, struct rte_rib6_node *last, int flag);
186
197void
198rte_rib6_remove(struct rte_rib6 *rib,
199 const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
200
214struct rte_rib6_node *
215rte_rib6_insert(struct rte_rib6 *rib,
216 const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
217
229int
230rte_rib6_get_ip(const struct rte_rib6_node *node,
231 uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
232
244int
245rte_rib6_get_depth(const struct rte_rib6_node *node, uint8_t *depth);
246
257void *
258rte_rib6_get_ext(struct rte_rib6_node *node);
259
271int
272rte_rib6_get_nh(const struct rte_rib6_node *node, uint64_t *nh);
273
285int
286rte_rib6_set_nh(struct rte_rib6_node *node, uint64_t nh);
287
301struct rte_rib6 *
302rte_rib6_create(const char *name, int socket_id,
303 const struct rte_rib6_conf *conf);
304
314struct rte_rib6 *
315rte_rib6_find_existing(const char *name);
316
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:613
#define RTE_MAX(a, b)
Definition: rte_common.h:623
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:104
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:60
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)
@ RTE_RIB6_GET_NXT_COVER
Definition: rte_rib6.h:33
@ RTE_RIB6_GET_NXT_ALL
Definition: rte_rib6.h:31
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:80
void rte_rib6_free(struct rte_rib6 *rib)
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:46