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