xref: /dpdk/lib/fib/rte_fib.h (revision df8b5bf744f9aa9a1fbb790dac14a32d9cc9f236)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(c) 2018 Vladimir Medvedkin <medvedkinv@gmail.com>
399a2dd95SBruce Richardson  * Copyright(c) 2019 Intel Corporation
499a2dd95SBruce Richardson  */
599a2dd95SBruce Richardson 
699a2dd95SBruce Richardson #ifndef _RTE_FIB_H_
799a2dd95SBruce Richardson #define _RTE_FIB_H_
899a2dd95SBruce Richardson 
999a2dd95SBruce Richardson /**
1099a2dd95SBruce Richardson  * @file
1199a2dd95SBruce Richardson  *
1299a2dd95SBruce Richardson  * RTE FIB library.
1399a2dd95SBruce Richardson  *
1499a2dd95SBruce Richardson  * FIB (Forwarding information base) implementation
1599a2dd95SBruce Richardson  * for IPv4 Longest Prefix Match
1699a2dd95SBruce Richardson  */
1799a2dd95SBruce Richardson 
1899a2dd95SBruce Richardson #include <stdint.h>
1999a2dd95SBruce Richardson 
2096c3d06aSVladimir Medvedkin #include <rte_rcu_qsbr.h>
2199a2dd95SBruce Richardson 
2299a2dd95SBruce Richardson #ifdef __cplusplus
2399a2dd95SBruce Richardson extern "C" {
2499a2dd95SBruce Richardson #endif
2599a2dd95SBruce Richardson 
2699a2dd95SBruce Richardson struct rte_fib;
2799a2dd95SBruce Richardson struct rte_rib;
2899a2dd95SBruce Richardson 
2999a2dd95SBruce Richardson /** Maximum depth value possible for IPv4 FIB. */
3099a2dd95SBruce Richardson #define RTE_FIB_MAXDEPTH	32
3199a2dd95SBruce Richardson 
3296c3d06aSVladimir Medvedkin /** @internal Default RCU defer queue entries to reclaim in one go. */
3396c3d06aSVladimir Medvedkin #define RTE_FIB_RCU_DQ_RECLAIM_MAX	16
3496c3d06aSVladimir Medvedkin /** @internal Default RCU defer queue size. */
3596c3d06aSVladimir Medvedkin #define RTE_FIB_RCU_DQ_RECLAIM_SZ	128
3696c3d06aSVladimir Medvedkin 
3796c3d06aSVladimir Medvedkin /** RCU reclamation modes */
3896c3d06aSVladimir Medvedkin enum rte_fib_qsbr_mode {
3996c3d06aSVladimir Medvedkin 	/** Create defer queue for reclaim. */
4096c3d06aSVladimir Medvedkin 	RTE_FIB_QSBR_MODE_DQ = 0,
4196c3d06aSVladimir Medvedkin 	/** Use blocking mode reclaim. No defer queue created. */
4296c3d06aSVladimir Medvedkin 	RTE_FIB_QSBR_MODE_SYNC
4396c3d06aSVladimir Medvedkin };
4496c3d06aSVladimir Medvedkin 
4599a2dd95SBruce Richardson /** Type of FIB struct */
4699a2dd95SBruce Richardson enum rte_fib_type {
4799a2dd95SBruce Richardson 	RTE_FIB_DUMMY,		/**< RIB tree based FIB */
4899a2dd95SBruce Richardson 	RTE_FIB_DIR24_8		/**< DIR24_8 based FIB */
4999a2dd95SBruce Richardson };
5099a2dd95SBruce Richardson 
5199a2dd95SBruce Richardson /** Modify FIB function */
5299a2dd95SBruce Richardson typedef int (*rte_fib_modify_fn_t)(struct rte_fib *fib, uint32_t ip,
5399a2dd95SBruce Richardson 	uint8_t depth, uint64_t next_hop, int op);
5499a2dd95SBruce Richardson /** FIB bulk lookup function */
5599a2dd95SBruce Richardson typedef void (*rte_fib_lookup_fn_t)(void *fib, const uint32_t *ips,
5699a2dd95SBruce Richardson 	uint64_t *next_hops, const unsigned int n);
5799a2dd95SBruce Richardson 
5899a2dd95SBruce Richardson enum rte_fib_op {
5999a2dd95SBruce Richardson 	RTE_FIB_ADD,
6099a2dd95SBruce Richardson 	RTE_FIB_DEL,
6199a2dd95SBruce Richardson };
6299a2dd95SBruce Richardson 
6399a2dd95SBruce Richardson /** Size of nexthop (1 << nh_sz) bits for DIR24_8 based FIB */
6499a2dd95SBruce Richardson enum rte_fib_dir24_8_nh_sz {
6599a2dd95SBruce Richardson 	RTE_FIB_DIR24_8_1B,
6699a2dd95SBruce Richardson 	RTE_FIB_DIR24_8_2B,
6799a2dd95SBruce Richardson 	RTE_FIB_DIR24_8_4B,
6899a2dd95SBruce Richardson 	RTE_FIB_DIR24_8_8B
6999a2dd95SBruce Richardson };
7099a2dd95SBruce Richardson 
7199a2dd95SBruce Richardson /** Type of lookup function implementation */
7299a2dd95SBruce Richardson enum rte_fib_lookup_type {
7399a2dd95SBruce Richardson 	RTE_FIB_LOOKUP_DEFAULT,
7499a2dd95SBruce Richardson 	/**< Selects the best implementation based on the max simd bitwidth */
7599a2dd95SBruce Richardson 	RTE_FIB_LOOKUP_DIR24_8_SCALAR_MACRO,
7699a2dd95SBruce Richardson 	/**< Macro based lookup function */
7799a2dd95SBruce Richardson 	RTE_FIB_LOOKUP_DIR24_8_SCALAR_INLINE,
7899a2dd95SBruce Richardson 	/**<
7999a2dd95SBruce Richardson 	 * Lookup implementation using inlined functions
8099a2dd95SBruce Richardson 	 * for different next hop sizes
8199a2dd95SBruce Richardson 	 */
8299a2dd95SBruce Richardson 	RTE_FIB_LOOKUP_DIR24_8_SCALAR_UNI,
8399a2dd95SBruce Richardson 	/**<
8499a2dd95SBruce Richardson 	 * Unified lookup function for all next hop sizes
8599a2dd95SBruce Richardson 	 */
8699a2dd95SBruce Richardson 	RTE_FIB_LOOKUP_DIR24_8_VECTOR_AVX512
8799a2dd95SBruce Richardson 	/**< Vector implementation using AVX512 */
8899a2dd95SBruce Richardson };
8999a2dd95SBruce Richardson 
90e194f3cdSVladimir Medvedkin /** If set, fib lookup is expecting IPv4 address in network byte order */
91*df8b5bf7SVladimir Medvedkin #define RTE_FIB_F_LOOKUP_NETWORK_ORDER 1
92*df8b5bf7SVladimir Medvedkin #define RTE_FIB_ALLOWED_FLAGS (RTE_FIB_F_LOOKUP_NETWORK_ORDER)
93e194f3cdSVladimir Medvedkin 
9499a2dd95SBruce Richardson /** FIB configuration structure */
9599a2dd95SBruce Richardson struct rte_fib_conf {
9699a2dd95SBruce Richardson 	enum rte_fib_type type; /**< Type of FIB struct */
9799a2dd95SBruce Richardson 	/** Default value returned on lookup if there is no route */
9899a2dd95SBruce Richardson 	uint64_t default_nh;
9999a2dd95SBruce Richardson 	int	max_routes;
10011c5b9b5SVladimir Medvedkin 	/** Size of the node extension in the internal RIB struct */
10111c5b9b5SVladimir Medvedkin 	unsigned int rib_ext_sz;
10299a2dd95SBruce Richardson 	union {
10399a2dd95SBruce Richardson 		struct {
10499a2dd95SBruce Richardson 			enum rte_fib_dir24_8_nh_sz nh_sz;
10599a2dd95SBruce Richardson 			uint32_t	num_tbl8;
10699a2dd95SBruce Richardson 		} dir24_8;
10799a2dd95SBruce Richardson 	};
108e194f3cdSVladimir Medvedkin 	unsigned int flags; /**< Optional feature flags from RTE_FIB_F_* **/
10999a2dd95SBruce Richardson };
11099a2dd95SBruce Richardson 
11196c3d06aSVladimir Medvedkin /** FIB RCU QSBR configuration structure. */
11296c3d06aSVladimir Medvedkin struct rte_fib_rcu_config {
11396c3d06aSVladimir Medvedkin 	/** RCU QSBR variable. */
11496c3d06aSVladimir Medvedkin 	struct rte_rcu_qsbr *v;
11596c3d06aSVladimir Medvedkin 	/** Mode of RCU QSBR. See RTE_FIB_QSBR_MODE_xxx.
11696c3d06aSVladimir Medvedkin 	 * Default: RTE_FIB_QSBR_MODE_DQ, create defer queue for reclaim.
11796c3d06aSVladimir Medvedkin 	 */
11896c3d06aSVladimir Medvedkin 	enum rte_fib_qsbr_mode mode;
11996c3d06aSVladimir Medvedkin 	/** RCU defer queue size.
12096c3d06aSVladimir Medvedkin 	 * Default: RTE_FIB_RCU_DQ_RECLAIM_SZ.
12196c3d06aSVladimir Medvedkin 	 */
12296c3d06aSVladimir Medvedkin 	uint32_t dq_size;
12396c3d06aSVladimir Medvedkin 	/** Threshold to trigger auto reclaim. */
12496c3d06aSVladimir Medvedkin 	uint32_t reclaim_thd;
12596c3d06aSVladimir Medvedkin 	/** Max entries to reclaim in one go.
12696c3d06aSVladimir Medvedkin 	 * Default: RTE_FIB_RCU_DQ_RECLAIM_MAX.
12796c3d06aSVladimir Medvedkin 	 */
12896c3d06aSVladimir Medvedkin 	uint32_t reclaim_max;
12996c3d06aSVladimir Medvedkin };
13096c3d06aSVladimir Medvedkin 
13199a2dd95SBruce Richardson /**
13299a2dd95SBruce Richardson  * Create FIB
13399a2dd95SBruce Richardson  *
13499a2dd95SBruce Richardson  * @param name
13599a2dd95SBruce Richardson  *  FIB name
13699a2dd95SBruce Richardson  * @param socket_id
13799a2dd95SBruce Richardson  *  NUMA socket ID for FIB table memory allocation
13899a2dd95SBruce Richardson  * @param conf
13999a2dd95SBruce Richardson  *  Structure containing the configuration
14099a2dd95SBruce Richardson  * @return
14199a2dd95SBruce Richardson  *  Handle to the FIB object on success
14299a2dd95SBruce Richardson  *  NULL otherwise with rte_errno set to an appropriate values.
14399a2dd95SBruce Richardson  */
14499a2dd95SBruce Richardson struct rte_fib *
14599a2dd95SBruce Richardson rte_fib_create(const char *name, int socket_id, struct rte_fib_conf *conf);
14699a2dd95SBruce Richardson 
14799a2dd95SBruce Richardson /**
14899a2dd95SBruce Richardson  * Find an existing FIB object and return a pointer to it.
14999a2dd95SBruce Richardson  *
15099a2dd95SBruce Richardson  * @param name
15199a2dd95SBruce Richardson  *  Name of the fib object as passed to rte_fib_create()
15299a2dd95SBruce Richardson  * @return
15399a2dd95SBruce Richardson  *  Pointer to fib object or NULL if object not found with rte_errno
15499a2dd95SBruce Richardson  *  set appropriately. Possible rte_errno values include:
15599a2dd95SBruce Richardson  *   - ENOENT - required entry not available to return.
15699a2dd95SBruce Richardson  */
15799a2dd95SBruce Richardson struct rte_fib *
15899a2dd95SBruce Richardson rte_fib_find_existing(const char *name);
15999a2dd95SBruce Richardson 
16099a2dd95SBruce Richardson /**
16199a2dd95SBruce Richardson  * Free an FIB object.
16299a2dd95SBruce Richardson  *
16399a2dd95SBruce Richardson  * @param fib
164448e01f1SStephen Hemminger  *   FIB object handle created by rte_fib_create().
165448e01f1SStephen Hemminger  *   If fib is NULL, no operation is performed.
16699a2dd95SBruce Richardson  */
16799a2dd95SBruce Richardson void
16899a2dd95SBruce Richardson rte_fib_free(struct rte_fib *fib);
16999a2dd95SBruce Richardson 
17099a2dd95SBruce Richardson /**
17199a2dd95SBruce Richardson  * Add a route to the FIB.
17299a2dd95SBruce Richardson  *
17399a2dd95SBruce Richardson  * @param fib
17499a2dd95SBruce Richardson  *   FIB object handle
17599a2dd95SBruce Richardson  * @param ip
17699a2dd95SBruce Richardson  *   IPv4 prefix address to be added to the FIB
17799a2dd95SBruce Richardson  * @param depth
17899a2dd95SBruce Richardson  *   Prefix length
17999a2dd95SBruce Richardson  * @param next_hop
18099a2dd95SBruce Richardson  *   Next hop to be added to the FIB
18199a2dd95SBruce Richardson  * @return
18299a2dd95SBruce Richardson  *   0 on success, negative value otherwise
18399a2dd95SBruce Richardson  */
18499a2dd95SBruce Richardson int
18599a2dd95SBruce Richardson rte_fib_add(struct rte_fib *fib, uint32_t ip, uint8_t depth, uint64_t next_hop);
18699a2dd95SBruce Richardson 
18799a2dd95SBruce Richardson /**
18899a2dd95SBruce Richardson  * Delete a rule from the FIB.
18999a2dd95SBruce Richardson  *
19099a2dd95SBruce Richardson  * @param fib
19199a2dd95SBruce Richardson  *   FIB object handle
19299a2dd95SBruce Richardson  * @param ip
19399a2dd95SBruce Richardson  *   IPv4 prefix address to be deleted from the FIB
19499a2dd95SBruce Richardson  * @param depth
19599a2dd95SBruce Richardson  *   Prefix length
19699a2dd95SBruce Richardson  * @return
19799a2dd95SBruce Richardson  *   0 on success, negative value otherwise
19899a2dd95SBruce Richardson  */
19999a2dd95SBruce Richardson int
20099a2dd95SBruce Richardson rte_fib_delete(struct rte_fib *fib, uint32_t ip, uint8_t depth);
20199a2dd95SBruce Richardson 
20299a2dd95SBruce Richardson /**
20399a2dd95SBruce Richardson  * Lookup multiple IP addresses in the FIB.
20499a2dd95SBruce Richardson  *
20599a2dd95SBruce Richardson  * @param fib
20699a2dd95SBruce Richardson  *   FIB object handle
20799a2dd95SBruce Richardson  * @param ips
20899a2dd95SBruce Richardson  *   Array of IPs to be looked up in the FIB
20999a2dd95SBruce Richardson  * @param next_hops
21099a2dd95SBruce Richardson  *   Next hop of the most specific rule found for IP.
21199a2dd95SBruce Richardson  *   This is an array of eight byte values.
21299a2dd95SBruce Richardson  *   If the lookup for the given IP failed, then corresponding element would
21399a2dd95SBruce Richardson  *   contain default nexthop value configured for a FIB.
21499a2dd95SBruce Richardson  * @param n
21599a2dd95SBruce Richardson  *   Number of elements in ips (and next_hops) array to lookup.
21699a2dd95SBruce Richardson  *  @return
21799a2dd95SBruce Richardson  *   -EINVAL for incorrect arguments, otherwise 0
21899a2dd95SBruce Richardson  */
21999a2dd95SBruce Richardson int
22099a2dd95SBruce Richardson rte_fib_lookup_bulk(struct rte_fib *fib, uint32_t *ips,
22199a2dd95SBruce Richardson 		uint64_t *next_hops, int n);
22299a2dd95SBruce Richardson /**
22399a2dd95SBruce Richardson  * Get pointer to the dataplane specific struct
22499a2dd95SBruce Richardson  *
22599a2dd95SBruce Richardson  * @param fib
22699a2dd95SBruce Richardson  *   FIB object handle
22799a2dd95SBruce Richardson  * @return
22899a2dd95SBruce Richardson  *   Pointer on the dataplane struct on success
2297be78d02SJosh Soref  *   NULL otherwise
23099a2dd95SBruce Richardson  */
23199a2dd95SBruce Richardson void *
23299a2dd95SBruce Richardson rte_fib_get_dp(struct rte_fib *fib);
23399a2dd95SBruce Richardson 
23499a2dd95SBruce Richardson /**
23599a2dd95SBruce Richardson  * Get pointer to the RIB
23699a2dd95SBruce Richardson  *
23799a2dd95SBruce Richardson  * @param fib
23899a2dd95SBruce Richardson  *   FIB object handle
23999a2dd95SBruce Richardson  * @return
24099a2dd95SBruce Richardson  *   Pointer on the RIB on success
2417be78d02SJosh Soref  *   NULL otherwise
24299a2dd95SBruce Richardson  */
24399a2dd95SBruce Richardson struct rte_rib *
24499a2dd95SBruce Richardson rte_fib_get_rib(struct rte_fib *fib);
24599a2dd95SBruce Richardson 
24699a2dd95SBruce Richardson /**
24799a2dd95SBruce Richardson  * Set lookup function based on type
24899a2dd95SBruce Richardson  *
24999a2dd95SBruce Richardson  * @param fib
25099a2dd95SBruce Richardson  *   FIB object handle
25199a2dd95SBruce Richardson  * @param type
25299a2dd95SBruce Richardson  *   type of lookup function
25399a2dd95SBruce Richardson  *
25499a2dd95SBruce Richardson  * @return
25599a2dd95SBruce Richardson  *   0 on success
25699a2dd95SBruce Richardson  *   -EINVAL on failure
25799a2dd95SBruce Richardson  */
25899a2dd95SBruce Richardson int
25999a2dd95SBruce Richardson rte_fib_select_lookup(struct rte_fib *fib, enum rte_fib_lookup_type type);
26099a2dd95SBruce Richardson 
26196c3d06aSVladimir Medvedkin /**
26296c3d06aSVladimir Medvedkin  * Associate RCU QSBR variable with a FIB object.
26396c3d06aSVladimir Medvedkin  *
26496c3d06aSVladimir Medvedkin  * @param fib
26596c3d06aSVladimir Medvedkin  *   FIB object handle
26696c3d06aSVladimir Medvedkin  * @param cfg
26796c3d06aSVladimir Medvedkin  *   RCU QSBR configuration
26896c3d06aSVladimir Medvedkin  * @return
269cc8764c6SVladimir Medvedkin  *   0 on success
270cc8764c6SVladimir Medvedkin  *   Negative otherwise
271cc8764c6SVladimir Medvedkin  *   Possible error codes are:
272cc8764c6SVladimir Medvedkin  *   - -EINVAL - invalid parameters
273cc8764c6SVladimir Medvedkin  *   - -EEXIST - already added QSBR
274cc8764c6SVladimir Medvedkin  *   - -ENOMEM - memory allocation failure
275cc8764c6SVladimir Medvedkin  *   - -ENOTSUP - not supported by configured dataplane algorithm
27696c3d06aSVladimir Medvedkin  */
27796c3d06aSVladimir Medvedkin __rte_experimental
27896c3d06aSVladimir Medvedkin int
27996c3d06aSVladimir Medvedkin rte_fib_rcu_qsbr_add(struct rte_fib *fib, struct rte_fib_rcu_config *cfg);
28096c3d06aSVladimir Medvedkin 
28199a2dd95SBruce Richardson #ifdef __cplusplus
28299a2dd95SBruce Richardson }
28399a2dd95SBruce Richardson #endif
28499a2dd95SBruce Richardson 
28599a2dd95SBruce Richardson #endif /* _RTE_FIB_H_ */
286