net/sfc: generalise flow parsing
[dpdk.git] / drivers / net / sfc / sfc_flow.h
index 71ec18c..19db8fc 100644 (file)
@@ -35,21 +35,42 @@ struct sfc_flow_rss {
        unsigned int    rss_tbl[EFX_RSS_TBL_SIZE];
 };
 
-/* 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) */
-       boolean_t rss;                  /* RSS toggle */
-       struct sfc_flow_rss rss_conf;   /* RSS configuration */
+       struct sfc_flow_spec spec;      /* flow specification */
        TAILQ_ENTRY(rte_flow) entries;  /* flow list entries */
 };
 
@@ -64,6 +85,12 @@ void sfc_flow_fini(struct sfc_adapter *sa);
 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