hostapd: fix wds interface address handling for multi-bssid (backport of r27823)
[openwrt-10.03/.git] / package / hostapd / patches / 780-wds_addr_fix.patch
1 --- a/src/drivers/driver_nl80211.c
2 +++ b/src/drivers/driver_nl80211.c
3 @@ -111,6 +111,7 @@ struct i802_bss {
4         struct wpa_driver_nl80211_data *drv;
5         struct i802_bss *next;
6         int ifindex;
7 +       u8 addr[ETH_ALEN];
8         char ifname[IFNAMSIZ + 1];
9         char brname[IFNAMSIZ];
10         unsigned int beacon_set:1;
11 @@ -121,7 +122,6 @@ struct i802_bss {
12  struct wpa_driver_nl80211_data {
13         struct nl80211_global *global;
14         struct dl_list list;
15 -       u8 addr[ETH_ALEN];
16         char phyname[32];
17         void *ctx;
18         struct netlink_data *netlink;
19 @@ -2111,7 +2111,7 @@ wpa_driver_nl80211_finish_drv_init(struc
20         if (wpa_driver_nl80211_capa(drv))
21                 return -1;
22  
23 -       if (linux_get_ifhwaddr(drv->ioctl_sock, bss->ifname, drv->addr))
24 +       if (linux_get_ifhwaddr(drv->ioctl_sock, bss->ifname, bss->addr))
25                 return -1;
26  
27         if (nl80211_register_action_frames(drv) < 0) {
28 @@ -5650,7 +5650,7 @@ static int i802_set_wds_sta(void *priv, 
29                 if (!if_nametoindex(name)) {
30                         if (nl80211_create_iface(drv, name,
31                                                  NL80211_IFTYPE_AP_VLAN,
32 -                                                NULL, 1) < 0)
33 +                                                bss->addr, 1) < 0)
34                                 return -1;
35                         if (bridge_ifname &&
36                             linux_br_add_if(drv->ioctl_sock, bridge_ifname,
37 @@ -5878,7 +5878,7 @@ static int nl80211_addr_in_use(struct nl
38         struct wpa_driver_nl80211_data *drv;
39         dl_list_for_each(drv, &global->interfaces,
40                          struct wpa_driver_nl80211_data, list) {
41 -               if (os_memcmp(addr, drv->addr, ETH_ALEN) == 0)
42 +               if (os_memcmp(addr, drv->first_bss.addr, ETH_ALEN) == 0)
43                         return 1;
44         }
45         return 0;
46 @@ -5893,9 +5893,9 @@ static int nl80211_p2p_interface_addr(st
47         if (!drv->global)
48                 return -1;
49  
50 -       os_memcpy(new_addr, drv->addr, ETH_ALEN);
51 +       os_memcpy(new_addr, drv->first_bss.addr, ETH_ALEN);
52         for (idx = 0; idx < 64; idx++) {
53 -               new_addr[0] = drv->addr[0] | 0x02;
54 +               new_addr[0] = drv->first_bss.addr[0] | 0x02;
55                 new_addr[0] ^= idx << 2;
56                 if (!nl80211_addr_in_use(drv->global, new_addr))
57                         break;
58 @@ -5980,6 +5980,8 @@ static int wpa_driver_nl80211_if_add(voi
59         }
60  #endif /* CONFIG_P2P */
61  
62 +       memcpy(new_bss->addr, addr ? addr : if_addr, ETH_ALEN);
63 +
64  #ifdef HOSTAPD
65         if (bridge &&
66             i802_check_bridge(drv, new_bss, bridge, ifname) < 0) {