1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Vladimir Medvedkin <medvedkinv@gmail.com>
3 * Copyright(c) 2019 Intel Corporation
14 * FIB (Forwarding information base) implementation
15 * for IPv4 Longest Prefix Match
28 /** Maximum depth value possible for IPv4 FIB. */
29 #define RTE_FIB_MAXDEPTH 32
31 /** Type of FIB struct */
33 RTE_FIB_DUMMY, /**< RIB tree based FIB */
34 RTE_FIB_DIR24_8 /**< DIR24_8 based FIB */
37 /** Modify FIB function */
38 typedef int (*rte_fib_modify_fn_t)(struct rte_fib *fib, uint32_t ip,
39 uint8_t depth, uint64_t next_hop, int op);
40 /** FIB bulk lookup function */
41 typedef void (*rte_fib_lookup_fn_t)(void *fib, const uint32_t *ips,
42 uint64_t *next_hops, const unsigned int n);
49 /** Size of nexthop (1 << nh_sz) bits for DIR24_8 based FIB */
50 enum rte_fib_dir24_8_nh_sz {
57 /** Type of lookup function implementation */
58 enum rte_fib_lookup_type {
59 RTE_FIB_LOOKUP_DEFAULT,
60 /**< Selects the best implementation based on the max simd bitwidth */
61 RTE_FIB_LOOKUP_DIR24_8_SCALAR_MACRO,
62 /**< Macro based lookup function */
63 RTE_FIB_LOOKUP_DIR24_8_SCALAR_INLINE,
65 * Lookup implementation using inlined functions
66 * for different next hop sizes
68 RTE_FIB_LOOKUP_DIR24_8_SCALAR_UNI,
70 * Unified lookup function for all next hop sizes
72 RTE_FIB_LOOKUP_DIR24_8_VECTOR_AVX512
73 /**< Vector implementation using AVX512 */
76 /** FIB configuration structure */
78 enum rte_fib_type type; /**< Type of FIB struct */
79 /** Default value returned on lookup if there is no route */
82 /** Size of the node extension in the internal RIB struct */
83 unsigned int rib_ext_sz;
86 enum rte_fib_dir24_8_nh_sz nh_sz;
98 * NUMA socket ID for FIB table memory allocation
100 * Structure containing the configuration
102 * Handle to the FIB object on success
103 * NULL otherwise with rte_errno set to an appropriate values.
106 rte_fib_create(const char *name, int socket_id, struct rte_fib_conf *conf);
109 * Find an existing FIB object and return a pointer to it.
112 * Name of the fib object as passed to rte_fib_create()
114 * Pointer to fib object or NULL if object not found with rte_errno
115 * set appropriately. Possible rte_errno values include:
116 * - ENOENT - required entry not available to return.
119 rte_fib_find_existing(const char *name);
122 * Free an FIB object.
130 rte_fib_free(struct rte_fib *fib);
133 * Add a route to the FIB.
138 * IPv4 prefix address to be added to the FIB
142 * Next hop to be added to the FIB
144 * 0 on success, negative value otherwise
147 rte_fib_add(struct rte_fib *fib, uint32_t ip, uint8_t depth, uint64_t next_hop);
150 * Delete a rule from the FIB.
155 * IPv4 prefix address to be deleted from the FIB
159 * 0 on success, negative value otherwise
162 rte_fib_delete(struct rte_fib *fib, uint32_t ip, uint8_t depth);
165 * Lookup multiple IP addresses in the FIB.
170 * Array of IPs to be looked up in the FIB
172 * Next hop of the most specific rule found for IP.
173 * This is an array of eight byte values.
174 * If the lookup for the given IP failed, then corresponding element would
175 * contain default nexthop value configured for a FIB.
177 * Number of elements in ips (and next_hops) array to lookup.
179 * -EINVAL for incorrect arguments, otherwise 0
182 rte_fib_lookup_bulk(struct rte_fib *fib, uint32_t *ips,
183 uint64_t *next_hops, int n);
185 * Get pointer to the dataplane specific struct
190 * Pointer on the dataplane struct on success
194 rte_fib_get_dp(struct rte_fib *fib);
197 * Get pointer to the RIB
202 * Pointer on the RIB on success
206 rte_fib_get_rib(struct rte_fib *fib);
209 * Set lookup function based on type
214 * type of lookup function
221 rte_fib_select_lookup(struct rte_fib *fib, enum rte_fib_lookup_type type);
227 #endif /* _RTE_FIB_H_ */