DPDK  20.11.10
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 
21 #include <rte_memcpy.h>
22 #include <rte_compat.h>
23 #include <rte_common.h>
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 #define RTE_RIB6_IPV6_ADDR_SIZE 16
30 
34 enum {
39 };
40 
41 struct rte_rib6;
42 struct rte_rib6_node;
43 
45 struct rte_rib6_conf {
51  size_t ext_sz;
52  /* size of rte_rib6_node's pool */
53  int max_nodes;
54 };
55 
64 static inline void
65 rte_rib6_copy_addr(uint8_t *dst, const uint8_t *src)
66 {
67  if ((dst == NULL) || (src == NULL))
68  return;
69  rte_memcpy(dst, src, RTE_RIB6_IPV6_ADDR_SIZE);
70 }
71 
84 static inline int
85 rte_rib6_is_equal(const uint8_t *ip1, const uint8_t *ip2) {
86  int i;
87 
88  if ((ip1 == NULL) || (ip2 == NULL))
89  return 0;
90  for (i = 0; i < RTE_RIB6_IPV6_ADDR_SIZE; i++) {
91  if (ip1[i] != ip2[i])
92  return 0;
93  }
94  return 1;
95 }
96 
108 static inline uint8_t
109 get_msk_part(uint8_t depth, int byte) {
110  uint8_t part;
111 
112  byte &= 0xf;
113  depth = RTE_MIN(depth, 128);
114  part = RTE_MAX((int16_t)depth - (byte * 8), 0);
115  part = (part > 8) ? 8 : part;
116  return (uint16_t)(~UINT8_MAX) >> part;
117 }
118 
130 __rte_experimental
131 struct rte_rib6_node *
132 rte_rib6_lookup(struct rte_rib6 *rib,
133  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
134 
145 __rte_experimental
146 struct rte_rib6_node *
147 rte_rib6_lookup_parent(struct rte_rib6_node *ent);
148 
162 __rte_experimental
163 struct rte_rib6_node *
164 rte_rib6_lookup_exact(struct rte_rib6 *rib,
165  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
166 
190 __rte_experimental
191 struct rte_rib6_node *
192 rte_rib6_get_nxt(struct rte_rib6 *rib,
193  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE],
194  uint8_t depth, struct rte_rib6_node *last, int flag);
195 
206 __rte_experimental
207 void
208 rte_rib6_remove(struct rte_rib6 *rib,
209  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
210 
224 __rte_experimental
225 struct rte_rib6_node *
226 rte_rib6_insert(struct rte_rib6 *rib,
227  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
228 
240 __rte_experimental
241 int
242 rte_rib6_get_ip(const struct rte_rib6_node *node,
243  uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
244 
256 __rte_experimental
257 int
258 rte_rib6_get_depth(const struct rte_rib6_node *node, uint8_t *depth);
259 
270 __rte_experimental
271 void *
272 rte_rib6_get_ext(struct rte_rib6_node *node);
273 
285 __rte_experimental
286 int
287 rte_rib6_get_nh(const struct rte_rib6_node *node, uint64_t *nh);
288 
300 __rte_experimental
301 int
302 rte_rib6_set_nh(struct rte_rib6_node *node, uint64_t nh);
303 
317 __rte_experimental
318 struct rte_rib6 *
319 rte_rib6_create(const char *name, int socket_id,
320  const struct rte_rib6_conf *conf);
321 
331 __rte_experimental
332 struct rte_rib6 *
333 rte_rib6_find_existing(const char *name);
334 
341 __rte_experimental
342 void
343 rte_rib6_free(struct rte_rib6 *rib);
344 
345 #ifdef __cplusplus
346 }
347 #endif
348 
349 #endif /* _RTE_RIB6_H_ */
__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 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 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_lookup_parent(struct rte_rib6_node *ent)
__rte_experimental void * rte_rib6_get_ext(struct rte_rib6_node *node)
#define RTE_MIN(a, b)
Definition: rte_common.h:578
__rte_experimental int rte_rib6_get_nh(const struct rte_rib6_node *node, uint64_t *nh)
__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 * rte_rib6_find_existing(const char *name)
static void rte_rib6_copy_addr(uint8_t *dst, const uint8_t *src)
Definition: rte_rib6.h:65
__rte_experimental int rte_rib6_get_ip(const struct rte_rib6_node *node, uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE])
static int rte_rib6_is_equal(const uint8_t *ip1, const uint8_t *ip2)
Definition: rte_rib6.h:85
__rte_experimental struct rte_rib6 * rte_rib6_create(const char *name, int socket_id, const struct rte_rib6_conf *conf)
static void * rte_memcpy(void *dst, const void *src, size_t n)
__rte_experimental int rte_rib6_get_depth(const struct rte_rib6_node *node, uint8_t *depth)
static uint8_t get_msk_part(uint8_t depth, int byte)
Definition: rte_rib6.h:109
__rte_experimental int rte_rib6_set_nh(struct rte_rib6_node *node, uint64_t nh)
__rte_experimental void rte_rib6_free(struct rte_rib6 *rib)
#define RTE_MAX(a, b)
Definition: rte_common.h:588
size_t ext_sz
Definition: rte_rib6.h:51