This allows tc-flower filters that were offloaded to be removed.

Signed-off-by: Vinicius Costa Gomes <vinicius.go...@intel.com>
---
 drivers/net/ethernet/intel/igb/igb_main.c | 32 ++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/intel/igb/igb_main.c 
b/drivers/net/ethernet/intel/igb/igb_main.c
index b1d401e77d62..5e0e1df0e941 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -2641,10 +2641,40 @@ static int igb_configure_clsflower(struct igb_adapter 
*adapter,
        return err;
 }
 
+static int igb_delete_filter_by_cookie(struct igb_adapter *adapter,
+                                      unsigned long cookie)
+{
+       struct igb_nfc_filter *filter;
+       int err;
+
+       spin_lock(&adapter->nfc_lock);
+
+       hlist_for_each_entry(filter, &adapter->nfc_filter_list, nfc_node) {
+               if (filter->cookie == cookie)
+                       break;
+       }
+
+       if (!filter) {
+               err = -ENOENT;
+               goto out;
+       }
+
+       err = igb_erase_filter(adapter, filter);
+
+       hlist_del(&filter->nfc_node);
+       kfree(filter);
+       adapter->nfc_filter_count--;
+
+out:
+       spin_unlock(&adapter->nfc_lock);
+
+       return err;
+}
+
 static int igb_delete_clsflower(struct igb_adapter *adapter,
                                struct tc_cls_flower_offload *cls_flower)
 {
-       return -EOPNOTSUPP;
+       return igb_delete_filter_by_cookie(adapter, cls_flower->cookie);
 }
 
 static int igb_setup_tc_cls_flower(struct igb_adapter *adapter,
-- 
2.16.2

Reply via email to