DPDK  22.03.0
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
21 extern "C" {
22 #endif
23 
24 #define RTE_RIB6_IPV6_ADDR_SIZE 16
25 
29 enum {
34 };
35 
36 struct rte_rib6;
37 struct rte_rib6_node;
38 
40 struct rte_rib6_conf {
46  size_t ext_sz;
47  /* size of rte_rib_node's pool */
48  int max_nodes;
49 };
50 
59 static inline void
60 rte_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 
79 static inline int
80 rte_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 
103 static inline uint8_t
104 get_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 
125 struct rte_rib6_node *
126 rte_rib6_lookup(struct rte_rib6 *rib,
127  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
128 
139 struct rte_rib6_node *
140 rte_rib6_lookup_parent(struct rte_rib6_node *ent);
141 
155 struct rte_rib6_node *
156 rte_rib6_lookup_exact(struct rte_rib6 *rib,
157  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
158 
182 struct rte_rib6_node *
183 rte_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 
197 void
198 rte_rib6_remove(struct rte_rib6 *rib,
199  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
200 
214 struct rte_rib6_node *
215 rte_rib6_insert(struct rte_rib6 *rib,
216  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
217 
229 int
230 rte_rib6_get_ip(const struct rte_rib6_node *node,
231  uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
232 
244 int
245 rte_rib6_get_depth(const struct rte_rib6_node *node, uint8_t *depth);
246 
257 void *
258 rte_rib6_get_ext(struct rte_rib6_node *node);
259 
271 int
272 rte_rib6_get_nh(const struct rte_rib6_node *node, uint64_t *nh);
273 
285 int
286 rte_rib6_set_nh(struct rte_rib6_node *node, uint64_t nh);
287 
301 struct rte_rib6 *
302 rte_rib6_create(const char *name, int socket_id,
303  const struct rte_rib6_conf *conf);
304 
314 struct rte_rib6 *
315 rte_rib6_find_existing(const char *name);
316 
325 void
326 rte_rib6_free(struct rte_rib6 *rib);
327 
328 #ifdef __cplusplus
329 }
330 #endif
331 
332 #endif /* _RTE_RIB6_H_ */
struct rte_rib6_node * rte_rib6_lookup(struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE])
int rte_rib6_get_depth(const struct rte_rib6_node *node, uint8_t *depth)
void rte_rib6_free(struct rte_rib6 *rib)
void * rte_rib6_get_ext(struct rte_rib6_node *node)
struct rte_rib6 * rte_rib6_find_existing(const char *name)
#define RTE_MIN(a, b)
Definition: rte_common.h:575
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_ip(const struct rte_rib6_node *node, uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE])
struct rte_rib6 * rte_rib6_create(const char *name, int socket_id, const struct rte_rib6_conf *conf)
struct rte_rib6_node * rte_rib6_insert(struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth)
int rte_rib6_get_nh(const struct rte_rib6_node *node, uint64_t *nh)
struct rte_rib6_node * rte_rib6_lookup_exact(struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth)
void rte_rib6_remove(struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth)
static void rte_rib6_copy_addr(uint8_t *dst, const uint8_t *src)
Definition: rte_rib6.h:60
int rte_rib6_set_nh(struct rte_rib6_node *node, uint64_t nh)
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
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
#define RTE_MAX(a, b)
Definition: rte_common.h:585
size_t ext_sz
Definition: rte_rib6.h:46