DPDK  20.05.0-rc0
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 
14 #include <rte_memcpy.h>
15 #include <rte_compat.h>
16 
17 #define RTE_RIB6_IPV6_ADDR_SIZE 16
18 
22 enum {
27 };
28 
29 struct rte_rib6;
30 struct rte_rib6_node;
31 
33 struct rte_rib6_conf {
39  size_t ext_sz;
40  /* size of rte_rib_node's pool */
41  int max_nodes;
42 };
43 
52 static inline void
53 rte_rib6_copy_addr(uint8_t *dst, const uint8_t *src)
54 {
55  if ((dst == NULL) || (src == NULL))
56  return;
57  rte_memcpy(dst, src, RTE_RIB6_IPV6_ADDR_SIZE);
58 }
59 
72 static inline int
73 rte_rib6_is_equal(uint8_t *ip1, uint8_t *ip2) {
74  int i;
75 
76  if ((ip1 == NULL) || (ip2 == NULL))
77  return 0;
78  for (i = 0; i < RTE_RIB6_IPV6_ADDR_SIZE; i++) {
79  if (ip1[i] != ip2[i])
80  return 0;
81  }
82  return 1;
83 }
84 
96 static inline uint8_t
97 get_msk_part(uint8_t depth, int byte) {
98  uint8_t part;
99 
100  byte &= 0xf;
101  depth = RTE_MIN(depth, 128);
102  part = RTE_MAX((int16_t)depth - (byte * 8), 0);
103  part = (part > 8) ? 8 : part;
104  return (uint16_t)(~UINT8_MAX) >> part;
105 }
106 
118 __rte_experimental
119 struct rte_rib6_node *
120 rte_rib6_lookup(struct rte_rib6 *rib,
121  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
122 
133 __rte_experimental
134 struct rte_rib6_node *
135 rte_rib6_lookup_parent(struct rte_rib6_node *ent);
136 
150 __rte_experimental
151 struct rte_rib6_node *
152 rte_rib6_lookup_exact(struct rte_rib6 *rib,
153  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
154 
178 __rte_experimental
179 struct rte_rib6_node *
180 rte_rib6_get_nxt(struct rte_rib6 *rib,
181  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE],
182  uint8_t depth, struct rte_rib6_node *last, int flag);
183 
194 __rte_experimental
195 void
196 rte_rib6_remove(struct rte_rib6 *rib,
197  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
198 
212 __rte_experimental
213 struct rte_rib6_node *
214 rte_rib6_insert(struct rte_rib6 *rib,
215  const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth);
216 
228 __rte_experimental
229 int
230 rte_rib6_get_ip(struct rte_rib6_node *node,
231  uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]);
232 
244 __rte_experimental
245 int
246 rte_rib6_get_depth(struct rte_rib6_node *node, uint8_t *depth);
247 
258 __rte_experimental
259 void *
260 rte_rib6_get_ext(struct rte_rib6_node *node);
261 
273 __rte_experimental
274 int
275 rte_rib6_get_nh(struct rte_rib6_node *node, uint64_t *nh);
276 
288 __rte_experimental
289 int
290 rte_rib6_set_nh(struct rte_rib6_node *node, uint64_t nh);
291 
305 __rte_experimental
306 struct rte_rib6 *
307 rte_rib6_create(const char *name, int socket_id, struct rte_rib6_conf *conf);
308 
318 __rte_experimental
319 struct rte_rib6 *
320 rte_rib6_find_existing(const char *name);
321 
330 __rte_experimental
331 void
332 rte_rib6_free(struct rte_rib6 *rib);
333 
334 #endif /* _RTE_RIB_H_ */
__rte_experimental void rte_rib6_remove(struct rte_rib6 *rib, const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth)
static int rte_rib6_is_equal(uint8_t *ip1, uint8_t *ip2)
Definition: rte_rib6.h:73
__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 int rte_rib6_get_depth(struct rte_rib6_node *node, 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:520
__rte_experimental struct rte_rib6 * rte_rib6_create(const char *name, int socket_id, struct rte_rib6_conf *conf)
__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)
__rte_experimental int rte_rib6_get_nh(struct rte_rib6_node *node, uint64_t *nh)
static void rte_rib6_copy_addr(uint8_t *dst, const uint8_t *src)
Definition: rte_rib6.h:53
static void * rte_memcpy(void *dst, const void *src, size_t n)
__rte_experimental int rte_rib6_get_ip(struct rte_rib6_node *node, uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE])
static uint8_t get_msk_part(uint8_t depth, int byte)
Definition: rte_rib6.h:97
__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:530
size_t ext_sz
Definition: rte_rib6.h:39