--- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -111,6 +111,7 @@ struct i802_bss { struct wpa_driver_nl80211_data *drv; struct i802_bss *next; int ifindex; + u8 addr[ETH_ALEN]; char ifname[IFNAMSIZ + 1]; char brname[IFNAMSIZ]; unsigned int beacon_set:1; @@ -121,7 +122,6 @@ struct i802_bss { struct wpa_driver_nl80211_data { struct nl80211_global *global; struct dl_list list; - u8 addr[ETH_ALEN]; char phyname[32]; void *ctx; struct netlink_data *netlink; @@ -2111,7 +2111,7 @@ wpa_driver_nl80211_finish_drv_init(struc if (wpa_driver_nl80211_capa(drv)) return -1; - if (linux_get_ifhwaddr(drv->ioctl_sock, bss->ifname, drv->addr)) + if (linux_get_ifhwaddr(drv->ioctl_sock, bss->ifname, bss->addr)) return -1; if (nl80211_register_action_frames(drv) < 0) { @@ -5650,7 +5650,7 @@ static int i802_set_wds_sta(void *priv, if (!if_nametoindex(name)) { if (nl80211_create_iface(drv, name, NL80211_IFTYPE_AP_VLAN, - NULL, 1) < 0) + bss->addr, 1) < 0) return -1; if (bridge_ifname && linux_br_add_if(drv->ioctl_sock, bridge_ifname, @@ -5878,7 +5878,7 @@ static int nl80211_addr_in_use(struct nl struct wpa_driver_nl80211_data *drv; dl_list_for_each(drv, &global->interfaces, struct wpa_driver_nl80211_data, list) { - if (os_memcmp(addr, drv->addr, ETH_ALEN) == 0) + if (os_memcmp(addr, drv->first_bss.addr, ETH_ALEN) == 0) return 1; } return 0; @@ -5893,9 +5893,9 @@ static int nl80211_p2p_interface_addr(st if (!drv->global) return -1; - os_memcpy(new_addr, drv->addr, ETH_ALEN); + os_memcpy(new_addr, drv->first_bss.addr, ETH_ALEN); for (idx = 0; idx < 64; idx++) { - new_addr[0] = drv->addr[0] | 0x02; + new_addr[0] = drv->first_bss.addr[0] | 0x02; new_addr[0] ^= idx << 2; if (!nl80211_addr_in_use(drv->global, new_addr)) break; @@ -5996,6 +5996,7 @@ static int wpa_driver_nl80211_if_add(voi os_free(new_bss); return -1; } + memcpy(new_bss->addr, addr ? addr : if_addr, ETH_ALEN); os_strlcpy(new_bss->ifname, ifname, IFNAMSIZ); new_bss->ifindex = ifidx; new_bss->drv = drv;