xref: /f-stack/dpdk/lib/librte_fib/rte_fib6.h (revision 2d9fd380)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018 Vladimir Medvedkin <[email protected]>
3  * Copyright(c) 2019 Intel Corporation
4  */
5 
6 #ifndef _RTE_FIB6_H_
7 #define _RTE_FIB6_H_
8 
9 /**
10  * @file
11  *
12  * RTE FIB6 library.
13  *
14  * @warning
15  * @b EXPERIMENTAL:
16  * All functions in this file may be changed or removed without prior notice.
17  *
18  * FIB (Forwarding information base) implementation
19  * for IPv6 Longest Prefix Match
20  */
21 
22 #include <rte_compat.h>
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 #define RTE_FIB6_IPV6_ADDR_SIZE		16
29 /** Maximum depth value possible for IPv6 FIB. */
30 #define RTE_FIB6_MAXDEPTH       128
31 
32 struct rte_fib6;
33 struct rte_rib6;
34 
35 /** Type of FIB struct */
36 enum rte_fib6_type {
37 	RTE_FIB6_DUMMY,		/**< RIB6 tree based FIB */
38 	RTE_FIB6_TRIE		/**< TRIE based fib  */
39 };
40 
41 /** Modify FIB function */
42 typedef int (*rte_fib6_modify_fn_t)(struct rte_fib6 *fib,
43 	const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], uint8_t depth,
44 	uint64_t next_hop, int op);
45 /** FIB bulk lookup function */
46 typedef void (*rte_fib6_lookup_fn_t)(void *fib,
47 	uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE],
48 	uint64_t *next_hops, const unsigned int n);
49 
50 enum rte_fib6_op {
51 	RTE_FIB6_ADD,
52 	RTE_FIB6_DEL,
53 };
54 
55 /** Size of nexthop (1 << nh_sz) bits for TRIE based FIB */
56 enum rte_fib_trie_nh_sz {
57 	RTE_FIB6_TRIE_2B = 1,
58 	RTE_FIB6_TRIE_4B,
59 	RTE_FIB6_TRIE_8B
60 };
61 
62 /** Type of lookup function implementation */
63 enum rte_fib6_lookup_type {
64 	RTE_FIB6_LOOKUP_DEFAULT,
65 	/**< Selects the best implementation based on the max simd bitwidth */
66 	RTE_FIB6_LOOKUP_TRIE_SCALAR, /**< Scalar lookup function implementation*/
67 	RTE_FIB6_LOOKUP_TRIE_VECTOR_AVX512 /**< Vector implementation using AVX512 */
68 };
69 
70 /** FIB configuration structure */
71 struct rte_fib6_conf {
72 	enum rte_fib6_type type; /**< Type of FIB struct */
73 	/** Default value returned on lookup if there is no route */
74 	uint64_t default_nh;
75 	int	max_routes;
76 	union {
77 		struct {
78 			enum rte_fib_trie_nh_sz nh_sz;
79 			uint32_t	num_tbl8;
80 		} trie;
81 	};
82 };
83 
84 /**
85  * Create FIB
86  *
87  * @param name
88  *  FIB name
89  * @param socket_id
90  *  NUMA socket ID for FIB table memory allocation
91  * @param conf
92  *  Structure containing the configuration
93  * @return
94  *  Handle to FIB object on success
95  *  NULL otherwise with rte_errno set to an appropriate values.
96  */
97 __rte_experimental
98 struct rte_fib6 *
99 rte_fib6_create(const char *name, int socket_id, struct rte_fib6_conf *conf);
100 
101 /**
102  * Find an existing FIB object and return a pointer to it.
103  *
104  * @param name
105  *  Name of the fib object as passed to rte_fib6_create()
106  * @return
107  *  Pointer to fib object or NULL if object not found with rte_errno
108  *  set appropriately. Possible rte_errno values include:
109  *   - ENOENT - required entry not available to return.
110  */
111 __rte_experimental
112 struct rte_fib6 *
113 rte_fib6_find_existing(const char *name);
114 
115 /**
116  * Free an FIB object.
117  *
118  * @param fib
119  *   FIB object handle
120  * @return
121  *   None
122  */
123 __rte_experimental
124 void
125 rte_fib6_free(struct rte_fib6 *fib);
126 
127 /**
128  * Add a route to the FIB.
129  *
130  * @param fib
131  *   FIB object handle
132  * @param ip
133  *   IPv6 prefix address to be added to the FIB
134  * @param depth
135  *   Prefix length
136  * @param next_hop
137  *   Next hop to be added to the FIB
138  * @return
139  *   0 on success, negative value otherwise
140  */
141 __rte_experimental
142 int
143 rte_fib6_add(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE],
144 	uint8_t depth, uint64_t next_hop);
145 
146 /**
147  * Delete a rule from the FIB.
148  *
149  * @param fib
150  *   FIB object handle
151  * @param ip
152  *   IPv6 prefix address to be deleted from the FIB
153  * @param depth
154  *   Prefix length
155  * @return
156  *   0 on success, negative value otherwise
157  */
158 __rte_experimental
159 int
160 rte_fib6_delete(struct rte_fib6 *fib,
161 	const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], uint8_t depth);
162 
163 /**
164  * Lookup multiple IP addresses in the FIB.
165  *
166  * @param fib
167  *   FIB object handle
168  * @param ips
169  *   Array of IPv6s to be looked up in the FIB
170  * @param next_hops
171  *   Next hop of the most specific rule found for IP.
172  *   This is an array of eight byte values.
173  *   If the lookup for the given IP failed, then corresponding element would
174  *   contain default nexthop value configured for a FIB.
175  * @param n
176  *   Number of elements in ips (and next_hops) array to lookup.
177  *  @return
178  *   -EINVAL for incorrect arguments, otherwise 0
179  */
180 __rte_experimental
181 int
182 rte_fib6_lookup_bulk(struct rte_fib6 *fib,
183 	uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE],
184 	uint64_t *next_hops, int n);
185 
186 /**
187  * Get pointer to the dataplane specific struct
188  *
189  * @param fib
190  *   FIB6 object handle
191  * @return
192  *   Pointer on the dataplane struct on success
193  *   NULL othervise
194  */
195 __rte_experimental
196 void *
197 rte_fib6_get_dp(struct rte_fib6 *fib);
198 
199 /**
200  * Get pointer to the RIB6
201  *
202  * @param fib
203  *   FIB object handle
204  * @return
205  *   Pointer on the RIB6 on success
206  *   NULL othervise
207  */
208 __rte_experimental
209 struct rte_rib6 *
210 rte_fib6_get_rib(struct rte_fib6 *fib);
211 
212 /**
213  * Set lookup function based on type
214  *
215  * @param fib
216  *   FIB object handle
217  * @param type
218  *   type of lookup function
219  *
220  * @return
221  *   0 on success
222  *   -EINVAL on failure
223  */
224 __rte_experimental
225 int
226 rte_fib6_select_lookup(struct rte_fib6 *fib, enum rte_fib6_lookup_type type);
227 
228 #ifdef __cplusplus
229 }
230 #endif
231 
232 #endif /* _RTE_FIB6_H_ */
233