[dpdk-dev] net/i40e: new API to add VF MAC address from PF
Checks
Commit Message
Currently, on i40e the parameter 'pool' of API
rte_eth_dev_mac_addr_add means the VMDq pool, not VF.
So, it's wrong to use it to set the VF MAC address.
As this API is also used by the VMDq example, ideally
we need a parameter to tell the pool is VMDq or VF.
But it's hard to change it because of the ABI change
concern.
Now the solution is to provide a new API, users can
call it to add VF MAC address from PF on i40e.
Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
---
app/test-pmd/cmdline.c | 9 +++++--
drivers/net/i40e/rte_pmd_i40e.c | 44 +++++++++++++++++++++++++++++++
drivers/net/i40e/rte_pmd_i40e.h | 20 ++++++++++++++
drivers/net/i40e/rte_pmd_i40e_version.map | 1 +
4 files changed, 72 insertions(+), 2 deletions(-)
Comments
In testpmd, it's wrong to call rte_eth_dev_mac_addr_add to add a MAC
address for a VF. Because this API is used to add a MAC address for
a VMDq pool.
v3:
- split the patch to 2. One for adding a new API. One for fixing the CLI.
Wenzhuo Lu (2):
net/i40e: new API to add VF MAC address from PF
app/testpmd: fix wrong API of adding VF MAC
app/test-pmd/cmdline.c | 19 ++++++++++---
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 +++++
4 files changed, 86 insertions(+), 4 deletions(-)
On 8/17/2017 7:33 PM, Wenzhuo Lu wrote:
> In testpmd, it's wrong to call rte_eth_dev_mac_addr_add to add a MAC
> address for a VF. Because this API is used to add a MAC address for
> a VMDq pool.
>
> v3:
> - split the patch to 2. One for adding a new API. One for fixing the CLI.
>
> Wenzhuo Lu (2):
> net/i40e: new API to add VF MAC address from PF
> app/testpmd: fix wrong API of adding VF MAC
Series applied to dpdk-next-net/master, thanks.
@@ -7211,9 +7211,14 @@ static void cmd_vf_mac_addr_parsed(void *parsed_result,
struct cmd_vf_mac_addr_result *res = parsed_result;
int ret = 0;
- if (strcmp(res->what, "add") == 0)
+ if (strcmp(res->what, "add") != 0)
+ return;
+
+ ret = rte_pmd_i40e_add_vf_mac_addr(res->port_num, res->vf_num,
+ &res->address);
+ if (ret == -ENOTSUP)
ret = rte_eth_dev_mac_addr_add(res->port_num,
- &res->address, res->vf_num);
+ &res->address, res->vf_num);
if(ret < 0)
printf("vf_mac_addr_cmd error: (%s)\n", strerror(-ret));
@@ -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;
+}
@@ -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_ */
@@ -42,6 +42,7 @@ DPDK_17.05 {
DPDK_17.08 {
global:
+ rte_pmd_i40e_add_vf_mac_addr;
rte_pmd_i40e_get_ddp_info;
} DPDK_17.05;