net/i40e: flush ethertype filters
authorBeilei Xing <beilei.xing@intel.com>
Fri, 6 Jan 2017 05:27:18 +0000 (13:27 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 17 Jan 2017 18:40:54 +0000 (19:40 +0100)
This patch adds i40e_flow_flush_ethertype_filter
function to flush all ethertype filters, including
filters in SW and HW.

Signed-off-by: Beilei Xing <beilei.xing@intel.com>
Acked-by: Jingjing Wu <jingjing.wu@intel.com>
drivers/net/i40e/i40e_flow.c

index e425fe8..dc5e655 100644 (file)
@@ -123,6 +123,7 @@ static int i40e_flow_destroy_ethertype_filter(struct i40e_pf *pf,
 static int i40e_flow_destroy_tunnel_filter(struct i40e_pf *pf,
                                           struct i40e_tunnel_filter *filter);
 static int i40e_flow_flush_fdir_filter(struct i40e_pf *pf);
+static int i40e_flow_flush_ethertype_filter(struct i40e_pf *pf);
 
 const struct rte_flow_ops i40e_flow_ops = {
        .validate = i40e_flow_validate,
@@ -1732,10 +1733,20 @@ i40e_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error)
        int ret;
 
        ret = i40e_flow_flush_fdir_filter(pf);
-       if (ret)
+       if (ret) {
                rte_flow_error_set(error, -ret,
                                   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
                                   "Failed to flush FDIR flows.");
+               return -rte_errno;
+       }
+
+       ret = i40e_flow_flush_ethertype_filter(pf);
+       if (ret) {
+               rte_flow_error_set(error, -ret,
+                                  RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
+                                  "Failed to ethertype flush flows.");
+               return -rte_errno;
+       }
 
        return ret;
 }
@@ -1771,3 +1782,31 @@ i40e_flow_flush_fdir_filter(struct i40e_pf *pf)
 
        return ret;
 }
+
+/* Flush all ethertype filters */
+static int
+i40e_flow_flush_ethertype_filter(struct i40e_pf *pf)
+{
+       struct i40e_ethertype_filter_list
+               *ethertype_list = &pf->ethertype.ethertype_list;
+       struct i40e_ethertype_filter *filter;
+       struct rte_flow *flow;
+       void *temp;
+       int ret = 0;
+
+       while ((filter = TAILQ_FIRST(ethertype_list))) {
+               ret = i40e_flow_destroy_ethertype_filter(pf, filter);
+               if (ret)
+                       return ret;
+       }
+
+       /* Delete ethertype flows in flow list. */
+       TAILQ_FOREACH_SAFE(flow, &pf->flow_list, node, temp) {
+               if (flow->filter_type == RTE_ETH_FILTER_ETHERTYPE) {
+                       TAILQ_REMOVE(&pf->flow_list, flow, node);
+                       rte_free(flow);
+               }
+       }
+
+       return ret;
+}