1 /* SPDX-License-Identifier: BSD-3-Clause 2 * 3 * Copyright(c) 2019-2021 Xilinx, Inc. 4 * Copyright(c) 2017-2019 Solarflare Communications Inc. 5 * 6 * This software was jointly developed between OKTET Labs (under contract 7 * for Solarflare) and Solarflare Communications, Inc. 8 */ 9 10 #ifndef _SFC_FLOW_H 11 #define _SFC_FLOW_H 12 13 #include <rte_tailq.h> 14 #include <rte_flow_driver.h> 15 16 #include "efx.h" 17 18 #ifdef __cplusplus 19 extern "C" { 20 #endif 21 22 /* 23 * The maximum number of fully elaborated hardware filter specifications 24 * which can be produced from a template by means of multiplication, if 25 * missing match flags are needed to be taken into account 26 */ 27 #define SF_FLOW_SPEC_NB_FILTERS_MAX 8 28 29 /* Used to guard action masks */ 30 #define SFC_BUILD_SET_OVERFLOW(_action, _set) \ 31 RTE_BUILD_BUG_ON((_action) >= sizeof(_set) * CHAR_BIT) 32 33 /* RSS configuration storage */ 34 struct sfc_flow_rss { 35 unsigned int rxq_hw_index_min; 36 unsigned int rxq_hw_index_max; 37 unsigned int rss_hash_types; 38 uint8_t rss_key[EFX_RSS_KEY_SIZE]; 39 unsigned int rss_tbl[EFX_RSS_TBL_SIZE]; 40 }; 41 42 /* Flow engines supported by the implementation */ 43 enum sfc_flow_spec_type { 44 SFC_FLOW_SPEC_FILTER = 0, 45 SFC_FLOW_SPEC_MAE, 46 47 SFC_FLOW_SPEC_NTYPES 48 }; 49 50 /* VNIC-specific flow specification */ 51 struct sfc_flow_spec_filter { 52 /* partial specification from flow rule */ 53 efx_filter_spec_t template; 54 /* fully elaborated hardware filters specifications */ 55 efx_filter_spec_t filters[SF_FLOW_SPEC_NB_FILTERS_MAX]; 56 /* number of complete specifications */ 57 unsigned int count; 58 /* RSS toggle */ 59 boolean_t rss; 60 /* RSS hash toggle */ 61 boolean_t rss_hash_required; 62 /* RSS configuration */ 63 struct sfc_flow_rss rss_conf; 64 }; 65 66 /* Indicates the role of a given flow in tunnel offload */ 67 enum sfc_flow_tunnel_rule_type { 68 /* The flow has nothing to do with tunnel offload */ 69 SFC_FT_RULE_NONE = 0, 70 /* The flow represents a JUMP rule */ 71 SFC_FT_RULE_JUMP, 72 /* The flow represents a GROUP rule */ 73 SFC_FT_RULE_GROUP, 74 }; 75 76 /* MAE-specific flow specification */ 77 struct sfc_flow_spec_mae { 78 /* FLow Tunnel (FT) rule type (or NONE) */ 79 enum sfc_flow_tunnel_rule_type ft_rule_type; 80 /* Flow Tunnel (FT) context (or NULL) */ 81 struct sfc_flow_tunnel *ft; 82 /* Desired priority level */ 83 unsigned int priority; 84 /* Outer rule registry entry */ 85 struct sfc_mae_outer_rule *outer_rule; 86 /* EFX match specification */ 87 efx_mae_match_spec_t *match_spec; 88 /* Action set registry entry */ 89 struct sfc_mae_action_set *action_set; 90 /* Firmware-allocated rule ID */ 91 efx_mae_rule_id_t rule_id; 92 }; 93 94 /* Flow specification */ 95 struct sfc_flow_spec { 96 /* Flow specification type (engine-based) */ 97 enum sfc_flow_spec_type type; 98 99 RTE_STD_C11 100 union { 101 /* Filter-based (VNIC level flows) specification */ 102 struct sfc_flow_spec_filter filter; 103 /* MAE-based (lower-level HW switch flows) specification */ 104 struct sfc_flow_spec_mae mae; 105 }; 106 }; 107 108 /* PMD-specific definition of the opaque type from rte_flow.h */ 109 struct rte_flow { 110 struct sfc_flow_spec spec; /* flow specification */ 111 TAILQ_ENTRY(rte_flow) entries; /* flow list entries */ 112 }; 113 114 TAILQ_HEAD(sfc_flow_list, rte_flow); 115 116 extern const struct rte_flow_ops sfc_flow_ops; 117 118 enum sfc_flow_item_layers { 119 SFC_FLOW_ITEM_ANY_LAYER, 120 SFC_FLOW_ITEM_START_LAYER, 121 SFC_FLOW_ITEM_L2, 122 SFC_FLOW_ITEM_L3, 123 SFC_FLOW_ITEM_L4, 124 }; 125 126 /* Flow parse context types */ 127 enum sfc_flow_parse_ctx_type { 128 SFC_FLOW_PARSE_CTX_FILTER = 0, 129 SFC_FLOW_PARSE_CTX_MAE, 130 131 SFC_FLOW_PARSE_CTX_NTYPES 132 }; 133 134 /* Flow parse context */ 135 struct sfc_flow_parse_ctx { 136 enum sfc_flow_parse_ctx_type type; 137 138 RTE_STD_C11 139 union { 140 /* Context pointer valid for filter-based (VNIC) flows */ 141 efx_filter_spec_t *filter; 142 /* Context pointer valid for MAE-based flows */ 143 struct sfc_mae_parse_ctx *mae; 144 }; 145 }; 146 147 typedef int (sfc_flow_item_parse)(const struct rte_flow_item *item, 148 struct sfc_flow_parse_ctx *parse_ctx, 149 struct rte_flow_error *error); 150 151 struct sfc_flow_item { 152 enum rte_flow_item_type type; /* Type of item */ 153 const char *name; /* Item name */ 154 enum sfc_flow_item_layers layer; /* Layer of item */ 155 enum sfc_flow_item_layers prev_layer; /* Previous layer of item */ 156 enum sfc_flow_parse_ctx_type ctx_type; /* Parse context type */ 157 sfc_flow_item_parse *parse; /* Parsing function */ 158 }; 159 160 struct sfc_adapter; 161 162 int sfc_flow_parse_pattern(struct sfc_adapter *sa, 163 const struct sfc_flow_item *flow_items, 164 unsigned int nb_flow_items, 165 const struct rte_flow_item pattern[], 166 struct sfc_flow_parse_ctx *parse_ctx, 167 struct rte_flow_error *error); 168 169 int sfc_flow_parse_init(const struct rte_flow_item *item, 170 const void **spec_ptr, 171 const void **mask_ptr, 172 const void *supp_mask, 173 const void *def_mask, 174 unsigned int size, 175 struct rte_flow_error *error); 176 177 void sfc_flow_init(struct sfc_adapter *sa); 178 void sfc_flow_fini(struct sfc_adapter *sa); 179 int sfc_flow_start(struct sfc_adapter *sa); 180 void sfc_flow_stop(struct sfc_adapter *sa); 181 182 typedef int (sfc_flow_parse_cb_t)(struct rte_eth_dev *dev, 183 const struct rte_flow_item items[], 184 const struct rte_flow_action actions[], 185 struct rte_flow *flow, 186 struct rte_flow_error *error); 187 188 typedef int (sfc_flow_verify_cb_t)(struct sfc_adapter *sa, 189 struct rte_flow *flow); 190 191 typedef void (sfc_flow_cleanup_cb_t)(struct sfc_adapter *sa, 192 struct rte_flow *flow); 193 194 typedef int (sfc_flow_insert_cb_t)(struct sfc_adapter *sa, 195 struct rte_flow *flow); 196 197 typedef int (sfc_flow_remove_cb_t)(struct sfc_adapter *sa, 198 struct rte_flow *flow); 199 200 typedef int (sfc_flow_query_cb_t)(struct rte_eth_dev *dev, 201 struct rte_flow *flow, 202 const struct rte_flow_action *action, 203 void *data, 204 struct rte_flow_error *error); 205 206 #ifdef __cplusplus 207 } 208 #endif 209 #endif /* _SFC_FLOW_H */ 210