DPDK  20.08.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 
21 #include <rte_memcpy.h>
22 #include <rte_compat.h>
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 #define RTE_RIB6_IPV6_ADDR_SIZE 16
29 
33 enum {
38 };
39 
40 struct rte_rib6;
41 struct rte_rib6_node;
42 
44 struct rte_rib6_conf {
50  size_t ext_sz;
51  /* size of rte_rib_node's pool */
52  int max_nodes;
53 };
54 
63 static inline void
64 rte_rib6_copy_addr(uint8_t *dst, const uint8_t *src)
65 {
66  if ((dst == NULL) || (src == NULL))
67  return;
68  rte_memcpy(dst, src, RTE_RIB6_IPV6_ADDR_SIZE);
69 }
70 
83 static inline int
84 rte_rib6_is_equal(const uint8_t *ip1, const uint8_t *ip2) {
85  int i;
86 
87  if ((ip1 == NULL) || (ip2 == NULL))
88  return 0;
89  for (i = 0; i < RTE_RIB6_IPV6_ADDR_SIZE; i++) {
90  if (ip1[i] != ip2[i])
91  return 0;
92  }
93  return 1;
94 }
95 
107 static inline uint8_t
108 get_msk_part(uint8_t depth, int byte) {
109  uint8_t part;
110 
111  byte &= 0xf;
112  depth = RTE_MIN(depth, 128);
113  part = RTE_MAX((int16_t)depth - (byte * 8), 0);
114  part = (part > 8) ? 8 : part;
115  return (uint16_t)(~UINT8_MAX) >> part;
116 }
117 
129 __rte_experimental
130 struct rte_rib6_node *
131 rte_rib6_lookup(struct rte_rib6 *rib,
132  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
133 
144 __rte_experimental
145 struct rte_rib6_node *
146 rte_rib6_lookup_parent(struct rte_rib6_node *ent);
147 
161 __rte_experimental
162 struct rte_rib6_node *
163 rte_rib6_lookup_exact(struct rte_rib6 *rib,
164  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
165 
189 __rte_experimental
190 struct rte_rib6_node *
191 rte_rib6_get_nxt(struct rte_rib6 *rib,
192  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE],
193  uint8_t depth, struct rte_rib6_node *last, int flag);
194 
205 __rte_experimental
206 void
207 rte_rib6_remove(struct rte_rib6 *rib,
208  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
209 
223 __rte_experimental
224 struct rte_rib6_node *
225 rte_rib6_insert(struct rte_rib6 *rib,
226  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
227 
239 __rte_experimental
240 int
241 rte_rib6_get_ip(const struct rte_rib6_node *node,
242  uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
243 
255 __rte_experimental
256 int
257 rte_rib6_get_depth(const struct rte_rib6_node *node, uint8_t *depth);
258 
269 __rte_experimental
270 void *
271 rte_rib6_get_ext(struct rte_rib6_node *node);
272 
284 __rte_experimental
285 int
286 rte_rib6_get_nh(const struct rte_rib6_node *node, uint64_t *nh);
287 
299 __rte_experimental
300 int
301 rte_rib6_set_nh(struct rte_rib6_node *node, uint64_t nh);
302 
316 __rte_experimental
317 struct rte_rib6 *
318 rte_rib6_create(const char *name, int socket_id,
319  const struct rte_rib6_conf *conf);
320 
330 __rte_experimental
331 struct rte_rib6 *
332 rte_rib6_find_existing(const char *name);
333 
342 __rte_experimental
343 void
344 rte_rib6_free(struct rte_rib6 *rib);
345 
346 #ifdef __cplusplus
347 }
348 #endif
349 
350 #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:549
__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:64
__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:84
__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:108
__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:559
size_t ext_sz
Definition: rte_rib6.h:50