xref: /dpdk/drivers/net/sfc/sfc_flow.h (revision a0147be54763c09daca94eec7cb075214788ca65)
144c0947bSAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause
2244cfa79SAndrew Rybchenko  *
3*a0147be5SAndrew Rybchenko  * Copyright(c) 2019-2020 Xilinx, Inc.
4*a0147be5SAndrew Rybchenko  * Copyright(c) 2017-2019 Solarflare Communications Inc.
5a9825ccfSRoman Zhukov  *
6a9825ccfSRoman Zhukov  * This software was jointly developed between OKTET Labs (under contract
7a9825ccfSRoman Zhukov  * for Solarflare) and Solarflare Communications, Inc.
8a9825ccfSRoman Zhukov  */
9a9825ccfSRoman Zhukov 
10a9825ccfSRoman Zhukov #ifndef _SFC_FLOW_H
11a9825ccfSRoman Zhukov #define _SFC_FLOW_H
12a9825ccfSRoman Zhukov 
13a9825ccfSRoman Zhukov #include <rte_tailq.h>
14a9825ccfSRoman Zhukov #include <rte_flow_driver.h>
15a9825ccfSRoman Zhukov 
16a9825ccfSRoman Zhukov #include "efx.h"
17a9825ccfSRoman Zhukov 
18a9825ccfSRoman Zhukov #ifdef __cplusplus
19a9825ccfSRoman Zhukov extern "C" {
20a9825ccfSRoman Zhukov #endif
21a9825ccfSRoman Zhukov 
22814260e0SRoman Zhukov /*
23814260e0SRoman Zhukov  * The maximum number of fully elaborated hardware filter specifications
24814260e0SRoman Zhukov  * which can be produced from a template by means of multiplication, if
25814260e0SRoman Zhukov  * missing match flags are needed to be taken into account
26814260e0SRoman Zhukov  */
275448324dSRoman Zhukov #define SF_FLOW_SPEC_NB_FILTERS_MAX 8
28814260e0SRoman Zhukov 
29d77d0739SIvan Malov /* RSS configuration storage */
30d77d0739SIvan Malov struct sfc_flow_rss {
31d77d0739SIvan Malov 	unsigned int	rxq_hw_index_min;
32d77d0739SIvan Malov 	unsigned int	rxq_hw_index_max;
33d77d0739SIvan Malov 	unsigned int	rss_hash_types;
34d77d0739SIvan Malov 	uint8_t		rss_key[EFX_RSS_KEY_SIZE];
35d77d0739SIvan Malov 	unsigned int	rss_tbl[EFX_RSS_TBL_SIZE];
36d77d0739SIvan Malov };
37d77d0739SIvan Malov 
386f63bf7bSIvan Malov /* Flow engines supported by the implementation */
396f63bf7bSIvan Malov enum sfc_flow_spec_type {
406f63bf7bSIvan Malov 	SFC_FLOW_SPEC_FILTER = 0,
416f63bf7bSIvan Malov 
426f63bf7bSIvan Malov 	SFC_FLOW_SPEC_NTYPES
436f63bf7bSIvan Malov };
446f63bf7bSIvan Malov 
456f63bf7bSIvan Malov /* VNIC-specific flow specification */
466f63bf7bSIvan Malov struct sfc_flow_spec_filter {
47814260e0SRoman Zhukov 	/* partial specification from flow rule */
48814260e0SRoman Zhukov 	efx_filter_spec_t template;
49814260e0SRoman Zhukov 	/* fully elaborated hardware filters specifications */
50814260e0SRoman Zhukov 	efx_filter_spec_t filters[SF_FLOW_SPEC_NB_FILTERS_MAX];
51814260e0SRoman Zhukov 	/* number of complete specifications */
52814260e0SRoman Zhukov 	unsigned int count;
537571c08dSIvan Malov 	/* RSS toggle */
547571c08dSIvan Malov 	boolean_t rss;
557571c08dSIvan Malov 	/* RSS configuration */
567571c08dSIvan Malov 	struct sfc_flow_rss rss_conf;
57814260e0SRoman Zhukov };
58814260e0SRoman Zhukov 
596f63bf7bSIvan Malov /* Flow specification */
606f63bf7bSIvan Malov struct sfc_flow_spec {
616f63bf7bSIvan Malov 	/* Flow specification type (engine-based) */
626f63bf7bSIvan Malov 	enum sfc_flow_spec_type type;
636f63bf7bSIvan Malov 
646f63bf7bSIvan Malov 	RTE_STD_C11
656f63bf7bSIvan Malov 	union {
666f63bf7bSIvan Malov 		/* Filter-based (VNIC level flows) specification */
676f63bf7bSIvan Malov 		struct sfc_flow_spec_filter filter;
686f63bf7bSIvan Malov 	};
696f63bf7bSIvan Malov };
706f63bf7bSIvan Malov 
71a9825ccfSRoman Zhukov /* PMD-specific definition of the opaque type from rte_flow.h */
72a9825ccfSRoman Zhukov struct rte_flow {
736f63bf7bSIvan Malov 	struct sfc_flow_spec spec;	/* flow specification */
74a9825ccfSRoman Zhukov 	TAILQ_ENTRY(rte_flow) entries;	/* flow list entries */
75a9825ccfSRoman Zhukov };
76a9825ccfSRoman Zhukov 
77a9825ccfSRoman Zhukov TAILQ_HEAD(sfc_flow_list, rte_flow);
78a9825ccfSRoman Zhukov 
79a9825ccfSRoman Zhukov extern const struct rte_flow_ops sfc_flow_ops;
80a9825ccfSRoman Zhukov 
812e2e5bdfSIvan Malov enum sfc_flow_item_layers {
822e2e5bdfSIvan Malov 	SFC_FLOW_ITEM_ANY_LAYER,
832e2e5bdfSIvan Malov 	SFC_FLOW_ITEM_START_LAYER,
842e2e5bdfSIvan Malov 	SFC_FLOW_ITEM_L2,
852e2e5bdfSIvan Malov 	SFC_FLOW_ITEM_L3,
862e2e5bdfSIvan Malov 	SFC_FLOW_ITEM_L4,
872e2e5bdfSIvan Malov };
882e2e5bdfSIvan Malov 
892e2e5bdfSIvan Malov /* Flow parse context types */
902e2e5bdfSIvan Malov enum sfc_flow_parse_ctx_type {
912e2e5bdfSIvan Malov 	SFC_FLOW_PARSE_CTX_FILTER = 0,
922e2e5bdfSIvan Malov 
932e2e5bdfSIvan Malov 	SFC_FLOW_PARSE_CTX_NTYPES
942e2e5bdfSIvan Malov };
952e2e5bdfSIvan Malov 
962e2e5bdfSIvan Malov /* Flow parse context */
972e2e5bdfSIvan Malov struct sfc_flow_parse_ctx {
982e2e5bdfSIvan Malov 	enum sfc_flow_parse_ctx_type type;
992e2e5bdfSIvan Malov 
1002e2e5bdfSIvan Malov 	RTE_STD_C11
1012e2e5bdfSIvan Malov 	union {
1022e2e5bdfSIvan Malov 		/* Context pointer valid for filter-based (VNIC) flows */
1032e2e5bdfSIvan Malov 		efx_filter_spec_t *filter;
1042e2e5bdfSIvan Malov 	};
1052e2e5bdfSIvan Malov };
1062e2e5bdfSIvan Malov 
1072e2e5bdfSIvan Malov typedef int (sfc_flow_item_parse)(const struct rte_flow_item *item,
1082e2e5bdfSIvan Malov 				  struct sfc_flow_parse_ctx *parse_ctx,
1092e2e5bdfSIvan Malov 				  struct rte_flow_error *error);
1102e2e5bdfSIvan Malov 
1112e2e5bdfSIvan Malov struct sfc_flow_item {
1122e2e5bdfSIvan Malov 	enum rte_flow_item_type type;		/* Type of item */
1132e2e5bdfSIvan Malov 	enum sfc_flow_item_layers layer;	/* Layer of item */
1142e2e5bdfSIvan Malov 	enum sfc_flow_item_layers prev_layer;	/* Previous layer of item */
1152e2e5bdfSIvan Malov 	enum sfc_flow_parse_ctx_type ctx_type;	/* Parse context type */
1162e2e5bdfSIvan Malov 	sfc_flow_item_parse *parse;		/* Parsing function */
1172e2e5bdfSIvan Malov };
1182e2e5bdfSIvan Malov 
1192e2e5bdfSIvan Malov int sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items,
1202e2e5bdfSIvan Malov 			   unsigned int nb_flow_items,
1212e2e5bdfSIvan Malov 			   const struct rte_flow_item pattern[],
1222e2e5bdfSIvan Malov 			   struct sfc_flow_parse_ctx *parse_ctx,
1232e2e5bdfSIvan Malov 			   struct rte_flow_error *error);
1242e2e5bdfSIvan Malov 
1252e2e5bdfSIvan Malov int sfc_flow_parse_init(const struct rte_flow_item *item,
1262e2e5bdfSIvan Malov 			const void **spec_ptr,
1272e2e5bdfSIvan Malov 			const void **mask_ptr,
1282e2e5bdfSIvan Malov 			const void *supp_mask,
1292e2e5bdfSIvan Malov 			const void *def_mask,
1302e2e5bdfSIvan Malov 			unsigned int size,
1312e2e5bdfSIvan Malov 			struct rte_flow_error *error);
1322e2e5bdfSIvan Malov 
133a9825ccfSRoman Zhukov struct sfc_adapter;
134a9825ccfSRoman Zhukov 
135a9825ccfSRoman Zhukov void sfc_flow_init(struct sfc_adapter *sa);
136a9825ccfSRoman Zhukov void sfc_flow_fini(struct sfc_adapter *sa);
137a9825ccfSRoman Zhukov int sfc_flow_start(struct sfc_adapter *sa);
138a9825ccfSRoman Zhukov void sfc_flow_stop(struct sfc_adapter *sa);
139a9825ccfSRoman Zhukov 
1405b2b9236SIvan Malov typedef int (sfc_flow_parse_cb_t)(struct rte_eth_dev *dev,
1415b2b9236SIvan Malov 				  const struct rte_flow_item items[],
1425b2b9236SIvan Malov 				  const struct rte_flow_action actions[],
1435b2b9236SIvan Malov 				  struct rte_flow *flow,
1445b2b9236SIvan Malov 				  struct rte_flow_error *error);
1455b2b9236SIvan Malov 
1464f867ad6SIvan Malov typedef int (sfc_flow_insert_cb_t)(struct sfc_adapter *sa,
1474f867ad6SIvan Malov 				   struct rte_flow *flow);
1484f867ad6SIvan Malov 
1494f867ad6SIvan Malov typedef int (sfc_flow_remove_cb_t)(struct sfc_adapter *sa,
1504f867ad6SIvan Malov 				   struct rte_flow *flow);
1514f867ad6SIvan Malov 
152a9825ccfSRoman Zhukov #ifdef __cplusplus
153a9825ccfSRoman Zhukov }
154a9825ccfSRoman Zhukov #endif
155a9825ccfSRoman Zhukov #endif /* _SFC_FLOW_H */
156