b3515340736abf500007c2d5f9a7e3b306d0a1c5
[openwrt/svn-archive/archive.git] / package / network / services / hostapd / patches / 300-nl80211_multicall_fixes.patch
1 --- a/src/drivers/driver_nl80211.c
2 +++ b/src/drivers/driver_nl80211.c
3 @@ -754,7 +754,6 @@ nla_put_failure:
4 }
5
6
7 -#ifndef HOSTAPD
8 static int nl80211_get_macaddr(struct i802_bss *bss)
9 {
10 struct nl_msg *msg;
11 @@ -776,7 +775,6 @@ nla_put_failure:
12 nlmsg_free(msg);
13 return NL80211_IFTYPE_UNSPECIFIED;
14 }
15 -#endif /* HOSTAPD */
16
17
18 static int nl80211_register_beacons(struct wpa_driver_nl80211_data *drv,
19 @@ -3613,6 +3611,7 @@ static void * wpa_driver_nl80211_init(vo
20 drv->monitor_sock = -1;
21 drv->eapol_tx_sock = -1;
22 drv->ap_scan_as_station = NL80211_IFTYPE_UNSPECIFIED;
23 + drv->nlmode = NL80211_IFTYPE_STATION;
24
25 if (wpa_driver_nl80211_init_nl(drv)) {
26 os_free(drv);
27 @@ -4003,31 +4002,16 @@ static int i802_set_iface_flags(struct i
28
29
30 static int
31 -wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv)
32 +wpa_driver_nl80211_finish_drv_init_sta(struct wpa_driver_nl80211_data *drv,
33 + int *send_rfkill_event)
34 {
35 -#ifndef HOSTAPD
36 enum nl80211_iftype nlmode = NL80211_IFTYPE_STATION;
37 -#endif /* HOSTAPD */
38 struct i802_bss *bss = &drv->first_bss;
39 - int send_rfkill_event = 0;
40 int dynamic_if;
41
42 - drv->ifindex = if_nametoindex(bss->ifname);
43 - bss->ifindex = drv->ifindex;
44 - bss->wdev_id = drv->global->if_add_wdevid;
45 - bss->wdev_id_set = drv->global->if_add_wdevid_set;
46 -
47 dynamic_if = drv->ifindex == drv->global->if_add_ifindex;
48 dynamic_if = dynamic_if || drv->global->if_add_wdevid_set;
49 - drv->global->if_add_wdevid_set = 0;
50
51 - if (wpa_driver_nl80211_capa(drv))
52 - return -1;
53 -
54 - wpa_printf(MSG_DEBUG, "nl80211: interface %s in phy %s",
55 - bss->ifname, drv->phyname);
56 -
57 -#ifndef HOSTAPD
58 if (dynamic_if)
59 nlmode = nl80211_get_ifmode(bss);
60
61 @@ -4056,7 +4040,7 @@ wpa_driver_nl80211_finish_drv_init(struc
62 "interface '%s' due to rfkill",
63 bss->ifname);
64 drv->if_disabled = 1;
65 - send_rfkill_event = 1;
66 + *send_rfkill_event = 1;
67 } else {
68 wpa_printf(MSG_ERROR, "nl80211: Could not set "
69 "interface '%s' UP", bss->ifname);
70 @@ -4066,7 +4050,30 @@ wpa_driver_nl80211_finish_drv_init(struc
71
72 netlink_send_oper_ifla(drv->global->netlink, drv->ifindex,
73 1, IF_OPER_DORMANT);
74 -#endif /* HOSTAPD */
75 + return 0;
76 +}
77 +
78 +static int
79 +wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv)
80 +{
81 + struct i802_bss *bss = &drv->first_bss;
82 + int send_rfkill_event = 0;
83 +
84 + drv->ifindex = if_nametoindex(bss->ifname);
85 + bss->ifindex = drv->ifindex;
86 + bss->wdev_id = drv->global->if_add_wdevid;
87 + bss->wdev_id_set = drv->global->if_add_wdevid_set;
88 + drv->global->if_add_wdevid_set = 0;
89 +
90 + if (wpa_driver_nl80211_capa(drv))
91 + return -1;
92 +
93 + wpa_printf(MSG_DEBUG, "nl80211: interface %s in phy %s",
94 + bss->ifname, drv->phyname);
95 +
96 + if (drv->nlmode == NL80211_IFTYPE_STATION &&
97 + wpa_driver_nl80211_finish_drv_init_sta(drv, &send_rfkill_event))
98 + return -1;
99
100 if (linux_get_ifhwaddr(drv->global->ioctl_sock, bss->ifname,
101 bss->addr))