[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