X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_lpm%2Frte_lpm.h;h=03da2d37e0f767cdcae5936cf3276e2be2af1e7e;hb=0f9ac2afa62ebacd24f36a3b98272b7146be3edd;hp=26303e628890bd6fd88482870f54e6f0126750e1;hpb=dc61aa74b7078329c09c6b748524ef17aa4299e3;p=dpdk.git diff --git a/lib/librte_lpm/rte_lpm.h b/lib/librte_lpm/rte_lpm.h index 26303e6288..03da2d37e0 100644 --- a/lib/librte_lpm/rte_lpm.h +++ b/lib/librte_lpm/rte_lpm.h @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2010-2014 Intel Corporation + * Copyright(c) 2020 Arm Limited */ #ifndef _RTE_LPM_H_ @@ -20,6 +21,7 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { @@ -62,33 +64,19 @@ extern "C" { /** Bitmask used to indicate successful lookup */ #define RTE_LPM_LOOKUP_SUCCESS 0x01000000 +/** @internal Default RCU defer queue entries to reclaim in one go. */ +#define RTE_LPM_RCU_DQ_RECLAIM_MAX 16 + +/** RCU reclamation modes */ +enum rte_lpm_qsbr_mode { + /** Create defer queue for reclaim. */ + RTE_LPM_QSBR_MODE_DQ = 0, + /** Use blocking mode reclaim. No defer queue created. */ + RTE_LPM_QSBR_MODE_SYNC +}; + #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN /** @internal Tbl24 entry structure. */ -__extension__ -struct rte_lpm_tbl_entry_v20 { - /** - * Stores Next hop (tbl8 or tbl24 when valid_group is not set) or - * a group index pointing to a tbl8 structure (tbl24 only, when - * valid_group is set) - */ - RTE_STD_C11 - union { - uint8_t next_hop; - uint8_t group_idx; - }; - /* Using single uint8_t to store 3 values. */ - uint8_t valid :1; /**< Validation flag. */ - /** - * For tbl24: - * - valid_group == 0: entry stores a next hop - * - valid_group == 1: entry stores a group_index pointing to a tbl8 - * For tbl8: - * - valid_group indicates whether the current tbl8 is in use or not - */ - uint8_t valid_group :1; - uint8_t depth :6; /**< Rule depth. */ -} __rte_aligned(sizeof(uint16_t)); - __extension__ struct rte_lpm_tbl_entry { /** @@ -111,16 +99,6 @@ struct rte_lpm_tbl_entry { }; #else -__extension__ -struct rte_lpm_tbl_entry_v20 { - uint8_t depth :6; - uint8_t valid_group :1; - uint8_t valid :1; - union { - uint8_t group_idx; - uint8_t next_hop; - }; -} __rte_aligned(sizeof(uint16_t)); __extension__ struct rte_lpm_tbl_entry { @@ -141,11 +119,6 @@ struct rte_lpm_config { }; /** @internal Rule structure. */ -struct rte_lpm_rule_v20 { - uint32_t ip; /**< Rule IP address. */ - uint8_t next_hop; /**< Rule next hop. */ -}; - struct rte_lpm_rule { uint32_t ip; /**< Rule IP address. */ uint32_t next_hop; /**< Rule next hop. */ @@ -158,21 +131,6 @@ struct rte_lpm_rule_info { }; /** @internal LPM structure. */ -struct rte_lpm_v20 { - /* LPM metadata. */ - char name[RTE_LPM_NAMESIZE]; /**< Name of the lpm. */ - uint32_t max_rules; /**< Max. balanced rules per lpm. */ - struct rte_lpm_rule_info rule_info[RTE_LPM_MAX_DEPTH]; /**< Rule info table. */ - - /* LPM Tables. */ - struct rte_lpm_tbl_entry_v20 tbl24[RTE_LPM_TBL24_NUM_ENTRIES] - __rte_cache_aligned; /**< LPM tbl24 table. */ - struct rte_lpm_tbl_entry_v20 tbl8[RTE_LPM_TBL8_NUM_ENTRIES] - __rte_cache_aligned; /**< LPM tbl8 table. */ - struct rte_lpm_rule_v20 rules_tbl[] - __rte_cache_aligned; /**< LPM rules. */ -}; - struct rte_lpm { /* LPM metadata. */ char name[RTE_LPM_NAMESIZE]; /**< Name of the lpm. */ @@ -187,6 +145,22 @@ struct rte_lpm { struct rte_lpm_rule *rules_tbl; /**< LPM rules. */ }; +/** LPM RCU QSBR configuration structure. */ +struct rte_lpm_rcu_config { + struct rte_rcu_qsbr *v; /* RCU QSBR variable. */ + /* Mode of RCU QSBR. RTE_LPM_QSBR_MODE_xxx + * '0' for default: create defer queue for reclaim. + */ + enum rte_lpm_qsbr_mode mode; + uint32_t dq_size; /* RCU defer queue size. + * default: lpm->number_tbl8s. + */ + uint32_t reclaim_thd; /* Threshold to trigger auto reclaim. */ + uint32_t reclaim_max; /* Max entries to reclaim in one go. + * default: RTE_LPM_RCU_DQ_RECLAIM_MAX. + */ +}; + /** * Create an LPM object. * @@ -209,11 +183,6 @@ struct rte_lpm { struct rte_lpm * rte_lpm_create(const char *name, int socket_id, const struct rte_lpm_config *config); -struct rte_lpm_v20 * -rte_lpm_create_v20(const char *name, int socket_id, int max_rules, int flags); -struct rte_lpm * -rte_lpm_create_v1604(const char *name, int socket_id, - const struct rte_lpm_config *config); /** * Find an existing LPM object and return a pointer to it. @@ -227,10 +196,6 @@ rte_lpm_create_v1604(const char *name, int socket_id, */ struct rte_lpm * rte_lpm_find_existing(const char *name); -struct rte_lpm_v20 * -rte_lpm_find_existing_v20(const char *name); -struct rte_lpm * -rte_lpm_find_existing_v1604(const char *name); /** * Free an LPM object. @@ -242,10 +207,27 @@ rte_lpm_find_existing_v1604(const char *name); */ void rte_lpm_free(struct rte_lpm *lpm); -void -rte_lpm_free_v20(struct rte_lpm_v20 *lpm); -void -rte_lpm_free_v1604(struct rte_lpm *lpm); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice + * + * Associate RCU QSBR variable with an LPM object. + * + * @param lpm + * the lpm object to add RCU QSBR + * @param cfg + * RCU QSBR configuration + * @return + * On success - 0 + * On error - 1 with error code set in rte_errno. + * Possible rte_errno codes are: + * - EINVAL - invalid pointer + * - EEXIST - already added QSBR + * - ENOMEM - memory allocation failure + */ +__rte_experimental +int rte_lpm_rcu_qsbr_add(struct rte_lpm *lpm, struct rte_lpm_rcu_config *cfg); /** * Add a rule to the LPM table. @@ -263,12 +245,6 @@ rte_lpm_free_v1604(struct rte_lpm *lpm); */ int rte_lpm_add(struct rte_lpm *lpm, uint32_t ip, uint8_t depth, uint32_t next_hop); -int -rte_lpm_add_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth, - uint8_t next_hop); -int -rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth, - uint32_t next_hop); /** * Check if a rule is present in the LPM table, @@ -288,12 +264,6 @@ rte_lpm_add_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth, int rte_lpm_is_rule_present(struct rte_lpm *lpm, uint32_t ip, uint8_t depth, uint32_t *next_hop); -int -rte_lpm_is_rule_present_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth, -uint8_t *next_hop); -int -rte_lpm_is_rule_present_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth, -uint32_t *next_hop); /** * Delete a rule from the LPM table. @@ -309,10 +279,6 @@ uint32_t *next_hop); */ int rte_lpm_delete(struct rte_lpm *lpm, uint32_t ip, uint8_t depth); -int -rte_lpm_delete_v20(struct rte_lpm_v20 *lpm, uint32_t ip, uint8_t depth); -int -rte_lpm_delete_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth); /** * Delete all rules from the LPM table. @@ -322,10 +288,6 @@ rte_lpm_delete_v1604(struct rte_lpm *lpm, uint32_t ip, uint8_t depth); */ void rte_lpm_delete_all(struct rte_lpm *lpm); -void -rte_lpm_delete_all_v20(struct rte_lpm_v20 *lpm); -void -rte_lpm_delete_all_v1604(struct rte_lpm *lpm); /** * Lookup an IP into the LPM table.