[dpdk-dev,18/24] net/i40e: destroy macvlan filter

Message ID 1480679625-4157-19-git-send-email-beilei.xing@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers

Checks

Context Check Description
checkpatch/checkpatch success coding style OK

Commit Message

Xing, Beilei Dec. 2, 2016, 11:53 a.m. UTC
  This patch adds a function to destroy the macvlan filter.

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

Patch

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);