[PATCH] Adding p2p_device_random_mac_addr=2 to manage device drivers that create random MAC addresses

Macrì Alberto amacri at tiscali.it
Sun Jan 24 09:18:22 EST 2021


Adding option 2 to the "p2p_device_random_mac_addr" configuration option 
in order to support device drivers which use by default random MAC 
adresses when creating a new P2P Device interface (for instance, the 
BCM2711 80211 wireless device driver included in Raspberry Pi 4 Model 
B); in such case, this option allows to create the P2P Device interface 
correctly when using P2P permanent groups, enabling wpa_supplicant to 
reuse the same MAC address when re-invoking a P2P permanent group.

update_config=1 is required.

Some notes and the patch itself follow. Adding also it in attachment.

Regards

Alberto

----------------

NOTES

p2p_device_random_mac_addr=0

This is the default option and uses permanent MAC address (the one set by
default by the device driver). Notice that, if the device driver is 
configured
to always use random MAC adresses, this flag breaks reinvoking a persistent
group, so flags 1 or 2 should be used instead.

p2p_device_random_mac_addr=1

This option uses random MAC address on creating the interface if there is no
persistent group. Besides, if a persistent group is created,
p2p_device_persistent_mac_addr is set to the MAC address of the P2P Device
interface, so that this address will be subsequently used to change the MAC
address of the P2P Device interface. With no persistent group, the 
random MAC
address is created by wpa_supplicant, changing the one set by the device
driver. The device driver shall support SIOCGIFFLAGS/SIOCSIFFLAGS ioctl
interface control operations.

p2p_device_random_mac_addr=2

This flag should be used when the device driver uses random MAC addresses by
default when a P2P Device interface is created. If
p2p_device_persistent_mac_addr is set, use this MAC address on creating the
P2P Device interface. If not set, use the default method adopted by the
device driver (e.g., random MAC address). Besides, if a persistent group is
created, p2p_device_persistent_mac_addr is set to the MAC address of the P2P
Device interface, so that this address will be subsequently used in place of
the default address set by the device driver. (This option does not need
support of SIOCGIFFLAGS/SIOCSIFFLAGS ioctl interface control operations and
uses NL80211_ATTR_MAC).

Signed-off-by: Ircama <amacri at tiscali.it 
<http://lists.infradead.org/mailman/listinfo/hostap>>

---
  src/drivers/driver_nl80211.c    |  9 +++++++++
  wpa_supplicant/config.h         | 25 +++++++++++++++++++++++--
  wpa_supplicant/p2p_supplicant.c | 17 ++++++++++++++++-
  3 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 13ecd11d3..1eb65f9e7 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -5242,6 +5242,15 @@ static int nl80211_create_iface_once(struct 
wpa_driver_nl80211_data *drv,
      if (nla_put_flag(msg, NL80211_ATTR_IFACE_SOCKET_OWNER))
          goto fail;

+    if (addr && (iftype == NL80211_IFTYPE_P2P_DEVICE)) {
+        if(nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) {
+            wpa_printf(MSG_ERROR, "Failed to set MAC address " MACSTR
+                   " to P2P Device interface %s: %d (%s)",
+                   MAC2STR(addr), ifname, ret, strerror(-ret));
+            goto fail;
+        }
+    }
+
      ret = send_and_recv_msgs(drv, msg, handler, arg, NULL, NULL);
      msg = NULL;
      if (ret) {
diff --git a/wpa_supplicant/config.h b/wpa_supplicant/config.h
index 611b99318..09a802a52 100644
--- a/wpa_supplicant/config.h
+++ b/wpa_supplicant/config.h
@@ -1554,9 +1554,30 @@ struct wpa_config {
      /**
       * p2p_device_random_mac_addr - P2P Device MAC address policy default
       *
-     * 0 = use permanent MAC address
+     * 0 = use permanent MAC address (the one set by default by the device
+     *     driver). Notice that, if the device driver is configured to
+     *     always use random MAC adresses, this flag breaks reinvoking a
+     *     persistent group, so flags 1 or 2 should be used instead.
       * 1 = use random MAC address on creating the interface if there is no
-     * persistent groups.
+     *     persistent group. Besides, if a persistent group is created,
+     *     p2p_device_persistent_mac_addr is set to the MAC address of the
+     *     P2P Device interface, so that this address will be subsequently
+     *     used to change the MAC address of the P2P Device interface. With
+     *     no persistent group, the random MAC address is created by
+     *     wpa_supplicant, changing the one set by the device driver.
+     *     The device driver shall support SIOCGIFFLAGS/SIOCSIFFLAGS ioctl
+     *     interface control operations.
+     * 2 = this flag should be used when the device driver uses random MAC
+     *     addresses by default when a P2P Device interface is created.
+     *     If p2p_device_persistent_mac_addr is set, use this MAC address
+     *     on creating the P2P Device interface. If not set, use the
+     *     default method adopted by the device driver (e.g., random MAC
+     *     address). Besides, if a persistent group is created,
+     *     p2p_device_persistent_mac_addr is set to the MAC address of the
+     *     P2P Device interface, so that this address will be subsequently
+     *     used in place of the default address set by the device driver.
+     *     (This option does not need support of SIOCGIFFLAGS/SIOCSIFFLAGS
+     *     ioctl interface control operations and uses NL80211_ATTR_MAC).
       *
       * By default, permanent MAC address is used.
       */
diff --git a/wpa_supplicant/p2p_supplicant.c 
b/wpa_supplicant/p2p_supplicant.c
index a1eaaf128..6f27e6cc3 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -3980,6 +3980,7 @@ int wpas_p2p_add_p2pdev_interface(struct 
wpa_supplicant *wpa_s,
      char ifname[100];
      char force_name[100];
      int ret;
+    const u8 *if_addr = NULL;

      ret = os_snprintf(ifname, sizeof(ifname), P2P_MGMT_DEVICE_PREFIX "%s",
                wpa_s->ifname);
@@ -3991,7 +3992,12 @@ int wpas_p2p_add_p2pdev_interface(struct 
wpa_supplicant *wpa_s,
      ifname[IFNAMSIZ - 1] = '\0';
      force_name[0] = '\0';
      wpa_s->pending_interface_type = WPA_IF_P2P_DEVICE;
-    ret = wpa_drv_if_add(wpa_s, WPA_IF_P2P_DEVICE, ifname, NULL, NULL,
+
+    if (wpa_s->conf->p2p_device_random_mac_addr == 2 &&
+ !is_zero_ether_addr(wpa_s->conf->p2p_device_persistent_mac_addr))
+        if_addr = wpa_s->conf->p2p_device_persistent_mac_addr;
+
+    ret = wpa_drv_if_add(wpa_s, WPA_IF_P2P_DEVICE, ifname, if_addr, NULL,
                   force_name, wpa_s->pending_interface_addr, NULL);
      if (ret < 0) {
          wpa_printf(MSG_DEBUG, "P2P: Failed to create P2P Device 
interface");
@@ -4568,6 +4574,15 @@ int wpas_p2p_mac_setup(struct wpa_supplicant *wpa_s)
      if (wpa_s->conf->p2p_device_random_mac_addr == 0)
          return 0;

+    if (wpa_s->conf->p2p_device_random_mac_addr == 2) {
+        if 
(is_zero_ether_addr(wpa_s->conf->p2p_device_persistent_mac_addr) &&
+            !is_zero_ether_addr(wpa_s->own_addr)) {
+ os_memcpy(wpa_s->conf->p2p_device_persistent_mac_addr,
+                  wpa_s->own_addr, ETH_ALEN);
+        }
+        return 0;
+    }
+
      if (!wpa_s->conf->ssid) {
          if (random_mac_addr(addr) < 0) {
              wpa_msg(wpa_s, MSG_INFO,
-- 
2.25.1.windows.1

-------------- next part --------------
>From 2f32f74aff33241841d78f644b1efd2f3cc1643f Mon Sep 17 00:00:00 2001
From: Ircama <amacri at tiscali.it>
Date: Sun, 24 Jan 2021 14:38:54 +0100
Subject: [PATCH] Adding p2p_device_random_mac_addr=2 to manage default random
 MAC address

Adding option 2 to p2p_device_random_mac_addr in order to support
device drivers which use random MAC adresses by default. It should
be used to correctly create the P2P Device interface when using P2P permanent
groups.

p2p_device_random_mac_addr=0

This is the default option and uses permanent MAC address (the one set by
default by the device driver). Notice that, if the device driver is configured
to always use random MAC adresses, this flag breaks reinvoking a persistent
group, so flags 1 or 2 should be used instead.

p2p_device_random_mac_addr=1

This option uses random MAC address on creating the interface if there is no
persistent group. Besides, if a persistent group is created,
p2p_device_persistent_mac_addr is set to the MAC address of the P2P Device
interface, so that this address will be subsequently used to change the MAC
address of the P2P Device interface. With no persistent group, the random MAC
address is created by wpa_supplicant, changing the one set by the device
driver. The device driver shall support SIOCGIFFLAGS/SIOCSIFFLAGS ioctl
interface control operations.

p2p_device_random_mac_addr=2

This flag should be used when the device driver uses random MAC addresses by
default when a P2P Device interface is created. If
p2p_device_persistent_mac_addr is set, use this MAC address on creating the
P2P Device interface. If not set, use the default method adopted by the
device driver (e.g., random MAC address). Besides, if a persistent group is
created, p2p_device_persistent_mac_addr is set to the MAC address of the P2P
Device interface, so that this address will be subsequently used in place of
the default address set by the device driver. (This option does not need
support of SIOCGIFFLAGS/SIOCSIFFLAGS ioctl interface control operations and
uses NL80211_ATTR_MAC).
---
 src/drivers/driver_nl80211.c    |  9 +++++++++
 wpa_supplicant/config.h         | 25 +++++++++++++++++++++++--
 wpa_supplicant/p2p_supplicant.c | 17 ++++++++++++++++-
 3 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 13ecd11d3..1eb65f9e7 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -5242,6 +5242,15 @@ static int nl80211_create_iface_once(struct wpa_driver_nl80211_data *drv,
 	if (nla_put_flag(msg, NL80211_ATTR_IFACE_SOCKET_OWNER))
 		goto fail;
 
+	if (addr && (iftype == NL80211_IFTYPE_P2P_DEVICE)) {
+		if(nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) {
+			wpa_printf(MSG_ERROR, "Failed to set MAC address " MACSTR
+				   " to P2P Device interface %s: %d (%s)",
+				   MAC2STR(addr), ifname, ret, strerror(-ret));
+			goto fail;
+		}
+	}
+
 	ret = send_and_recv_msgs(drv, msg, handler, arg, NULL, NULL);
 	msg = NULL;
 	if (ret) {
diff --git a/wpa_supplicant/config.h b/wpa_supplicant/config.h
index 611b99318..09a802a52 100644
--- a/wpa_supplicant/config.h
+++ b/wpa_supplicant/config.h
@@ -1554,9 +1554,30 @@ struct wpa_config {
 	/**
 	 * p2p_device_random_mac_addr - P2P Device MAC address policy default
 	 *
-	 * 0 = use permanent MAC address
+	 * 0 = use permanent MAC address (the one set by default by the device
+	 *     driver). Notice that, if the device driver is configured to
+	 *     always use random MAC adresses, this flag breaks reinvoking a
+	 *     persistent group, so flags 1 or 2 should be used instead.
 	 * 1 = use random MAC address on creating the interface if there is no
-	 * persistent groups.
+	 *     persistent group. Besides, if a persistent group is created,
+	 *     p2p_device_persistent_mac_addr is set to the MAC address of the
+	 *     P2P Device interface, so that this address will be subsequently
+	 *     used to change the MAC address of the P2P Device interface. With
+	 *     no persistent group, the random MAC address is created by
+	 *     wpa_supplicant, changing the one set by the device driver.
+	 *     The device driver shall support SIOCGIFFLAGS/SIOCSIFFLAGS ioctl
+	 *     interface control operations.
+	 * 2 = this flag should be used when the device driver uses random MAC
+	 *     addresses by default when a P2P Device interface is created.
+	 *     If p2p_device_persistent_mac_addr is set, use this MAC address
+	 *     on creating the P2P Device interface. If not set, use the
+	 *     default method adopted by the device driver (e.g., random MAC
+	 *     address). Besides, if a persistent group is created,
+	 *     p2p_device_persistent_mac_addr is set to the MAC address of the
+	 *     P2P Device interface, so that this address will be subsequently
+	 *     used in place of the default address set by the device driver.
+	 *     (This option does not need support of SIOCGIFFLAGS/SIOCSIFFLAGS
+	 *     ioctl interface control operations and uses NL80211_ATTR_MAC).
 	 *
 	 * By default, permanent MAC address is used.
 	 */
diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index a1eaaf128..6f27e6cc3 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -3980,6 +3980,7 @@ int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s,
 	char ifname[100];
 	char force_name[100];
 	int ret;
+	const u8 *if_addr = NULL;
 
 	ret = os_snprintf(ifname, sizeof(ifname), P2P_MGMT_DEVICE_PREFIX "%s",
 			  wpa_s->ifname);
@@ -3991,7 +3992,12 @@ int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s,
 	ifname[IFNAMSIZ - 1] = '\0';
 	force_name[0] = '\0';
 	wpa_s->pending_interface_type = WPA_IF_P2P_DEVICE;
-	ret = wpa_drv_if_add(wpa_s, WPA_IF_P2P_DEVICE, ifname, NULL, NULL,
+
+	if (wpa_s->conf->p2p_device_random_mac_addr == 2 &&
+		!is_zero_ether_addr(wpa_s->conf->p2p_device_persistent_mac_addr))
+		if_addr = wpa_s->conf->p2p_device_persistent_mac_addr;
+
+	ret = wpa_drv_if_add(wpa_s, WPA_IF_P2P_DEVICE, ifname, if_addr, NULL,
 			     force_name, wpa_s->pending_interface_addr, NULL);
 	if (ret < 0) {
 		wpa_printf(MSG_DEBUG, "P2P: Failed to create P2P Device interface");
@@ -4568,6 +4574,15 @@ int wpas_p2p_mac_setup(struct wpa_supplicant *wpa_s)
 	if (wpa_s->conf->p2p_device_random_mac_addr == 0)
 		return 0;
 
+	if (wpa_s->conf->p2p_device_random_mac_addr == 2) {
+		if (is_zero_ether_addr(wpa_s->conf->p2p_device_persistent_mac_addr) &&
+			!is_zero_ether_addr(wpa_s->own_addr)) {
+			os_memcpy(wpa_s->conf->p2p_device_persistent_mac_addr,
+				  wpa_s->own_addr, ETH_ALEN);
+		}
+		return 0;
+	}
+
 	if (!wpa_s->conf->ssid) {
 		if (random_mac_addr(addr) < 0) {
 			wpa_msg(wpa_s, MSG_INFO,
-- 
2.25.1.windows.1



More information about the Hostap mailing list