[dpdk-dev,v3,1/2] net/i40e: new API to add VF MAC address from PF

Message ID 1502994823-125017-2-git-send-email-wenzhuo.lu@intel.com (mailing list archive)
State Accepted, 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 Aug. 17, 2017, 6:33 p.m. UTC
  Currently, rte_eth_dev_mac_addr_add is used by a
testpmd CLI to add a MAC address for VF. But the
parameter 'pool' of this API means the VMDq pool,
not VF.
So, it's wrong to use it to add the VF MAC address.
This patch provides a new API that can be used to
add VF MAC address on i40e.

Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
---
 drivers/net/i40e/rte_pmd_i40e.c           | 44 +++++++++++++++++++++++++++++++
 drivers/net/i40e/rte_pmd_i40e.h           | 20 ++++++++++++++
 drivers/net/i40e/rte_pmd_i40e_version.map |  7 +++++
 3 files changed, 71 insertions(+)
  

Comments

Stephen Hemminger Aug. 18, 2017, 12:32 a.m. UTC | #1
On Fri, 18 Aug 2017 02:33:42 +0800
Wenzhuo Lu <wenzhuo.lu@intel.com> wrote:

> Currently, rte_eth_dev_mac_addr_add is used by a
> testpmd CLI to add a MAC address for VF. But the
> parameter 'pool' of this API means the VMDq pool,
> not VF.
> So, it's wrong to use it to add the VF MAC address.
> This patch provides a new API that can be used to
> add VF MAC address on i40e.
> 
> Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>

What do other drivers do?
Sorry, a driver specific API is (almost) always the wrong solution.
  
Ferruh Yigit Aug. 18, 2017, 4:43 p.m. UTC | #2
On 8/18/2017 1:32 AM, Stephen Hemminger wrote:
> On Fri, 18 Aug 2017 02:33:42 +0800
> Wenzhuo Lu <wenzhuo.lu@intel.com> wrote:
> 
>> Currently, rte_eth_dev_mac_addr_add is used by a
>> testpmd CLI to add a MAC address for VF. But the
>> parameter 'pool' of this API means the VMDq pool,
>> not VF.
>> So, it's wrong to use it to add the VF MAC address.
>> This patch provides a new API that can be used to
>> add VF MAC address on i40e.
>>
>> Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
> 
> What do other drivers do?

This is adding VF MAC through PF, not all PMDs support this.

> Sorry, a driver specific API is (almost) always the wrong solution.

Currently there are set of device specific APIs [1].

The motivation was to be able to expose NIC specific features,
abstraction layer should not prevent using HW features; while keeping
abstraction clean for common majority, not having APIs valid only for a
single NIC.

But with number of the device specific APIs increasing, it may be time
to bring postponed discussion to life on how to manage them.

Recent ioclt or staging dev_ops was a good tart:
http://dpdk.org/ml/archives/dev/2017-August/thread.html#72423


[1]
Physical PMDs with device specific API: i40e, ixgbe, bnxt
Virtual PMDs with device specific API: ring, vhost, bonding, xenvirt
  
Wenzhuo Lu Aug. 19, 2017, 12:52 p.m. UTC | #3
Hi,

> -----Original Message-----

> From: Yigit, Ferruh

> Sent: Friday, August 18, 2017 12:43 PM

> To: Stephen Hemminger <stephen@networkplumber.org>; Lu, Wenzhuo

> <wenzhuo.lu@intel.com>

> Cc: dev@dpdk.org

> Subject: Re: [dpdk-dev] [PATCH v3 1/2] net/i40e: new API to add VF MAC

> address from PF

> 

> On 8/18/2017 1:32 AM, Stephen Hemminger wrote:

> > On Fri, 18 Aug 2017 02:33:42 +0800

> > Wenzhuo Lu <wenzhuo.lu@intel.com> wrote:

> >

> >> Currently, rte_eth_dev_mac_addr_add is used by a testpmd CLI to add a

> >> MAC address for VF. But the parameter 'pool' of this API means the

> >> VMDq pool, not VF.

> >> So, it's wrong to use it to add the VF MAC address.

> >> This patch provides a new API that can be used to add VF MAC address

> >> on i40e.

> >>

> >> Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>

> >

> > What do other drivers do?

> 

> This is adding VF MAC through PF, not all PMDs support this.

> 

> > Sorry, a driver specific API is (almost) always the wrong solution.

> 

> Currently there are set of device specific APIs [1].

> 

> The motivation was to be able to expose NIC specific features, abstraction

> layer should not prevent using HW features; while keeping abstraction clean

> for common majority, not having APIs valid only for a single NIC.

> 

> But with number of the device specific APIs increasing, it may be time to

> bring postponed discussion to life on how to manage them.

> 

> Recent ioclt or staging dev_ops was a good tart:

> http://dpdk.org/ml/archives/dev/2017-August/thread.html#72423

> 

> 

> [1]

> Physical PMDs with device specific API: i40e, ixgbe, bnxt Virtual PMDs with

> device specific API: ring, vhost, bonding, xenvirt

This patch follows the existing bnxt example to implement the same function on i40e.

Totally agree the private API is not a good idea. To my opinion, as many same functions are implemented on ixgbe, i40e, bnxt, it's them time to make them public. Let me send some RFC later.
  

Patch

diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c
index f12b7f4..8877239 100644
--- a/drivers/net/i40e/rte_pmd_i40e.c
+++ b/drivers/net/i40e/rte_pmd_i40e.c
@@ -2115,3 +2115,47 @@  int rte_pmd_i40e_ptype_mapping_replace(uint8_t port,
 
 	return 0;
 }
+
+int
+rte_pmd_i40e_add_vf_mac_addr(uint8_t port, uint16_t vf_id,
+			     struct ether_addr *mac_addr)
+{
+	struct rte_eth_dev *dev;
+	struct i40e_pf_vf *vf;
+	struct i40e_vsi *vsi;
+	struct i40e_pf *pf;
+	struct i40e_mac_filter_info mac_filter;
+	int ret;
+
+	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];
+
+	if (!is_i40e_supported(dev))
+		return -ENOTSUP;
+
+	pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
+
+	if (vf_id >= pf->vf_num || !pf->vfs)
+		return -EINVAL;
+
+	vf = &pf->vfs[vf_id];
+	vsi = vf->vsi;
+	if (!vsi) {
+		PMD_DRV_LOG(ERR, "Invalid VSI.");
+		return -EINVAL;
+	}
+
+	mac_filter.filter_type = RTE_MACVLAN_PERFECT_MATCH;
+	ether_addr_copy(mac_addr, &mac_filter.mac_addr);
+	ret = i40e_vsi_add_mac(vsi, &mac_filter);
+	if (ret != I40E_SUCCESS) {
+		PMD_DRV_LOG(ERR, "Failed to add MAC filter.");
+		return -1;
+	}
+
+	return 0;
+}
diff --git a/drivers/net/i40e/rte_pmd_i40e.h b/drivers/net/i40e/rte_pmd_i40e.h
index 356fa89..155b7e8 100644
--- a/drivers/net/i40e/rte_pmd_i40e.h
+++ b/drivers/net/i40e/rte_pmd_i40e.h
@@ -637,4 +637,24 @@  int rte_pmd_i40e_ptype_mapping_replace(uint8_t port,
 				       uint8_t mask,
 				       uint32_t pkt_type);
 
+/**
+ * Add a VF MAC address.
+ *
+ * Add more MAC address for VF. The existing MAC addresses
+ * are still effective.
+ *
+ * @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_add_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 20cc980..ef8882b 100644
--- a/drivers/net/i40e/rte_pmd_i40e_version.map
+++ b/drivers/net/i40e/rte_pmd_i40e_version.map
@@ -45,3 +45,10 @@  DPDK_17.08 {
 	rte_pmd_i40e_get_ddp_info;
 
 } DPDK_17.05;
+
+DPDK_17.11 {
+	global:
+
+	rte_pmd_i40e_add_vf_mac_addr;
+
+} DPDK_17.08;