153a80512SIvan Malov /* SPDX-License-Identifier: BSD-3-Clause 253a80512SIvan Malov * 353a80512SIvan Malov * Copyright(c) 2021 Xilinx, Inc. 453a80512SIvan Malov */ 553a80512SIvan Malov 653a80512SIvan Malov #ifndef _SFC_FLOW_TUNNEL_H 753a80512SIvan Malov #define _SFC_FLOW_TUNNEL_H 853a80512SIvan Malov 953a80512SIvan Malov #include <limits.h> 1053a80512SIvan Malov #include <stdbool.h> 1153a80512SIvan Malov #include <stdint.h> 1253a80512SIvan Malov 137e5b4798SIvan Malov #include <rte_flow.h> 147e5b4798SIvan Malov 1593de39f5SIvan Malov #include "efx.h" 1693de39f5SIvan Malov 1753a80512SIvan Malov #ifdef __cplusplus 1853a80512SIvan Malov extern "C" { 1953a80512SIvan Malov #endif 2053a80512SIvan Malov 2153a80512SIvan Malov /** Flow Tunnel (FT) SW entry ID */ 22*f55fe01fSIvan Malov typedef uint8_t sfc_ft_ctx_id_t; 2353a80512SIvan Malov 24*f55fe01fSIvan Malov #define SFC_FT_CTX_MARK_BITS \ 25*f55fe01fSIvan Malov (sizeof(sfc_ft_ctx_id_t) * CHAR_BIT) 2653a80512SIvan Malov 2753a80512SIvan Malov #define SFC_FT_USER_MARK_BITS \ 28*f55fe01fSIvan Malov (sizeof(uint32_t) * CHAR_BIT - SFC_FT_CTX_MARK_BITS) 2953a80512SIvan Malov 3053a80512SIvan Malov #define SFC_FT_USER_MARK_MASK \ 3153a80512SIvan Malov RTE_LEN2MASK(SFC_FT_USER_MARK_BITS, uint32_t) 3253a80512SIvan Malov 33*f55fe01fSIvan Malov #define SFC_FT_FLOW_MARK_TO_CTX_MARK(_flow_mark) \ 34*f55fe01fSIvan Malov ((_flow_mark) >> SFC_FT_USER_MARK_BITS) 3593de39f5SIvan Malov 36*f55fe01fSIvan Malov #define SFC_FT_CTX_MARK_INVALID (0) 3793de39f5SIvan Malov 38*f55fe01fSIvan Malov #define SFC_FT_CTX_MARK_TO_CTX_ID(_ctx_mark) \ 39*f55fe01fSIvan Malov ((_ctx_mark) - 1) 4093de39f5SIvan Malov 41*f55fe01fSIvan Malov #define SFC_FT_CTX_ID_TO_CTX_MARK(_ctx_id) \ 42*f55fe01fSIvan Malov ((_ctx_id) + 1) 4393de39f5SIvan Malov 44*f55fe01fSIvan Malov #define SFC_FT_CTX_ID_TO_FLOW_MARK(_ctx_id) \ 45*f55fe01fSIvan Malov (SFC_FT_CTX_ID_TO_CTX_MARK(_ctx_id) << SFC_FT_USER_MARK_BITS) 46012bf708SIvan Malov 47*f55fe01fSIvan Malov #define SFC_FT_FLOW_MARK_TO_USER_MARK(_flow_mark) \ 48*f55fe01fSIvan Malov ((_flow_mark) & SFC_FT_USER_MARK_MASK) 49012bf708SIvan Malov 5093de39f5SIvan Malov #define SFC_FT_MAX_NTUNNELS \ 51*f55fe01fSIvan Malov (RTE_LEN2MASK(SFC_FT_CTX_MARK_BITS, uint8_t) - 1) 5293de39f5SIvan Malov 53*f55fe01fSIvan Malov struct sfc_ft_ctx { 54*f55fe01fSIvan Malov bool tunnel_rule_is_set; 5593de39f5SIvan Malov efx_tunnel_protocol_t encap_type; 56*f55fe01fSIvan Malov struct rte_flow_tunnel tunnel; 5793de39f5SIvan Malov unsigned int refcnt; 58*f55fe01fSIvan Malov sfc_ft_ctx_id_t id; 597e5b4798SIvan Malov 607e5b4798SIvan Malov struct rte_flow_action_mark action_mark; 617e5b4798SIvan Malov struct rte_flow_action action; 627e5b4798SIvan Malov 637e5b4798SIvan Malov struct rte_flow_item_mark item_mark_v; 647e5b4798SIvan Malov struct rte_flow_item_mark item_mark_m; 657e5b4798SIvan Malov struct rte_flow_item item; 669df2d8f5SIvan Malov 67*f55fe01fSIvan Malov uint64_t reset_tunnel_hit_counter; 68*f55fe01fSIvan Malov uint64_t switch_hit_counter; 6993de39f5SIvan Malov }; 7093de39f5SIvan Malov 7153a80512SIvan Malov struct sfc_adapter; 7253a80512SIvan Malov 73*f55fe01fSIvan Malov bool sfc_ft_is_supported(struct sfc_adapter *sa); 7453a80512SIvan Malov 75*f55fe01fSIvan Malov bool sfc_ft_is_active(struct sfc_adapter *sa); 7653a80512SIvan Malov 77*f55fe01fSIvan Malov struct sfc_ft_ctx *sfc_ft_ctx_pick(struct sfc_adapter *sa, uint32_t flow_mark); 7893de39f5SIvan Malov 79*f55fe01fSIvan Malov int sfc_ft_tunnel_rule_detect(struct sfc_adapter *sa, 8093de39f5SIvan Malov const struct rte_flow_action *actions, 8193de39f5SIvan Malov struct sfc_flow_spec_mae *spec, 8293de39f5SIvan Malov struct rte_flow_error *error); 8393de39f5SIvan Malov 84*f55fe01fSIvan Malov int sfc_ft_decap_set(struct rte_eth_dev *dev, struct rte_flow_tunnel *tunnel, 857e5b4798SIvan Malov struct rte_flow_action **pmd_actions, 86*f55fe01fSIvan Malov uint32_t *num_of_actions, struct rte_flow_error *err); 87*f55fe01fSIvan Malov 88*f55fe01fSIvan Malov int sfc_ft_match(struct rte_eth_dev *dev, struct rte_flow_tunnel *tunnel, 89*f55fe01fSIvan Malov struct rte_flow_item **pmd_items, uint32_t *num_of_items, 907e5b4798SIvan Malov struct rte_flow_error *err); 917e5b4798SIvan Malov 92*f55fe01fSIvan Malov int sfc_ft_item_release(struct rte_eth_dev *dev, 93*f55fe01fSIvan Malov struct rte_flow_item *pmd_items, uint32_t num_items, 947e5b4798SIvan Malov struct rte_flow_error *err); 957e5b4798SIvan Malov 96*f55fe01fSIvan Malov int sfc_ft_action_decap_release(struct rte_eth_dev *dev, 977e5b4798SIvan Malov struct rte_flow_action *pmd_actions, 987e5b4798SIvan Malov uint32_t num_actions, 997e5b4798SIvan Malov struct rte_flow_error *err); 1007e5b4798SIvan Malov 101*f55fe01fSIvan Malov int sfc_ft_get_restore_info(struct rte_eth_dev *dev, struct rte_mbuf *m, 1027e5b4798SIvan Malov struct rte_flow_restore_info *info, 1037e5b4798SIvan Malov struct rte_flow_error *err); 1047e5b4798SIvan Malov 105*f55fe01fSIvan Malov void sfc_ft_counters_reset(struct sfc_adapter *sa); 1069df2d8f5SIvan Malov 10753a80512SIvan Malov #ifdef __cplusplus 10853a80512SIvan Malov } 10953a80512SIvan Malov #endif 11053a80512SIvan Malov #endif /* _SFC_FLOW_TUNNEL_H */ 111