hostapd: Allow ACS to be offloaded to the driver
[mech_eap.git] / src / drivers / driver_nl80211_event.c
1 /*
2  * Driver interaction with Linux nl80211/cfg80211 - Event processing
3  * Copyright (c) 2002-2014, Jouni Malinen <j@w1.fi>
4  * Copyright (c) 2007, Johannes Berg <johannes@sipsolutions.net>
5  * Copyright (c) 2009-2010, Atheros Communications
6  *
7  * This software may be distributed under the terms of the BSD license.
8  * See README for more details.
9  */
10
11 #include "includes.h"
12 #include <netlink/genl/genl.h>
13
14 #include "utils/common.h"
15 #include "utils/eloop.h"
16 #include "common/qca-vendor.h"
17 #include "common/qca-vendor-attr.h"
18 #include "common/ieee802_11_defs.h"
19 #include "common/ieee802_11_common.h"
20 #include "driver_nl80211.h"
21
22
23 static const char * nl80211_command_to_string(enum nl80211_commands cmd)
24 {
25 #define C2S(x) case x: return #x;
26         switch (cmd) {
27         C2S(NL80211_CMD_UNSPEC)
28         C2S(NL80211_CMD_GET_WIPHY)
29         C2S(NL80211_CMD_SET_WIPHY)
30         C2S(NL80211_CMD_NEW_WIPHY)
31         C2S(NL80211_CMD_DEL_WIPHY)
32         C2S(NL80211_CMD_GET_INTERFACE)
33         C2S(NL80211_CMD_SET_INTERFACE)
34         C2S(NL80211_CMD_NEW_INTERFACE)
35         C2S(NL80211_CMD_DEL_INTERFACE)
36         C2S(NL80211_CMD_GET_KEY)
37         C2S(NL80211_CMD_SET_KEY)
38         C2S(NL80211_CMD_NEW_KEY)
39         C2S(NL80211_CMD_DEL_KEY)
40         C2S(NL80211_CMD_GET_BEACON)
41         C2S(NL80211_CMD_SET_BEACON)
42         C2S(NL80211_CMD_START_AP)
43         C2S(NL80211_CMD_STOP_AP)
44         C2S(NL80211_CMD_GET_STATION)
45         C2S(NL80211_CMD_SET_STATION)
46         C2S(NL80211_CMD_NEW_STATION)
47         C2S(NL80211_CMD_DEL_STATION)
48         C2S(NL80211_CMD_GET_MPATH)
49         C2S(NL80211_CMD_SET_MPATH)
50         C2S(NL80211_CMD_NEW_MPATH)
51         C2S(NL80211_CMD_DEL_MPATH)
52         C2S(NL80211_CMD_SET_BSS)
53         C2S(NL80211_CMD_SET_REG)
54         C2S(NL80211_CMD_REQ_SET_REG)
55         C2S(NL80211_CMD_GET_MESH_CONFIG)
56         C2S(NL80211_CMD_SET_MESH_CONFIG)
57         C2S(NL80211_CMD_SET_MGMT_EXTRA_IE)
58         C2S(NL80211_CMD_GET_REG)
59         C2S(NL80211_CMD_GET_SCAN)
60         C2S(NL80211_CMD_TRIGGER_SCAN)
61         C2S(NL80211_CMD_NEW_SCAN_RESULTS)
62         C2S(NL80211_CMD_SCAN_ABORTED)
63         C2S(NL80211_CMD_REG_CHANGE)
64         C2S(NL80211_CMD_AUTHENTICATE)
65         C2S(NL80211_CMD_ASSOCIATE)
66         C2S(NL80211_CMD_DEAUTHENTICATE)
67         C2S(NL80211_CMD_DISASSOCIATE)
68         C2S(NL80211_CMD_MICHAEL_MIC_FAILURE)
69         C2S(NL80211_CMD_REG_BEACON_HINT)
70         C2S(NL80211_CMD_JOIN_IBSS)
71         C2S(NL80211_CMD_LEAVE_IBSS)
72         C2S(NL80211_CMD_TESTMODE)
73         C2S(NL80211_CMD_CONNECT)
74         C2S(NL80211_CMD_ROAM)
75         C2S(NL80211_CMD_DISCONNECT)
76         C2S(NL80211_CMD_SET_WIPHY_NETNS)
77         C2S(NL80211_CMD_GET_SURVEY)
78         C2S(NL80211_CMD_NEW_SURVEY_RESULTS)
79         C2S(NL80211_CMD_SET_PMKSA)
80         C2S(NL80211_CMD_DEL_PMKSA)
81         C2S(NL80211_CMD_FLUSH_PMKSA)
82         C2S(NL80211_CMD_REMAIN_ON_CHANNEL)
83         C2S(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL)
84         C2S(NL80211_CMD_SET_TX_BITRATE_MASK)
85         C2S(NL80211_CMD_REGISTER_FRAME)
86         C2S(NL80211_CMD_FRAME)
87         C2S(NL80211_CMD_FRAME_TX_STATUS)
88         C2S(NL80211_CMD_SET_POWER_SAVE)
89         C2S(NL80211_CMD_GET_POWER_SAVE)
90         C2S(NL80211_CMD_SET_CQM)
91         C2S(NL80211_CMD_NOTIFY_CQM)
92         C2S(NL80211_CMD_SET_CHANNEL)
93         C2S(NL80211_CMD_SET_WDS_PEER)
94         C2S(NL80211_CMD_FRAME_WAIT_CANCEL)
95         C2S(NL80211_CMD_JOIN_MESH)
96         C2S(NL80211_CMD_LEAVE_MESH)
97         C2S(NL80211_CMD_UNPROT_DEAUTHENTICATE)
98         C2S(NL80211_CMD_UNPROT_DISASSOCIATE)
99         C2S(NL80211_CMD_NEW_PEER_CANDIDATE)
100         C2S(NL80211_CMD_GET_WOWLAN)
101         C2S(NL80211_CMD_SET_WOWLAN)
102         C2S(NL80211_CMD_START_SCHED_SCAN)
103         C2S(NL80211_CMD_STOP_SCHED_SCAN)
104         C2S(NL80211_CMD_SCHED_SCAN_RESULTS)
105         C2S(NL80211_CMD_SCHED_SCAN_STOPPED)
106         C2S(NL80211_CMD_SET_REKEY_OFFLOAD)
107         C2S(NL80211_CMD_PMKSA_CANDIDATE)
108         C2S(NL80211_CMD_TDLS_OPER)
109         C2S(NL80211_CMD_TDLS_MGMT)
110         C2S(NL80211_CMD_UNEXPECTED_FRAME)
111         C2S(NL80211_CMD_PROBE_CLIENT)
112         C2S(NL80211_CMD_REGISTER_BEACONS)
113         C2S(NL80211_CMD_UNEXPECTED_4ADDR_FRAME)
114         C2S(NL80211_CMD_SET_NOACK_MAP)
115         C2S(NL80211_CMD_CH_SWITCH_NOTIFY)
116         C2S(NL80211_CMD_START_P2P_DEVICE)
117         C2S(NL80211_CMD_STOP_P2P_DEVICE)
118         C2S(NL80211_CMD_CONN_FAILED)
119         C2S(NL80211_CMD_SET_MCAST_RATE)
120         C2S(NL80211_CMD_SET_MAC_ACL)
121         C2S(NL80211_CMD_RADAR_DETECT)
122         C2S(NL80211_CMD_GET_PROTOCOL_FEATURES)
123         C2S(NL80211_CMD_UPDATE_FT_IES)
124         C2S(NL80211_CMD_FT_EVENT)
125         C2S(NL80211_CMD_CRIT_PROTOCOL_START)
126         C2S(NL80211_CMD_CRIT_PROTOCOL_STOP)
127         C2S(NL80211_CMD_GET_COALESCE)
128         C2S(NL80211_CMD_SET_COALESCE)
129         C2S(NL80211_CMD_CHANNEL_SWITCH)
130         C2S(NL80211_CMD_VENDOR)
131         C2S(NL80211_CMD_SET_QOS_MAP)
132         C2S(NL80211_CMD_ADD_TX_TS)
133         C2S(NL80211_CMD_DEL_TX_TS)
134         default:
135                 return "NL80211_CMD_UNKNOWN";
136         }
137 #undef C2S
138 }
139
140
141 static void mlme_event_auth(struct wpa_driver_nl80211_data *drv,
142                             const u8 *frame, size_t len)
143 {
144         const struct ieee80211_mgmt *mgmt;
145         union wpa_event_data event;
146
147         if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME) &&
148             drv->force_connect_cmd) {
149                 /*
150                  * Avoid reporting two association events that would confuse
151                  * the core code.
152                  */
153                 wpa_printf(MSG_DEBUG,
154                            "nl80211: Ignore auth event when using driver SME");
155                 return;
156         }
157
158         wpa_printf(MSG_DEBUG, "nl80211: Authenticate event");
159         mgmt = (const struct ieee80211_mgmt *) frame;
160         if (len < 24 + sizeof(mgmt->u.auth)) {
161                 wpa_printf(MSG_DEBUG, "nl80211: Too short association event "
162                            "frame");
163                 return;
164         }
165
166         os_memcpy(drv->auth_bssid, mgmt->sa, ETH_ALEN);
167         os_memset(drv->auth_attempt_bssid, 0, ETH_ALEN);
168         os_memset(&event, 0, sizeof(event));
169         os_memcpy(event.auth.peer, mgmt->sa, ETH_ALEN);
170         event.auth.auth_type = le_to_host16(mgmt->u.auth.auth_alg);
171         event.auth.auth_transaction =
172                 le_to_host16(mgmt->u.auth.auth_transaction);
173         event.auth.status_code = le_to_host16(mgmt->u.auth.status_code);
174         if (len > 24 + sizeof(mgmt->u.auth)) {
175                 event.auth.ies = mgmt->u.auth.variable;
176                 event.auth.ies_len = len - 24 - sizeof(mgmt->u.auth);
177         }
178
179         wpa_supplicant_event(drv->ctx, EVENT_AUTH, &event);
180 }
181
182
183 static int nl80211_parse_wmm_params(struct nlattr *wmm_attr,
184                                     struct wmm_params *wmm_params)
185 {
186         struct nlattr *wmm_info[NL80211_STA_WME_MAX + 1];
187         static struct nla_policy wme_policy[NL80211_STA_WME_MAX + 1] = {
188                 [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 },
189         };
190
191         if (!wmm_attr) {
192                 wpa_printf(MSG_DEBUG, "nl80211: WMM data missing");
193                 return -1;
194         }
195
196         if (nla_parse_nested(wmm_info, NL80211_STA_WME_MAX, wmm_attr,
197                              wme_policy)) {
198                 wpa_printf(MSG_DEBUG,
199                            "nl80211: Failed to parse nested attributes");
200                 return -1;
201         }
202
203         if (!wmm_info[NL80211_STA_WME_UAPSD_QUEUES])
204                 return -1;
205
206         wmm_params->uapsd_queues =
207                 nla_get_u8(wmm_info[NL80211_STA_WME_UAPSD_QUEUES]);
208         wmm_params->info_bitmap |= WMM_PARAMS_UAPSD_QUEUES_INFO;
209
210         return 0;
211 }
212
213
214 static void mlme_event_assoc(struct wpa_driver_nl80211_data *drv,
215                             const u8 *frame, size_t len, struct nlattr *wmm)
216 {
217         const struct ieee80211_mgmt *mgmt;
218         union wpa_event_data event;
219         u16 status;
220
221         if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME) &&
222             drv->force_connect_cmd) {
223                 /*
224                  * Avoid reporting two association events that would confuse
225                  * the core code.
226                  */
227                 wpa_printf(MSG_DEBUG,
228                            "nl80211: Ignore assoc event when using driver SME");
229                 return;
230         }
231
232         wpa_printf(MSG_DEBUG, "nl80211: Associate event");
233         mgmt = (const struct ieee80211_mgmt *) frame;
234         if (len < 24 + sizeof(mgmt->u.assoc_resp)) {
235                 wpa_printf(MSG_DEBUG, "nl80211: Too short association event "
236                            "frame");
237                 return;
238         }
239
240         status = le_to_host16(mgmt->u.assoc_resp.status_code);
241         if (status != WLAN_STATUS_SUCCESS) {
242                 os_memset(&event, 0, sizeof(event));
243                 event.assoc_reject.bssid = mgmt->bssid;
244                 if (len > 24 + sizeof(mgmt->u.assoc_resp)) {
245                         event.assoc_reject.resp_ies =
246                                 (u8 *) mgmt->u.assoc_resp.variable;
247                         event.assoc_reject.resp_ies_len =
248                                 len - 24 - sizeof(mgmt->u.assoc_resp);
249                 }
250                 event.assoc_reject.status_code = status;
251
252                 wpa_supplicant_event(drv->ctx, EVENT_ASSOC_REJECT, &event);
253                 return;
254         }
255
256         drv->associated = 1;
257         os_memcpy(drv->bssid, mgmt->sa, ETH_ALEN);
258         os_memcpy(drv->prev_bssid, mgmt->sa, ETH_ALEN);
259
260         os_memset(&event, 0, sizeof(event));
261         if (len > 24 + sizeof(mgmt->u.assoc_resp)) {
262                 event.assoc_info.resp_ies = (u8 *) mgmt->u.assoc_resp.variable;
263                 event.assoc_info.resp_ies_len =
264                         len - 24 - sizeof(mgmt->u.assoc_resp);
265         }
266
267         event.assoc_info.freq = drv->assoc_freq;
268
269         nl80211_parse_wmm_params(wmm, &event.assoc_info.wmm_params);
270
271         wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event);
272 }
273
274
275 static void mlme_event_connect(struct wpa_driver_nl80211_data *drv,
276                                enum nl80211_commands cmd, struct nlattr *status,
277                                struct nlattr *addr, struct nlattr *req_ie,
278                                struct nlattr *resp_ie,
279                                struct nlattr *authorized,
280                                struct nlattr *key_replay_ctr,
281                                struct nlattr *ptk_kck,
282                                struct nlattr *ptk_kek)
283 {
284         union wpa_event_data event;
285
286         if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) {
287                 /*
288                  * Avoid reporting two association events that would confuse
289                  * the core code.
290                  */
291                 wpa_printf(MSG_DEBUG, "nl80211: Ignore connect event (cmd=%d) "
292                            "when using userspace SME", cmd);
293                 return;
294         }
295
296         if (cmd == NL80211_CMD_CONNECT)
297                 wpa_printf(MSG_DEBUG, "nl80211: Connect event");
298         else if (cmd == NL80211_CMD_ROAM)
299                 wpa_printf(MSG_DEBUG, "nl80211: Roam event");
300
301         os_memset(&event, 0, sizeof(event));
302         if (cmd == NL80211_CMD_CONNECT &&
303             nla_get_u16(status) != WLAN_STATUS_SUCCESS) {
304                 if (addr)
305                         event.assoc_reject.bssid = nla_data(addr);
306                 if (resp_ie) {
307                         event.assoc_reject.resp_ies = nla_data(resp_ie);
308                         event.assoc_reject.resp_ies_len = nla_len(resp_ie);
309                 }
310                 event.assoc_reject.status_code = nla_get_u16(status);
311                 wpa_supplicant_event(drv->ctx, EVENT_ASSOC_REJECT, &event);
312                 return;
313         }
314
315         drv->associated = 1;
316         if (addr) {
317                 os_memcpy(drv->bssid, nla_data(addr), ETH_ALEN);
318                 os_memcpy(drv->prev_bssid, drv->bssid, ETH_ALEN);
319         }
320
321         if (req_ie) {
322                 event.assoc_info.req_ies = nla_data(req_ie);
323                 event.assoc_info.req_ies_len = nla_len(req_ie);
324         }
325         if (resp_ie) {
326                 event.assoc_info.resp_ies = nla_data(resp_ie);
327                 event.assoc_info.resp_ies_len = nla_len(resp_ie);
328         }
329
330         event.assoc_info.freq = nl80211_get_assoc_freq(drv);
331
332         if (authorized && nla_get_u8(authorized)) {
333                 event.assoc_info.authorized = 1;
334                 wpa_printf(MSG_DEBUG, "nl80211: connection authorized");
335         }
336         if (key_replay_ctr) {
337                 event.assoc_info.key_replay_ctr = nla_data(key_replay_ctr);
338                 event.assoc_info.key_replay_ctr_len = nla_len(key_replay_ctr);
339         }
340         if (ptk_kck) {
341                 event.assoc_info.ptk_kck = nla_data(ptk_kck);
342                 event.assoc_info.ptk_kck_len = nla_len(ptk_kck);
343         }
344         if (ptk_kek) {
345                 event.assoc_info.ptk_kek = nla_data(ptk_kek);
346                 event.assoc_info.ptk_kek_len = nla_len(ptk_kek);
347         }
348
349         wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event);
350 }
351
352
353 static void mlme_event_disconnect(struct wpa_driver_nl80211_data *drv,
354                                   struct nlattr *reason, struct nlattr *addr,
355                                   struct nlattr *by_ap)
356 {
357         union wpa_event_data data;
358         unsigned int locally_generated = by_ap == NULL;
359
360         if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) {
361                 /*
362                  * Avoid reporting two disassociation events that could
363                  * confuse the core code.
364                  */
365                 wpa_printf(MSG_DEBUG, "nl80211: Ignore disconnect "
366                            "event when using userspace SME");
367                 return;
368         }
369
370         if (drv->ignore_next_local_disconnect) {
371                 drv->ignore_next_local_disconnect = 0;
372                 if (locally_generated) {
373                         wpa_printf(MSG_DEBUG, "nl80211: Ignore disconnect "
374                                    "event triggered during reassociation");
375                         return;
376                 }
377                 wpa_printf(MSG_WARNING, "nl80211: Was expecting local "
378                            "disconnect but got another disconnect "
379                            "event first");
380         }
381
382         wpa_printf(MSG_DEBUG, "nl80211: Disconnect event");
383         nl80211_mark_disconnected(drv);
384         os_memset(&data, 0, sizeof(data));
385         if (reason)
386                 data.deauth_info.reason_code = nla_get_u16(reason);
387         data.deauth_info.locally_generated = by_ap == NULL;
388         wpa_supplicant_event(drv->ctx, EVENT_DEAUTH, &data);
389 }
390
391
392 static int calculate_chan_offset(int width, int freq, int cf1, int cf2)
393 {
394         int freq1 = 0;
395
396         switch (convert2width(width)) {
397         case CHAN_WIDTH_20_NOHT:
398         case CHAN_WIDTH_20:
399                 return 0;
400         case CHAN_WIDTH_40:
401                 freq1 = cf1 - 10;
402                 break;
403         case CHAN_WIDTH_80:
404                 freq1 = cf1 - 30;
405                 break;
406         case CHAN_WIDTH_160:
407                 freq1 = cf1 - 70;
408                 break;
409         case CHAN_WIDTH_UNKNOWN:
410         case CHAN_WIDTH_80P80:
411                 /* FIXME: implement this */
412                 return 0;
413         }
414
415         return (abs(freq - freq1) / 20) % 2 == 0 ? 1 : -1;
416 }
417
418
419 static void mlme_event_ch_switch(struct wpa_driver_nl80211_data *drv,
420                                  struct nlattr *ifindex, struct nlattr *freq,
421                                  struct nlattr *type, struct nlattr *bw,
422                                  struct nlattr *cf1, struct nlattr *cf2)
423 {
424         struct i802_bss *bss;
425         union wpa_event_data data;
426         int ht_enabled = 1;
427         int chan_offset = 0;
428         int ifidx;
429
430         wpa_printf(MSG_DEBUG, "nl80211: Channel switch event");
431
432         if (!freq)
433                 return;
434
435         ifidx = nla_get_u32(ifindex);
436         bss = get_bss_ifindex(drv, ifidx);
437         if (bss == NULL) {
438                 wpa_printf(MSG_WARNING, "nl80211: Unknown ifindex (%d) for channel switch, ignoring",
439                            ifidx);
440                 return;
441         }
442
443         if (type) {
444                 enum nl80211_channel_type ch_type = nla_get_u32(type);
445
446                 wpa_printf(MSG_DEBUG, "nl80211: Channel type: %d", ch_type);
447                 switch (ch_type) {
448                 case NL80211_CHAN_NO_HT:
449                         ht_enabled = 0;
450                         break;
451                 case NL80211_CHAN_HT20:
452                         break;
453                 case NL80211_CHAN_HT40PLUS:
454                         chan_offset = 1;
455                         break;
456                 case NL80211_CHAN_HT40MINUS:
457                         chan_offset = -1;
458                         break;
459                 }
460         } else if (bw && cf1) {
461                 /* This can happen for example with VHT80 ch switch */
462                 chan_offset = calculate_chan_offset(nla_get_u32(bw),
463                                                     nla_get_u32(freq),
464                                                     nla_get_u32(cf1),
465                                                     cf2 ? nla_get_u32(cf2) : 0);
466         } else {
467                 wpa_printf(MSG_WARNING, "nl80211: Unknown secondary channel information - following channel definition calculations may fail");
468         }
469
470         os_memset(&data, 0, sizeof(data));
471         data.ch_switch.freq = nla_get_u32(freq);
472         data.ch_switch.ht_enabled = ht_enabled;
473         data.ch_switch.ch_offset = chan_offset;
474         if (bw)
475                 data.ch_switch.ch_width = convert2width(nla_get_u32(bw));
476         if (cf1)
477                 data.ch_switch.cf1 = nla_get_u32(cf1);
478         if (cf2)
479                 data.ch_switch.cf2 = nla_get_u32(cf2);
480
481         bss->freq = data.ch_switch.freq;
482
483         wpa_supplicant_event(bss->ctx, EVENT_CH_SWITCH, &data);
484 }
485
486
487 static void mlme_timeout_event(struct wpa_driver_nl80211_data *drv,
488                                enum nl80211_commands cmd, struct nlattr *addr)
489 {
490         union wpa_event_data event;
491         enum wpa_event_type ev;
492
493         if (nla_len(addr) != ETH_ALEN)
494                 return;
495
496         wpa_printf(MSG_DEBUG, "nl80211: MLME event %d; timeout with " MACSTR,
497                    cmd, MAC2STR((u8 *) nla_data(addr)));
498
499         if (cmd == NL80211_CMD_AUTHENTICATE)
500                 ev = EVENT_AUTH_TIMED_OUT;
501         else if (cmd == NL80211_CMD_ASSOCIATE)
502                 ev = EVENT_ASSOC_TIMED_OUT;
503         else
504                 return;
505
506         os_memset(&event, 0, sizeof(event));
507         os_memcpy(event.timeout_event.addr, nla_data(addr), ETH_ALEN);
508         wpa_supplicant_event(drv->ctx, ev, &event);
509 }
510
511
512 static void mlme_event_mgmt(struct i802_bss *bss,
513                             struct nlattr *freq, struct nlattr *sig,
514                             const u8 *frame, size_t len)
515 {
516         struct wpa_driver_nl80211_data *drv = bss->drv;
517         const struct ieee80211_mgmt *mgmt;
518         union wpa_event_data event;
519         u16 fc, stype;
520         int ssi_signal = 0;
521         int rx_freq = 0;
522
523         wpa_printf(MSG_MSGDUMP, "nl80211: Frame event");
524         mgmt = (const struct ieee80211_mgmt *) frame;
525         if (len < 24) {
526                 wpa_printf(MSG_DEBUG, "nl80211: Too short management frame");
527                 return;
528         }
529
530         fc = le_to_host16(mgmt->frame_control);
531         stype = WLAN_FC_GET_STYPE(fc);
532
533         if (sig)
534                 ssi_signal = (s32) nla_get_u32(sig);
535
536         os_memset(&event, 0, sizeof(event));
537         if (freq) {
538                 event.rx_mgmt.freq = nla_get_u32(freq);
539                 rx_freq = drv->last_mgmt_freq = event.rx_mgmt.freq;
540         }
541         wpa_printf(MSG_DEBUG,
542                    "nl80211: RX frame sa=" MACSTR
543                    " freq=%d ssi_signal=%d stype=%u (%s) len=%u",
544                    MAC2STR(mgmt->sa), rx_freq, ssi_signal, stype, fc2str(fc),
545                    (unsigned int) len);
546         event.rx_mgmt.frame = frame;
547         event.rx_mgmt.frame_len = len;
548         event.rx_mgmt.ssi_signal = ssi_signal;
549         event.rx_mgmt.drv_priv = bss;
550         wpa_supplicant_event(drv->ctx, EVENT_RX_MGMT, &event);
551 }
552
553
554 static void mlme_event_mgmt_tx_status(struct wpa_driver_nl80211_data *drv,
555                                       struct nlattr *cookie, const u8 *frame,
556                                       size_t len, struct nlattr *ack)
557 {
558         union wpa_event_data event;
559         const struct ieee80211_hdr *hdr;
560         u16 fc;
561
562         wpa_printf(MSG_DEBUG, "nl80211: Frame TX status event");
563         if (!is_ap_interface(drv->nlmode)) {
564                 u64 cookie_val;
565
566                 if (!cookie)
567                         return;
568
569                 cookie_val = nla_get_u64(cookie);
570                 wpa_printf(MSG_DEBUG, "nl80211: Action TX status:"
571                            " cookie=0%llx%s (ack=%d)",
572                            (long long unsigned int) cookie_val,
573                            cookie_val == drv->send_action_cookie ?
574                            " (match)" : " (unknown)", ack != NULL);
575                 if (cookie_val != drv->send_action_cookie)
576                         return;
577         }
578
579         hdr = (const struct ieee80211_hdr *) frame;
580         fc = le_to_host16(hdr->frame_control);
581
582         os_memset(&event, 0, sizeof(event));
583         event.tx_status.type = WLAN_FC_GET_TYPE(fc);
584         event.tx_status.stype = WLAN_FC_GET_STYPE(fc);
585         event.tx_status.dst = hdr->addr1;
586         event.tx_status.data = frame;
587         event.tx_status.data_len = len;
588         event.tx_status.ack = ack != NULL;
589         wpa_supplicant_event(drv->ctx, EVENT_TX_STATUS, &event);
590 }
591
592
593 static void mlme_event_deauth_disassoc(struct wpa_driver_nl80211_data *drv,
594                                        enum wpa_event_type type,
595                                        const u8 *frame, size_t len)
596 {
597         const struct ieee80211_mgmt *mgmt;
598         union wpa_event_data event;
599         const u8 *bssid = NULL;
600         u16 reason_code = 0;
601
602         if (type == EVENT_DEAUTH)
603                 wpa_printf(MSG_DEBUG, "nl80211: Deauthenticate event");
604         else
605                 wpa_printf(MSG_DEBUG, "nl80211: Disassociate event");
606
607         mgmt = (const struct ieee80211_mgmt *) frame;
608         if (len >= 24) {
609                 bssid = mgmt->bssid;
610
611                 if ((drv->capa.flags & WPA_DRIVER_FLAGS_SME) &&
612                     !drv->associated &&
613                     os_memcmp(bssid, drv->auth_bssid, ETH_ALEN) != 0 &&
614                     os_memcmp(bssid, drv->auth_attempt_bssid, ETH_ALEN) != 0 &&
615                     os_memcmp(bssid, drv->prev_bssid, ETH_ALEN) == 0) {
616                         /*
617                          * Avoid issues with some roaming cases where
618                          * disconnection event for the old AP may show up after
619                          * we have started connection with the new AP.
620                          */
621                         wpa_printf(MSG_DEBUG, "nl80211: Ignore deauth/disassoc event from old AP " MACSTR " when already authenticating with " MACSTR,
622                                    MAC2STR(bssid),
623                                    MAC2STR(drv->auth_attempt_bssid));
624                         return;
625                 }
626
627                 if (drv->associated != 0 &&
628                     os_memcmp(bssid, drv->bssid, ETH_ALEN) != 0 &&
629                     os_memcmp(bssid, drv->auth_bssid, ETH_ALEN) != 0) {
630                         /*
631                          * We have presumably received this deauth as a
632                          * response to a clear_state_mismatch() outgoing
633                          * deauth.  Don't let it take us offline!
634                          */
635                         wpa_printf(MSG_DEBUG, "nl80211: Deauth received "
636                                    "from Unknown BSSID " MACSTR " -- ignoring",
637                                    MAC2STR(bssid));
638                         return;
639                 }
640         }
641
642         nl80211_mark_disconnected(drv);
643         os_memset(&event, 0, sizeof(event));
644
645         /* Note: Same offset for Reason Code in both frame subtypes */
646         if (len >= 24 + sizeof(mgmt->u.deauth))
647                 reason_code = le_to_host16(mgmt->u.deauth.reason_code);
648
649         if (type == EVENT_DISASSOC) {
650                 event.disassoc_info.locally_generated =
651                         !os_memcmp(mgmt->sa, drv->first_bss->addr, ETH_ALEN);
652                 event.disassoc_info.addr = bssid;
653                 event.disassoc_info.reason_code = reason_code;
654                 if (frame + len > mgmt->u.disassoc.variable) {
655                         event.disassoc_info.ie = mgmt->u.disassoc.variable;
656                         event.disassoc_info.ie_len = frame + len -
657                                 mgmt->u.disassoc.variable;
658                 }
659         } else {
660                 if (drv->ignore_deauth_event) {
661                         wpa_printf(MSG_DEBUG, "nl80211: Ignore deauth event due to previous forced deauth-during-auth");
662                         drv->ignore_deauth_event = 0;
663                         return;
664                 }
665                 event.deauth_info.locally_generated =
666                         !os_memcmp(mgmt->sa, drv->first_bss->addr, ETH_ALEN);
667                 if (drv->ignore_next_local_deauth) {
668                         drv->ignore_next_local_deauth = 0;
669                         if (event.deauth_info.locally_generated) {
670                                 wpa_printf(MSG_DEBUG, "nl80211: Ignore deauth event triggered due to own deauth request");
671                                 return;
672                         }
673                         wpa_printf(MSG_WARNING, "nl80211: Was expecting local deauth but got another disconnect event first");
674                 }
675                 event.deauth_info.addr = bssid;
676                 event.deauth_info.reason_code = reason_code;
677                 if (frame + len > mgmt->u.deauth.variable) {
678                         event.deauth_info.ie = mgmt->u.deauth.variable;
679                         event.deauth_info.ie_len = frame + len -
680                                 mgmt->u.deauth.variable;
681                 }
682         }
683
684         wpa_supplicant_event(drv->ctx, type, &event);
685 }
686
687
688 static void mlme_event_unprot_disconnect(struct wpa_driver_nl80211_data *drv,
689                                          enum wpa_event_type type,
690                                          const u8 *frame, size_t len)
691 {
692         const struct ieee80211_mgmt *mgmt;
693         union wpa_event_data event;
694         u16 reason_code = 0;
695
696         if (type == EVENT_UNPROT_DEAUTH)
697                 wpa_printf(MSG_DEBUG, "nl80211: Unprot Deauthenticate event");
698         else
699                 wpa_printf(MSG_DEBUG, "nl80211: Unprot Disassociate event");
700
701         if (len < 24)
702                 return;
703
704         mgmt = (const struct ieee80211_mgmt *) frame;
705
706         os_memset(&event, 0, sizeof(event));
707         /* Note: Same offset for Reason Code in both frame subtypes */
708         if (len >= 24 + sizeof(mgmt->u.deauth))
709                 reason_code = le_to_host16(mgmt->u.deauth.reason_code);
710
711         if (type == EVENT_UNPROT_DISASSOC) {
712                 event.unprot_disassoc.sa = mgmt->sa;
713                 event.unprot_disassoc.da = mgmt->da;
714                 event.unprot_disassoc.reason_code = reason_code;
715         } else {
716                 event.unprot_deauth.sa = mgmt->sa;
717                 event.unprot_deauth.da = mgmt->da;
718                 event.unprot_deauth.reason_code = reason_code;
719         }
720
721         wpa_supplicant_event(drv->ctx, type, &event);
722 }
723
724
725 static void mlme_event(struct i802_bss *bss,
726                        enum nl80211_commands cmd, struct nlattr *frame,
727                        struct nlattr *addr, struct nlattr *timed_out,
728                        struct nlattr *freq, struct nlattr *ack,
729                        struct nlattr *cookie, struct nlattr *sig,
730                        struct nlattr *wmm)
731 {
732         struct wpa_driver_nl80211_data *drv = bss->drv;
733         const u8 *data;
734         size_t len;
735
736         if (timed_out && addr) {
737                 mlme_timeout_event(drv, cmd, addr);
738                 return;
739         }
740
741         if (frame == NULL) {
742                 wpa_printf(MSG_DEBUG,
743                            "nl80211: MLME event %d (%s) without frame data",
744                            cmd, nl80211_command_to_string(cmd));
745                 return;
746         }
747
748         data = nla_data(frame);
749         len = nla_len(frame);
750         if (len < 4 + 2 * ETH_ALEN) {
751                 wpa_printf(MSG_MSGDUMP, "nl80211: MLME event %d (%s) on %s("
752                            MACSTR ") - too short",
753                            cmd, nl80211_command_to_string(cmd), bss->ifname,
754                            MAC2STR(bss->addr));
755                 return;
756         }
757         wpa_printf(MSG_MSGDUMP, "nl80211: MLME event %d (%s) on %s(" MACSTR
758                    ") A1=" MACSTR " A2=" MACSTR, cmd,
759                    nl80211_command_to_string(cmd), bss->ifname,
760                    MAC2STR(bss->addr), MAC2STR(data + 4),
761                    MAC2STR(data + 4 + ETH_ALEN));
762         if (cmd != NL80211_CMD_FRAME_TX_STATUS && !(data[4] & 0x01) &&
763             os_memcmp(bss->addr, data + 4, ETH_ALEN) != 0 &&
764             os_memcmp(bss->addr, data + 4 + ETH_ALEN, ETH_ALEN) != 0) {
765                 wpa_printf(MSG_MSGDUMP, "nl80211: %s: Ignore MLME frame event "
766                            "for foreign address", bss->ifname);
767                 return;
768         }
769         wpa_hexdump(MSG_MSGDUMP, "nl80211: MLME event frame",
770                     nla_data(frame), nla_len(frame));
771
772         switch (cmd) {
773         case NL80211_CMD_AUTHENTICATE:
774                 mlme_event_auth(drv, nla_data(frame), nla_len(frame));
775                 break;
776         case NL80211_CMD_ASSOCIATE:
777                 mlme_event_assoc(drv, nla_data(frame), nla_len(frame), wmm);
778                 break;
779         case NL80211_CMD_DEAUTHENTICATE:
780                 mlme_event_deauth_disassoc(drv, EVENT_DEAUTH,
781                                            nla_data(frame), nla_len(frame));
782                 break;
783         case NL80211_CMD_DISASSOCIATE:
784                 mlme_event_deauth_disassoc(drv, EVENT_DISASSOC,
785                                            nla_data(frame), nla_len(frame));
786                 break;
787         case NL80211_CMD_FRAME:
788                 mlme_event_mgmt(bss, freq, sig, nla_data(frame),
789                                 nla_len(frame));
790                 break;
791         case NL80211_CMD_FRAME_TX_STATUS:
792                 mlme_event_mgmt_tx_status(drv, cookie, nla_data(frame),
793                                           nla_len(frame), ack);
794                 break;
795         case NL80211_CMD_UNPROT_DEAUTHENTICATE:
796                 mlme_event_unprot_disconnect(drv, EVENT_UNPROT_DEAUTH,
797                                              nla_data(frame), nla_len(frame));
798                 break;
799         case NL80211_CMD_UNPROT_DISASSOCIATE:
800                 mlme_event_unprot_disconnect(drv, EVENT_UNPROT_DISASSOC,
801                                              nla_data(frame), nla_len(frame));
802                 break;
803         default:
804                 break;
805         }
806 }
807
808
809 static void mlme_event_michael_mic_failure(struct i802_bss *bss,
810                                            struct nlattr *tb[])
811 {
812         union wpa_event_data data;
813
814         wpa_printf(MSG_DEBUG, "nl80211: MLME event Michael MIC failure");
815         os_memset(&data, 0, sizeof(data));
816         if (tb[NL80211_ATTR_MAC]) {
817                 wpa_hexdump(MSG_DEBUG, "nl80211: Source MAC address",
818                             nla_data(tb[NL80211_ATTR_MAC]),
819                             nla_len(tb[NL80211_ATTR_MAC]));
820                 data.michael_mic_failure.src = nla_data(tb[NL80211_ATTR_MAC]);
821         }
822         if (tb[NL80211_ATTR_KEY_SEQ]) {
823                 wpa_hexdump(MSG_DEBUG, "nl80211: TSC",
824                             nla_data(tb[NL80211_ATTR_KEY_SEQ]),
825                             nla_len(tb[NL80211_ATTR_KEY_SEQ]));
826         }
827         if (tb[NL80211_ATTR_KEY_TYPE]) {
828                 enum nl80211_key_type key_type =
829                         nla_get_u32(tb[NL80211_ATTR_KEY_TYPE]);
830                 wpa_printf(MSG_DEBUG, "nl80211: Key Type %d", key_type);
831                 if (key_type == NL80211_KEYTYPE_PAIRWISE)
832                         data.michael_mic_failure.unicast = 1;
833         } else
834                 data.michael_mic_failure.unicast = 1;
835
836         if (tb[NL80211_ATTR_KEY_IDX]) {
837                 u8 key_id = nla_get_u8(tb[NL80211_ATTR_KEY_IDX]);
838                 wpa_printf(MSG_DEBUG, "nl80211: Key Id %d", key_id);
839         }
840
841         wpa_supplicant_event(bss->ctx, EVENT_MICHAEL_MIC_FAILURE, &data);
842 }
843
844
845 static void mlme_event_join_ibss(struct wpa_driver_nl80211_data *drv,
846                                  struct nlattr *tb[])
847 {
848         unsigned int freq;
849
850         if (tb[NL80211_ATTR_MAC] == NULL) {
851                 wpa_printf(MSG_DEBUG, "nl80211: No address in IBSS joined "
852                            "event");
853                 return;
854         }
855         os_memcpy(drv->bssid, nla_data(tb[NL80211_ATTR_MAC]), ETH_ALEN);
856
857         drv->associated = 1;
858         wpa_printf(MSG_DEBUG, "nl80211: IBSS " MACSTR " joined",
859                    MAC2STR(drv->bssid));
860
861         freq = nl80211_get_assoc_freq(drv);
862         if (freq) {
863                 wpa_printf(MSG_DEBUG, "nl80211: IBSS on frequency %u MHz",
864                            freq);
865                 drv->first_bss->freq = freq;
866         }
867
868         wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
869 }
870
871
872 static void mlme_event_remain_on_channel(struct wpa_driver_nl80211_data *drv,
873                                          int cancel_event, struct nlattr *tb[])
874 {
875         unsigned int freq, chan_type, duration;
876         union wpa_event_data data;
877         u64 cookie;
878
879         if (tb[NL80211_ATTR_WIPHY_FREQ])
880                 freq = nla_get_u32(tb[NL80211_ATTR_WIPHY_FREQ]);
881         else
882                 freq = 0;
883
884         if (tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE])
885                 chan_type = nla_get_u32(tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
886         else
887                 chan_type = 0;
888
889         if (tb[NL80211_ATTR_DURATION])
890                 duration = nla_get_u32(tb[NL80211_ATTR_DURATION]);
891         else
892                 duration = 0;
893
894         if (tb[NL80211_ATTR_COOKIE])
895                 cookie = nla_get_u64(tb[NL80211_ATTR_COOKIE]);
896         else
897                 cookie = 0;
898
899         wpa_printf(MSG_DEBUG, "nl80211: Remain-on-channel event (cancel=%d "
900                    "freq=%u channel_type=%u duration=%u cookie=0x%llx (%s))",
901                    cancel_event, freq, chan_type, duration,
902                    (long long unsigned int) cookie,
903                    cookie == drv->remain_on_chan_cookie ? "match" : "unknown");
904
905         if (cookie != drv->remain_on_chan_cookie)
906                 return; /* not for us */
907
908         if (cancel_event)
909                 drv->pending_remain_on_chan = 0;
910
911         os_memset(&data, 0, sizeof(data));
912         data.remain_on_channel.freq = freq;
913         data.remain_on_channel.duration = duration;
914         wpa_supplicant_event(drv->ctx, cancel_event ?
915                              EVENT_CANCEL_REMAIN_ON_CHANNEL :
916                              EVENT_REMAIN_ON_CHANNEL, &data);
917 }
918
919
920 static void mlme_event_ft_event(struct wpa_driver_nl80211_data *drv,
921                                 struct nlattr *tb[])
922 {
923         union wpa_event_data data;
924
925         os_memset(&data, 0, sizeof(data));
926
927         if (tb[NL80211_ATTR_IE]) {
928                 data.ft_ies.ies = nla_data(tb[NL80211_ATTR_IE]);
929                 data.ft_ies.ies_len = nla_len(tb[NL80211_ATTR_IE]);
930         }
931
932         if (tb[NL80211_ATTR_IE_RIC]) {
933                 data.ft_ies.ric_ies = nla_data(tb[NL80211_ATTR_IE_RIC]);
934                 data.ft_ies.ric_ies_len = nla_len(tb[NL80211_ATTR_IE_RIC]);
935         }
936
937         if (tb[NL80211_ATTR_MAC])
938                 os_memcpy(data.ft_ies.target_ap,
939                           nla_data(tb[NL80211_ATTR_MAC]), ETH_ALEN);
940
941         wpa_printf(MSG_DEBUG, "nl80211: FT event target_ap " MACSTR,
942                    MAC2STR(data.ft_ies.target_ap));
943
944         wpa_supplicant_event(drv->ctx, EVENT_FT_RESPONSE, &data);
945 }
946
947
948 static void send_scan_event(struct wpa_driver_nl80211_data *drv, int aborted,
949                             struct nlattr *tb[])
950 {
951         union wpa_event_data event;
952         struct nlattr *nl;
953         int rem;
954         struct scan_info *info;
955 #define MAX_REPORT_FREQS 50
956         int freqs[MAX_REPORT_FREQS];
957         int num_freqs = 0;
958
959         if (drv->scan_for_auth) {
960                 drv->scan_for_auth = 0;
961                 wpa_printf(MSG_DEBUG, "nl80211: Scan results for missing "
962                            "cfg80211 BSS entry");
963                 wpa_driver_nl80211_authenticate_retry(drv);
964                 return;
965         }
966
967         os_memset(&event, 0, sizeof(event));
968         info = &event.scan_info;
969         info->aborted = aborted;
970
971         if (tb[NL80211_ATTR_SCAN_SSIDS]) {
972                 nla_for_each_nested(nl, tb[NL80211_ATTR_SCAN_SSIDS], rem) {
973                         struct wpa_driver_scan_ssid *s =
974                                 &info->ssids[info->num_ssids];
975                         s->ssid = nla_data(nl);
976                         s->ssid_len = nla_len(nl);
977                         wpa_printf(MSG_DEBUG, "nl80211: Scan probed for SSID '%s'",
978                                    wpa_ssid_txt(s->ssid, s->ssid_len));
979                         info->num_ssids++;
980                         if (info->num_ssids == WPAS_MAX_SCAN_SSIDS)
981                                 break;
982                 }
983         }
984         if (tb[NL80211_ATTR_SCAN_FREQUENCIES]) {
985                 char msg[200], *pos, *end;
986                 int res;
987
988                 pos = msg;
989                 end = pos + sizeof(msg);
990                 *pos = '\0';
991
992                 nla_for_each_nested(nl, tb[NL80211_ATTR_SCAN_FREQUENCIES], rem)
993                 {
994                         freqs[num_freqs] = nla_get_u32(nl);
995                         res = os_snprintf(pos, end - pos, " %d",
996                                           freqs[num_freqs]);
997                         if (res > 0 && end - pos > res)
998                                 pos += res;
999                         num_freqs++;
1000                         if (num_freqs == MAX_REPORT_FREQS - 1)
1001                                 break;
1002                 }
1003                 info->freqs = freqs;
1004                 info->num_freqs = num_freqs;
1005                 wpa_printf(MSG_DEBUG, "nl80211: Scan included frequencies:%s",
1006                            msg);
1007         }
1008         wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS, &event);
1009 }
1010
1011
1012 static void nl80211_cqm_event(struct wpa_driver_nl80211_data *drv,
1013                               struct nlattr *tb[])
1014 {
1015         static struct nla_policy cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
1016                 [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_U32 },
1017                 [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U8 },
1018                 [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
1019                 [NL80211_ATTR_CQM_PKT_LOSS_EVENT] = { .type = NLA_U32 },
1020         };
1021         struct nlattr *cqm[NL80211_ATTR_CQM_MAX + 1];
1022         enum nl80211_cqm_rssi_threshold_event event;
1023         union wpa_event_data ed;
1024         struct wpa_signal_info sig;
1025         int res;
1026
1027         if (tb[NL80211_ATTR_CQM] == NULL ||
1028             nla_parse_nested(cqm, NL80211_ATTR_CQM_MAX, tb[NL80211_ATTR_CQM],
1029                              cqm_policy)) {
1030                 wpa_printf(MSG_DEBUG, "nl80211: Ignore invalid CQM event");
1031                 return;
1032         }
1033
1034         os_memset(&ed, 0, sizeof(ed));
1035
1036         if (cqm[NL80211_ATTR_CQM_PKT_LOSS_EVENT]) {
1037                 if (!tb[NL80211_ATTR_MAC])
1038                         return;
1039                 os_memcpy(ed.low_ack.addr, nla_data(tb[NL80211_ATTR_MAC]),
1040                           ETH_ALEN);
1041                 wpa_supplicant_event(drv->ctx, EVENT_STATION_LOW_ACK, &ed);
1042                 return;
1043         }
1044
1045         if (cqm[NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] == NULL)
1046                 return;
1047         event = nla_get_u32(cqm[NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT]);
1048
1049         if (event == NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH) {
1050                 wpa_printf(MSG_DEBUG, "nl80211: Connection quality monitor "
1051                            "event: RSSI high");
1052                 ed.signal_change.above_threshold = 1;
1053         } else if (event == NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW) {
1054                 wpa_printf(MSG_DEBUG, "nl80211: Connection quality monitor "
1055                            "event: RSSI low");
1056                 ed.signal_change.above_threshold = 0;
1057         } else
1058                 return;
1059
1060         res = nl80211_get_link_signal(drv, &sig);
1061         if (res == 0) {
1062                 ed.signal_change.current_signal = sig.current_signal;
1063                 ed.signal_change.current_txrate = sig.current_txrate;
1064                 wpa_printf(MSG_DEBUG, "nl80211: Signal: %d dBm  txrate: %d",
1065                            sig.current_signal, sig.current_txrate);
1066         }
1067
1068         res = nl80211_get_link_noise(drv, &sig);
1069         if (res == 0) {
1070                 ed.signal_change.current_noise = sig.current_noise;
1071                 wpa_printf(MSG_DEBUG, "nl80211: Noise: %d dBm",
1072                            sig.current_noise);
1073         }
1074
1075         wpa_supplicant_event(drv->ctx, EVENT_SIGNAL_CHANGE, &ed);
1076 }
1077
1078
1079 static void nl80211_new_peer_candidate(struct wpa_driver_nl80211_data *drv,
1080                                        struct nlattr **tb)
1081 {
1082         const u8 *addr;
1083         union wpa_event_data data;
1084
1085         if (drv->nlmode != NL80211_IFTYPE_MESH_POINT)
1086                 return;
1087
1088         if (!tb[NL80211_ATTR_MAC] || !tb[NL80211_ATTR_IE])
1089                 return;
1090
1091         addr = nla_data(tb[NL80211_ATTR_MAC]);
1092         wpa_printf(MSG_DEBUG, "nl80211: New peer candidate" MACSTR,
1093                    MAC2STR(addr));
1094
1095         os_memset(&data, 0, sizeof(data));
1096         data.mesh_peer.peer = addr;
1097         data.mesh_peer.ies = nla_data(tb[NL80211_ATTR_IE]);
1098         data.mesh_peer.ie_len = nla_len(tb[NL80211_ATTR_IE]);
1099         wpa_supplicant_event(drv->ctx, EVENT_NEW_PEER_CANDIDATE, &data);
1100 }
1101
1102
1103 static void nl80211_new_station_event(struct wpa_driver_nl80211_data *drv,
1104                                       struct nlattr **tb)
1105 {
1106         u8 *addr;
1107         union wpa_event_data data;
1108
1109         if (tb[NL80211_ATTR_MAC] == NULL)
1110                 return;
1111         addr = nla_data(tb[NL80211_ATTR_MAC]);
1112         wpa_printf(MSG_DEBUG, "nl80211: New station " MACSTR, MAC2STR(addr));
1113
1114         if (is_ap_interface(drv->nlmode) && drv->device_ap_sme) {
1115                 u8 *ies = NULL;
1116                 size_t ies_len = 0;
1117                 if (tb[NL80211_ATTR_IE]) {
1118                         ies = nla_data(tb[NL80211_ATTR_IE]);
1119                         ies_len = nla_len(tb[NL80211_ATTR_IE]);
1120                 }
1121                 wpa_hexdump(MSG_DEBUG, "nl80211: Assoc Req IEs", ies, ies_len);
1122                 drv_event_assoc(drv->ctx, addr, ies, ies_len, 0);
1123                 return;
1124         }
1125
1126         if (drv->nlmode != NL80211_IFTYPE_ADHOC)
1127                 return;
1128
1129         os_memset(&data, 0, sizeof(data));
1130         os_memcpy(data.ibss_rsn_start.peer, addr, ETH_ALEN);
1131         wpa_supplicant_event(drv->ctx, EVENT_IBSS_RSN_START, &data);
1132 }
1133
1134
1135 static void nl80211_del_station_event(struct wpa_driver_nl80211_data *drv,
1136                                       struct nlattr **tb)
1137 {
1138         u8 *addr;
1139         union wpa_event_data data;
1140
1141         if (tb[NL80211_ATTR_MAC] == NULL)
1142                 return;
1143         addr = nla_data(tb[NL80211_ATTR_MAC]);
1144         wpa_printf(MSG_DEBUG, "nl80211: Delete station " MACSTR,
1145                    MAC2STR(addr));
1146
1147         if (is_ap_interface(drv->nlmode) && drv->device_ap_sme) {
1148                 drv_event_disassoc(drv->ctx, addr);
1149                 return;
1150         }
1151
1152         if (drv->nlmode != NL80211_IFTYPE_ADHOC)
1153                 return;
1154
1155         os_memset(&data, 0, sizeof(data));
1156         os_memcpy(data.ibss_peer_lost.peer, addr, ETH_ALEN);
1157         wpa_supplicant_event(drv->ctx, EVENT_IBSS_PEER_LOST, &data);
1158 }
1159
1160
1161 static void nl80211_rekey_offload_event(struct wpa_driver_nl80211_data *drv,
1162                                         struct nlattr **tb)
1163 {
1164         struct nlattr *rekey_info[NUM_NL80211_REKEY_DATA];
1165         static struct nla_policy rekey_policy[NUM_NL80211_REKEY_DATA] = {
1166                 [NL80211_REKEY_DATA_KEK] = {
1167                         .minlen = NL80211_KEK_LEN,
1168                         .maxlen = NL80211_KEK_LEN,
1169                 },
1170                 [NL80211_REKEY_DATA_KCK] = {
1171                         .minlen = NL80211_KCK_LEN,
1172                         .maxlen = NL80211_KCK_LEN,
1173                 },
1174                 [NL80211_REKEY_DATA_REPLAY_CTR] = {
1175                         .minlen = NL80211_REPLAY_CTR_LEN,
1176                         .maxlen = NL80211_REPLAY_CTR_LEN,
1177                 },
1178         };
1179         union wpa_event_data data;
1180
1181         if (!tb[NL80211_ATTR_MAC])
1182                 return;
1183         if (!tb[NL80211_ATTR_REKEY_DATA])
1184                 return;
1185         if (nla_parse_nested(rekey_info, MAX_NL80211_REKEY_DATA,
1186                              tb[NL80211_ATTR_REKEY_DATA], rekey_policy))
1187                 return;
1188         if (!rekey_info[NL80211_REKEY_DATA_REPLAY_CTR])
1189                 return;
1190
1191         os_memset(&data, 0, sizeof(data));
1192         data.driver_gtk_rekey.bssid = nla_data(tb[NL80211_ATTR_MAC]);
1193         wpa_printf(MSG_DEBUG, "nl80211: Rekey offload event for BSSID " MACSTR,
1194                    MAC2STR(data.driver_gtk_rekey.bssid));
1195         data.driver_gtk_rekey.replay_ctr =
1196                 nla_data(rekey_info[NL80211_REKEY_DATA_REPLAY_CTR]);
1197         wpa_hexdump(MSG_DEBUG, "nl80211: Rekey offload - Replay Counter",
1198                     data.driver_gtk_rekey.replay_ctr, NL80211_REPLAY_CTR_LEN);
1199         wpa_supplicant_event(drv->ctx, EVENT_DRIVER_GTK_REKEY, &data);
1200 }
1201
1202
1203 static void nl80211_pmksa_candidate_event(struct wpa_driver_nl80211_data *drv,
1204                                           struct nlattr **tb)
1205 {
1206         struct nlattr *cand[NUM_NL80211_PMKSA_CANDIDATE];
1207         static struct nla_policy cand_policy[NUM_NL80211_PMKSA_CANDIDATE] = {
1208                 [NL80211_PMKSA_CANDIDATE_INDEX] = { .type = NLA_U32 },
1209                 [NL80211_PMKSA_CANDIDATE_BSSID] = {
1210                         .minlen = ETH_ALEN,
1211                         .maxlen = ETH_ALEN,
1212                 },
1213                 [NL80211_PMKSA_CANDIDATE_PREAUTH] = { .type = NLA_FLAG },
1214         };
1215         union wpa_event_data data;
1216
1217         wpa_printf(MSG_DEBUG, "nl80211: PMKSA candidate event");
1218
1219         if (!tb[NL80211_ATTR_PMKSA_CANDIDATE])
1220                 return;
1221         if (nla_parse_nested(cand, MAX_NL80211_PMKSA_CANDIDATE,
1222                              tb[NL80211_ATTR_PMKSA_CANDIDATE], cand_policy))
1223                 return;
1224         if (!cand[NL80211_PMKSA_CANDIDATE_INDEX] ||
1225             !cand[NL80211_PMKSA_CANDIDATE_BSSID])
1226                 return;
1227
1228         os_memset(&data, 0, sizeof(data));
1229         os_memcpy(data.pmkid_candidate.bssid,
1230                   nla_data(cand[NL80211_PMKSA_CANDIDATE_BSSID]), ETH_ALEN);
1231         data.pmkid_candidate.index =
1232                 nla_get_u32(cand[NL80211_PMKSA_CANDIDATE_INDEX]);
1233         data.pmkid_candidate.preauth =
1234                 cand[NL80211_PMKSA_CANDIDATE_PREAUTH] != NULL;
1235         wpa_supplicant_event(drv->ctx, EVENT_PMKID_CANDIDATE, &data);
1236 }
1237
1238
1239 static void nl80211_client_probe_event(struct wpa_driver_nl80211_data *drv,
1240                                        struct nlattr **tb)
1241 {
1242         union wpa_event_data data;
1243
1244         wpa_printf(MSG_DEBUG, "nl80211: Probe client event");
1245
1246         if (!tb[NL80211_ATTR_MAC] || !tb[NL80211_ATTR_ACK])
1247                 return;
1248
1249         os_memset(&data, 0, sizeof(data));
1250         os_memcpy(data.client_poll.addr,
1251                   nla_data(tb[NL80211_ATTR_MAC]), ETH_ALEN);
1252
1253         wpa_supplicant_event(drv->ctx, EVENT_DRIVER_CLIENT_POLL_OK, &data);
1254 }
1255
1256
1257 static void nl80211_tdls_oper_event(struct wpa_driver_nl80211_data *drv,
1258                                     struct nlattr **tb)
1259 {
1260         union wpa_event_data data;
1261
1262         wpa_printf(MSG_DEBUG, "nl80211: TDLS operation event");
1263
1264         if (!tb[NL80211_ATTR_MAC] || !tb[NL80211_ATTR_TDLS_OPERATION])
1265                 return;
1266
1267         os_memset(&data, 0, sizeof(data));
1268         os_memcpy(data.tdls.peer, nla_data(tb[NL80211_ATTR_MAC]), ETH_ALEN);
1269         switch (nla_get_u8(tb[NL80211_ATTR_TDLS_OPERATION])) {
1270         case NL80211_TDLS_SETUP:
1271                 wpa_printf(MSG_DEBUG, "nl80211: TDLS setup request for peer "
1272                            MACSTR, MAC2STR(data.tdls.peer));
1273                 data.tdls.oper = TDLS_REQUEST_SETUP;
1274                 break;
1275         case NL80211_TDLS_TEARDOWN:
1276                 wpa_printf(MSG_DEBUG, "nl80211: TDLS teardown request for peer "
1277                            MACSTR, MAC2STR(data.tdls.peer));
1278                 data.tdls.oper = TDLS_REQUEST_TEARDOWN;
1279                 break;
1280         default:
1281                 wpa_printf(MSG_DEBUG, "nl80211: Unsupported TDLS operatione "
1282                            "event");
1283                 return;
1284         }
1285         if (tb[NL80211_ATTR_REASON_CODE]) {
1286                 data.tdls.reason_code =
1287                         nla_get_u16(tb[NL80211_ATTR_REASON_CODE]);
1288         }
1289
1290         wpa_supplicant_event(drv->ctx, EVENT_TDLS, &data);
1291 }
1292
1293
1294 static void nl80211_stop_ap(struct wpa_driver_nl80211_data *drv,
1295                             struct nlattr **tb)
1296 {
1297         wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_UNAVAILABLE, NULL);
1298 }
1299
1300
1301 static void nl80211_connect_failed_event(struct wpa_driver_nl80211_data *drv,
1302                                          struct nlattr **tb)
1303 {
1304         union wpa_event_data data;
1305         u32 reason;
1306
1307         wpa_printf(MSG_DEBUG, "nl80211: Connect failed event");
1308
1309         if (!tb[NL80211_ATTR_MAC] || !tb[NL80211_ATTR_CONN_FAILED_REASON])
1310                 return;
1311
1312         os_memset(&data, 0, sizeof(data));
1313         os_memcpy(data.connect_failed_reason.addr,
1314                   nla_data(tb[NL80211_ATTR_MAC]), ETH_ALEN);
1315
1316         reason = nla_get_u32(tb[NL80211_ATTR_CONN_FAILED_REASON]);
1317         switch (reason) {
1318         case NL80211_CONN_FAIL_MAX_CLIENTS:
1319                 wpa_printf(MSG_DEBUG, "nl80211: Max client reached");
1320                 data.connect_failed_reason.code = MAX_CLIENT_REACHED;
1321                 break;
1322         case NL80211_CONN_FAIL_BLOCKED_CLIENT:
1323                 wpa_printf(MSG_DEBUG, "nl80211: Blocked client " MACSTR
1324                            " tried to connect",
1325                            MAC2STR(data.connect_failed_reason.addr));
1326                 data.connect_failed_reason.code = BLOCKED_CLIENT;
1327                 break;
1328         default:
1329                 wpa_printf(MSG_DEBUG, "nl8021l: Unknown connect failed reason "
1330                            "%u", reason);
1331                 return;
1332         }
1333
1334         wpa_supplicant_event(drv->ctx, EVENT_CONNECT_FAILED_REASON, &data);
1335 }
1336
1337
1338 static void nl80211_radar_event(struct wpa_driver_nl80211_data *drv,
1339                                 struct nlattr **tb)
1340 {
1341         union wpa_event_data data;
1342         enum nl80211_radar_event event_type;
1343
1344         if (!tb[NL80211_ATTR_WIPHY_FREQ] || !tb[NL80211_ATTR_RADAR_EVENT])
1345                 return;
1346
1347         os_memset(&data, 0, sizeof(data));
1348         data.dfs_event.freq = nla_get_u32(tb[NL80211_ATTR_WIPHY_FREQ]);
1349         event_type = nla_get_u32(tb[NL80211_ATTR_RADAR_EVENT]);
1350
1351         /* Check HT params */
1352         if (tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
1353                 data.dfs_event.ht_enabled = 1;
1354                 data.dfs_event.chan_offset = 0;
1355
1356                 switch (nla_get_u32(tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE])) {
1357                 case NL80211_CHAN_NO_HT:
1358                         data.dfs_event.ht_enabled = 0;
1359                         break;
1360                 case NL80211_CHAN_HT20:
1361                         break;
1362                 case NL80211_CHAN_HT40PLUS:
1363                         data.dfs_event.chan_offset = 1;
1364                         break;
1365                 case NL80211_CHAN_HT40MINUS:
1366                         data.dfs_event.chan_offset = -1;
1367                         break;
1368                 }
1369         }
1370
1371         /* Get VHT params */
1372         if (tb[NL80211_ATTR_CHANNEL_WIDTH])
1373                 data.dfs_event.chan_width =
1374                         convert2width(nla_get_u32(
1375                                               tb[NL80211_ATTR_CHANNEL_WIDTH]));
1376         if (tb[NL80211_ATTR_CENTER_FREQ1])
1377                 data.dfs_event.cf1 = nla_get_u32(tb[NL80211_ATTR_CENTER_FREQ1]);
1378         if (tb[NL80211_ATTR_CENTER_FREQ2])
1379                 data.dfs_event.cf2 = nla_get_u32(tb[NL80211_ATTR_CENTER_FREQ2]);
1380
1381         wpa_printf(MSG_DEBUG, "nl80211: DFS event on freq %d MHz, ht: %d, offset: %d, width: %d, cf1: %dMHz, cf2: %dMHz",
1382                    data.dfs_event.freq, data.dfs_event.ht_enabled,
1383                    data.dfs_event.chan_offset, data.dfs_event.chan_width,
1384                    data.dfs_event.cf1, data.dfs_event.cf2);
1385
1386         switch (event_type) {
1387         case NL80211_RADAR_DETECTED:
1388                 wpa_supplicant_event(drv->ctx, EVENT_DFS_RADAR_DETECTED, &data);
1389                 break;
1390         case NL80211_RADAR_CAC_FINISHED:
1391                 wpa_supplicant_event(drv->ctx, EVENT_DFS_CAC_FINISHED, &data);
1392                 break;
1393         case NL80211_RADAR_CAC_ABORTED:
1394                 wpa_supplicant_event(drv->ctx, EVENT_DFS_CAC_ABORTED, &data);
1395                 break;
1396         case NL80211_RADAR_NOP_FINISHED:
1397                 wpa_supplicant_event(drv->ctx, EVENT_DFS_NOP_FINISHED, &data);
1398                 break;
1399         default:
1400                 wpa_printf(MSG_DEBUG, "nl80211: Unknown radar event %d "
1401                            "received", event_type);
1402                 break;
1403         }
1404 }
1405
1406
1407 static void nl80211_spurious_frame(struct i802_bss *bss, struct nlattr **tb,
1408                                    int wds)
1409 {
1410         struct wpa_driver_nl80211_data *drv = bss->drv;
1411         union wpa_event_data event;
1412
1413         if (!tb[NL80211_ATTR_MAC])
1414                 return;
1415
1416         os_memset(&event, 0, sizeof(event));
1417         event.rx_from_unknown.bssid = bss->addr;
1418         event.rx_from_unknown.addr = nla_data(tb[NL80211_ATTR_MAC]);
1419         event.rx_from_unknown.wds = wds;
1420
1421         wpa_supplicant_event(drv->ctx, EVENT_RX_FROM_UNKNOWN, &event);
1422 }
1423
1424
1425 static void qca_nl80211_avoid_freq(struct wpa_driver_nl80211_data *drv,
1426                                    const u8 *data, size_t len)
1427 {
1428         u32 i, count;
1429         union wpa_event_data event;
1430         struct wpa_freq_range *range = NULL;
1431         const struct qca_avoid_freq_list *freq_range;
1432
1433         freq_range = (const struct qca_avoid_freq_list *) data;
1434         if (len < sizeof(freq_range->count))
1435                 return;
1436
1437         count = freq_range->count;
1438         if (len < sizeof(freq_range->count) +
1439             count * sizeof(struct qca_avoid_freq_range)) {
1440                 wpa_printf(MSG_DEBUG, "nl80211: Ignored too short avoid frequency list (len=%u)",
1441                            (unsigned int) len);
1442                 return;
1443         }
1444
1445         if (count > 0) {
1446                 range = os_calloc(count, sizeof(struct wpa_freq_range));
1447                 if (range == NULL)
1448                         return;
1449         }
1450
1451         os_memset(&event, 0, sizeof(event));
1452         for (i = 0; i < count; i++) {
1453                 unsigned int idx = event.freq_range.num;
1454                 range[idx].min = freq_range->range[i].start_freq;
1455                 range[idx].max = freq_range->range[i].end_freq;
1456                 wpa_printf(MSG_DEBUG, "nl80211: Avoid frequency range: %u-%u",
1457                            range[idx].min, range[idx].max);
1458                 if (range[idx].min > range[idx].max) {
1459                         wpa_printf(MSG_DEBUG, "nl80211: Ignore invalid frequency range");
1460                         continue;
1461                 }
1462                 event.freq_range.num++;
1463         }
1464         event.freq_range.range = range;
1465
1466         wpa_supplicant_event(drv->ctx, EVENT_AVOID_FREQUENCIES, &event);
1467
1468         os_free(range);
1469 }
1470
1471
1472 static void qca_nl80211_acs_select_ch(struct wpa_driver_nl80211_data *drv,
1473                                    const u8 *data, size_t len)
1474 {
1475         struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_ACS_MAX + 1];
1476         union wpa_event_data event;
1477
1478         wpa_printf(MSG_DEBUG,
1479                    "nl80211: ACS channel selection vendor event received");
1480
1481         if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_ACS_MAX,
1482                       (struct nlattr *) data, len, NULL))
1483                 return;
1484
1485         if (!tb[QCA_WLAN_VENDOR_ATTR_ACS_PRIMARY_CHANNEL] ||
1486             !tb[QCA_WLAN_VENDOR_ATTR_ACS_SECONDARY_CHANNEL])
1487                 return;
1488
1489         os_memset(&event, 0, sizeof(event));
1490         event.acs_selected_channels.pri_channel =
1491                 nla_get_u8(tb[QCA_WLAN_VENDOR_ATTR_ACS_PRIMARY_CHANNEL]);
1492         event.acs_selected_channels.sec_channel =
1493                 nla_get_u8(tb[QCA_WLAN_VENDOR_ATTR_ACS_SECONDARY_CHANNEL]);
1494
1495         wpa_supplicant_event(drv->ctx, EVENT_ACS_CHANNEL_SELECTED, &event);
1496 }
1497
1498
1499 static void qca_nl80211_key_mgmt_auth(struct wpa_driver_nl80211_data *drv,
1500                                       const u8 *data, size_t len)
1501 {
1502         struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_MAX + 1];
1503         u8 *bssid;
1504
1505         wpa_printf(MSG_DEBUG,
1506                    "nl80211: Key management roam+auth vendor event received");
1507
1508         if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_MAX,
1509                       (struct nlattr *) data, len, NULL))
1510                 return;
1511         if (!tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_BSSID] ||
1512             nla_len(tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_BSSID]) != ETH_ALEN ||
1513             !tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_REQ_IE] ||
1514             !tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_RESP_IE] ||
1515             !tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_AUTHORIZED])
1516                 return;
1517
1518         bssid = nla_data(tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_BSSID]);
1519         wpa_printf(MSG_DEBUG, "  * roam BSSID " MACSTR, MAC2STR(bssid));
1520
1521         mlme_event_connect(drv, NL80211_CMD_ROAM, NULL,
1522                            tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_BSSID],
1523                            tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_REQ_IE],
1524                            tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_RESP_IE],
1525                            tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_AUTHORIZED],
1526                            tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_KEY_REPLAY_CTR],
1527                            tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KCK],
1528                            tb[QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KEK]);
1529 }
1530
1531
1532 static void nl80211_vendor_event_qca(struct wpa_driver_nl80211_data *drv,
1533                                      u32 subcmd, u8 *data, size_t len)
1534 {
1535         switch (subcmd) {
1536         case QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY:
1537                 qca_nl80211_avoid_freq(drv, data, len);
1538                 break;
1539         case QCA_NL80211_VENDOR_SUBCMD_KEY_MGMT_ROAM_AUTH:
1540                 qca_nl80211_key_mgmt_auth(drv, data, len);
1541                 break;
1542         case QCA_NL80211_VENDOR_SUBCMD_DO_ACS:
1543                 qca_nl80211_acs_select_ch(drv, data, len);
1544                 break;
1545         default:
1546                 wpa_printf(MSG_DEBUG,
1547                            "nl80211: Ignore unsupported QCA vendor event %u",
1548                            subcmd);
1549                 break;
1550         }
1551 }
1552
1553
1554 static void nl80211_vendor_event(struct wpa_driver_nl80211_data *drv,
1555                                  struct nlattr **tb)
1556 {
1557         u32 vendor_id, subcmd, wiphy = 0;
1558         int wiphy_idx;
1559         u8 *data = NULL;
1560         size_t len = 0;
1561
1562         if (!tb[NL80211_ATTR_VENDOR_ID] ||
1563             !tb[NL80211_ATTR_VENDOR_SUBCMD])
1564                 return;
1565
1566         vendor_id = nla_get_u32(tb[NL80211_ATTR_VENDOR_ID]);
1567         subcmd = nla_get_u32(tb[NL80211_ATTR_VENDOR_SUBCMD]);
1568
1569         if (tb[NL80211_ATTR_WIPHY])
1570                 wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
1571
1572         wpa_printf(MSG_DEBUG, "nl80211: Vendor event: wiphy=%u vendor_id=0x%x subcmd=%u",
1573                    wiphy, vendor_id, subcmd);
1574
1575         if (tb[NL80211_ATTR_VENDOR_DATA]) {
1576                 data = nla_data(tb[NL80211_ATTR_VENDOR_DATA]);
1577                 len = nla_len(tb[NL80211_ATTR_VENDOR_DATA]);
1578                 wpa_hexdump(MSG_MSGDUMP, "nl80211: Vendor data", data, len);
1579         }
1580
1581         wiphy_idx = nl80211_get_wiphy_index(drv->first_bss);
1582         if (wiphy_idx >= 0 && wiphy_idx != (int) wiphy) {
1583                 wpa_printf(MSG_DEBUG, "nl80211: Ignore vendor event for foreign wiphy %u (own: %d)",
1584                            wiphy, wiphy_idx);
1585                 return;
1586         }
1587
1588         switch (vendor_id) {
1589         case OUI_QCA:
1590                 nl80211_vendor_event_qca(drv, subcmd, data, len);
1591                 break;
1592         default:
1593                 wpa_printf(MSG_DEBUG, "nl80211: Ignore unsupported vendor event");
1594                 break;
1595         }
1596 }
1597
1598
1599 static void nl80211_reg_change_event(struct wpa_driver_nl80211_data *drv,
1600                                      struct nlattr *tb[])
1601 {
1602         union wpa_event_data data;
1603         enum nl80211_reg_initiator init;
1604
1605         wpa_printf(MSG_DEBUG, "nl80211: Regulatory domain change");
1606
1607         if (tb[NL80211_ATTR_REG_INITIATOR] == NULL)
1608                 return;
1609
1610         os_memset(&data, 0, sizeof(data));
1611         init = nla_get_u8(tb[NL80211_ATTR_REG_INITIATOR]);
1612         wpa_printf(MSG_DEBUG, " * initiator=%d", init);
1613         switch (init) {
1614         case NL80211_REGDOM_SET_BY_CORE:
1615                 data.channel_list_changed.initiator = REGDOM_SET_BY_CORE;
1616                 break;
1617         case NL80211_REGDOM_SET_BY_USER:
1618                 data.channel_list_changed.initiator = REGDOM_SET_BY_USER;
1619                 break;
1620         case NL80211_REGDOM_SET_BY_DRIVER:
1621                 data.channel_list_changed.initiator = REGDOM_SET_BY_DRIVER;
1622                 break;
1623         case NL80211_REGDOM_SET_BY_COUNTRY_IE:
1624                 data.channel_list_changed.initiator = REGDOM_SET_BY_COUNTRY_IE;
1625                 break;
1626         }
1627
1628         if (tb[NL80211_ATTR_REG_TYPE]) {
1629                 enum nl80211_reg_type type;
1630                 type = nla_get_u8(tb[NL80211_ATTR_REG_TYPE]);
1631                 wpa_printf(MSG_DEBUG, " * type=%d", type);
1632                 switch (type) {
1633                 case NL80211_REGDOM_TYPE_COUNTRY:
1634                         data.channel_list_changed.type = REGDOM_TYPE_COUNTRY;
1635                         break;
1636                 case NL80211_REGDOM_TYPE_WORLD:
1637                         data.channel_list_changed.type = REGDOM_TYPE_WORLD;
1638                         break;
1639                 case NL80211_REGDOM_TYPE_CUSTOM_WORLD:
1640                         data.channel_list_changed.type =
1641                                 REGDOM_TYPE_CUSTOM_WORLD;
1642                         break;
1643                 case NL80211_REGDOM_TYPE_INTERSECTION:
1644                         data.channel_list_changed.type =
1645                                 REGDOM_TYPE_INTERSECTION;
1646                         break;
1647                 }
1648         }
1649
1650         if (tb[NL80211_ATTR_REG_ALPHA2]) {
1651                 os_strlcpy(data.channel_list_changed.alpha2,
1652                            nla_get_string(tb[NL80211_ATTR_REG_ALPHA2]),
1653                            sizeof(data.channel_list_changed.alpha2));
1654                 wpa_printf(MSG_DEBUG, " * alpha2=%s",
1655                            data.channel_list_changed.alpha2);
1656         }
1657
1658         wpa_supplicant_event(drv->ctx, EVENT_CHANNEL_LIST_CHANGED, &data);
1659 }
1660
1661
1662 static void do_process_drv_event(struct i802_bss *bss, int cmd,
1663                                  struct nlattr **tb)
1664 {
1665         struct wpa_driver_nl80211_data *drv = bss->drv;
1666         union wpa_event_data data;
1667
1668         wpa_printf(MSG_DEBUG, "nl80211: Drv Event %d (%s) received for %s",
1669                    cmd, nl80211_command_to_string(cmd), bss->ifname);
1670
1671         if (cmd == NL80211_CMD_ROAM && drv->roam_auth_vendor_event_avail) {
1672                 /*
1673                  * Device will use roam+auth vendor event to indicate
1674                  * roaming, so ignore the regular roam event.
1675                  */
1676                 wpa_printf(MSG_DEBUG,
1677                            "nl80211: Ignore roam event (cmd=%d), device will use vendor event roam+auth",
1678                            cmd);
1679                 return;
1680         }
1681
1682         if (drv->ap_scan_as_station != NL80211_IFTYPE_UNSPECIFIED &&
1683             (cmd == NL80211_CMD_NEW_SCAN_RESULTS ||
1684              cmd == NL80211_CMD_SCAN_ABORTED)) {
1685                 wpa_driver_nl80211_set_mode(drv->first_bss,
1686                                             drv->ap_scan_as_station);
1687                 drv->ap_scan_as_station = NL80211_IFTYPE_UNSPECIFIED;
1688         }
1689
1690         switch (cmd) {
1691         case NL80211_CMD_TRIGGER_SCAN:
1692                 wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Scan trigger");
1693                 drv->scan_state = SCAN_STARTED;
1694                 if (drv->scan_for_auth) {
1695                         /*
1696                          * Cannot indicate EVENT_SCAN_STARTED here since we skip
1697                          * EVENT_SCAN_RESULTS in scan_for_auth case and the
1698                          * upper layer implementation could get confused about
1699                          * scanning state.
1700                          */
1701                         wpa_printf(MSG_DEBUG, "nl80211: Do not indicate scan-start event due to internal scan_for_auth");
1702                         break;
1703                 }
1704                 wpa_supplicant_event(drv->ctx, EVENT_SCAN_STARTED, NULL);
1705                 break;
1706         case NL80211_CMD_START_SCHED_SCAN:
1707                 wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Sched scan started");
1708                 drv->scan_state = SCHED_SCAN_STARTED;
1709                 break;
1710         case NL80211_CMD_SCHED_SCAN_STOPPED:
1711                 wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Sched scan stopped");
1712                 drv->scan_state = SCHED_SCAN_STOPPED;
1713                 wpa_supplicant_event(drv->ctx, EVENT_SCHED_SCAN_STOPPED, NULL);
1714                 break;
1715         case NL80211_CMD_NEW_SCAN_RESULTS:
1716                 wpa_dbg(drv->ctx, MSG_DEBUG,
1717                         "nl80211: New scan results available");
1718                 drv->scan_state = SCAN_COMPLETED;
1719                 drv->scan_complete_events = 1;
1720                 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv,
1721                                      drv->ctx);
1722                 send_scan_event(drv, 0, tb);
1723                 break;
1724         case NL80211_CMD_SCHED_SCAN_RESULTS:
1725                 wpa_dbg(drv->ctx, MSG_DEBUG,
1726                         "nl80211: New sched scan results available");
1727                 drv->scan_state = SCHED_SCAN_RESULTS;
1728                 send_scan_event(drv, 0, tb);
1729                 break;
1730         case NL80211_CMD_SCAN_ABORTED:
1731                 wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Scan aborted");
1732                 drv->scan_state = SCAN_ABORTED;
1733                 /*
1734                  * Need to indicate that scan results are available in order
1735                  * not to make wpa_supplicant stop its scanning.
1736                  */
1737                 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv,
1738                                      drv->ctx);
1739                 send_scan_event(drv, 1, tb);
1740                 break;
1741         case NL80211_CMD_AUTHENTICATE:
1742         case NL80211_CMD_ASSOCIATE:
1743         case NL80211_CMD_DEAUTHENTICATE:
1744         case NL80211_CMD_DISASSOCIATE:
1745         case NL80211_CMD_FRAME_TX_STATUS:
1746         case NL80211_CMD_UNPROT_DEAUTHENTICATE:
1747         case NL80211_CMD_UNPROT_DISASSOCIATE:
1748                 mlme_event(bss, cmd, tb[NL80211_ATTR_FRAME],
1749                            tb[NL80211_ATTR_MAC], tb[NL80211_ATTR_TIMED_OUT],
1750                            tb[NL80211_ATTR_WIPHY_FREQ], tb[NL80211_ATTR_ACK],
1751                            tb[NL80211_ATTR_COOKIE],
1752                            tb[NL80211_ATTR_RX_SIGNAL_DBM],
1753                            tb[NL80211_ATTR_STA_WME]);
1754                 break;
1755         case NL80211_CMD_CONNECT:
1756         case NL80211_CMD_ROAM:
1757                 mlme_event_connect(drv, cmd,
1758                                    tb[NL80211_ATTR_STATUS_CODE],
1759                                    tb[NL80211_ATTR_MAC],
1760                                    tb[NL80211_ATTR_REQ_IE],
1761                                    tb[NL80211_ATTR_RESP_IE],
1762                                    NULL, NULL, NULL, NULL);
1763                 break;
1764         case NL80211_CMD_CH_SWITCH_NOTIFY:
1765                 mlme_event_ch_switch(drv,
1766                                      tb[NL80211_ATTR_IFINDEX],
1767                                      tb[NL80211_ATTR_WIPHY_FREQ],
1768                                      tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE],
1769                                      tb[NL80211_ATTR_CHANNEL_WIDTH],
1770                                      tb[NL80211_ATTR_CENTER_FREQ1],
1771                                      tb[NL80211_ATTR_CENTER_FREQ2]);
1772                 break;
1773         case NL80211_CMD_DISCONNECT:
1774                 mlme_event_disconnect(drv, tb[NL80211_ATTR_REASON_CODE],
1775                                       tb[NL80211_ATTR_MAC],
1776                                       tb[NL80211_ATTR_DISCONNECTED_BY_AP]);
1777                 break;
1778         case NL80211_CMD_MICHAEL_MIC_FAILURE:
1779                 mlme_event_michael_mic_failure(bss, tb);
1780                 break;
1781         case NL80211_CMD_JOIN_IBSS:
1782                 mlme_event_join_ibss(drv, tb);
1783                 break;
1784         case NL80211_CMD_REMAIN_ON_CHANNEL:
1785                 mlme_event_remain_on_channel(drv, 0, tb);
1786                 break;
1787         case NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL:
1788                 mlme_event_remain_on_channel(drv, 1, tb);
1789                 break;
1790         case NL80211_CMD_NOTIFY_CQM:
1791                 nl80211_cqm_event(drv, tb);
1792                 break;
1793         case NL80211_CMD_REG_CHANGE:
1794                 nl80211_reg_change_event(drv, tb);
1795                 break;
1796         case NL80211_CMD_REG_BEACON_HINT:
1797                 wpa_printf(MSG_DEBUG, "nl80211: Regulatory beacon hint");
1798                 os_memset(&data, 0, sizeof(data));
1799                 data.channel_list_changed.initiator = REGDOM_BEACON_HINT;
1800                 wpa_supplicant_event(drv->ctx, EVENT_CHANNEL_LIST_CHANGED,
1801                                      &data);
1802                 break;
1803         case NL80211_CMD_NEW_STATION:
1804                 nl80211_new_station_event(drv, tb);
1805                 break;
1806         case NL80211_CMD_DEL_STATION:
1807                 nl80211_del_station_event(drv, tb);
1808                 break;
1809         case NL80211_CMD_SET_REKEY_OFFLOAD:
1810                 nl80211_rekey_offload_event(drv, tb);
1811                 break;
1812         case NL80211_CMD_PMKSA_CANDIDATE:
1813                 nl80211_pmksa_candidate_event(drv, tb);
1814                 break;
1815         case NL80211_CMD_PROBE_CLIENT:
1816                 nl80211_client_probe_event(drv, tb);
1817                 break;
1818         case NL80211_CMD_TDLS_OPER:
1819                 nl80211_tdls_oper_event(drv, tb);
1820                 break;
1821         case NL80211_CMD_CONN_FAILED:
1822                 nl80211_connect_failed_event(drv, tb);
1823                 break;
1824         case NL80211_CMD_FT_EVENT:
1825                 mlme_event_ft_event(drv, tb);
1826                 break;
1827         case NL80211_CMD_RADAR_DETECT:
1828                 nl80211_radar_event(drv, tb);
1829                 break;
1830         case NL80211_CMD_STOP_AP:
1831                 nl80211_stop_ap(drv, tb);
1832                 break;
1833         case NL80211_CMD_VENDOR:
1834                 nl80211_vendor_event(drv, tb);
1835                 break;
1836         case NL80211_CMD_NEW_PEER_CANDIDATE:
1837                 nl80211_new_peer_candidate(drv, tb);
1838                 break;
1839         default:
1840                 wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Ignored unknown event "
1841                         "(cmd=%d)", cmd);
1842                 break;
1843         }
1844 }
1845
1846
1847 int process_drv_event(struct nl_msg *msg, void *arg)
1848 {
1849         struct wpa_driver_nl80211_data *drv = arg;
1850         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
1851         struct nlattr *tb[NL80211_ATTR_MAX + 1];
1852         struct i802_bss *bss;
1853         int ifidx = -1;
1854
1855         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
1856                   genlmsg_attrlen(gnlh, 0), NULL);
1857
1858         if (tb[NL80211_ATTR_IFINDEX]) {
1859                 ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
1860
1861                 for (bss = drv->first_bss; bss; bss = bss->next)
1862                         if (ifidx == -1 || ifidx == bss->ifindex) {
1863                                 do_process_drv_event(bss, gnlh->cmd, tb);
1864                                 return NL_SKIP;
1865                         }
1866                 wpa_printf(MSG_DEBUG,
1867                            "nl80211: Ignored event (cmd=%d) for foreign interface (ifindex %d)",
1868                            gnlh->cmd, ifidx);
1869         } else if (tb[NL80211_ATTR_WDEV]) {
1870                 u64 wdev_id = nla_get_u64(tb[NL80211_ATTR_WDEV]);
1871                 wpa_printf(MSG_DEBUG, "nl80211: Process event on P2P device");
1872                 for (bss = drv->first_bss; bss; bss = bss->next) {
1873                         if (bss->wdev_id_set && wdev_id == bss->wdev_id) {
1874                                 do_process_drv_event(bss, gnlh->cmd, tb);
1875                                 return NL_SKIP;
1876                         }
1877                 }
1878                 wpa_printf(MSG_DEBUG,
1879                            "nl80211: Ignored event (cmd=%d) for foreign interface (wdev 0x%llx)",
1880                            gnlh->cmd, (long long unsigned int) wdev_id);
1881         }
1882
1883         return NL_SKIP;
1884 }
1885
1886
1887 int process_global_event(struct nl_msg *msg, void *arg)
1888 {
1889         struct nl80211_global *global = arg;
1890         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
1891         struct nlattr *tb[NL80211_ATTR_MAX + 1];
1892         struct wpa_driver_nl80211_data *drv, *tmp;
1893         int ifidx = -1;
1894         struct i802_bss *bss;
1895         u64 wdev_id = 0;
1896         int wdev_id_set = 0;
1897
1898         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
1899                   genlmsg_attrlen(gnlh, 0), NULL);
1900
1901         if (tb[NL80211_ATTR_IFINDEX])
1902                 ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
1903         else if (tb[NL80211_ATTR_WDEV]) {
1904                 wdev_id = nla_get_u64(tb[NL80211_ATTR_WDEV]);
1905                 wdev_id_set = 1;
1906         }
1907
1908         dl_list_for_each_safe(drv, tmp, &global->interfaces,
1909                               struct wpa_driver_nl80211_data, list) {
1910                 for (bss = drv->first_bss; bss; bss = bss->next) {
1911                         if ((ifidx == -1 && !wdev_id_set) ||
1912                             ifidx == bss->ifindex ||
1913                             (wdev_id_set && bss->wdev_id_set &&
1914                              wdev_id == bss->wdev_id)) {
1915                                 do_process_drv_event(bss, gnlh->cmd, tb);
1916                                 return NL_SKIP;
1917                         }
1918                 }
1919         }
1920
1921         return NL_SKIP;
1922 }
1923
1924
1925 int process_bss_event(struct nl_msg *msg, void *arg)
1926 {
1927         struct i802_bss *bss = arg;
1928         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
1929         struct nlattr *tb[NL80211_ATTR_MAX + 1];
1930
1931         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
1932                   genlmsg_attrlen(gnlh, 0), NULL);
1933
1934         wpa_printf(MSG_DEBUG, "nl80211: BSS Event %d (%s) received for %s",
1935                    gnlh->cmd, nl80211_command_to_string(gnlh->cmd),
1936                    bss->ifname);
1937
1938         switch (gnlh->cmd) {
1939         case NL80211_CMD_FRAME:
1940         case NL80211_CMD_FRAME_TX_STATUS:
1941                 mlme_event(bss, gnlh->cmd, tb[NL80211_ATTR_FRAME],
1942                            tb[NL80211_ATTR_MAC], tb[NL80211_ATTR_TIMED_OUT],
1943                            tb[NL80211_ATTR_WIPHY_FREQ], tb[NL80211_ATTR_ACK],
1944                            tb[NL80211_ATTR_COOKIE],
1945                            tb[NL80211_ATTR_RX_SIGNAL_DBM],
1946                            tb[NL80211_ATTR_STA_WME]);
1947                 break;
1948         case NL80211_CMD_UNEXPECTED_FRAME:
1949                 nl80211_spurious_frame(bss, tb, 0);
1950                 break;
1951         case NL80211_CMD_UNEXPECTED_4ADDR_FRAME:
1952                 nl80211_spurious_frame(bss, tb, 1);
1953                 break;
1954         default:
1955                 wpa_printf(MSG_DEBUG, "nl80211: Ignored unknown event "
1956                            "(cmd=%d)", gnlh->cmd);
1957                 break;
1958         }
1959
1960         return NL_SKIP;
1961 }