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