[PATCH v1 1/1] net/nbl: use hardware MAC address instead of random one
Dimon Zhao
dimon.zhao at nebula-matrix.com
Fri Oct 31 02:44:16 CET 2025
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 <dimon.zhao at nebula-matrix.com>
---
drivers/net/nbl/nbl_common/nbl_userdev.c | 40 +++++++++++++++++++
drivers/net/nbl/nbl_dev/nbl_dev.c | 1 +
drivers/net/nbl/nbl_dispatch.c | 15 ++++++-
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, 61 insertions(+), 1 deletion(-)
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..adfaec22f8 100644
--- a/drivers/net/nbl/nbl_dev/nbl_dev.c
+++ b/drivers/net/nbl/nbl_dev/nbl_dev.c
@@ -886,6 +886,7 @@ 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;
+ memcpy(common->mac, register_result.mac, RTE_ETHER_ADDR_LEN);
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..d0ea15eef1 100644
--- a/drivers/net/nbl/nbl_dispatch.c
+++ b/drivers/net/nbl/nbl_dispatch.c
@@ -298,7 +298,20 @@ static int nbl_disp_get_mac_addr(void *priv __rte_unused, u8 *mac)
static int nbl_disp_get_mac_addr_req(void *priv __rte_unused, 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);
+ u8 zero_mac[RTE_ETHER_ADDR_LEN] = {0, 0, 0, 0, 0, 0};
+ int ret = -1;
+
+ if (common->nl_socket_route >= 0 && common->ifindex >= 0)
+ ret = nbl_userdev_get_mac_addr(common, mac);
+
+ if (ret) {
+ if (!memcmp(common->mac, zero_mac, RTE_ETHER_ADDR_LEN))
+ rte_eth_random_addr(mac);
+ else
+ memcpy(mac, common->mac, RTE_ETHER_ADDR_LEN);
+ }
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
More information about the dev
mailing list