This patch adds a function to destroy the macvlan filter.

Signed-off-by: Beilei Xing <beilei.x...@intel.com>
---
 drivers/net/i40e/i40e_ethdev.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index a3ed1f0..fddd46d 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -519,6 +519,9 @@ static struct i40e_flow *i40e_flow_create(struct 
rte_eth_dev *dev,
                                   struct rte_flow_error *error);
 static int i40e_dev_destroy_ethertype_filter(struct i40e_pf *pf,
                                     struct i40e_ethertype_filter *filter);
+static int i40e_dev_destroy_macvlan_filter(struct i40e_pf *pf,
+                                          struct i40e_vsi *vsi,
+                                          struct i40e_mac_filter *filter);
 static int i40e_flow_destroy(struct rte_eth_dev *dev,
                             struct rte_flow *flow,
                             struct rte_flow_error *error);
@@ -11708,6 +11711,29 @@ i40e_dev_destroy_ethertype_filter(struct i40e_pf *pf,
 }
 
 static int
+i40e_dev_destroy_macvlan_filter(struct i40e_pf *pf,
+                               struct i40e_vsi *vsi,
+                               struct i40e_mac_filter *filter)
+{
+       struct i40e_hw *hw = I40E_PF_TO_HW(pf);
+       int ret;
+
+       (void)rte_memcpy(hw->mac.addr, hw->mac.perm_addr,
+                        ETHER_ADDR_LEN);
+       ret = i40e_vsi_delete_mac(vsi, &filter->mac_info.mac_addr);
+       if (ret != I40E_SUCCESS) {
+               PMD_DRV_LOG(ERR, "Failed to delete MAC filter.");
+               return -1;
+       }
+
+       /* Clear device address as it has been removed. */
+       if (is_same_ether_addr(&pf->dev_addr, &filter->mac_info.mac_addr))
+               memset(&pf->dev_addr, 0, sizeof(struct ether_addr));
+
+       return 0;
+}
+
+static int
 i40e_flow_destroy(struct rte_eth_dev *dev,
                  struct rte_flow *flow,
                  struct rte_flow_error *error)
@@ -11722,6 +11748,10 @@ i40e_flow_destroy(struct rte_eth_dev *dev,
                ret = i40e_dev_destroy_ethertype_filter(pf,
                        (struct i40e_ethertype_filter *)pmd_flow->rule);
                break;
+       case RTE_ETH_FILTER_MACVLAN:
+               ret = i40e_dev_destroy_macvlan_filter(pf,
+                     pmd_flow->vsi, (struct i40e_mac_filter *)pmd_flow->rule);
+               break;
        default:
                PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
                            filter_type);
-- 
2.5.5

Reply via email to