[dpdk-dev,v7,10/27] net/i40e: set VF MAC from PF support

Message ID 1483426488-117332-11-git-send-email-wenzhuo.lu@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel compilation success Compilation OK

Commit Message

Wenzhuo Lu Jan. 3, 2017, 6:54 a.m. UTC
  From: Ferruh Yigit <ferruh.yigit@intel.com>

Support setting VF MAC address from PF.
User can call the API on PF to set a specific
VF's MAC address.

This will remove all existing MAC filters.

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
 drivers/net/i40e/i40e_ethdev.c            | 42 +++++++++++++++++++++++++++++++
 drivers/net/i40e/rte_pmd_i40e.h           | 19 ++++++++++++++
 drivers/net/i40e/rte_pmd_i40e_version.map |  1 +
 3 files changed, 62 insertions(+)
  

Comments

Jingjing Wu Jan. 6, 2017, 12:32 a.m. UTC | #1
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wenzhuo Lu
> Sent: Tuesday, January 3, 2017 2:55 PM
> To: dev@dpdk.org
> Cc: Yigit, Ferruh <ferruh.yigit@intel.com>
> Subject: [dpdk-dev] [PATCH v7 10/27] net/i40e: set VF MAC from PF support
> 
> From: Ferruh Yigit <ferruh.yigit@intel.com>
> 
> Support setting VF MAC address from PF.
> User can call the API on PF to set a specific VF's MAC address.
> 
> This will remove all existing MAC filters.
> 
> Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
> ---
>  drivers/net/i40e/i40e_ethdev.c            | 42
> +++++++++++++++++++++++++++++++
>  drivers/net/i40e/rte_pmd_i40e.h           | 19 ++++++++++++++
>  drivers/net/i40e/rte_pmd_i40e_version.map |  1 +
>  3 files changed, 62 insertions(+)
> 
> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
> index 9d050c8..758b574 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c
> @@ -10198,3 +10198,45 @@ static void i40e_set_default_mac_addr(struct
> rte_eth_dev *dev,
> 
>  	return ret;
>  }
> +
> +int
> +rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
> +			     struct ether_addr *mac_addr)
> +{
> +	struct rte_eth_dev_info dev_info;
> +	struct i40e_mac_filter *f;
> +	struct rte_eth_dev *dev;
> +	struct i40e_pf_vf *vf;
> +	struct i40e_vsi *vsi;
> +	struct i40e_pf *pf;
> +	void *temp;
> +
> +	if (i40e_validate_mac_addr((u8 *)mac_addr) != I40E_SUCCESS)
> +		return -EINVAL;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
> +
> +	dev = &rte_eth_devices[port];
> +	rte_eth_dev_info_get(port, &dev_info);
> +
> +	if (vf_id >= dev_info.max_vfs)
> +		return -EINVAL;
> +
> +	pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
> +
> +	if (vf_id > pf->vf_num - 1 || !pf->vfs)
> +		return -EINVAL;
> +
> +	vf = &pf->vfs[vf_id];
> +	vsi = vf->vsi;
> +	if (!vsi)
> +		return -EINVAL;
> +
> +	ether_addr_copy(mac_addr, &vf->mac_addr);

Only store the mac address in vf struct?
Are you supposing the API is called before VF is initialized? If so, it's better to comment it.

Thanks
Jingjing
  
Ferruh Yigit Jan. 6, 2017, 12:07 p.m. UTC | #2
On 1/6/2017 12:32 AM, Wu, Jingjing wrote:
> 
> 
>> -----Original Message-----
>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wenzhuo Lu
>> Sent: Tuesday, January 3, 2017 2:55 PM
>> To: dev@dpdk.org
>> Cc: Yigit, Ferruh <ferruh.yigit@intel.com>
>> Subject: [dpdk-dev] [PATCH v7 10/27] net/i40e: set VF MAC from PF support
>>
>> From: Ferruh Yigit <ferruh.yigit@intel.com>
>>
>> Support setting VF MAC address from PF.
>> User can call the API on PF to set a specific VF's MAC address.
>>
>> This will remove all existing MAC filters.
>>
>> Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
>> ---
>>  drivers/net/i40e/i40e_ethdev.c            | 42
>> +++++++++++++++++++++++++++++++
>>  drivers/net/i40e/rte_pmd_i40e.h           | 19 ++++++++++++++
>>  drivers/net/i40e/rte_pmd_i40e_version.map |  1 +
>>  3 files changed, 62 insertions(+)
>>
>> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
>> index 9d050c8..758b574 100644
>> --- a/drivers/net/i40e/i40e_ethdev.c
>> +++ b/drivers/net/i40e/i40e_ethdev.c
>> @@ -10198,3 +10198,45 @@ static void i40e_set_default_mac_addr(struct
>> rte_eth_dev *dev,
>>
>>  	return ret;
>>  }
>> +
>> +int
>> +rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
>> +			     struct ether_addr *mac_addr)
>> +{
>> +	struct rte_eth_dev_info dev_info;
>> +	struct i40e_mac_filter *f;
>> +	struct rte_eth_dev *dev;
>> +	struct i40e_pf_vf *vf;
>> +	struct i40e_vsi *vsi;
>> +	struct i40e_pf *pf;
>> +	void *temp;
>> +
>> +	if (i40e_validate_mac_addr((u8 *)mac_addr) != I40E_SUCCESS)
>> +		return -EINVAL;
>> +
>> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
>> +
>> +	dev = &rte_eth_devices[port];
>> +	rte_eth_dev_info_get(port, &dev_info);
>> +
>> +	if (vf_id >= dev_info.max_vfs)
>> +		return -EINVAL;
>> +
>> +	pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
>> +
>> +	if (vf_id > pf->vf_num - 1 || !pf->vfs)
>> +		return -EINVAL;
>> +
>> +	vf = &pf->vfs[vf_id];
>> +	vsi = vf->vsi;
>> +	if (!vsi)
>> +		return -EINVAL;
>> +
>> +	ether_addr_copy(mac_addr, &vf->mac_addr);
> 
> Only store the mac address in vf struct?
> Are you supposing the API is called before VF is initialized?

Yes.
PF should set the VF MAC before VF initialized.

If PF sets the VF MAC after VF already initialized, new MAC address
won't be effective until next VF initialization.

> If so, it's better to comment it.

Good idea, I will.

> 
> Thanks
> Jingjing
>
  

Patch

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 9d050c8..758b574 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -10198,3 +10198,45 @@  static void i40e_set_default_mac_addr(struct rte_eth_dev *dev,
 
 	return ret;
 }
+
+int
+rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
+			     struct ether_addr *mac_addr)
+{
+	struct rte_eth_dev_info dev_info;
+	struct i40e_mac_filter *f;
+	struct rte_eth_dev *dev;
+	struct i40e_pf_vf *vf;
+	struct i40e_vsi *vsi;
+	struct i40e_pf *pf;
+	void *temp;
+
+	if (i40e_validate_mac_addr((u8 *)mac_addr) != I40E_SUCCESS)
+		return -EINVAL;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV);
+
+	dev = &rte_eth_devices[port];
+	rte_eth_dev_info_get(port, &dev_info);
+
+	if (vf_id >= dev_info.max_vfs)
+		return -EINVAL;
+
+	pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
+
+	if (vf_id > pf->vf_num - 1 || !pf->vfs)
+		return -EINVAL;
+
+	vf = &pf->vfs[vf_id];
+	vsi = vf->vsi;
+	if (!vsi)
+		return -EINVAL;
+
+	ether_addr_copy(mac_addr, &vf->mac_addr);
+
+	/* Remove all existing mac */
+	TAILQ_FOREACH_SAFE(f, &vsi->mac_list, next, temp)
+		i40e_vsi_delete_mac(vsi, &f->mac_info.mac_addr);
+
+	return 0;
+}
diff --git a/drivers/net/i40e/rte_pmd_i40e.h b/drivers/net/i40e/rte_pmd_i40e.h
index 9091520..faacbb9 100644
--- a/drivers/net/i40e/rte_pmd_i40e.h
+++ b/drivers/net/i40e/rte_pmd_i40e.h
@@ -168,4 +168,23 @@  int rte_pmd_i40e_set_vf_multicast_promisc(uint8_t port,
 					  uint16_t vf_id,
 					  uint8_t on);
 
+/**
+ * Set the VF MAC address.
+ *
+ * This will remove all existing MAC filters.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param vf_id
+ *   VF id.
+ * @param mac_addr
+ *   VF MAC address.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-EINVAL) if *vf* or *mac_addr* is invalid.
+ */
+int rte_pmd_i40e_set_vf_mac_addr(uint8_t port, uint16_t vf_id,
+				 struct ether_addr *mac_addr);
+
 #endif /* _PMD_I40E_H_ */
diff --git a/drivers/net/i40e/rte_pmd_i40e_version.map b/drivers/net/i40e/rte_pmd_i40e_version.map
index 32939b2..2d53b87 100644
--- a/drivers/net/i40e/rte_pmd_i40e_version.map
+++ b/drivers/net/i40e/rte_pmd_i40e_version.map
@@ -8,6 +8,7 @@  DPDK_17.02 {
 
 	rte_pmd_i40e_ping_vfs;
 	rte_pmd_i40e_set_tx_loopback;
+	rte_pmd_i40e_set_vf_mac_addr;
 	rte_pmd_i40e_set_vf_mac_anti_spoof;
 	rte_pmd_i40e_set_vf_multicast_promisc;
 	rte_pmd_i40e_set_vf_unicast_promisc;