xref: /dpdk/drivers/net/sfc/sfc_flow_tunnel.h (revision f55fe01f88a6802f27df96d78a489306370406a4)
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