* which can be produced from a template by means of multiplication, if
* missing match flags are needed to be taken into account
*/
-#define SF_FLOW_SPEC_NB_FILTERS_MAX 1
+#define SF_FLOW_SPEC_NB_FILTERS_MAX 8
-#if EFSYS_OPT_RX_SCALE
/* RSS configuration storage */
struct sfc_flow_rss {
unsigned int rxq_hw_index_min;
uint8_t rss_key[EFX_RSS_KEY_SIZE];
unsigned int rss_tbl[EFX_RSS_TBL_SIZE];
};
-#endif /* EFSYS_OPT_RX_SCALE */
-/* Filter specification storage */
-struct sfc_flow_spec {
+/* Flow engines supported by the implementation */
+enum sfc_flow_spec_type {
+ SFC_FLOW_SPEC_FILTER = 0,
+
+ SFC_FLOW_SPEC_NTYPES
+};
+
+/* VNIC-specific flow specification */
+struct sfc_flow_spec_filter {
/* partial specification from flow rule */
efx_filter_spec_t template;
/* fully elaborated hardware filters specifications */
efx_filter_spec_t filters[SF_FLOW_SPEC_NB_FILTERS_MAX];
/* number of complete specifications */
unsigned int count;
+ /* RSS toggle */
+ boolean_t rss;
+ /* RSS configuration */
+ struct sfc_flow_rss rss_conf;
+};
+
+/* Flow specification */
+struct sfc_flow_spec {
+ /* Flow specification type (engine-based) */
+ enum sfc_flow_spec_type type;
+
+ RTE_STD_C11
+ union {
+ /* Filter-based (VNIC level flows) specification */
+ struct sfc_flow_spec_filter filter;
+ };
};
/* PMD-specific definition of the opaque type from rte_flow.h */
struct rte_flow {
- struct sfc_flow_spec spec; /* flow spec for hardware filter(s) */
-#if EFSYS_OPT_RX_SCALE
- boolean_t rss; /* RSS toggle */
- struct sfc_flow_rss rss_conf; /* RSS configuration */
-#endif /* EFSYS_OPT_RX_SCALE */
+ struct sfc_flow_spec spec; /* flow specification */
TAILQ_ENTRY(rte_flow) entries; /* flow list entries */
};
int sfc_flow_start(struct sfc_adapter *sa);
void sfc_flow_stop(struct sfc_adapter *sa);
+typedef int (sfc_flow_parse_cb_t)(struct rte_eth_dev *dev,
+ const struct rte_flow_item items[],
+ const struct rte_flow_action actions[],
+ struct rte_flow *flow,
+ struct rte_flow_error *error);
+
#ifdef __cplusplus
}
#endif