DPDK  21.11.7
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
22 extern "C" {
23 #endif
24 
25 #define RTE_RIB6_IPV6_ADDR_SIZE 16
26 
30 enum {
35 };
36 
37 struct rte_rib6;
38 struct rte_rib6_node;
39 
41 struct rte_rib6_conf {
47  size_t ext_sz;
48  /* size of rte_rib6_node's pool */
49  int max_nodes;
50 };
51 
60 static inline void
61 rte_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 
80 static inline int
81 rte_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 
104 static inline uint8_t
105 get_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 
126 struct rte_rib6_node *
127 rte_rib6_lookup(struct rte_rib6 *rib,
128  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
129 
140 struct rte_rib6_node *
141 rte_rib6_lookup_parent(struct rte_rib6_node *ent);
142 
156 struct rte_rib6_node *
157 rte_rib6_lookup_exact(struct rte_rib6 *rib,
158  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
159 
183 struct rte_rib6_node *
184 rte_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 
198 void
199 rte_rib6_remove(struct rte_rib6 *rib,
200  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
201 
215 struct rte_rib6_node *
216 rte_rib6_insert(struct rte_rib6 *rib,
217  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
218 
230 int
231 rte_rib6_get_ip(const struct rte_rib6_node *node,
232  uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
233 
245 int
246 rte_rib6_get_depth(const struct rte_rib6_node *node, uint8_t *depth);
247 
258 void *
259 rte_rib6_get_ext(struct rte_rib6_node *node);
260 
272 int
273 rte_rib6_get_nh(const struct rte_rib6_node *node, uint64_t *nh);
274 
286 int
287 rte_rib6_set_nh(struct rte_rib6_node *node, uint64_t nh);
288 
302 struct rte_rib6 *
303 rte_rib6_create(const char *name, int socket_id,
304  const struct rte_rib6_conf *conf);
305 
315 struct rte_rib6 *
316 rte_rib6_find_existing(const char *name);
317 
324 void
325 rte_rib6_free(struct rte_rib6 *rib);
326 
327 #ifdef __cplusplus
328 }
329 #endif
330 
331 #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:593
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:61
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:81
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
#define RTE_MAX(a, b)
Definition: rte_common.h:603
size_t ext_sz
Definition: rte_rib6.h:47