[PATCH 55/97] wpa_supplicant: Support configuring MAC address on interface creation
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Tue Apr 28 13:05:56 PDT 2026
From: Ilan Peer <ilan.peer at intel.com>
Support setting the MAC address when a dynamic interface is added,
e.g., when creating a NAN Device interface etc.
Signed-off-by: Ilan Peer <ilan.peer at intel.com>
---
wpa_supplicant/ctrl_iface.c | 23 ++++++++++++++++++++---
wpa_supplicant/wpa_cli.c | 8 ++++----
2 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
index 1ff295922f..8a96b4f812 100644
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
@@ -14524,12 +14524,12 @@ static int wpa_supplicant_global_iface_add(struct wpa_global *global,
char *pos, *extra;
struct wpa_supplicant *wpa_s;
unsigned int create_iface = 0;
- u8 mac_addr[ETH_ALEN];
+ u8 mac_addr[ETH_ALEN], *addr_ptr = NULL;
enum wpa_driver_if_type type = WPA_IF_STATION;
/*
* <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB<driver_param>
- * TAB<bridge_ifname>[TAB<create>[TAB<interface_type>]]
+ * TAB<bridge_ifname>[TAB<create>[TAB<interface_type>][TAB<addr>]]
*/
wpa_printf(MSG_DEBUG, "CTRL_IFACE GLOBAL INTERFACE_ADD '%s'", cmd);
@@ -14602,6 +14602,10 @@ static int wpa_supplicant_global_iface_add(struct wpa_global *global,
if (!pos)
break;
+ extra = os_strchr(pos, '\t');
+ if (extra)
+ *extra++ = '\0';
+
if (os_strcmp(pos, "sta") == 0) {
type = WPA_IF_STATION;
} else if (os_strcmp(pos, "ap") == 0) {
@@ -14618,6 +14622,19 @@ static int wpa_supplicant_global_iface_add(struct wpa_global *global,
pos);
return -1;
}
+
+ pos = extra;
+ if (!pos || !pos[0])
+ break;
+
+ if (hwaddr_aton(pos, mac_addr)) {
+ wpa_printf(MSG_DEBUG,
+ "INTERFACE_ADD invalid MAC address: '%s'",
+ pos);
+ return -1;
+ }
+
+ addr_ptr = mac_addr;
} else {
wpa_printf(MSG_DEBUG,
"INTERFACE_ADD unsupported extra parameter: '%s'",
@@ -14632,7 +14649,7 @@ static int wpa_supplicant_global_iface_add(struct wpa_global *global,
if (!global->ifaces)
return -1;
if (wpa_drv_if_add(global->ifaces, type, iface.ifname,
- NULL, NULL, NULL, mac_addr, NULL) < 0) {
+ addr_ptr, NULL, NULL, mac_addr, NULL) < 0) {
wpa_printf(MSG_ERROR,
"CTRL_IFACE interface creation failed");
return -1;
diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c
index 64d6154ee2..9a5d631021 100644
--- a/wpa_supplicant/wpa_cli.c
+++ b/wpa_supplicant/wpa_cli.c
@@ -1887,21 +1887,21 @@ static int wpa_cli_cmd_interface_add(struct wpa_ctrl *ctrl, int argc,
printf("Invalid INTERFACE_ADD command: needs at least one "
"argument (interface name)\n"
"All arguments: ifname confname driver ctrl_interface "
- "driver_param bridge_name [create]\n");
+ "driver_param bridge_name [create <type> [addr]]\n");
return -1;
}
/*
* INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB
- * <driver_param>TAB<bridge_name>[TAB<create>[TAB<type>]]
+ * <driver_param>TAB<bridge_name>[TAB<create>[TAB<type>][TAB<addr>]]
*/
res = os_snprintf(cmd, sizeof(cmd),
- "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s\t%s\t%s",
+ "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s",
argv[0],
argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "",
argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "",
argc > 5 ? argv[5] : "", argc > 6 ? argv[6] : "",
- argc > 7 ? argv[7] : "");
+ argc > 7 ? argv[7] : "", argc > 8 ? argv[8] : "");
if (os_snprintf_error(sizeof(cmd), res))
return -1;
cmd[sizeof(cmd) - 1] = '\0';
--
2.53.0
More information about the Hostap
mailing list