P2P: Adding option to manage device drivers creating random MAC addresses

Add option 2 to the p2p_device_random_mac_addr configuration option 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.

Signed-off-by: Ircama <amacri@tiscali.it>
This commit is contained in:
Ircama 2021-01-24 16:33:58 +01:00 committed by Jouni Malinen
parent a579642bc3
commit e79febb3f5
3 changed files with 45 additions and 3 deletions

View file

@ -5261,6 +5261,10 @@ static int nl80211_create_iface_once(struct wpa_driver_nl80211_data *drv,
if (nla_put_flag(msg, NL80211_ATTR_IFACE_SOCKET_OWNER)) if (nla_put_flag(msg, NL80211_ATTR_IFACE_SOCKET_OWNER))
goto fail; goto fail;
if ((addr && iftype == NL80211_IFTYPE_P2P_DEVICE) &&
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
goto fail;
ret = send_and_recv_msgs(drv, msg, handler, arg, NULL, NULL); ret = send_and_recv_msgs(drv, msg, handler, arg, NULL, NULL);
msg = NULL; msg = NULL;
if (ret) { if (ret) {

View file

@ -1554,9 +1554,31 @@ struct wpa_config {
/** /**
* p2p_device_random_mac_addr - P2P Device MAC address policy default * 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 addresses, this flag breaks reinvoking a
* persistent group, so flags 1 or 2 should be used instead with
* such drivers if persistent groups are used.
* 1 = use random MAC address on creating the interface if there is no * 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. * By default, permanent MAC address is used.
*/ */

View file

@ -3980,6 +3980,7 @@ int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s,
char ifname[100]; char ifname[100];
char force_name[100]; char force_name[100];
int ret; int ret;
const u8 *if_addr = NULL;
ret = os_snprintf(ifname, sizeof(ifname), P2P_MGMT_DEVICE_PREFIX "%s", ret = os_snprintf(ifname, sizeof(ifname), P2P_MGMT_DEVICE_PREFIX "%s",
wpa_s->ifname); wpa_s->ifname);
@ -3991,7 +3992,12 @@ int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s,
ifname[IFNAMSIZ - 1] = '\0'; ifname[IFNAMSIZ - 1] = '\0';
force_name[0] = '\0'; force_name[0] = '\0';
wpa_s->pending_interface_type = WPA_IF_P2P_DEVICE; 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); force_name, wpa_s->pending_interface_addr, NULL);
if (ret < 0) { if (ret < 0) {
wpa_printf(MSG_DEBUG, "P2P: Failed to create P2P Device interface"); wpa_printf(MSG_DEBUG, "P2P: Failed to create P2P Device interface");
@ -4568,6 +4574,16 @@ int wpas_p2p_mac_setup(struct wpa_supplicant *wpa_s)
if (wpa_s->conf->p2p_device_random_mac_addr == 0) if (wpa_s->conf->p2p_device_random_mac_addr == 0)
return 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 (!wpa_s->conf->ssid) {
if (random_mac_addr(addr) < 0) { if (random_mac_addr(addr) < 0) {
wpa_msg(wpa_s, MSG_INFO, wpa_msg(wpa_s, MSG_INFO,