The previous implementation used random MAC address for rte_eth_dev.
This change retrieves and uses the actual hardware MAC address from
the network device.

Fixes: bf649059c5ea ("net/nbl: support init and uninit")

Signed-off-by: Dimon Zhao <[email protected]>
---
 drivers/net/nbl/nbl_common/nbl_userdev.c      | 40 +++++++++++++++++++
 drivers/net/nbl/nbl_dev/nbl_dev.c             |  2 +
 drivers/net/nbl/nbl_dispatch.c                | 17 +++++++-
 drivers/net/nbl/nbl_include/nbl_def_channel.h |  1 +
 drivers/net/nbl/nbl_include/nbl_def_common.h  |  1 +
 drivers/net/nbl/nbl_include/nbl_include.h     |  4 ++
 6 files changed, 63 insertions(+), 2 deletions(-)

diff --git a/drivers/net/nbl/nbl_common/nbl_userdev.c 
b/drivers/net/nbl/nbl_common/nbl_userdev.c
index 75e0e2884b..bd0305affe 100644
--- a/drivers/net/nbl/nbl_common/nbl_userdev.c
+++ b/drivers/net/nbl/nbl_common/nbl_userdev.c
@@ -760,3 +760,43 @@ void nbl_pci_unmap_device(struct nbl_adapter *adapter)
 
        nbl_mdev_unmap_device(adapter);
 }
+
+static int nbl_userdev_ifreq(int ifindex, int req, struct ifreq *ifr)
+{
+       int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
+       int ret = 0;
+
+       if (sock == -1) {
+               rte_errno = errno;
+               return -rte_errno;
+       }
+
+       if (!if_indextoname(ifindex, &ifr->ifr_name[0]))
+               goto error;
+
+       ret = ioctl(sock, req, ifr);
+       if (ret == -1) {
+               rte_errno = errno;
+               goto error;
+       }
+       close(sock);
+       return 0;
+error:
+       close(sock);
+       return -rte_errno;
+}
+
+int nbl_userdev_get_mac_addr(struct nbl_common_info *common, u8 *mac)
+{
+       struct ifreq request;
+       int ret;
+
+       ret = nbl_userdev_ifreq(common->ifindex, SIOCGIFHWADDR, &request);
+       if (ret) {
+               NBL_LOG(ERR, "userdev get mac failed: %d", ret);
+               return ret;
+       }
+
+       memcpy(mac, request.ifr_hwaddr.sa_data, RTE_ETHER_ADDR_LEN);
+       return 0;
+}
diff --git a/drivers/net/nbl/nbl_dev/nbl_dev.c 
b/drivers/net/nbl/nbl_dev/nbl_dev.c
index 8a4a776b22..0381bb74ec 100644
--- a/drivers/net/nbl/nbl_dev/nbl_dev.c
+++ b/drivers/net/nbl/nbl_dev/nbl_dev.c
@@ -886,6 +886,8 @@ static int nbl_dev_setup_net_dev(struct nbl_dev_mgt 
*dev_mgt,
 
        common->vsi_id = net_dev->vsi_id;
        common->eth_id = net_dev->eth_id;
+       rte_ether_addr_copy((struct rte_ether_addr *)register_result.mac,
+                           (struct rte_ether_addr *)common->mac);
 
        disp_ops->clear_queues(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), 
net_dev->vsi_id);
        disp_ops->register_vsi2q(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), 
NBL_VSI_DATA, net_dev->vsi_id,
diff --git a/drivers/net/nbl/nbl_dispatch.c b/drivers/net/nbl/nbl_dispatch.c
index fff8e5d184..96d2c84c40 100644
--- a/drivers/net/nbl/nbl_dispatch.c
+++ b/drivers/net/nbl/nbl_dispatch.c
@@ -296,9 +296,22 @@ static int nbl_disp_get_mac_addr(void *priv __rte_unused, 
u8 *mac)
        return 0;
 }
 
-static int nbl_disp_get_mac_addr_req(void *priv __rte_unused, u8 *mac)
+static int nbl_disp_get_mac_addr_req(void *priv, u8 *mac)
 {
-       rte_eth_random_addr(mac);
+       struct nbl_dispatch_mgt *disp_mgt = (struct nbl_dispatch_mgt *)priv;
+       struct nbl_common_info *common = NBL_DISP_MGT_TO_COMMON(disp_mgt);
+       int ret = -1;
+
+       if (common->nl_socket_route >= 0 && common->ifindex >= 0)
+               ret = nbl_userdev_get_mac_addr(common, mac);
+
+       if (ret) {
+               if (rte_is_zero_ether_addr((struct rte_ether_addr 
*)common->mac))
+                       rte_eth_random_addr(mac);
+               else
+                       rte_ether_addr_copy((struct rte_ether_addr 
*)common->mac,
+                                           (struct rte_ether_addr *)mac);
+       }
 
        return 0;
 }
diff --git a/drivers/net/nbl/nbl_include/nbl_def_channel.h 
b/drivers/net/nbl/nbl_include/nbl_def_channel.h
index dd7057f3b2..6b150ed715 100644
--- a/drivers/net/nbl/nbl_include/nbl_def_channel.h
+++ b/drivers/net/nbl/nbl_include/nbl_def_channel.h
@@ -322,6 +322,7 @@ struct nbl_chan_param_register_net_info {
        u16 offset;
        u16 stride;
        u64 pf_bar_start;
+       u16 is_vdpa;
 };
 
 struct nbl_chan_param_get_vsi_id {
diff --git a/drivers/net/nbl/nbl_include/nbl_def_common.h 
b/drivers/net/nbl/nbl_include/nbl_def_common.h
index 5480d30f0d..39be8042b9 100644
--- a/drivers/net/nbl/nbl_include/nbl_def_common.h
+++ b/drivers/net/nbl/nbl_include/nbl_def_common.h
@@ -116,5 +116,6 @@ int nbl_userdev_port_config(struct nbl_adapter *adapter, 
int start);
 int nbl_userdev_port_isolate(struct nbl_adapter *adapter, int set, struct 
rte_flow_error *error);
 int nbl_pci_map_device(struct nbl_adapter *adapter);
 void nbl_pci_unmap_device(struct nbl_adapter *adapter);
+int nbl_userdev_get_mac_addr(struct nbl_common_info *common, u8 *mac);
 
 #endif
diff --git a/drivers/net/nbl/nbl_include/nbl_include.h 
b/drivers/net/nbl/nbl_include/nbl_include.h
index 6423ada176..e0f0497e3f 100644
--- a/drivers/net/nbl/nbl_include/nbl_include.h
+++ b/drivers/net/nbl/nbl_include/nbl_include.h
@@ -23,6 +23,7 @@
 #include <sys/ioctl.h>
 #include <sys/types.h>
 #include <unistd.h>
+#include <net/if.h>
 
 #include <rte_ethdev.h>
 #include <ethdev_driver.h>
@@ -146,6 +147,7 @@ struct nbl_common_info {
        u8 dma_set_msb:1;
        u8 rsv:2;
        struct nbl_board_port_info board_info;
+       u8 mac[RTE_ETHER_ADDR_LEN];
 };
 
 struct nbl_register_net_param {
@@ -172,6 +174,8 @@ struct nbl_register_net_result {
        u16 vlan_tci;
        u32 rate;
        bool trusted;
+       u64 vlan_features;
+       u64 hw_enc_features;
 };
 
 struct nbl_eth_link_info {
-- 
2.34.1

Reply via email to