Add deinit_ap driver op to help wpa_supplicant AP mode use
[libeap.git] / src / drivers / driver_nl80211.c
1 /*
2  * Driver interaction with Linux nl80211/cfg80211
3  * Copyright (c) 2002-2010, Jouni Malinen <j@w1.fi>
4  * Copyright (c) 2003-2004, Instant802 Networks, Inc.
5  * Copyright (c) 2005-2006, Devicescape Software, Inc.
6  * Copyright (c) 2007, Johannes Berg <johannes@sipsolutions.net>
7  * Copyright (c) 2009, Atheros Communications
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  *
13  * Alternatively, this software may be distributed under the terms of BSD
14  * license.
15  *
16  * See README and COPYING for more details.
17  */
18
19 #include "includes.h"
20 #include <sys/ioctl.h>
21 #include <net/if.h>
22 #include <netlink/genl/genl.h>
23 #include <netlink/genl/family.h>
24 #include <netlink/genl/ctrl.h>
25 #include <netpacket/packet.h>
26 #include <linux/filter.h>
27 #include "nl80211_copy.h"
28
29 #include "common.h"
30 #include "eloop.h"
31 #include "common/ieee802_11_defs.h"
32 #include "netlink.h"
33 #include "linux_ioctl.h"
34 #include "radiotap.h"
35 #include "radiotap_iter.h"
36 #include "driver.h"
37
38 #ifdef CONFIG_LIBNL20
39 /* libnl 2.0 compatibility code */
40 #define nl_handle nl_sock
41 #define nl_handle_alloc_cb nl_socket_alloc_cb
42 #define nl_handle_destroy nl_socket_free
43 #endif /* CONFIG_LIBNL20 */
44
45
46 #ifndef IFF_LOWER_UP
47 #define IFF_LOWER_UP   0x10000         /* driver signals L1 up         */
48 #endif
49 #ifndef IFF_DORMANT
50 #define IFF_DORMANT    0x20000         /* driver signals dormant       */
51 #endif
52
53 #ifndef IF_OPER_DORMANT
54 #define IF_OPER_DORMANT 5
55 #endif
56 #ifndef IF_OPER_UP
57 #define IF_OPER_UP 6
58 #endif
59
60 struct i802_bss {
61         struct i802_bss *next;
62         int ifindex;
63         unsigned int beacon_set:1;
64 };
65
66 struct wpa_driver_nl80211_data {
67         void *ctx;
68         struct netlink_data *netlink;
69         int ioctl_sock; /* socket for ioctl() use */
70         char ifname[IFNAMSIZ + 1];
71         int ifindex;
72         int if_removed;
73         struct wpa_driver_capa capa;
74         int has_capability;
75
76         int operstate;
77
78         int scan_complete_events;
79
80         struct nl_handle *nl_handle;
81         struct nl_handle *nl_handle_event;
82         struct nl_cache *nl_cache;
83         struct nl_cache *nl_cache_event;
84         struct nl_cb *nl_cb;
85         struct genl_family *nl80211;
86
87         u8 auth_bssid[ETH_ALEN];
88         u8 bssid[ETH_ALEN];
89         int associated;
90         u8 ssid[32];
91         size_t ssid_len;
92         int nlmode;
93         int ap_scan_as_station;
94         unsigned int assoc_freq;
95
96         int monitor_sock;
97         int monitor_ifidx;
98         int probe_req_report;
99         int disable_11b_rates;
100
101         unsigned int beacon_set:1;
102         unsigned int pending_remain_on_chan:1;
103
104         u64 remain_on_chan_cookie;
105
106 #ifdef HOSTAPD
107         int eapol_sock; /* socket for EAPOL frames */
108
109         int default_if_indices[16];
110         int *if_indices;
111         int num_if_indices;
112
113         struct i802_bss bss;
114
115         int last_freq;
116         int last_freq_ht;
117 #endif /* HOSTAPD */
118 };
119
120
121 static void wpa_driver_nl80211_scan_timeout(void *eloop_ctx,
122                                             void *timeout_ctx);
123 static int wpa_driver_nl80211_set_mode(void *priv, int mode);
124 static int
125 wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv);
126 static int wpa_driver_nl80211_mlme(struct wpa_driver_nl80211_data *drv,
127                                    const u8 *addr, int cmd, u16 reason_code);
128 static void nl80211_remove_monitor_interface(
129         struct wpa_driver_nl80211_data *drv);
130
131 #ifdef HOSTAPD
132 static void add_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx);
133 static void del_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx);
134 static struct i802_bss * get_bss(struct wpa_driver_nl80211_data *drv,
135                                  int ifindex);
136 static int i802_set_freq(void *priv, struct hostapd_freq_params *freq);
137 static int wpa_driver_nl80211_if_remove(void *priv,
138                                         enum wpa_driver_if_type type,
139                                         const char *ifname);
140 #endif /* HOSTAPD */
141
142 static void wpa_driver_nl80211_probe_req_report_timeout(void *eloop_ctx,
143                                                         void *timeout_ctx);
144 static int nl80211_disable_11b_rates(struct wpa_driver_nl80211_data *drv,
145                                      int ifindex, int disabled);
146
147
148 /* nl80211 code */
149 static int ack_handler(struct nl_msg *msg, void *arg)
150 {
151         int *err = arg;
152         *err = 0;
153         return NL_STOP;
154 }
155
156 static int finish_handler(struct nl_msg *msg, void *arg)
157 {
158         int *ret = arg;
159         *ret = 0;
160         return NL_SKIP;
161 }
162
163 static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err,
164                          void *arg)
165 {
166         int *ret = arg;
167         *ret = err->error;
168         return NL_SKIP;
169 }
170
171
172 static int no_seq_check(struct nl_msg *msg, void *arg)
173 {
174         return NL_OK;
175 }
176
177
178 static int send_and_recv_msgs(struct wpa_driver_nl80211_data *drv,
179                               struct nl_msg *msg,
180                               int (*valid_handler)(struct nl_msg *, void *),
181                               void *valid_data)
182 {
183         struct nl_cb *cb;
184         int err = -ENOMEM;
185
186         cb = nl_cb_clone(drv->nl_cb);
187         if (!cb)
188                 goto out;
189
190         err = nl_send_auto_complete(drv->nl_handle, msg);
191         if (err < 0)
192                 goto out;
193
194         err = 1;
195
196         nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
197         nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err);
198         nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, &err);
199
200         if (valid_handler)
201                 nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM,
202                           valid_handler, valid_data);
203
204         while (err > 0)
205                 nl_recvmsgs(drv->nl_handle, cb);
206  out:
207         nl_cb_put(cb);
208         nlmsg_free(msg);
209         return err;
210 }
211
212
213 struct family_data {
214         const char *group;
215         int id;
216 };
217
218
219 static int family_handler(struct nl_msg *msg, void *arg)
220 {
221         struct family_data *res = arg;
222         struct nlattr *tb[CTRL_ATTR_MAX + 1];
223         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
224         struct nlattr *mcgrp;
225         int i;
226
227         nla_parse(tb, CTRL_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
228                   genlmsg_attrlen(gnlh, 0), NULL);
229         if (!tb[CTRL_ATTR_MCAST_GROUPS])
230                 return NL_SKIP;
231
232         nla_for_each_nested(mcgrp, tb[CTRL_ATTR_MCAST_GROUPS], i) {
233                 struct nlattr *tb2[CTRL_ATTR_MCAST_GRP_MAX + 1];
234                 nla_parse(tb2, CTRL_ATTR_MCAST_GRP_MAX, nla_data(mcgrp),
235                           nla_len(mcgrp), NULL);
236                 if (!tb2[CTRL_ATTR_MCAST_GRP_NAME] ||
237                     !tb2[CTRL_ATTR_MCAST_GRP_ID] ||
238                     os_strncmp(nla_data(tb2[CTRL_ATTR_MCAST_GRP_NAME]),
239                                res->group,
240                                nla_len(tb2[CTRL_ATTR_MCAST_GRP_NAME])) != 0)
241                         continue;
242                 res->id = nla_get_u32(tb2[CTRL_ATTR_MCAST_GRP_ID]);
243                 break;
244         };
245
246         return NL_SKIP;
247 }
248
249
250 static int nl_get_multicast_id(struct wpa_driver_nl80211_data *drv,
251                                const char *family, const char *group)
252 {
253         struct nl_msg *msg;
254         int ret = -1;
255         struct family_data res = { group, -ENOENT };
256
257         msg = nlmsg_alloc();
258         if (!msg)
259                 return -ENOMEM;
260         genlmsg_put(msg, 0, 0, genl_ctrl_resolve(drv->nl_handle, "nlctrl"),
261                     0, 0, CTRL_CMD_GETFAMILY, 0);
262         NLA_PUT_STRING(msg, CTRL_ATTR_FAMILY_NAME, family);
263
264         ret = send_and_recv_msgs(drv, msg, family_handler, &res);
265         msg = NULL;
266         if (ret == 0)
267                 ret = res.id;
268
269 nla_put_failure:
270         nlmsg_free(msg);
271         return ret;
272 }
273
274
275 static int wpa_driver_nl80211_get_bssid(void *priv, u8 *bssid)
276 {
277         struct wpa_driver_nl80211_data *drv = priv;
278         if (!drv->associated)
279                 return -1;
280         os_memcpy(bssid, drv->bssid, ETH_ALEN);
281         return 0;
282 }
283
284
285 static int wpa_driver_nl80211_get_ssid(void *priv, u8 *ssid)
286 {
287         struct wpa_driver_nl80211_data *drv = priv;
288         if (!drv->associated)
289                 return -1;
290         os_memcpy(ssid, drv->ssid, drv->ssid_len);
291         return drv->ssid_len;
292 }
293
294
295 static void wpa_driver_nl80211_event_link(struct wpa_driver_nl80211_data *drv,
296                                           char *buf, size_t len, int del)
297 {
298         union wpa_event_data event;
299
300         os_memset(&event, 0, sizeof(event));
301         if (len > sizeof(event.interface_status.ifname))
302                 len = sizeof(event.interface_status.ifname) - 1;
303         os_memcpy(event.interface_status.ifname, buf, len);
304         event.interface_status.ievent = del ? EVENT_INTERFACE_REMOVED :
305                 EVENT_INTERFACE_ADDED;
306
307         wpa_printf(MSG_DEBUG, "RTM_%sLINK, IFLA_IFNAME: Interface '%s' %s",
308                    del ? "DEL" : "NEW",
309                    event.interface_status.ifname,
310                    del ? "removed" : "added");
311
312         if (os_strcmp(drv->ifname, event.interface_status.ifname) == 0) {
313                 if (del)
314                         drv->if_removed = 1;
315                 else
316                         drv->if_removed = 0;
317         }
318
319         wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_STATUS, &event);
320 }
321
322
323 static int wpa_driver_nl80211_own_ifname(struct wpa_driver_nl80211_data *drv,
324                                          u8 *buf, size_t len)
325 {
326         int attrlen, rta_len;
327         struct rtattr *attr;
328
329         attrlen = len;
330         attr = (struct rtattr *) buf;
331
332         rta_len = RTA_ALIGN(sizeof(struct rtattr));
333         while (RTA_OK(attr, attrlen)) {
334                 if (attr->rta_type == IFLA_IFNAME) {
335                         if (os_strcmp(((char *) attr) + rta_len, drv->ifname)
336                             == 0)
337                                 return 1;
338                         else
339                                 break;
340                 }
341                 attr = RTA_NEXT(attr, attrlen);
342         }
343
344         return 0;
345 }
346
347
348 static int wpa_driver_nl80211_own_ifindex(struct wpa_driver_nl80211_data *drv,
349                                           int ifindex, u8 *buf, size_t len)
350 {
351         if (drv->ifindex == ifindex)
352                 return 1;
353
354         if (drv->if_removed && wpa_driver_nl80211_own_ifname(drv, buf, len)) {
355                 drv->ifindex = if_nametoindex(drv->ifname);
356                 wpa_printf(MSG_DEBUG, "nl80211: Update ifindex for a removed "
357                            "interface");
358                 wpa_driver_nl80211_finish_drv_init(drv);
359                 return 1;
360         }
361
362         return 0;
363 }
364
365
366 static void wpa_driver_nl80211_event_rtm_newlink(void *ctx,
367                                                  struct ifinfomsg *ifi,
368                                                  u8 *buf, size_t len)
369 {
370         struct wpa_driver_nl80211_data *drv = ctx;
371         int attrlen, rta_len;
372         struct rtattr *attr;
373
374         if (!wpa_driver_nl80211_own_ifindex(drv, ifi->ifi_index, buf, len)) {
375                 wpa_printf(MSG_DEBUG, "Ignore event for foreign ifindex %d",
376                            ifi->ifi_index);
377                 return;
378         }
379
380         wpa_printf(MSG_DEBUG, "RTM_NEWLINK: operstate=%d ifi_flags=0x%x "
381                    "(%s%s%s%s)",
382                    drv->operstate, ifi->ifi_flags,
383                    (ifi->ifi_flags & IFF_UP) ? "[UP]" : "",
384                    (ifi->ifi_flags & IFF_RUNNING) ? "[RUNNING]" : "",
385                    (ifi->ifi_flags & IFF_LOWER_UP) ? "[LOWER_UP]" : "",
386                    (ifi->ifi_flags & IFF_DORMANT) ? "[DORMANT]" : "");
387         /*
388          * Some drivers send the association event before the operup event--in
389          * this case, lifting operstate in wpa_driver_nl80211_set_operstate()
390          * fails. This will hit us when wpa_supplicant does not need to do
391          * IEEE 802.1X authentication
392          */
393         if (drv->operstate == 1 &&
394             (ifi->ifi_flags & (IFF_LOWER_UP | IFF_DORMANT)) == IFF_LOWER_UP &&
395             !(ifi->ifi_flags & IFF_RUNNING))
396                 netlink_send_oper_ifla(drv->netlink, drv->ifindex,
397                                        -1, IF_OPER_UP);
398
399         attrlen = len;
400         attr = (struct rtattr *) buf;
401         rta_len = RTA_ALIGN(sizeof(struct rtattr));
402         while (RTA_OK(attr, attrlen)) {
403                 if (attr->rta_type == IFLA_IFNAME) {
404                         wpa_driver_nl80211_event_link(
405                                 drv,
406                                 ((char *) attr) + rta_len,
407                                 attr->rta_len - rta_len, 0);
408                 }
409                 attr = RTA_NEXT(attr, attrlen);
410         }
411 }
412
413
414 static void wpa_driver_nl80211_event_rtm_dellink(void *ctx,
415                                                  struct ifinfomsg *ifi,
416                                                  u8 *buf, size_t len)
417 {
418         struct wpa_driver_nl80211_data *drv = ctx;
419         int attrlen, rta_len;
420         struct rtattr *attr;
421
422         attrlen = len;
423         attr = (struct rtattr *) buf;
424
425         rta_len = RTA_ALIGN(sizeof(struct rtattr));
426         while (RTA_OK(attr, attrlen)) {
427                 if (attr->rta_type == IFLA_IFNAME) {
428                         wpa_driver_nl80211_event_link(
429                                 drv,
430                                 ((char *) attr) + rta_len,
431                                 attr->rta_len - rta_len, 1);
432                 }
433                 attr = RTA_NEXT(attr, attrlen);
434         }
435 }
436
437
438 static void mlme_event_auth(struct wpa_driver_nl80211_data *drv,
439                             const u8 *frame, size_t len)
440 {
441         const struct ieee80211_mgmt *mgmt;
442         union wpa_event_data event;
443
444         mgmt = (const struct ieee80211_mgmt *) frame;
445         if (len < 24 + sizeof(mgmt->u.auth)) {
446                 wpa_printf(MSG_DEBUG, "nl80211: Too short association event "
447                            "frame");
448                 return;
449         }
450
451         os_memcpy(drv->auth_bssid, mgmt->sa, ETH_ALEN);
452         os_memset(&event, 0, sizeof(event));
453         os_memcpy(event.auth.peer, mgmt->sa, ETH_ALEN);
454         event.auth.auth_type = le_to_host16(mgmt->u.auth.auth_alg);
455         event.auth.status_code = le_to_host16(mgmt->u.auth.status_code);
456         if (len > 24 + sizeof(mgmt->u.auth)) {
457                 event.auth.ies = mgmt->u.auth.variable;
458                 event.auth.ies_len = len - 24 - sizeof(mgmt->u.auth);
459         }
460
461         wpa_supplicant_event(drv->ctx, EVENT_AUTH, &event);
462 }
463
464
465 static void mlme_event_assoc(struct wpa_driver_nl80211_data *drv,
466                             const u8 *frame, size_t len)
467 {
468         const struct ieee80211_mgmt *mgmt;
469         union wpa_event_data event;
470         u16 status;
471
472         mgmt = (const struct ieee80211_mgmt *) frame;
473         if (len < 24 + sizeof(mgmt->u.assoc_resp)) {
474                 wpa_printf(MSG_DEBUG, "nl80211: Too short association event "
475                            "frame");
476                 return;
477         }
478
479         status = le_to_host16(mgmt->u.assoc_resp.status_code);
480         if (status != WLAN_STATUS_SUCCESS) {
481                 os_memset(&event, 0, sizeof(event));
482                 if (len > 24 + sizeof(mgmt->u.assoc_resp)) {
483                         event.assoc_reject.resp_ies =
484                                 (u8 *) mgmt->u.assoc_resp.variable;
485                         event.assoc_reject.resp_ies_len =
486                                 len - 24 - sizeof(mgmt->u.assoc_resp);
487                 }
488                 event.assoc_reject.status_code = status;
489
490                 wpa_supplicant_event(drv->ctx, EVENT_ASSOC_REJECT, &event);
491                 return;
492         }
493
494         drv->associated = 1;
495         os_memcpy(drv->bssid, mgmt->sa, ETH_ALEN);
496
497         os_memset(&event, 0, sizeof(event));
498         if (len > 24 + sizeof(mgmt->u.assoc_resp)) {
499                 event.assoc_info.resp_ies = (u8 *) mgmt->u.assoc_resp.variable;
500                 event.assoc_info.resp_ies_len =
501                         len - 24 - sizeof(mgmt->u.assoc_resp);
502         }
503
504         event.assoc_info.freq = drv->assoc_freq;
505
506         wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event);
507 }
508
509
510 static void mlme_event_connect(struct wpa_driver_nl80211_data *drv,
511                                enum nl80211_commands cmd, struct nlattr *status,
512                                struct nlattr *addr, struct nlattr *req_ie,
513                                struct nlattr *resp_ie)
514 {
515         union wpa_event_data event;
516
517         if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) {
518                 /*
519                  * Avoid reporting two association events that would confuse
520                  * the core code.
521                  */
522                 wpa_printf(MSG_DEBUG, "nl80211: Ignore connect event (cmd=%d) "
523                            "when using userspace SME", cmd);
524                 return;
525         }
526
527         os_memset(&event, 0, sizeof(event));
528         if (cmd == NL80211_CMD_CONNECT &&
529             nla_get_u16(status) != WLAN_STATUS_SUCCESS) {
530                 if (resp_ie) {
531                         event.assoc_reject.resp_ies = nla_data(resp_ie);
532                         event.assoc_reject.resp_ies_len = nla_len(resp_ie);
533                 }
534                 event.assoc_reject.status_code = nla_get_u16(status);
535                 wpa_supplicant_event(drv->ctx, EVENT_ASSOC_REJECT, &event);
536                 return;
537         }
538
539         drv->associated = 1;
540         if (addr)
541                 os_memcpy(drv->bssid, nla_data(addr), ETH_ALEN);
542
543         if (req_ie) {
544                 event.assoc_info.req_ies = nla_data(req_ie);
545                 event.assoc_info.req_ies_len = nla_len(req_ie);
546         }
547         if (resp_ie) {
548                 event.assoc_info.resp_ies = nla_data(resp_ie);
549                 event.assoc_info.resp_ies_len = nla_len(resp_ie);
550         }
551
552         wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event);
553 }
554
555
556 static void mlme_timeout_event(struct wpa_driver_nl80211_data *drv,
557                                enum nl80211_commands cmd, struct nlattr *addr)
558 {
559         union wpa_event_data event;
560         enum wpa_event_type ev;
561
562         if (nla_len(addr) != ETH_ALEN)
563                 return;
564
565         wpa_printf(MSG_DEBUG, "nl80211: MLME event %d; timeout with " MACSTR,
566                    cmd, MAC2STR((u8 *) nla_data(addr)));
567
568         if (cmd == NL80211_CMD_AUTHENTICATE)
569                 ev = EVENT_AUTH_TIMED_OUT;
570         else if (cmd == NL80211_CMD_ASSOCIATE)
571                 ev = EVENT_ASSOC_TIMED_OUT;
572         else
573                 return;
574
575         os_memset(&event, 0, sizeof(event));
576         os_memcpy(event.timeout_event.addr, nla_data(addr), ETH_ALEN);
577         wpa_supplicant_event(drv->ctx, ev, &event);
578 }
579
580
581 static void mlme_event(struct wpa_driver_nl80211_data *drv,
582                        enum nl80211_commands cmd, struct nlattr *frame,
583                        struct nlattr *addr, struct nlattr *timed_out)
584 {
585         if (timed_out && addr) {
586                 mlme_timeout_event(drv, cmd, addr);
587                 return;
588         }
589
590         if (frame == NULL) {
591                 wpa_printf(MSG_DEBUG, "nl80211: MLME event %d without frame "
592                            "data", cmd);
593                 return;
594         }
595
596         wpa_printf(MSG_DEBUG, "nl80211: MLME event %d", cmd);
597         wpa_hexdump(MSG_MSGDUMP, "nl80211: MLME event frame",
598                     nla_data(frame), nla_len(frame));
599
600         switch (cmd) {
601         case NL80211_CMD_AUTHENTICATE:
602                 mlme_event_auth(drv, nla_data(frame), nla_len(frame));
603                 break;
604         case NL80211_CMD_ASSOCIATE:
605                 mlme_event_assoc(drv, nla_data(frame), nla_len(frame));
606                 break;
607         case NL80211_CMD_DEAUTHENTICATE:
608                 drv->associated = 0;
609                 wpa_supplicant_event(drv->ctx, EVENT_DEAUTH, NULL);
610                 break;
611         case NL80211_CMD_DISASSOCIATE:
612                 drv->associated = 0;
613                 wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
614                 break;
615         default:
616                 break;
617         }
618 }
619
620
621 static void mlme_event_michael_mic_failure(struct wpa_driver_nl80211_data *drv,
622                                            struct nlattr *tb[])
623 {
624         union wpa_event_data data;
625
626         wpa_printf(MSG_DEBUG, "nl80211: MLME event Michael MIC failure");
627         os_memset(&data, 0, sizeof(data));
628         if (tb[NL80211_ATTR_MAC]) {
629                 wpa_hexdump(MSG_DEBUG, "nl80211: Source MAC address",
630                             nla_data(tb[NL80211_ATTR_MAC]),
631                             nla_len(tb[NL80211_ATTR_MAC]));
632                 data.michael_mic_failure.src = nla_data(tb[NL80211_ATTR_MAC]);
633         }
634         if (tb[NL80211_ATTR_KEY_SEQ]) {
635                 wpa_hexdump(MSG_DEBUG, "nl80211: TSC",
636                             nla_data(tb[NL80211_ATTR_KEY_SEQ]),
637                             nla_len(tb[NL80211_ATTR_KEY_SEQ]));
638         }
639         if (tb[NL80211_ATTR_KEY_TYPE]) {
640                 enum nl80211_key_type key_type =
641                         nla_get_u32(tb[NL80211_ATTR_KEY_TYPE]);
642                 wpa_printf(MSG_DEBUG, "nl80211: Key Type %d", key_type);
643                 if (key_type == NL80211_KEYTYPE_PAIRWISE)
644                         data.michael_mic_failure.unicast = 1;
645         } else
646                 data.michael_mic_failure.unicast = 1;
647
648         if (tb[NL80211_ATTR_KEY_IDX]) {
649                 u8 key_id = nla_get_u8(tb[NL80211_ATTR_KEY_IDX]);
650                 wpa_printf(MSG_DEBUG, "nl80211: Key Id %d", key_id);
651         }
652
653         wpa_supplicant_event(drv->ctx, EVENT_MICHAEL_MIC_FAILURE, &data);
654 }
655
656
657 static void mlme_event_join_ibss(struct wpa_driver_nl80211_data *drv,
658                                  struct nlattr *tb[])
659 {
660         if (tb[NL80211_ATTR_MAC] == NULL) {
661                 wpa_printf(MSG_DEBUG, "nl80211: No address in IBSS joined "
662                            "event");
663                 return;
664         }
665         os_memcpy(drv->bssid, nla_data(tb[NL80211_ATTR_MAC]), ETH_ALEN);
666         drv->associated = 1;
667         wpa_printf(MSG_DEBUG, "nl80211: IBSS " MACSTR " joined",
668                    MAC2STR(drv->bssid));
669
670         wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
671 }
672
673
674 static void mlme_event_remain_on_channel(struct wpa_driver_nl80211_data *drv,
675                                          int cancel_event, struct nlattr *tb[])
676 {
677         unsigned int freq, chan_type, duration;
678         union wpa_event_data data;
679         u64 cookie;
680
681         if (tb[NL80211_ATTR_WIPHY_FREQ])
682                 freq = nla_get_u32(tb[NL80211_ATTR_WIPHY_FREQ]);
683         else
684                 freq = 0;
685
686         if (tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE])
687                 chan_type = nla_get_u32(tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
688         else
689                 chan_type = 0;
690
691         if (tb[NL80211_ATTR_DURATION])
692                 duration = nla_get_u32(tb[NL80211_ATTR_DURATION]);
693         else
694                 duration = 0;
695
696         if (tb[NL80211_ATTR_COOKIE])
697                 cookie = nla_get_u64(tb[NL80211_ATTR_COOKIE]);
698         else
699                 cookie = 0;
700
701         wpa_printf(MSG_DEBUG, "nl80211: Remain-on-channel event (cancel=%d "
702                    "freq=%u channel_type=%u duration=%u cookie=0x%llx (%s))",
703                    cancel_event, freq, chan_type, duration,
704                    (long long unsigned int) cookie,
705                    cookie == drv->remain_on_chan_cookie ? "match" : "unknown");
706
707         if (cookie != drv->remain_on_chan_cookie)
708                 return; /* not for us */
709
710         drv->pending_remain_on_chan = !cancel_event;
711
712         os_memset(&data, 0, sizeof(data));
713         data.remain_on_channel.freq = freq;
714         data.remain_on_channel.duration = duration;
715         wpa_supplicant_event(drv->ctx, cancel_event ?
716                              EVENT_CANCEL_REMAIN_ON_CHANNEL :
717                              EVENT_REMAIN_ON_CHANNEL, &data);
718 }
719
720
721 static void send_scan_event(struct wpa_driver_nl80211_data *drv, int aborted,
722                             struct nlattr *tb[])
723 {
724         union wpa_event_data event;
725         struct nlattr *nl;
726         int rem;
727         struct scan_info *info;
728 #define MAX_REPORT_FREQS 50
729         int freqs[MAX_REPORT_FREQS];
730         int num_freqs = 0;
731
732         os_memset(&event, 0, sizeof(event));
733         info = &event.scan_info;
734         info->aborted = aborted;
735
736         if (tb[NL80211_ATTR_SCAN_SSIDS]) {
737                 nla_for_each_nested(nl, tb[NL80211_ATTR_SCAN_SSIDS], rem) {
738                         struct wpa_driver_scan_ssid *s =
739                                 &info->ssids[info->num_ssids];
740                         s->ssid = nla_data(nl);
741                         s->ssid_len = nla_len(nl);
742                         info->num_ssids++;
743                         if (info->num_ssids == WPAS_MAX_SCAN_SSIDS)
744                                 break;
745                 }
746         }
747         if (tb[NL80211_ATTR_SCAN_FREQUENCIES]) {
748                 nla_for_each_nested(nl, tb[NL80211_ATTR_SCAN_FREQUENCIES], rem)
749                 {
750                         freqs[num_freqs] = nla_get_u32(nl);
751                         num_freqs++;
752                         if (num_freqs == MAX_REPORT_FREQS - 1)
753                                 break;
754                 }
755                 info->freqs = freqs;
756                 info->num_freqs = num_freqs;
757         }
758         wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS, &event);
759 }
760
761
762 static int process_event(struct nl_msg *msg, void *arg)
763 {
764         struct wpa_driver_nl80211_data *drv = arg;
765         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
766         struct nlattr *tb[NL80211_ATTR_MAX + 1];
767
768         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
769                   genlmsg_attrlen(gnlh, 0), NULL);
770
771         if (tb[NL80211_ATTR_IFINDEX]) {
772                 int ifindex = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
773                 if (ifindex != drv->ifindex) {
774                         wpa_printf(MSG_DEBUG, "nl80211: Ignored event (cmd=%d)"
775                                    " for foreign interface (ifindex %d)",
776                                    gnlh->cmd, ifindex);
777                         return NL_SKIP;
778                 }
779         }
780
781         if (drv->ap_scan_as_station &&
782             (gnlh->cmd == NL80211_CMD_NEW_SCAN_RESULTS ||
783              gnlh->cmd == NL80211_CMD_SCAN_ABORTED)) {
784                 wpa_driver_nl80211_set_mode(drv, IEEE80211_MODE_AP);
785                 drv->ap_scan_as_station = 0;
786         }
787
788         switch (gnlh->cmd) {
789         case NL80211_CMD_TRIGGER_SCAN:
790                 wpa_printf(MSG_DEBUG, "nl80211: Scan trigger");
791                 break;
792         case NL80211_CMD_NEW_SCAN_RESULTS:
793                 wpa_printf(MSG_DEBUG, "nl80211: New scan results available");
794                 drv->scan_complete_events = 1;
795                 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv,
796                                      drv->ctx);
797                 send_scan_event(drv, 0, tb);
798                 break;
799         case NL80211_CMD_SCAN_ABORTED:
800                 wpa_printf(MSG_DEBUG, "nl80211: Scan aborted");
801                 /*
802                  * Need to indicate that scan results are available in order
803                  * not to make wpa_supplicant stop its scanning.
804                  */
805                 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv,
806                                      drv->ctx);
807                 send_scan_event(drv, 1, tb);
808                 break;
809         case NL80211_CMD_AUTHENTICATE:
810         case NL80211_CMD_ASSOCIATE:
811         case NL80211_CMD_DEAUTHENTICATE:
812         case NL80211_CMD_DISASSOCIATE:
813                 mlme_event(drv, gnlh->cmd, tb[NL80211_ATTR_FRAME],
814                            tb[NL80211_ATTR_MAC], tb[NL80211_ATTR_TIMED_OUT]);
815                 break;
816         case NL80211_CMD_CONNECT:
817         case NL80211_CMD_ROAM:
818                 mlme_event_connect(drv, gnlh->cmd,
819                                    tb[NL80211_ATTR_STATUS_CODE],
820                                    tb[NL80211_ATTR_MAC],
821                                    tb[NL80211_ATTR_REQ_IE],
822                                    tb[NL80211_ATTR_RESP_IE]);
823                 break;
824         case NL80211_CMD_DISCONNECT:
825                 if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) {
826                         /*
827                          * Avoid reporting two disassociation events that could
828                          * confuse the core code.
829                          */
830                         wpa_printf(MSG_DEBUG, "nl80211: Ignore disconnect "
831                                    "event when using userspace SME");
832                         break;
833                 }
834                 drv->associated = 0;
835                 wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
836                 break;
837         case NL80211_CMD_MICHAEL_MIC_FAILURE:
838                 mlme_event_michael_mic_failure(drv, tb);
839                 break;
840         case NL80211_CMD_JOIN_IBSS:
841                 mlme_event_join_ibss(drv, tb);
842                 break;
843         case NL80211_CMD_REMAIN_ON_CHANNEL:
844                 mlme_event_remain_on_channel(drv, 0, tb);
845                 break;
846         case NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL:
847                 mlme_event_remain_on_channel(drv, 1, tb);
848                 break;
849         default:
850                 wpa_printf(MSG_DEBUG, "nl80211: Ignored unknown event "
851                            "(cmd=%d)", gnlh->cmd);
852                 break;
853         }
854
855         return NL_SKIP;
856 }
857
858
859 static void wpa_driver_nl80211_event_receive(int sock, void *eloop_ctx,
860                                              void *sock_ctx)
861 {
862         struct nl_cb *cb;
863         struct wpa_driver_nl80211_data *drv = eloop_ctx;
864
865         wpa_printf(MSG_DEBUG, "nl80211: Event message available");
866
867         cb = nl_cb_clone(drv->nl_cb);
868         if (!cb)
869                 return;
870         nl_cb_set(cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, no_seq_check, NULL);
871         nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, process_event, drv);
872         nl_recvmsgs(drv->nl_handle_event, cb);
873         nl_cb_put(cb);
874 }
875
876
877 /**
878  * wpa_driver_nl80211_set_country - ask nl80211 to set the regulatory domain
879  * @priv: driver_nl80211 private data
880  * @alpha2_arg: country to which to switch to
881  * Returns: 0 on success, -1 on failure
882  *
883  * This asks nl80211 to set the regulatory domain for given
884  * country ISO / IEC alpha2.
885  */
886 static int wpa_driver_nl80211_set_country(void *priv, const char *alpha2_arg)
887 {
888         struct wpa_driver_nl80211_data *drv = priv;
889         char alpha2[3];
890         struct nl_msg *msg;
891
892         msg = nlmsg_alloc();
893         if (!msg)
894                 return -ENOMEM;
895
896         alpha2[0] = alpha2_arg[0];
897         alpha2[1] = alpha2_arg[1];
898         alpha2[2] = '\0';
899
900         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
901                     0, NL80211_CMD_REQ_SET_REG, 0);
902
903         NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2, alpha2);
904         if (send_and_recv_msgs(drv, msg, NULL, NULL))
905                 return -EINVAL;
906         return 0;
907 nla_put_failure:
908         return -EINVAL;
909 }
910
911
912 #ifndef HOSTAPD
913 struct wiphy_info_data {
914         int max_scan_ssids;
915         int ap_supported;
916         int auth_supported;
917         int connect_supported;
918 };
919
920
921 static int wiphy_info_handler(struct nl_msg *msg, void *arg)
922 {
923         struct nlattr *tb[NL80211_ATTR_MAX + 1];
924         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
925         struct wiphy_info_data *info = arg;
926
927         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
928                   genlmsg_attrlen(gnlh, 0), NULL);
929
930         if (tb[NL80211_ATTR_MAX_NUM_SCAN_SSIDS])
931                 info->max_scan_ssids =
932                         nla_get_u8(tb[NL80211_ATTR_MAX_NUM_SCAN_SSIDS]);
933
934         if (tb[NL80211_ATTR_SUPPORTED_IFTYPES]) {
935                 struct nlattr *nl_mode;
936                 int i;
937                 nla_for_each_nested(nl_mode,
938                                     tb[NL80211_ATTR_SUPPORTED_IFTYPES], i) {
939                         if (nl_mode->nla_type == NL80211_IFTYPE_AP) {
940                                 info->ap_supported = 1;
941                                 break;
942                         }
943                 }
944         }
945
946         if (tb[NL80211_ATTR_SUPPORTED_COMMANDS]) {
947                 struct nlattr *nl_cmd;
948                 int i;
949
950                 nla_for_each_nested(nl_cmd,
951                                     tb[NL80211_ATTR_SUPPORTED_COMMANDS], i) {
952                         u32 cmd = nla_get_u32(nl_cmd);
953                         if (cmd == NL80211_CMD_AUTHENTICATE)
954                                 info->auth_supported = 1;
955                         else if (cmd == NL80211_CMD_CONNECT)
956                                 info->connect_supported = 1;
957                 }
958         }
959
960         return NL_SKIP;
961 }
962
963
964 static int wpa_driver_nl80211_get_info(struct wpa_driver_nl80211_data *drv,
965                                        struct wiphy_info_data *info)
966 {
967         struct nl_msg *msg;
968
969         os_memset(info, 0, sizeof(*info));
970         msg = nlmsg_alloc();
971         if (!msg)
972                 return -1;
973
974         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
975                     0, NL80211_CMD_GET_WIPHY, 0);
976
977         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
978
979         if (send_and_recv_msgs(drv, msg, wiphy_info_handler, info) == 0)
980                 return 0;
981         msg = NULL;
982 nla_put_failure:
983         nlmsg_free(msg);
984         return -1;
985 }
986
987
988 static int wpa_driver_nl80211_capa(struct wpa_driver_nl80211_data *drv)
989 {
990         struct wiphy_info_data info;
991         if (wpa_driver_nl80211_get_info(drv, &info))
992                 return -1;
993         drv->has_capability = 1;
994         /* For now, assume TKIP, CCMP, WPA, WPA2 are supported */
995         drv->capa.key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA |
996                 WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
997                 WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
998                 WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK;
999         drv->capa.enc = WPA_DRIVER_CAPA_ENC_WEP40 |
1000                 WPA_DRIVER_CAPA_ENC_WEP104 |
1001                 WPA_DRIVER_CAPA_ENC_TKIP |
1002                 WPA_DRIVER_CAPA_ENC_CCMP;
1003         drv->capa.auth = WPA_DRIVER_AUTH_OPEN |
1004                 WPA_DRIVER_AUTH_SHARED |
1005                 WPA_DRIVER_AUTH_LEAP;
1006
1007         drv->capa.max_scan_ssids = info.max_scan_ssids;
1008         if (info.ap_supported)
1009                 drv->capa.flags |= WPA_DRIVER_FLAGS_AP;
1010
1011         if (info.auth_supported)
1012                 drv->capa.flags |= WPA_DRIVER_FLAGS_SME;
1013         else if (!info.connect_supported) {
1014                 wpa_printf(MSG_INFO, "nl80211: Driver does not support "
1015                            "authentication/association or connect commands");
1016                 return -1;
1017         }
1018
1019         drv->capa.flags |= WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC_DONE;
1020
1021         return 0;
1022 }
1023 #endif /* HOSTAPD */
1024
1025
1026 static int wpa_driver_nl80211_init_nl(struct wpa_driver_nl80211_data *drv,
1027                                       void *ctx)
1028 {
1029         int ret;
1030
1031         /* Initialize generic netlink and nl80211 */
1032
1033         drv->nl_cb = nl_cb_alloc(NL_CB_DEFAULT);
1034         if (drv->nl_cb == NULL) {
1035                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate netlink "
1036                            "callbacks");
1037                 goto err1;
1038         }
1039
1040         drv->nl_handle = nl_handle_alloc_cb(drv->nl_cb);
1041         if (drv->nl_handle == NULL) {
1042                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate netlink "
1043                            "callbacks");
1044                 goto err2;
1045         }
1046
1047         drv->nl_handle_event = nl_handle_alloc_cb(drv->nl_cb);
1048         if (drv->nl_handle_event == NULL) {
1049                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate netlink "
1050                            "callbacks (event)");
1051                 goto err2b;
1052         }
1053
1054         if (genl_connect(drv->nl_handle)) {
1055                 wpa_printf(MSG_ERROR, "nl80211: Failed to connect to generic "
1056                            "netlink");
1057                 goto err3;
1058         }
1059
1060         if (genl_connect(drv->nl_handle_event)) {
1061                 wpa_printf(MSG_ERROR, "nl80211: Failed to connect to generic "
1062                            "netlink (event)");
1063                 goto err3;
1064         }
1065
1066 #ifdef CONFIG_LIBNL20
1067         if (genl_ctrl_alloc_cache(drv->nl_handle, &drv->nl_cache) < 0) {
1068                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic "
1069                            "netlink cache");
1070                 goto err3;
1071         }
1072         if (genl_ctrl_alloc_cache(drv->nl_handle_event, &drv->nl_cache_event) <
1073             0) {
1074                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic "
1075                            "netlink cache (event)");
1076                 goto err3b;
1077         }
1078 #else /* CONFIG_LIBNL20 */
1079         drv->nl_cache = genl_ctrl_alloc_cache(drv->nl_handle);
1080         if (drv->nl_cache == NULL) {
1081                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic "
1082                            "netlink cache");
1083                 goto err3;
1084         }
1085         drv->nl_cache_event = genl_ctrl_alloc_cache(drv->nl_handle_event);
1086         if (drv->nl_cache_event == NULL) {
1087                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic "
1088                            "netlink cache (event)");
1089                 goto err3b;
1090         }
1091 #endif /* CONFIG_LIBNL20 */
1092
1093         drv->nl80211 = genl_ctrl_search_by_name(drv->nl_cache, "nl80211");
1094         if (drv->nl80211 == NULL) {
1095                 wpa_printf(MSG_ERROR, "nl80211: 'nl80211' generic netlink not "
1096                            "found");
1097                 goto err4;
1098         }
1099
1100         ret = nl_get_multicast_id(drv, "nl80211", "scan");
1101         if (ret >= 0)
1102                 ret = nl_socket_add_membership(drv->nl_handle_event, ret);
1103         if (ret < 0) {
1104                 wpa_printf(MSG_ERROR, "nl80211: Could not add multicast "
1105                            "membership for scan events: %d (%s)",
1106                            ret, strerror(-ret));
1107                 goto err4;
1108         }
1109
1110         ret = nl_get_multicast_id(drv, "nl80211", "mlme");
1111         if (ret >= 0)
1112                 ret = nl_socket_add_membership(drv->nl_handle_event, ret);
1113         if (ret < 0) {
1114                 wpa_printf(MSG_ERROR, "nl80211: Could not add multicast "
1115                            "membership for mlme events: %d (%s)",
1116                            ret, strerror(-ret));
1117                 goto err4;
1118         }
1119
1120         eloop_register_read_sock(nl_socket_get_fd(drv->nl_handle_event),
1121                                  wpa_driver_nl80211_event_receive, drv, ctx);
1122
1123         return 0;
1124
1125 err4:
1126         nl_cache_free(drv->nl_cache_event);
1127 err3b:
1128         nl_cache_free(drv->nl_cache);
1129 err3:
1130         nl_handle_destroy(drv->nl_handle_event);
1131 err2b:
1132         nl_handle_destroy(drv->nl_handle);
1133 err2:
1134         nl_cb_put(drv->nl_cb);
1135 err1:
1136         return -1;
1137 }
1138
1139
1140 /**
1141  * wpa_driver_nl80211_init - Initialize nl80211 driver interface
1142  * @ctx: context to be used when calling wpa_supplicant functions,
1143  * e.g., wpa_supplicant_event()
1144  * @ifname: interface name, e.g., wlan0
1145  * Returns: Pointer to private data, %NULL on failure
1146  */
1147 static void * wpa_driver_nl80211_init(void *ctx, const char *ifname)
1148 {
1149         struct wpa_driver_nl80211_data *drv;
1150         struct netlink_config *cfg;
1151
1152         drv = os_zalloc(sizeof(*drv));
1153         if (drv == NULL)
1154                 return NULL;
1155         drv->ctx = ctx;
1156         os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
1157         drv->monitor_ifidx = -1;
1158         drv->monitor_sock = -1;
1159         drv->ioctl_sock = -1;
1160
1161         if (wpa_driver_nl80211_init_nl(drv, ctx)) {
1162                 os_free(drv);
1163                 return NULL;
1164         }
1165
1166         drv->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);
1167         if (drv->ioctl_sock < 0) {
1168                 perror("socket(PF_INET,SOCK_DGRAM)");
1169                 goto failed;
1170         }
1171
1172         cfg = os_zalloc(sizeof(*cfg));
1173         if (cfg == NULL)
1174                 goto failed;
1175         cfg->ctx = drv;
1176         cfg->newlink_cb = wpa_driver_nl80211_event_rtm_newlink;
1177         cfg->dellink_cb = wpa_driver_nl80211_event_rtm_dellink;
1178         drv->netlink = netlink_init(cfg);
1179         if (drv->netlink == NULL) {
1180                 os_free(cfg);
1181                 goto failed;
1182         }
1183         if (wpa_driver_nl80211_finish_drv_init(drv))
1184                 goto failed;
1185
1186         return drv;
1187
1188 failed:
1189         netlink_deinit(drv->netlink);
1190         if (drv->ioctl_sock >= 0)
1191                 close(drv->ioctl_sock);
1192
1193         genl_family_put(drv->nl80211);
1194         nl_cache_free(drv->nl_cache);
1195         nl_handle_destroy(drv->nl_handle);
1196         nl_cb_put(drv->nl_cb);
1197
1198         os_free(drv);
1199         return NULL;
1200 }
1201
1202
1203 static int
1204 wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv)
1205 {
1206         drv->ifindex = if_nametoindex(drv->ifname);
1207
1208 #ifndef HOSTAPD
1209         if (wpa_driver_nl80211_set_mode(drv, IEEE80211_MODE_INFRA) < 0) {
1210                 wpa_printf(MSG_DEBUG, "nl80211: Could not configure driver to "
1211                            "use managed mode");
1212         }
1213
1214         if (linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 1)) {
1215                 wpa_printf(MSG_ERROR, "Could not set interface '%s' UP",
1216                            drv->ifname);
1217                 return -1;
1218         }
1219
1220         if (wpa_driver_nl80211_capa(drv))
1221                 return -1;
1222
1223         netlink_send_oper_ifla(drv->netlink, drv->ifindex,
1224                                1, IF_OPER_DORMANT);
1225 #endif /* HOSTAPD */
1226
1227         return 0;
1228 }
1229
1230
1231 #ifdef HOSTAPD
1232 static void wpa_driver_nl80211_free_bss(struct wpa_driver_nl80211_data *drv)
1233 {
1234         struct i802_bss *bss, *prev;
1235         bss = drv->bss.next;
1236         while (bss) {
1237                 prev = bss;
1238                 bss = bss->next;
1239                 os_free(bss);
1240         }
1241 }
1242 #endif /* HOSTAPD */
1243
1244
1245 static int wpa_driver_nl80211_del_beacon(struct wpa_driver_nl80211_data *drv)
1246 {
1247         struct nl_msg *msg;
1248
1249         msg = nlmsg_alloc();
1250         if (!msg)
1251                 return -ENOMEM;
1252
1253         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1254                     0, NL80211_CMD_DEL_BEACON, 0);
1255         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1256
1257         return send_and_recv_msgs(drv, msg, NULL, NULL);
1258  nla_put_failure:
1259         return -ENOBUFS;
1260 }
1261
1262
1263 /**
1264  * wpa_driver_nl80211_deinit - Deinitialize nl80211 driver interface
1265  * @priv: Pointer to private nl80211 data from wpa_driver_nl80211_init()
1266  *
1267  * Shut down driver interface and processing of driver events. Free
1268  * private data buffer if one was allocated in wpa_driver_nl80211_init().
1269  */
1270 static void wpa_driver_nl80211_deinit(void *priv)
1271 {
1272         struct wpa_driver_nl80211_data *drv = priv;
1273
1274         nl80211_remove_monitor_interface(drv);
1275
1276         if (drv->nlmode == NL80211_IFTYPE_AP)
1277                 wpa_driver_nl80211_del_beacon(drv);
1278
1279 #ifdef HOSTAPD
1280         if (drv->last_freq_ht) {
1281                 /* Clear HT flags from the driver */
1282                 struct hostapd_freq_params freq;
1283                 os_memset(&freq, 0, sizeof(freq));
1284                 freq.freq = drv->last_freq;
1285                 i802_set_freq(priv, &freq);
1286         }
1287
1288         if (drv->eapol_sock >= 0) {
1289                 eloop_unregister_read_sock(drv->eapol_sock);
1290                 close(drv->eapol_sock);
1291         }
1292
1293         if (drv->if_indices != drv->default_if_indices)
1294                 os_free(drv->if_indices);
1295
1296         wpa_driver_nl80211_free_bss(drv);
1297 #endif /* HOSTAPD */
1298
1299         if (drv->disable_11b_rates)
1300                 nl80211_disable_11b_rates(drv, drv->ifindex, 0);
1301
1302         netlink_send_oper_ifla(drv->netlink, drv->ifindex, 0, IF_OPER_UP);
1303         netlink_deinit(drv->netlink);
1304
1305         eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx);
1306
1307         (void) linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 0);
1308         wpa_driver_nl80211_set_mode(drv, IEEE80211_MODE_INFRA);
1309
1310         if (drv->ioctl_sock >= 0)
1311                 close(drv->ioctl_sock);
1312
1313         eloop_unregister_read_sock(nl_socket_get_fd(drv->nl_handle_event));
1314         genl_family_put(drv->nl80211);
1315         nl_cache_free(drv->nl_cache);
1316         nl_cache_free(drv->nl_cache_event);
1317         nl_handle_destroy(drv->nl_handle);
1318         nl_handle_destroy(drv->nl_handle_event);
1319         nl_cb_put(drv->nl_cb);
1320
1321         eloop_cancel_timeout(wpa_driver_nl80211_probe_req_report_timeout,
1322                              drv, NULL);
1323
1324         os_free(drv);
1325 }
1326
1327
1328 /**
1329  * wpa_driver_nl80211_scan_timeout - Scan timeout to report scan completion
1330  * @eloop_ctx: Driver private data
1331  * @timeout_ctx: ctx argument given to wpa_driver_nl80211_init()
1332  *
1333  * This function can be used as registered timeout when starting a scan to
1334  * generate a scan completed event if the driver does not report this.
1335  */
1336 static void wpa_driver_nl80211_scan_timeout(void *eloop_ctx, void *timeout_ctx)
1337 {
1338         struct wpa_driver_nl80211_data *drv = eloop_ctx;
1339         if (drv->ap_scan_as_station) {
1340                 wpa_driver_nl80211_set_mode(drv, IEEE80211_MODE_AP);
1341                 drv->ap_scan_as_station = 0;
1342         }
1343         wpa_printf(MSG_DEBUG, "Scan timeout - try to get results");
1344         wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL);
1345 }
1346
1347
1348 /**
1349  * wpa_driver_nl80211_scan - Request the driver to initiate scan
1350  * @priv: Pointer to private driver data from wpa_driver_nl80211_init()
1351  * @params: Scan parameters
1352  * Returns: 0 on success, -1 on failure
1353  */
1354 static int wpa_driver_nl80211_scan(void *priv,
1355                                    struct wpa_driver_scan_params *params)
1356 {
1357         struct wpa_driver_nl80211_data *drv = priv;
1358         int ret = 0, timeout;
1359         struct nl_msg *msg, *ssids, *freqs;
1360         size_t i;
1361
1362         msg = nlmsg_alloc();
1363         ssids = nlmsg_alloc();
1364         freqs = nlmsg_alloc();
1365         if (!msg || !ssids || !freqs) {
1366                 nlmsg_free(msg);
1367                 nlmsg_free(ssids);
1368                 nlmsg_free(freqs);
1369                 return -1;
1370         }
1371
1372         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
1373                     NL80211_CMD_TRIGGER_SCAN, 0);
1374
1375         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1376
1377         for (i = 0; i < params->num_ssids; i++) {
1378                 NLA_PUT(ssids, i + 1, params->ssids[i].ssid_len,
1379                         params->ssids[i].ssid);
1380         }
1381         if (params->num_ssids)
1382                 nla_put_nested(msg, NL80211_ATTR_SCAN_SSIDS, ssids);
1383
1384         if (params->extra_ies) {
1385                 NLA_PUT(msg, NL80211_ATTR_IE, params->extra_ies_len,
1386                         params->extra_ies);
1387         }
1388
1389         if (params->freqs) {
1390                 for (i = 0; params->freqs[i]; i++)
1391                         NLA_PUT_U32(freqs, i + 1, params->freqs[i]);
1392                 nla_put_nested(msg, NL80211_ATTR_SCAN_FREQUENCIES, freqs);
1393         }
1394
1395         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
1396         msg = NULL;
1397         if (ret) {
1398                 wpa_printf(MSG_DEBUG, "nl80211: Scan trigger failed: ret=%d "
1399                            "(%s)", ret, strerror(-ret));
1400 #ifdef HOSTAPD
1401                 if (drv->nlmode == NL80211_IFTYPE_AP) {
1402                         /*
1403                          * mac80211 does not allow scan requests in AP mode, so
1404                          * try to do this in station mode.
1405                          */
1406                         if (wpa_driver_nl80211_set_mode(drv,
1407                                                         IEEE80211_MODE_INFRA))
1408                                 goto nla_put_failure;
1409
1410                         if (wpa_driver_nl80211_scan(drv, params)) {
1411                                 wpa_driver_nl80211_set_mode(drv,
1412                                                             IEEE80211_MODE_AP);
1413                                 goto nla_put_failure;
1414                         }
1415
1416                         /* Restore AP mode when processing scan results */
1417                         drv->ap_scan_as_station = 1;
1418                         ret = 0;
1419                 } else
1420                         goto nla_put_failure;
1421 #else /* HOSTAPD */
1422                 goto nla_put_failure;
1423 #endif /* HOSTAPD */
1424         }
1425
1426         /* Not all drivers generate "scan completed" wireless event, so try to
1427          * read results after a timeout. */
1428         timeout = 10;
1429         if (drv->scan_complete_events) {
1430                 /*
1431                  * The driver seems to deliver events to notify when scan is
1432                  * complete, so use longer timeout to avoid race conditions
1433                  * with scanning and following association request.
1434                  */
1435                 timeout = 30;
1436         }
1437         wpa_printf(MSG_DEBUG, "Scan requested (ret=%d) - scan timeout %d "
1438                    "seconds", ret, timeout);
1439         eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx);
1440         eloop_register_timeout(timeout, 0, wpa_driver_nl80211_scan_timeout,
1441                                drv, drv->ctx);
1442
1443 nla_put_failure:
1444         nlmsg_free(ssids);
1445         nlmsg_free(msg);
1446         nlmsg_free(freqs);
1447         return ret;
1448 }
1449
1450
1451 static int bss_info_handler(struct nl_msg *msg, void *arg)
1452 {
1453         struct nlattr *tb[NL80211_ATTR_MAX + 1];
1454         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
1455         struct nlattr *bss[NL80211_BSS_MAX + 1];
1456         static struct nla_policy bss_policy[NL80211_BSS_MAX + 1] = {
1457                 [NL80211_BSS_BSSID] = { .type = NLA_UNSPEC },
1458                 [NL80211_BSS_FREQUENCY] = { .type = NLA_U32 },
1459                 [NL80211_BSS_TSF] = { .type = NLA_U64 },
1460                 [NL80211_BSS_BEACON_INTERVAL] = { .type = NLA_U16 },
1461                 [NL80211_BSS_CAPABILITY] = { .type = NLA_U16 },
1462                 [NL80211_BSS_INFORMATION_ELEMENTS] = { .type = NLA_UNSPEC },
1463                 [NL80211_BSS_SIGNAL_MBM] = { .type = NLA_U32 },
1464                 [NL80211_BSS_SIGNAL_UNSPEC] = { .type = NLA_U8 },
1465                 [NL80211_BSS_STATUS] = { .type = NLA_U32 },
1466                 [NL80211_BSS_SEEN_MS_AGO] = { .type = NLA_U32 },
1467         };
1468         struct wpa_scan_results *res = arg;
1469         struct wpa_scan_res **tmp;
1470         struct wpa_scan_res *r;
1471         const u8 *ie;
1472         size_t ie_len;
1473
1474         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
1475                   genlmsg_attrlen(gnlh, 0), NULL);
1476         if (!tb[NL80211_ATTR_BSS])
1477                 return NL_SKIP;
1478         if (nla_parse_nested(bss, NL80211_BSS_MAX, tb[NL80211_ATTR_BSS],
1479                              bss_policy))
1480                 return NL_SKIP;
1481         if (bss[NL80211_BSS_INFORMATION_ELEMENTS]) {
1482                 ie = nla_data(bss[NL80211_BSS_INFORMATION_ELEMENTS]);
1483                 ie_len = nla_len(bss[NL80211_BSS_INFORMATION_ELEMENTS]);
1484         } else {
1485                 ie = NULL;
1486                 ie_len = 0;
1487         }
1488
1489         r = os_zalloc(sizeof(*r) + ie_len);
1490         if (r == NULL)
1491                 return NL_SKIP;
1492         if (bss[NL80211_BSS_BSSID])
1493                 os_memcpy(r->bssid, nla_data(bss[NL80211_BSS_BSSID]),
1494                           ETH_ALEN);
1495         if (bss[NL80211_BSS_FREQUENCY])
1496                 r->freq = nla_get_u32(bss[NL80211_BSS_FREQUENCY]);
1497         if (bss[NL80211_BSS_BEACON_INTERVAL])
1498                 r->beacon_int = nla_get_u16(bss[NL80211_BSS_BEACON_INTERVAL]);
1499         if (bss[NL80211_BSS_CAPABILITY])
1500                 r->caps = nla_get_u16(bss[NL80211_BSS_CAPABILITY]);
1501         r->flags |= WPA_SCAN_NOISE_INVALID;
1502         if (bss[NL80211_BSS_SIGNAL_MBM]) {
1503                 r->level = nla_get_u32(bss[NL80211_BSS_SIGNAL_MBM]);
1504                 r->level /= 100; /* mBm to dBm */
1505                 r->flags |= WPA_SCAN_LEVEL_DBM | WPA_SCAN_QUAL_INVALID;
1506         } else if (bss[NL80211_BSS_SIGNAL_UNSPEC]) {
1507                 r->level = nla_get_u8(bss[NL80211_BSS_SIGNAL_UNSPEC]);
1508                 r->flags |= WPA_SCAN_LEVEL_INVALID;
1509         } else
1510                 r->flags |= WPA_SCAN_LEVEL_INVALID | WPA_SCAN_QUAL_INVALID;
1511         if (bss[NL80211_BSS_TSF])
1512                 r->tsf = nla_get_u64(bss[NL80211_BSS_TSF]);
1513         if (bss[NL80211_BSS_SEEN_MS_AGO])
1514                 r->age = nla_get_u32(bss[NL80211_BSS_SEEN_MS_AGO]);
1515         r->ie_len = ie_len;
1516         if (ie)
1517                 os_memcpy(r + 1, ie, ie_len);
1518
1519         if (bss[NL80211_BSS_STATUS]) {
1520                 enum nl80211_bss_status status;
1521                 status = nla_get_u32(bss[NL80211_BSS_STATUS]);
1522                 switch (status) {
1523                 case NL80211_BSS_STATUS_AUTHENTICATED:
1524                         r->flags |= WPA_SCAN_AUTHENTICATED;
1525                         break;
1526                 case NL80211_BSS_STATUS_ASSOCIATED:
1527                         r->flags |= WPA_SCAN_ASSOCIATED;
1528                         break;
1529                 default:
1530                         break;
1531                 }
1532         }
1533
1534         tmp = os_realloc(res->res,
1535                          (res->num + 1) * sizeof(struct wpa_scan_res *));
1536         if (tmp == NULL) {
1537                 os_free(r);
1538                 return NL_SKIP;
1539         }
1540         tmp[res->num++] = r;
1541         res->res = tmp;
1542
1543         return NL_SKIP;
1544 }
1545
1546
1547 static void clear_state_mismatch(struct wpa_driver_nl80211_data *drv,
1548                                  const u8 *addr)
1549 {
1550         if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) {
1551                 wpa_printf(MSG_DEBUG, "nl80211: Clear possible state "
1552                            "mismatch");
1553                 wpa_driver_nl80211_mlme(drv, addr,
1554                                         NL80211_CMD_DEAUTHENTICATE,
1555                                         WLAN_REASON_PREV_AUTH_NOT_VALID);
1556         }
1557 }
1558
1559
1560 static void wpa_driver_nl80211_check_bss_status(
1561         struct wpa_driver_nl80211_data *drv, struct wpa_scan_results *res)
1562 {
1563         size_t i;
1564
1565         for (i = 0; i < res->num; i++) {
1566                 struct wpa_scan_res *r = res->res[i];
1567                 if (r->flags & WPA_SCAN_AUTHENTICATED) {
1568                         wpa_printf(MSG_DEBUG, "nl80211: Scan results "
1569                                    "indicates BSS status with " MACSTR
1570                                    " as authenticated",
1571                                    MAC2STR(r->bssid));
1572                         if (drv->nlmode == NL80211_IFTYPE_STATION &&
1573                             os_memcmp(r->bssid, drv->bssid, ETH_ALEN) != 0 &&
1574                             os_memcmp(r->bssid, drv->auth_bssid, ETH_ALEN) !=
1575                             0) {
1576                                 wpa_printf(MSG_DEBUG, "nl80211: Unknown BSSID"
1577                                            " in local state (auth=" MACSTR
1578                                            " assoc=" MACSTR ")",
1579                                            MAC2STR(drv->auth_bssid),
1580                                            MAC2STR(drv->bssid));
1581                         }
1582                 }
1583
1584                 if (r->flags & WPA_SCAN_ASSOCIATED) {
1585                         wpa_printf(MSG_DEBUG, "nl80211: Scan results "
1586                                    "indicate BSS status with " MACSTR
1587                                    " as associated",
1588                                    MAC2STR(r->bssid));
1589                         if (drv->nlmode == NL80211_IFTYPE_STATION &&
1590                             !drv->associated) {
1591                                 wpa_printf(MSG_DEBUG, "nl80211: Local state "
1592                                            "(not associated) does not match "
1593                                            "with BSS state");
1594                                 clear_state_mismatch(drv, r->bssid);
1595                         } else if (drv->nlmode == NL80211_IFTYPE_STATION &&
1596                                    os_memcmp(drv->bssid, r->bssid, ETH_ALEN) !=
1597                                    0) {
1598                                 wpa_printf(MSG_DEBUG, "nl80211: Local state "
1599                                            "(associated with " MACSTR ") does "
1600                                            "not match with BSS state",
1601                                            MAC2STR(drv->bssid));
1602                                 clear_state_mismatch(drv, r->bssid);
1603                                 clear_state_mismatch(drv, drv->bssid);
1604                         }
1605                 }
1606         }
1607 }
1608
1609
1610 static void wpa_scan_results_free(struct wpa_scan_results *res)
1611 {
1612         size_t i;
1613
1614         if (res == NULL)
1615                 return;
1616
1617         for (i = 0; i < res->num; i++)
1618                 os_free(res->res[i]);
1619         os_free(res->res);
1620         os_free(res);
1621 }
1622
1623
1624 /**
1625  * wpa_driver_nl80211_get_scan_results - Fetch the latest scan results
1626  * @priv: Pointer to private wext data from wpa_driver_nl80211_init()
1627  * Returns: Scan results on success, -1 on failure
1628  */
1629 static struct wpa_scan_results *
1630 wpa_driver_nl80211_get_scan_results(void *priv)
1631 {
1632         struct wpa_driver_nl80211_data *drv = priv;
1633         struct nl_msg *msg;
1634         struct wpa_scan_results *res;
1635         int ret;
1636
1637         res = os_zalloc(sizeof(*res));
1638         if (res == NULL)
1639                 return NULL;
1640         msg = nlmsg_alloc();
1641         if (!msg)
1642                 goto nla_put_failure;
1643
1644         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, NLM_F_DUMP,
1645                     NL80211_CMD_GET_SCAN, 0);
1646         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1647
1648         ret = send_and_recv_msgs(drv, msg, bss_info_handler, res);
1649         msg = NULL;
1650         if (ret == 0) {
1651                 wpa_printf(MSG_DEBUG, "Received scan results (%lu BSSes)",
1652                            (unsigned long) res->num);
1653                 wpa_driver_nl80211_check_bss_status(drv, res);
1654                 return res;
1655         }
1656         wpa_printf(MSG_DEBUG, "nl80211: Scan result fetch failed: ret=%d "
1657                    "(%s)", ret, strerror(-ret));
1658 nla_put_failure:
1659         nlmsg_free(msg);
1660         wpa_scan_results_free(res);
1661         return NULL;
1662 }
1663
1664
1665 static int wpa_driver_nl80211_set_key(const char *ifname, void *priv,
1666                                       enum wpa_alg alg, const u8 *addr,
1667                                       int key_idx, int set_tx,
1668                                       const u8 *seq, size_t seq_len,
1669                                       const u8 *key, size_t key_len)
1670 {
1671         struct wpa_driver_nl80211_data *drv = priv;
1672         int ifindex = if_nametoindex(ifname);
1673         struct nl_msg *msg;
1674         int ret;
1675
1676         wpa_printf(MSG_DEBUG, "%s: ifindex=%d alg=%d addr=%p key_idx=%d "
1677                    "set_tx=%d seq_len=%lu key_len=%lu",
1678                    __func__, ifindex, alg, addr, key_idx, set_tx,
1679                    (unsigned long) seq_len, (unsigned long) key_len);
1680
1681         msg = nlmsg_alloc();
1682         if (!msg)
1683                 return -ENOMEM;
1684
1685         if (alg == WPA_ALG_NONE) {
1686                 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1687                             0, NL80211_CMD_DEL_KEY, 0);
1688         } else {
1689                 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1690                             0, NL80211_CMD_NEW_KEY, 0);
1691                 NLA_PUT(msg, NL80211_ATTR_KEY_DATA, key_len, key);
1692                 switch (alg) {
1693                 case WPA_ALG_WEP:
1694                         if (key_len == 5)
1695                                 NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
1696                                             WLAN_CIPHER_SUITE_WEP40);
1697                         else
1698                                 NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
1699                                             WLAN_CIPHER_SUITE_WEP104);
1700                         break;
1701                 case WPA_ALG_TKIP:
1702                         NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
1703                                     WLAN_CIPHER_SUITE_TKIP);
1704                         break;
1705                 case WPA_ALG_CCMP:
1706                         NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
1707                                     WLAN_CIPHER_SUITE_CCMP);
1708                         break;
1709                 case WPA_ALG_IGTK:
1710                         NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
1711                                     WLAN_CIPHER_SUITE_AES_CMAC);
1712                         break;
1713                 default:
1714                         wpa_printf(MSG_ERROR, "%s: Unsupported encryption "
1715                                    "algorithm %d", __func__, alg);
1716                         nlmsg_free(msg);
1717                         return -1;
1718                 }
1719         }
1720
1721         if (seq && seq_len)
1722                 NLA_PUT(msg, NL80211_ATTR_KEY_SEQ, seq_len, seq);
1723
1724         if (addr && os_memcmp(addr, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) != 0)
1725         {
1726                 wpa_printf(MSG_DEBUG, "   addr=" MACSTR, MAC2STR(addr));
1727                 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
1728         }
1729         NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_idx);
1730         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
1731
1732         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
1733         if (ret == -ENOENT && alg == WPA_ALG_NONE)
1734                 ret = 0;
1735         if (ret)
1736                 wpa_printf(MSG_DEBUG, "nl80211: set_key failed; err=%d %s)",
1737                            ret, strerror(-ret));
1738
1739         /*
1740          * If we failed or don't need to set the default TX key (below),
1741          * we're done here.
1742          */
1743         if (ret || !set_tx || alg == WPA_ALG_NONE)
1744                 return ret;
1745 #ifdef HOSTAPD /* FIX: is this needed? */
1746         if (addr)
1747                 return ret;
1748 #endif /* HOSTAPD */
1749
1750         msg = nlmsg_alloc();
1751         if (!msg)
1752                 return -ENOMEM;
1753
1754         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1755                     0, NL80211_CMD_SET_KEY, 0);
1756         NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_idx);
1757         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
1758         if (alg == WPA_ALG_IGTK)
1759                 NLA_PUT_FLAG(msg, NL80211_ATTR_KEY_DEFAULT_MGMT);
1760         else
1761                 NLA_PUT_FLAG(msg, NL80211_ATTR_KEY_DEFAULT);
1762
1763         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
1764         if (ret == -ENOENT)
1765                 ret = 0;
1766         if (ret)
1767                 wpa_printf(MSG_DEBUG, "nl80211: set_key default failed; "
1768                            "err=%d %s)", ret, strerror(-ret));
1769         return ret;
1770
1771 nla_put_failure:
1772         return -ENOBUFS;
1773 }
1774
1775
1776 static int nl_add_key(struct nl_msg *msg, enum wpa_alg alg,
1777                       int key_idx, int defkey,
1778                       const u8 *seq, size_t seq_len,
1779                       const u8 *key, size_t key_len)
1780 {
1781         struct nlattr *key_attr = nla_nest_start(msg, NL80211_ATTR_KEY);
1782         if (!key_attr)
1783                 return -1;
1784
1785         if (defkey && alg == WPA_ALG_IGTK)
1786                 NLA_PUT_FLAG(msg, NL80211_KEY_DEFAULT_MGMT);
1787         else if (defkey)
1788                 NLA_PUT_FLAG(msg, NL80211_KEY_DEFAULT);
1789
1790         NLA_PUT_U8(msg, NL80211_KEY_IDX, key_idx);
1791
1792         switch (alg) {
1793         case WPA_ALG_WEP:
1794                 if (key_len == 5)
1795                         NLA_PUT_U32(msg, NL80211_KEY_CIPHER,
1796                                     WLAN_CIPHER_SUITE_WEP40);
1797                 else
1798                         NLA_PUT_U32(msg, NL80211_KEY_CIPHER,
1799                                     WLAN_CIPHER_SUITE_WEP104);
1800                 break;
1801         case WPA_ALG_TKIP:
1802                 NLA_PUT_U32(msg, NL80211_KEY_CIPHER, WLAN_CIPHER_SUITE_TKIP);
1803                 break;
1804         case WPA_ALG_CCMP:
1805                 NLA_PUT_U32(msg, NL80211_KEY_CIPHER, WLAN_CIPHER_SUITE_CCMP);
1806                 break;
1807         case WPA_ALG_IGTK:
1808                 NLA_PUT_U32(msg, NL80211_KEY_CIPHER,
1809                             WLAN_CIPHER_SUITE_AES_CMAC);
1810                 break;
1811         default:
1812                 wpa_printf(MSG_ERROR, "%s: Unsupported encryption "
1813                            "algorithm %d", __func__, alg);
1814                 return -1;
1815         }
1816
1817         if (seq && seq_len)
1818                 NLA_PUT(msg, NL80211_KEY_SEQ, seq_len, seq);
1819
1820         NLA_PUT(msg, NL80211_KEY_DATA, key_len, key);
1821
1822         nla_nest_end(msg, key_attr);
1823
1824         return 0;
1825  nla_put_failure:
1826         return -1;
1827 }
1828
1829
1830 static int nl80211_set_conn_keys(struct wpa_driver_associate_params *params,
1831                                  struct nl_msg *msg)
1832 {
1833         int i, privacy = 0;
1834         struct nlattr *nl_keys, *nl_key;
1835
1836         for (i = 0; i < 4; i++) {
1837                 if (!params->wep_key[i])
1838                         continue;
1839                 privacy = 1;
1840                 break;
1841         }
1842         if (!privacy)
1843                 return 0;
1844
1845         NLA_PUT_FLAG(msg, NL80211_ATTR_PRIVACY);
1846
1847         nl_keys = nla_nest_start(msg, NL80211_ATTR_KEYS);
1848         if (!nl_keys)
1849                 goto nla_put_failure;
1850
1851         for (i = 0; i < 4; i++) {
1852                 if (!params->wep_key[i])
1853                         continue;
1854
1855                 nl_key = nla_nest_start(msg, i);
1856                 if (!nl_key)
1857                         goto nla_put_failure;
1858
1859                 NLA_PUT(msg, NL80211_KEY_DATA, params->wep_key_len[i],
1860                         params->wep_key[i]);
1861                 if (params->wep_key_len[i] == 5)
1862                         NLA_PUT_U32(msg, NL80211_KEY_CIPHER,
1863                                     WLAN_CIPHER_SUITE_WEP40);
1864                 else
1865                         NLA_PUT_U32(msg, NL80211_KEY_CIPHER,
1866                                     WLAN_CIPHER_SUITE_WEP104);
1867
1868                 NLA_PUT_U8(msg, NL80211_KEY_IDX, i);
1869
1870                 if (i == params->wep_tx_keyidx)
1871                         NLA_PUT_FLAG(msg, NL80211_KEY_DEFAULT);
1872
1873                 nla_nest_end(msg, nl_key);
1874         }
1875         nla_nest_end(msg, nl_keys);
1876
1877         return 0;
1878
1879 nla_put_failure:
1880         return -ENOBUFS;
1881 }
1882
1883
1884 static int wpa_driver_nl80211_mlme(struct wpa_driver_nl80211_data *drv,
1885                                    const u8 *addr, int cmd, u16 reason_code)
1886 {
1887         int ret = -1;
1888         struct nl_msg *msg;
1889
1890         msg = nlmsg_alloc();
1891         if (!msg)
1892                 return -1;
1893
1894         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0, cmd, 0);
1895
1896         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1897         NLA_PUT_U16(msg, NL80211_ATTR_REASON_CODE, reason_code);
1898         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
1899
1900         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
1901         msg = NULL;
1902         if (ret) {
1903                 wpa_printf(MSG_DEBUG, "nl80211: MLME command failed: ret=%d "
1904                            "(%s)", ret, strerror(-ret));
1905                 goto nla_put_failure;
1906         }
1907         ret = 0;
1908
1909 nla_put_failure:
1910         nlmsg_free(msg);
1911         return ret;
1912 }
1913
1914
1915 static int wpa_driver_nl80211_disconnect(struct wpa_driver_nl80211_data *drv,
1916                                          const u8 *addr, int reason_code)
1917 {
1918         wpa_printf(MSG_DEBUG, "%s", __func__);
1919         drv->associated = 0;
1920         return wpa_driver_nl80211_mlme(drv, addr, NL80211_CMD_DISCONNECT,
1921                                        reason_code);
1922 }
1923
1924
1925 static int wpa_driver_nl80211_deauthenticate(void *priv, const u8 *addr,
1926                                              int reason_code)
1927 {
1928         struct wpa_driver_nl80211_data *drv = priv;
1929         if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME))
1930                 return wpa_driver_nl80211_disconnect(drv, addr, reason_code);
1931         wpa_printf(MSG_DEBUG, "%s", __func__);
1932         drv->associated = 0;
1933         return wpa_driver_nl80211_mlme(drv, addr, NL80211_CMD_DEAUTHENTICATE,
1934                                        reason_code);
1935 }
1936
1937
1938 static int wpa_driver_nl80211_disassociate(void *priv, const u8 *addr,
1939                                            int reason_code)
1940 {
1941         struct wpa_driver_nl80211_data *drv = priv;
1942         if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME))
1943                 return wpa_driver_nl80211_disconnect(drv, addr, reason_code);
1944         wpa_printf(MSG_DEBUG, "%s", __func__);
1945         drv->associated = 0;
1946         return wpa_driver_nl80211_mlme(drv, addr, NL80211_CMD_DISASSOCIATE,
1947                                        reason_code);
1948 }
1949
1950
1951 static int wpa_driver_nl80211_authenticate(
1952         void *priv, struct wpa_driver_auth_params *params)
1953 {
1954         struct wpa_driver_nl80211_data *drv = priv;
1955         int ret = -1, i;
1956         struct nl_msg *msg;
1957         enum nl80211_auth_type type;
1958         int count = 0;
1959
1960         drv->associated = 0;
1961         os_memset(drv->auth_bssid, 0, ETH_ALEN);
1962         /* FIX: IBSS mode */
1963         if (drv->nlmode != NL80211_IFTYPE_STATION)
1964                 wpa_driver_nl80211_set_mode(priv, IEEE80211_MODE_INFRA);
1965
1966         if (wpa_driver_nl80211_set_mode(drv, IEEE80211_MODE_INFRA) < 0)
1967                 return -1;
1968
1969 retry:
1970         msg = nlmsg_alloc();
1971         if (!msg)
1972                 return -1;
1973
1974         wpa_printf(MSG_DEBUG, "nl80211: Authenticate (ifindex=%d)",
1975                    drv->ifindex);
1976
1977         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
1978                     NL80211_CMD_AUTHENTICATE, 0);
1979
1980         for (i = 0; i < 4; i++) {
1981                 if (!params->wep_key[i])
1982                         continue;
1983                 wpa_driver_nl80211_set_key(drv->ifname, drv, WPA_ALG_WEP, NULL,
1984                                            i,
1985                                            i == params->wep_tx_keyidx, NULL, 0,
1986                                            params->wep_key[i],
1987                                            params->wep_key_len[i]);
1988                 if (params->wep_tx_keyidx != i)
1989                         continue;
1990                 if (nl_add_key(msg, WPA_ALG_WEP, i, 1, NULL, 0,
1991                                params->wep_key[i], params->wep_key_len[i])) {
1992                         nlmsg_free(msg);
1993                         return -1;
1994                 }
1995         }
1996
1997         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1998         if (params->bssid) {
1999                 wpa_printf(MSG_DEBUG, "  * bssid=" MACSTR,
2000                            MAC2STR(params->bssid));
2001                 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, params->bssid);
2002         }
2003         if (params->freq) {
2004                 wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq);
2005                 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
2006         }
2007         if (params->ssid) {
2008                 wpa_hexdump_ascii(MSG_DEBUG, "  * SSID",
2009                                   params->ssid, params->ssid_len);
2010                 NLA_PUT(msg, NL80211_ATTR_SSID, params->ssid_len,
2011                         params->ssid);
2012         }
2013         wpa_hexdump(MSG_DEBUG, "  * IEs", params->ie, params->ie_len);
2014         if (params->ie)
2015                 NLA_PUT(msg, NL80211_ATTR_IE, params->ie_len, params->ie);
2016         /*
2017          * TODO: if multiple auth_alg options enabled, try them one by one if
2018          * the AP rejects authentication due to unknown auth alg
2019          */
2020         if (params->auth_alg & WPA_AUTH_ALG_OPEN)
2021                 type = NL80211_AUTHTYPE_OPEN_SYSTEM;
2022         else if (params->auth_alg & WPA_AUTH_ALG_SHARED)
2023                 type = NL80211_AUTHTYPE_SHARED_KEY;
2024         else if (params->auth_alg & WPA_AUTH_ALG_LEAP)
2025                 type = NL80211_AUTHTYPE_NETWORK_EAP;
2026         else if (params->auth_alg & WPA_AUTH_ALG_FT)
2027                 type = NL80211_AUTHTYPE_FT;
2028         else
2029                 goto nla_put_failure;
2030         wpa_printf(MSG_DEBUG, "  * Auth Type %d", type);
2031         NLA_PUT_U32(msg, NL80211_ATTR_AUTH_TYPE, type);
2032
2033         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
2034         msg = NULL;
2035         if (ret) {
2036                 wpa_printf(MSG_DEBUG, "nl80211: MLME command failed: ret=%d "
2037                            "(%s)", ret, strerror(-ret));
2038                 count++;
2039                 if (ret == -EALREADY && count == 1 && params->bssid) {
2040                         /*
2041                          * mac80211 does not currently accept new
2042                          * authentication if we are already authenticated. As a
2043                          * workaround, force deauthentication and try again.
2044                          */
2045                         wpa_printf(MSG_DEBUG, "nl80211: Retry authentication "
2046                                    "after forced deauthentication");
2047                         wpa_driver_nl80211_deauthenticate(
2048                                 drv, params->bssid,
2049                                 WLAN_REASON_PREV_AUTH_NOT_VALID);
2050                         nlmsg_free(msg);
2051                         goto retry;
2052                 }
2053                 goto nla_put_failure;
2054         }
2055         ret = 0;
2056         wpa_printf(MSG_DEBUG, "nl80211: Authentication request send "
2057                    "successfully");
2058
2059 nla_put_failure:
2060         nlmsg_free(msg);
2061         return ret;
2062 }
2063
2064
2065 struct phy_info_arg {
2066         u16 *num_modes;
2067         struct hostapd_hw_modes *modes;
2068 };
2069
2070 static int phy_info_handler(struct nl_msg *msg, void *arg)
2071 {
2072         struct nlattr *tb_msg[NL80211_ATTR_MAX + 1];
2073         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
2074         struct phy_info_arg *phy_info = arg;
2075
2076         struct nlattr *tb_band[NL80211_BAND_ATTR_MAX + 1];
2077
2078         struct nlattr *tb_freq[NL80211_FREQUENCY_ATTR_MAX + 1];
2079         static struct nla_policy freq_policy[NL80211_FREQUENCY_ATTR_MAX + 1] = {
2080                 [NL80211_FREQUENCY_ATTR_FREQ] = { .type = NLA_U32 },
2081                 [NL80211_FREQUENCY_ATTR_DISABLED] = { .type = NLA_FLAG },
2082                 [NL80211_FREQUENCY_ATTR_PASSIVE_SCAN] = { .type = NLA_FLAG },
2083                 [NL80211_FREQUENCY_ATTR_NO_IBSS] = { .type = NLA_FLAG },
2084                 [NL80211_FREQUENCY_ATTR_RADAR] = { .type = NLA_FLAG },
2085                 [NL80211_FREQUENCY_ATTR_MAX_TX_POWER] = { .type = NLA_U32 },
2086         };
2087
2088         struct nlattr *tb_rate[NL80211_BITRATE_ATTR_MAX + 1];
2089         static struct nla_policy rate_policy[NL80211_BITRATE_ATTR_MAX + 1] = {
2090                 [NL80211_BITRATE_ATTR_RATE] = { .type = NLA_U32 },
2091                 [NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE] = { .type = NLA_FLAG },
2092         };
2093
2094         struct nlattr *nl_band;
2095         struct nlattr *nl_freq;
2096         struct nlattr *nl_rate;
2097         int rem_band, rem_freq, rem_rate;
2098         struct hostapd_hw_modes *mode;
2099         int idx, mode_is_set;
2100
2101         nla_parse(tb_msg, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
2102                   genlmsg_attrlen(gnlh, 0), NULL);
2103
2104         if (!tb_msg[NL80211_ATTR_WIPHY_BANDS])
2105                 return NL_SKIP;
2106
2107         nla_for_each_nested(nl_band, tb_msg[NL80211_ATTR_WIPHY_BANDS], rem_band) {
2108                 mode = os_realloc(phy_info->modes, (*phy_info->num_modes + 1) * sizeof(*mode));
2109                 if (!mode)
2110                         return NL_SKIP;
2111                 phy_info->modes = mode;
2112
2113                 mode_is_set = 0;
2114
2115                 mode = &phy_info->modes[*(phy_info->num_modes)];
2116                 memset(mode, 0, sizeof(*mode));
2117                 *(phy_info->num_modes) += 1;
2118
2119                 nla_parse(tb_band, NL80211_BAND_ATTR_MAX, nla_data(nl_band),
2120                           nla_len(nl_band), NULL);
2121
2122                 if (tb_band[NL80211_BAND_ATTR_HT_CAPA]) {
2123                         mode->ht_capab = nla_get_u16(
2124                                 tb_band[NL80211_BAND_ATTR_HT_CAPA]);
2125                 }
2126
2127                 if (tb_band[NL80211_BAND_ATTR_HT_AMPDU_FACTOR]) {
2128                         mode->a_mpdu_params |= nla_get_u8(
2129                                 tb_band[NL80211_BAND_ATTR_HT_AMPDU_FACTOR]) &
2130                                 0x03;
2131                 }
2132
2133                 if (tb_band[NL80211_BAND_ATTR_HT_AMPDU_DENSITY]) {
2134                         mode->a_mpdu_params |= nla_get_u8(
2135                                 tb_band[NL80211_BAND_ATTR_HT_AMPDU_DENSITY]) <<
2136                                 2;
2137                 }
2138
2139                 if (tb_band[NL80211_BAND_ATTR_HT_MCS_SET] &&
2140                     nla_len(tb_band[NL80211_BAND_ATTR_HT_MCS_SET])) {
2141                         u8 *mcs;
2142                         mcs = nla_data(tb_band[NL80211_BAND_ATTR_HT_MCS_SET]);
2143                         os_memcpy(mode->mcs_set, mcs, 16);
2144                 }
2145
2146                 nla_for_each_nested(nl_freq, tb_band[NL80211_BAND_ATTR_FREQS], rem_freq) {
2147                         nla_parse(tb_freq, NL80211_FREQUENCY_ATTR_MAX, nla_data(nl_freq),
2148                                   nla_len(nl_freq), freq_policy);
2149                         if (!tb_freq[NL80211_FREQUENCY_ATTR_FREQ])
2150                                 continue;
2151                         mode->num_channels++;
2152                 }
2153
2154                 mode->channels = os_zalloc(mode->num_channels * sizeof(struct hostapd_channel_data));
2155                 if (!mode->channels)
2156                         return NL_SKIP;
2157
2158                 idx = 0;
2159
2160                 nla_for_each_nested(nl_freq, tb_band[NL80211_BAND_ATTR_FREQS], rem_freq) {
2161                         nla_parse(tb_freq, NL80211_FREQUENCY_ATTR_MAX, nla_data(nl_freq),
2162                                   nla_len(nl_freq), freq_policy);
2163                         if (!tb_freq[NL80211_FREQUENCY_ATTR_FREQ])
2164                                 continue;
2165
2166                         mode->channels[idx].freq = nla_get_u32(tb_freq[NL80211_FREQUENCY_ATTR_FREQ]);
2167                         mode->channels[idx].flag = 0;
2168
2169                         if (!mode_is_set) {
2170                                 /* crude heuristic */
2171                                 if (mode->channels[idx].freq < 4000)
2172                                         mode->mode = HOSTAPD_MODE_IEEE80211B;
2173                                 else
2174                                         mode->mode = HOSTAPD_MODE_IEEE80211A;
2175                                 mode_is_set = 1;
2176                         }
2177
2178                         /* crude heuristic */
2179                         if (mode->channels[idx].freq < 4000)
2180                                 if (mode->channels[idx].freq == 2484)
2181                                         mode->channels[idx].chan = 14;
2182                                 else
2183                                         mode->channels[idx].chan = (mode->channels[idx].freq - 2407) / 5;
2184                         else
2185                                 mode->channels[idx].chan = mode->channels[idx].freq/5 - 1000;
2186
2187                         if (tb_freq[NL80211_FREQUENCY_ATTR_DISABLED])
2188                                 mode->channels[idx].flag |=
2189                                         HOSTAPD_CHAN_DISABLED;
2190                         if (tb_freq[NL80211_FREQUENCY_ATTR_PASSIVE_SCAN])
2191                                 mode->channels[idx].flag |=
2192                                         HOSTAPD_CHAN_PASSIVE_SCAN;
2193                         if (tb_freq[NL80211_FREQUENCY_ATTR_NO_IBSS])
2194                                 mode->channels[idx].flag |=
2195                                         HOSTAPD_CHAN_NO_IBSS;
2196                         if (tb_freq[NL80211_FREQUENCY_ATTR_RADAR])
2197                                 mode->channels[idx].flag |=
2198                                         HOSTAPD_CHAN_RADAR;
2199
2200                         if (tb_freq[NL80211_FREQUENCY_ATTR_MAX_TX_POWER] &&
2201                             !tb_freq[NL80211_FREQUENCY_ATTR_DISABLED])
2202                                 mode->channels[idx].max_tx_power =
2203                                         nla_get_u32(tb_freq[NL80211_FREQUENCY_ATTR_MAX_TX_POWER]) / 100;
2204
2205                         idx++;
2206                 }
2207
2208                 nla_for_each_nested(nl_rate, tb_band[NL80211_BAND_ATTR_RATES], rem_rate) {
2209                         nla_parse(tb_rate, NL80211_BITRATE_ATTR_MAX, nla_data(nl_rate),
2210                                   nla_len(nl_rate), rate_policy);
2211                         if (!tb_rate[NL80211_BITRATE_ATTR_RATE])
2212                                 continue;
2213                         mode->num_rates++;
2214                 }
2215
2216                 mode->rates = os_zalloc(mode->num_rates * sizeof(int));
2217                 if (!mode->rates)
2218                         return NL_SKIP;
2219
2220                 idx = 0;
2221
2222                 nla_for_each_nested(nl_rate, tb_band[NL80211_BAND_ATTR_RATES], rem_rate) {
2223                         nla_parse(tb_rate, NL80211_BITRATE_ATTR_MAX, nla_data(nl_rate),
2224                                   nla_len(nl_rate), rate_policy);
2225                         if (!tb_rate[NL80211_BITRATE_ATTR_RATE])
2226                                 continue;
2227                         mode->rates[idx] = nla_get_u32(tb_rate[NL80211_BITRATE_ATTR_RATE]);
2228
2229                         /* crude heuristic */
2230                         if (mode->mode == HOSTAPD_MODE_IEEE80211B &&
2231                             mode->rates[idx] > 200)
2232                                 mode->mode = HOSTAPD_MODE_IEEE80211G;
2233
2234                         idx++;
2235                 }
2236         }
2237
2238         return NL_SKIP;
2239 }
2240
2241 static struct hostapd_hw_modes *
2242 wpa_driver_nl80211_add_11b(struct hostapd_hw_modes *modes, u16 *num_modes)
2243 {
2244         u16 m;
2245         struct hostapd_hw_modes *mode11g = NULL, *nmodes, *mode;
2246         int i, mode11g_idx = -1;
2247
2248         /* If only 802.11g mode is included, use it to construct matching
2249          * 802.11b mode data. */
2250
2251         for (m = 0; m < *num_modes; m++) {
2252                 if (modes[m].mode == HOSTAPD_MODE_IEEE80211B)
2253                         return modes; /* 802.11b already included */
2254                 if (modes[m].mode == HOSTAPD_MODE_IEEE80211G)
2255                         mode11g_idx = m;
2256         }
2257
2258         if (mode11g_idx < 0)
2259                 return modes; /* 2.4 GHz band not supported at all */
2260
2261         nmodes = os_realloc(modes, (*num_modes + 1) * sizeof(*nmodes));
2262         if (nmodes == NULL)
2263                 return modes; /* Could not add 802.11b mode */
2264
2265         mode = &nmodes[*num_modes];
2266         os_memset(mode, 0, sizeof(*mode));
2267         (*num_modes)++;
2268         modes = nmodes;
2269
2270         mode->mode = HOSTAPD_MODE_IEEE80211B;
2271
2272         mode11g = &modes[mode11g_idx];
2273         mode->num_channels = mode11g->num_channels;
2274         mode->channels = os_malloc(mode11g->num_channels *
2275                                    sizeof(struct hostapd_channel_data));
2276         if (mode->channels == NULL) {
2277                 (*num_modes)--;
2278                 return modes; /* Could not add 802.11b mode */
2279         }
2280         os_memcpy(mode->channels, mode11g->channels,
2281                   mode11g->num_channels * sizeof(struct hostapd_channel_data));
2282
2283         mode->num_rates = 0;
2284         mode->rates = os_malloc(4 * sizeof(int));
2285         if (mode->rates == NULL) {
2286                 os_free(mode->channels);
2287                 (*num_modes)--;
2288                 return modes; /* Could not add 802.11b mode */
2289         }
2290
2291         for (i = 0; i < mode11g->num_rates; i++) {
2292                 if (mode11g->rates[i] != 10 && mode11g->rates[i] != 20 &&
2293                     mode11g->rates[i] != 55 && mode11g->rates[i] != 110)
2294                         continue;
2295                 mode->rates[mode->num_rates] = mode11g->rates[i];
2296                 mode->num_rates++;
2297                 if (mode->num_rates == 4)
2298                         break;
2299         }
2300
2301         if (mode->num_rates == 0) {
2302                 os_free(mode->channels);
2303                 os_free(mode->rates);
2304                 (*num_modes)--;
2305                 return modes; /* No 802.11b rates */
2306         }
2307
2308         wpa_printf(MSG_DEBUG, "nl80211: Added 802.11b mode based on 802.11g "
2309                    "information");
2310
2311         return modes;
2312 }
2313
2314
2315 static struct hostapd_hw_modes *
2316 wpa_driver_nl80211_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags)
2317 {
2318         struct wpa_driver_nl80211_data *drv = priv;
2319         struct nl_msg *msg;
2320         struct phy_info_arg result = {
2321                 .num_modes = num_modes,
2322                 .modes = NULL,
2323         };
2324
2325         *num_modes = 0;
2326         *flags = 0;
2327
2328         msg = nlmsg_alloc();
2329         if (!msg)
2330                 return NULL;
2331
2332         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
2333                     0, NL80211_CMD_GET_WIPHY, 0);
2334
2335         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
2336
2337         if (send_and_recv_msgs(drv, msg, phy_info_handler, &result) == 0)
2338                 return wpa_driver_nl80211_add_11b(result.modes, num_modes);
2339  nla_put_failure:
2340         return NULL;
2341 }
2342
2343
2344 static int wpa_driver_nl80211_send_frame(struct wpa_driver_nl80211_data *drv,
2345                                          const void *data, size_t len,
2346                                          int encrypt)
2347 {
2348         __u8 rtap_hdr[] = {
2349                 0x00, 0x00, /* radiotap version */
2350                 0x0e, 0x00, /* radiotap length */
2351                 0x02, 0xc0, 0x00, 0x00, /* bmap: flags, tx and rx flags */
2352                 IEEE80211_RADIOTAP_F_FRAG, /* F_FRAG (fragment if required) */
2353                 0x00,       /* padding */
2354                 0x00, 0x00, /* RX and TX flags to indicate that */
2355                 0x00, 0x00, /* this is the injected frame directly */
2356         };
2357         struct iovec iov[2] = {
2358                 {
2359                         .iov_base = &rtap_hdr,
2360                         .iov_len = sizeof(rtap_hdr),
2361                 },
2362                 {
2363                         .iov_base = (void *) data,
2364                         .iov_len = len,
2365                 }
2366         };
2367         struct msghdr msg = {
2368                 .msg_name = NULL,
2369                 .msg_namelen = 0,
2370                 .msg_iov = iov,
2371                 .msg_iovlen = 2,
2372                 .msg_control = NULL,
2373                 .msg_controllen = 0,
2374                 .msg_flags = 0,
2375         };
2376
2377         if (encrypt)
2378                 rtap_hdr[8] |= IEEE80211_RADIOTAP_F_WEP;
2379
2380         return sendmsg(drv->monitor_sock, &msg, 0);
2381 }
2382
2383
2384 static int wpa_driver_nl80211_send_mlme(void *priv, const u8 *data,
2385                                         size_t data_len)
2386 {
2387         struct wpa_driver_nl80211_data *drv = priv;
2388         struct ieee80211_mgmt *mgmt;
2389         int encrypt = 1;
2390         u16 fc;
2391
2392         mgmt = (struct ieee80211_mgmt *) data;
2393         fc = le_to_host16(mgmt->frame_control);
2394
2395         if (WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
2396             WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_AUTH) {
2397                 /*
2398                  * Only one of the authentication frame types is encrypted.
2399                  * In order for static WEP encryption to work properly (i.e.,
2400                  * to not encrypt the frame), we need to tell mac80211 about
2401                  * the frames that must not be encrypted.
2402                  */
2403                 u16 auth_alg = le_to_host16(mgmt->u.auth.auth_alg);
2404                 u16 auth_trans = le_to_host16(mgmt->u.auth.auth_transaction);
2405                 if (auth_alg != WLAN_AUTH_SHARED_KEY || auth_trans != 3)
2406                         encrypt = 0;
2407         }
2408
2409         return wpa_driver_nl80211_send_frame(drv, data, data_len, encrypt);
2410 }
2411
2412
2413 static int wpa_driver_nl80211_set_beacon(const char *ifname, void *priv,
2414                                          const u8 *head, size_t head_len,
2415                                          const u8 *tail, size_t tail_len,
2416                                          int dtim_period, int beacon_int)
2417 {
2418         struct wpa_driver_nl80211_data *drv = priv;
2419         struct nl_msg *msg;
2420         u8 cmd = NL80211_CMD_NEW_BEACON;
2421         int ret;
2422         int beacon_set;
2423         int ifindex = if_nametoindex(ifname);
2424 #ifdef HOSTAPD
2425         struct i802_bss *bss;
2426
2427         bss = get_bss(drv, ifindex);
2428         if (bss == NULL)
2429                 return -ENOENT;
2430         beacon_set = bss->beacon_set;
2431 #else /* HOSTAPD */
2432         beacon_set = drv->beacon_set;
2433 #endif /* HOSTAPD */
2434
2435         msg = nlmsg_alloc();
2436         if (!msg)
2437                 return -ENOMEM;
2438
2439         wpa_printf(MSG_DEBUG, "nl80211: Set beacon (beacon_set=%d)",
2440                    beacon_set);
2441         if (beacon_set)
2442                 cmd = NL80211_CMD_SET_BEACON;
2443
2444         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
2445                     0, cmd, 0);
2446         NLA_PUT(msg, NL80211_ATTR_BEACON_HEAD, head_len, head);
2447         NLA_PUT(msg, NL80211_ATTR_BEACON_TAIL, tail_len, tail);
2448         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
2449         NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL, beacon_int);
2450         NLA_PUT_U32(msg, NL80211_ATTR_DTIM_PERIOD, dtim_period);
2451
2452         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
2453         if (ret) {
2454                 wpa_printf(MSG_DEBUG, "nl80211: Beacon set failed: %d (%s)",
2455                            ret, strerror(-ret));
2456         } else {
2457 #ifdef HOSTAPD
2458                 bss->beacon_set = 1;
2459 #else /* HOSTAPD */
2460                 drv->beacon_set = 1;
2461 #endif /* HOSTAPD */
2462         }
2463         return ret;
2464  nla_put_failure:
2465         return -ENOBUFS;
2466 }
2467
2468
2469 static int wpa_driver_nl80211_set_freq(struct wpa_driver_nl80211_data *drv,
2470                                        int freq, int ht_enabled,
2471                                        int sec_channel_offset)
2472 {
2473         struct nl_msg *msg;
2474         int ret;
2475
2476         msg = nlmsg_alloc();
2477         if (!msg)
2478                 return -1;
2479
2480         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
2481                     NL80211_CMD_SET_WIPHY, 0);
2482
2483         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
2484         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
2485         if (ht_enabled) {
2486                 switch (sec_channel_offset) {
2487                 case -1:
2488                         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
2489                                     NL80211_CHAN_HT40MINUS);
2490                         break;
2491                 case 1:
2492                         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
2493                                     NL80211_CHAN_HT40PLUS);
2494                         break;
2495                 default:
2496                         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
2497                                     NL80211_CHAN_HT20);
2498                         break;
2499                 }
2500         }
2501
2502         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
2503         if (ret == 0)
2504                 return 0;
2505         wpa_printf(MSG_DEBUG, "nl80211: Failed to set channel (freq=%d): "
2506                    "%d (%s)", freq, ret, strerror(-ret));
2507 nla_put_failure:
2508         return -1;
2509 }
2510
2511
2512 static int wpa_driver_nl80211_sta_add(const char *ifname, void *priv,
2513                                       struct hostapd_sta_add_params *params)
2514 {
2515         struct wpa_driver_nl80211_data *drv = priv;
2516         struct nl_msg *msg;
2517         int ret = -ENOBUFS;
2518
2519         msg = nlmsg_alloc();
2520         if (!msg)
2521                 return -ENOMEM;
2522
2523         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
2524                     0, NL80211_CMD_NEW_STATION, 0);
2525
2526         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(ifname));
2527         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, params->addr);
2528         NLA_PUT_U16(msg, NL80211_ATTR_STA_AID, params->aid);
2529         NLA_PUT(msg, NL80211_ATTR_STA_SUPPORTED_RATES, params->supp_rates_len,
2530                 params->supp_rates);
2531         NLA_PUT_U16(msg, NL80211_ATTR_STA_LISTEN_INTERVAL,
2532                     params->listen_interval);
2533         if (params->ht_capabilities) {
2534                 NLA_PUT(msg, NL80211_ATTR_HT_CAPABILITY,
2535                         sizeof(*params->ht_capabilities),
2536                         params->ht_capabilities);
2537         }
2538
2539         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
2540         if (ret)
2541                 wpa_printf(MSG_DEBUG, "nl80211: NL80211_CMD_NEW_STATION "
2542                            "result: %d (%s)", ret, strerror(-ret));
2543         if (ret == -EEXIST)
2544                 ret = 0;
2545  nla_put_failure:
2546         return ret;
2547 }
2548
2549
2550 static int wpa_driver_nl80211_sta_remove(void *priv, const u8 *addr)
2551 {
2552         struct wpa_driver_nl80211_data *drv = priv;
2553         struct nl_msg *msg;
2554         int ret;
2555
2556         msg = nlmsg_alloc();
2557         if (!msg)
2558                 return -ENOMEM;
2559
2560         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
2561                     0, NL80211_CMD_DEL_STATION, 0);
2562
2563         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
2564                     if_nametoindex(drv->ifname));
2565         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
2566
2567         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
2568         if (ret == -ENOENT)
2569                 return 0;
2570         return ret;
2571  nla_put_failure:
2572         return -ENOBUFS;
2573 }
2574
2575
2576 static void nl80211_remove_iface(struct wpa_driver_nl80211_data *drv,
2577                                  int ifidx)
2578 {
2579         struct nl_msg *msg;
2580
2581         wpa_printf(MSG_DEBUG, "nl80211: Remove interface ifindex=%d", ifidx);
2582
2583 #ifdef HOSTAPD
2584         /* stop listening for EAPOL on this interface */
2585         del_ifidx(drv, ifidx);
2586 #endif /* HOSTAPD */
2587
2588         msg = nlmsg_alloc();
2589         if (!msg)
2590                 goto nla_put_failure;
2591
2592         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
2593                     0, NL80211_CMD_DEL_INTERFACE, 0);
2594         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifidx);
2595
2596         if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0)
2597                 return;
2598  nla_put_failure:
2599         wpa_printf(MSG_ERROR, "Failed to remove interface (ifidx=%d).\n",
2600                    ifidx);
2601 }
2602
2603
2604 static int nl80211_create_iface_once(struct wpa_driver_nl80211_data *drv,
2605                                      const char *ifname,
2606                                      enum nl80211_iftype iftype,
2607                                      const u8 *addr, int wds)
2608 {
2609         struct nl_msg *msg, *flags = NULL;
2610         int ifidx;
2611         int ret = -ENOBUFS;
2612
2613         msg = nlmsg_alloc();
2614         if (!msg)
2615                 return -1;
2616
2617         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
2618                     0, NL80211_CMD_NEW_INTERFACE, 0);
2619         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
2620         NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, ifname);
2621         NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, iftype);
2622
2623         if (iftype == NL80211_IFTYPE_MONITOR) {
2624                 int err;
2625
2626                 flags = nlmsg_alloc();
2627                 if (!flags)
2628                         goto nla_put_failure;
2629
2630                 NLA_PUT_FLAG(flags, NL80211_MNTR_FLAG_COOK_FRAMES);
2631
2632                 err = nla_put_nested(msg, NL80211_ATTR_MNTR_FLAGS, flags);
2633
2634                 nlmsg_free(flags);
2635
2636                 if (err)
2637                         goto nla_put_failure;
2638         } else if (wds) {
2639                 NLA_PUT_U8(msg, NL80211_ATTR_4ADDR, wds);
2640         }
2641
2642         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
2643         if (ret) {
2644  nla_put_failure:
2645                 wpa_printf(MSG_ERROR, "Failed to create interface %s: %d (%s)",
2646                            ifname, ret, strerror(-ret));
2647                 return ret;
2648         }
2649
2650         ifidx = if_nametoindex(ifname);
2651         wpa_printf(MSG_DEBUG, "nl80211: New interface %s created: ifindex=%d",
2652                    ifname, ifidx);
2653
2654         if (ifidx <= 0)
2655                 return -1;
2656
2657 #ifdef HOSTAPD
2658         /* start listening for EAPOL on this interface */
2659         add_ifidx(drv, ifidx);
2660 #endif /* HOSTAPD */
2661
2662         if (addr && iftype != NL80211_IFTYPE_MONITOR &&
2663             linux_set_ifhwaddr(drv->ioctl_sock, ifname, addr)) {
2664                 nl80211_remove_iface(drv, ifidx);
2665                 return -1;
2666         }
2667
2668         return ifidx;
2669 }
2670
2671
2672 static int nl80211_create_iface(struct wpa_driver_nl80211_data *drv,
2673                                 const char *ifname, enum nl80211_iftype iftype,
2674                                 const u8 *addr, int wds)
2675 {
2676         int ret;
2677
2678         ret = nl80211_create_iface_once(drv, ifname, iftype, addr, wds);
2679
2680         /* if error occured and interface exists already */
2681         if (ret == -ENFILE && if_nametoindex(ifname)) {
2682                 wpa_printf(MSG_INFO, "Try to remove and re-create %s", ifname);
2683
2684                 /* Try to remove the interface that was already there. */
2685                 nl80211_remove_iface(drv, if_nametoindex(ifname));
2686
2687                 /* Try to create the interface again */
2688                 ret = nl80211_create_iface_once(drv, ifname, iftype, addr,
2689                                                 wds);
2690         }
2691
2692         if (ret >= 0 && drv->disable_11b_rates)
2693                 nl80211_disable_11b_rates(drv, ret, 1);
2694
2695         return ret;
2696 }
2697
2698
2699 static void handle_tx_callback(void *ctx, u8 *buf, size_t len, int ok)
2700 {
2701         struct ieee80211_hdr *hdr;
2702         u16 fc;
2703         union wpa_event_data event;
2704
2705         hdr = (struct ieee80211_hdr *) buf;
2706         fc = le_to_host16(hdr->frame_control);
2707
2708         os_memset(&event, 0, sizeof(event));
2709         event.tx_status.type = WLAN_FC_GET_TYPE(fc);
2710         event.tx_status.stype = WLAN_FC_GET_STYPE(fc);
2711         event.tx_status.dst = hdr->addr1;
2712         event.tx_status.data = buf;
2713         event.tx_status.data_len = len;
2714         event.tx_status.ack = ok;
2715         wpa_supplicant_event(ctx, EVENT_TX_STATUS, &event);
2716 }
2717
2718
2719 static void from_unknown_sta(struct wpa_driver_nl80211_data *drv,
2720                              u8 *buf, size_t len)
2721 {
2722         union wpa_event_data event;
2723         os_memset(&event, 0, sizeof(event));
2724         event.rx_from_unknown.frame = buf;
2725         event.rx_from_unknown.len = len;
2726         wpa_supplicant_event(drv->ctx, EVENT_RX_FROM_UNKNOWN, &event);
2727 }
2728
2729
2730 static void handle_frame(struct wpa_driver_nl80211_data *drv,
2731                          u8 *buf, size_t len, int datarate, int ssi_signal)
2732 {
2733         struct ieee80211_hdr *hdr;
2734         u16 fc;
2735         union wpa_event_data event;
2736
2737         hdr = (struct ieee80211_hdr *) buf;
2738         fc = le_to_host16(hdr->frame_control);
2739
2740         switch (WLAN_FC_GET_TYPE(fc)) {
2741         case WLAN_FC_TYPE_MGMT:
2742                 os_memset(&event, 0, sizeof(event));
2743                 event.rx_mgmt.frame = buf;
2744                 event.rx_mgmt.frame_len = len;
2745                 event.rx_mgmt.datarate = datarate;
2746                 event.rx_mgmt.ssi_signal = ssi_signal;
2747                 wpa_supplicant_event(drv->ctx, EVENT_RX_MGMT, &event);
2748                 break;
2749         case WLAN_FC_TYPE_CTRL:
2750                 /* can only get here with PS-Poll frames */
2751                 wpa_printf(MSG_DEBUG, "CTRL");
2752                 from_unknown_sta(drv, buf, len);
2753                 break;
2754         case WLAN_FC_TYPE_DATA:
2755                 from_unknown_sta(drv, buf, len);
2756                 break;
2757         }
2758 }
2759
2760
2761 static void handle_monitor_read(int sock, void *eloop_ctx, void *sock_ctx)
2762 {
2763         struct wpa_driver_nl80211_data *drv = eloop_ctx;
2764         int len;
2765         unsigned char buf[3000];
2766         struct ieee80211_radiotap_iterator iter;
2767         int ret;
2768         int datarate = 0, ssi_signal = 0;
2769         int injected = 0, failed = 0, rxflags = 0;
2770
2771         len = recv(sock, buf, sizeof(buf), 0);
2772         if (len < 0) {
2773                 perror("recv");
2774                 return;
2775         }
2776
2777         if (drv->nlmode == NL80211_IFTYPE_STATION && !drv->probe_req_report) {
2778                 wpa_printf(MSG_DEBUG, "nl80211: Ignore monitor interface "
2779                            "frame since Probe Request reporting is disabled");
2780                 return;
2781         }
2782
2783         if (ieee80211_radiotap_iterator_init(&iter, (void*)buf, len)) {
2784                 printf("received invalid radiotap frame\n");
2785                 return;
2786         }
2787
2788         while (1) {
2789                 ret = ieee80211_radiotap_iterator_next(&iter);
2790                 if (ret == -ENOENT)
2791                         break;
2792                 if (ret) {
2793                         printf("received invalid radiotap frame (%d)\n", ret);
2794                         return;
2795                 }
2796                 switch (iter.this_arg_index) {
2797                 case IEEE80211_RADIOTAP_FLAGS:
2798                         if (*iter.this_arg & IEEE80211_RADIOTAP_F_FCS)
2799                                 len -= 4;
2800                         break;
2801                 case IEEE80211_RADIOTAP_RX_FLAGS:
2802                         rxflags = 1;
2803                         break;
2804                 case IEEE80211_RADIOTAP_TX_FLAGS:
2805                         injected = 1;
2806                         failed = le_to_host16((*(uint16_t *) iter.this_arg)) &
2807                                         IEEE80211_RADIOTAP_F_TX_FAIL;
2808                         break;
2809                 case IEEE80211_RADIOTAP_DATA_RETRIES:
2810                         break;
2811                 case IEEE80211_RADIOTAP_CHANNEL:
2812                         /* TODO: convert from freq/flags to channel number */
2813                         break;
2814                 case IEEE80211_RADIOTAP_RATE:
2815                         datarate = *iter.this_arg * 5;
2816                         break;
2817                 case IEEE80211_RADIOTAP_DB_ANTSIGNAL:
2818                         ssi_signal = *iter.this_arg;
2819                         break;
2820                 }
2821         }
2822
2823         if (rxflags && injected)
2824                 return;
2825
2826         if (!injected)
2827                 handle_frame(drv, buf + iter.max_length,
2828                              len - iter.max_length, datarate, ssi_signal);
2829         else
2830                 handle_tx_callback(drv->ctx, buf + iter.max_length,
2831                                    len - iter.max_length, !failed);
2832 }
2833
2834
2835 /*
2836  * we post-process the filter code later and rewrite
2837  * this to the offset to the last instruction
2838  */
2839 #define PASS    0xFF
2840 #define FAIL    0xFE
2841
2842 static struct sock_filter msock_filter_insns[] = {
2843         /*
2844          * do a little-endian load of the radiotap length field
2845          */
2846         /* load lower byte into A */
2847         BPF_STMT(BPF_LD  | BPF_B | BPF_ABS, 2),
2848         /* put it into X (== index register) */
2849         BPF_STMT(BPF_MISC| BPF_TAX, 0),
2850         /* load upper byte into A */
2851         BPF_STMT(BPF_LD  | BPF_B | BPF_ABS, 3),
2852         /* left-shift it by 8 */
2853         BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 8),
2854         /* or with X */
2855         BPF_STMT(BPF_ALU | BPF_OR | BPF_X, 0),
2856         /* put result into X */
2857         BPF_STMT(BPF_MISC| BPF_TAX, 0),
2858
2859         /*
2860          * Allow management frames through, this also gives us those
2861          * management frames that we sent ourselves with status
2862          */
2863         /* load the lower byte of the IEEE 802.11 frame control field */
2864         BPF_STMT(BPF_LD  | BPF_B | BPF_IND, 0),
2865         /* mask off frame type and version */
2866         BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xF),
2867         /* accept frame if it's both 0, fall through otherwise */
2868         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, PASS, 0),
2869
2870         /*
2871          * TODO: add a bit to radiotap RX flags that indicates
2872          * that the sending station is not associated, then
2873          * add a filter here that filters on our DA and that flag
2874          * to allow us to deauth frames to that bad station.
2875          *
2876          * Not a regression -- we didn't do it before either.
2877          */
2878
2879 #if 0
2880         /*
2881          * drop non-data frames
2882          */
2883         /* load the lower byte of the frame control field */
2884         BPF_STMT(BPF_LD   | BPF_B | BPF_IND, 0),
2885         /* mask off QoS bit */
2886         BPF_STMT(BPF_ALU  | BPF_AND | BPF_K, 0x0c),
2887         /* drop non-data frames */
2888         BPF_JUMP(BPF_JMP  | BPF_JEQ | BPF_K, 8, 0, FAIL),
2889 #endif
2890         /* load the upper byte of the frame control field */
2891         BPF_STMT(BPF_LD   | BPF_B | BPF_IND, 1),
2892         /* mask off toDS/fromDS */
2893         BPF_STMT(BPF_ALU  | BPF_AND | BPF_K, 0x03),
2894         /* accept WDS frames */
2895         BPF_JUMP(BPF_JMP  | BPF_JEQ | BPF_K, 3, PASS, 0),
2896
2897         /*
2898          * add header length to index
2899          */
2900         /* load the lower byte of the frame control field */
2901         BPF_STMT(BPF_LD   | BPF_B | BPF_IND, 0),
2902         /* mask off QoS bit */
2903         BPF_STMT(BPF_ALU  | BPF_AND | BPF_K, 0x80),
2904         /* right shift it by 6 to give 0 or 2 */
2905         BPF_STMT(BPF_ALU  | BPF_RSH | BPF_K, 6),
2906         /* add data frame header length */
2907         BPF_STMT(BPF_ALU  | BPF_ADD | BPF_K, 24),
2908         /* add index, was start of 802.11 header */
2909         BPF_STMT(BPF_ALU  | BPF_ADD | BPF_X, 0),
2910         /* move to index, now start of LL header */
2911         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2912
2913         /*
2914          * Accept empty data frames, we use those for
2915          * polling activity.
2916          */
2917         BPF_STMT(BPF_LD  | BPF_W | BPF_LEN, 0),
2918         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, PASS, 0),
2919
2920         /*
2921          * Accept EAPOL frames
2922          */
2923         BPF_STMT(BPF_LD  | BPF_W | BPF_IND, 0),
2924         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0xAAAA0300, 0, FAIL),
2925         BPF_STMT(BPF_LD  | BPF_W | BPF_IND, 4),
2926         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0000888E, PASS, FAIL),
2927
2928         /* keep these last two statements or change the code below */
2929         /* return 0 == "DROP" */
2930         BPF_STMT(BPF_RET | BPF_K, 0),
2931         /* return ~0 == "keep all" */
2932         BPF_STMT(BPF_RET | BPF_K, ~0),
2933 };
2934
2935 static struct sock_fprog msock_filter = {
2936         .len = sizeof(msock_filter_insns)/sizeof(msock_filter_insns[0]),
2937         .filter = msock_filter_insns,
2938 };
2939
2940
2941 static int add_monitor_filter(int s)
2942 {
2943         int idx;
2944
2945         /* rewrite all PASS/FAIL jump offsets */
2946         for (idx = 0; idx < msock_filter.len; idx++) {
2947                 struct sock_filter *insn = &msock_filter_insns[idx];
2948
2949                 if (BPF_CLASS(insn->code) == BPF_JMP) {
2950                         if (insn->code == (BPF_JMP|BPF_JA)) {
2951                                 if (insn->k == PASS)
2952                                         insn->k = msock_filter.len - idx - 2;
2953                                 else if (insn->k == FAIL)
2954                                         insn->k = msock_filter.len - idx - 3;
2955                         }
2956
2957                         if (insn->jt == PASS)
2958                                 insn->jt = msock_filter.len - idx - 2;
2959                         else if (insn->jt == FAIL)
2960                                 insn->jt = msock_filter.len - idx - 3;
2961
2962                         if (insn->jf == PASS)
2963                                 insn->jf = msock_filter.len - idx - 2;
2964                         else if (insn->jf == FAIL)
2965                                 insn->jf = msock_filter.len - idx - 3;
2966                 }
2967         }
2968
2969         if (setsockopt(s, SOL_SOCKET, SO_ATTACH_FILTER,
2970                        &msock_filter, sizeof(msock_filter))) {
2971                 perror("SO_ATTACH_FILTER");
2972                 return -1;
2973         }
2974
2975         return 0;
2976 }
2977
2978
2979 static void nl80211_remove_monitor_interface(
2980         struct wpa_driver_nl80211_data *drv)
2981 {
2982         if (drv->monitor_ifidx >= 0) {
2983                 nl80211_remove_iface(drv, drv->monitor_ifidx);
2984                 drv->monitor_ifidx = -1;
2985         }
2986         if (drv->monitor_sock >= 0) {
2987                 eloop_unregister_read_sock(drv->monitor_sock);
2988                 close(drv->monitor_sock);
2989                 drv->monitor_sock = -1;
2990         }
2991 }
2992
2993
2994 static int
2995 nl80211_create_monitor_interface(struct wpa_driver_nl80211_data *drv)
2996 {
2997         char buf[IFNAMSIZ];
2998         struct sockaddr_ll ll;
2999         int optval;
3000         socklen_t optlen;
3001
3002         snprintf(buf, IFNAMSIZ, "mon.%s", drv->ifname);
3003         buf[IFNAMSIZ - 1] = '\0';
3004
3005         drv->monitor_ifidx =
3006                 nl80211_create_iface(drv, buf, NL80211_IFTYPE_MONITOR, NULL,
3007                                      0);
3008
3009         if (drv->monitor_ifidx < 0)
3010                 return -1;
3011
3012         if (linux_set_iface_flags(drv->ioctl_sock, buf, 1))
3013                 goto error;
3014
3015         memset(&ll, 0, sizeof(ll));
3016         ll.sll_family = AF_PACKET;
3017         ll.sll_ifindex = drv->monitor_ifidx;
3018         drv->monitor_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
3019         if (drv->monitor_sock < 0) {
3020                 perror("socket[PF_PACKET,SOCK_RAW]");
3021                 goto error;
3022         }
3023
3024         if (add_monitor_filter(drv->monitor_sock)) {
3025                 wpa_printf(MSG_INFO, "Failed to set socket filter for monitor "
3026                            "interface; do filtering in user space");
3027                 /* This works, but will cost in performance. */
3028         }
3029
3030         if (bind(drv->monitor_sock, (struct sockaddr *) &ll, sizeof(ll)) < 0) {
3031                 perror("monitor socket bind");
3032                 goto error;
3033         }
3034
3035         optlen = sizeof(optval);
3036         optval = 20;
3037         if (setsockopt
3038             (drv->monitor_sock, SOL_SOCKET, SO_PRIORITY, &optval, optlen)) {
3039                 perror("Failed to set socket priority");
3040                 goto error;
3041         }
3042
3043         if (eloop_register_read_sock(drv->monitor_sock, handle_monitor_read,
3044                                      drv, NULL)) {
3045                 printf("Could not register monitor read socket\n");
3046                 goto error;
3047         }
3048
3049         return 0;
3050  error:
3051         nl80211_remove_monitor_interface(drv);
3052         return -1;
3053 }
3054
3055
3056 static const u8 rfc1042_header[6] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
3057
3058 static int wpa_driver_nl80211_hapd_send_eapol(
3059         void *priv, const u8 *addr, const u8 *data,
3060         size_t data_len, int encrypt, const u8 *own_addr)
3061 {
3062         struct wpa_driver_nl80211_data *drv = priv;
3063         struct ieee80211_hdr *hdr;
3064         size_t len;
3065         u8 *pos;
3066         int res;
3067 #if 0 /* FIX */
3068         int qos = sta->flags & WPA_STA_WMM;
3069 #else
3070         int qos = 0;
3071 #endif
3072
3073         len = sizeof(*hdr) + (qos ? 2 : 0) + sizeof(rfc1042_header) + 2 +
3074                 data_len;
3075         hdr = os_zalloc(len);
3076         if (hdr == NULL) {
3077                 printf("malloc() failed for i802_send_data(len=%lu)\n",
3078                        (unsigned long) len);
3079                 return -1;
3080         }
3081
3082         hdr->frame_control =
3083                 IEEE80211_FC(WLAN_FC_TYPE_DATA, WLAN_FC_STYPE_DATA);
3084         hdr->frame_control |= host_to_le16(WLAN_FC_FROMDS);
3085         if (encrypt)
3086                 hdr->frame_control |= host_to_le16(WLAN_FC_ISWEP);
3087 #if 0 /* To be enabled if qos determination is added above */
3088         if (qos) {
3089                 hdr->frame_control |=
3090                         host_to_le16(WLAN_FC_STYPE_QOS_DATA << 4);
3091         }
3092 #endif
3093
3094         memcpy(hdr->IEEE80211_DA_FROMDS, addr, ETH_ALEN);
3095         memcpy(hdr->IEEE80211_BSSID_FROMDS, own_addr, ETH_ALEN);
3096         memcpy(hdr->IEEE80211_SA_FROMDS, own_addr, ETH_ALEN);
3097         pos = (u8 *) (hdr + 1);
3098
3099 #if 0 /* To be enabled if qos determination is added above */
3100         if (qos) {
3101                 /* add an empty QoS header if needed */
3102                 pos[0] = 0;
3103                 pos[1] = 0;
3104                 pos += 2;
3105         }
3106 #endif
3107
3108         memcpy(pos, rfc1042_header, sizeof(rfc1042_header));
3109         pos += sizeof(rfc1042_header);
3110         WPA_PUT_BE16(pos, ETH_P_PAE);
3111         pos += 2;
3112         memcpy(pos, data, data_len);
3113
3114         res = wpa_driver_nl80211_send_frame(drv, (u8 *) hdr, len, encrypt);
3115         if (res < 0) {
3116                 wpa_printf(MSG_ERROR, "i802_send_eapol - packet len: %lu - "
3117                            "failed: %d (%s)",
3118                            (unsigned long) len, errno, strerror(errno));
3119         }
3120         os_free(hdr);
3121
3122         return res;
3123 }
3124
3125
3126 static u32 sta_flags_nl80211(int flags)
3127 {
3128         u32 f = 0;
3129
3130         if (flags & WPA_STA_AUTHORIZED)
3131                 f |= BIT(NL80211_STA_FLAG_AUTHORIZED);
3132         if (flags & WPA_STA_WMM)
3133                 f |= BIT(NL80211_STA_FLAG_WME);
3134         if (flags & WPA_STA_SHORT_PREAMBLE)
3135                 f |= BIT(NL80211_STA_FLAG_SHORT_PREAMBLE);
3136         if (flags & WPA_STA_MFP)
3137                 f |= BIT(NL80211_STA_FLAG_MFP);
3138
3139         return f;
3140 }
3141
3142
3143 static int wpa_driver_nl80211_sta_set_flags(void *priv, const u8 *addr,
3144                                             int total_flags, int flags_or,
3145                                             int flags_and)
3146 {
3147         struct wpa_driver_nl80211_data *drv = priv;
3148         struct nl_msg *msg, *flags = NULL;
3149         struct nl80211_sta_flag_update upd;
3150
3151         msg = nlmsg_alloc();
3152         if (!msg)
3153                 return -ENOMEM;
3154
3155         flags = nlmsg_alloc();
3156         if (!flags) {
3157                 nlmsg_free(msg);
3158                 return -ENOMEM;
3159         }
3160
3161         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3162                     0, NL80211_CMD_SET_STATION, 0);
3163
3164         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
3165                     if_nametoindex(drv->ifname));
3166         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
3167
3168         /*
3169          * Backwards compatibility version using NL80211_ATTR_STA_FLAGS. This
3170          * can be removed eventually.
3171          */
3172         if (total_flags & WPA_STA_AUTHORIZED)
3173                 NLA_PUT_FLAG(flags, NL80211_STA_FLAG_AUTHORIZED);
3174
3175         if (total_flags & WPA_STA_WMM)
3176                 NLA_PUT_FLAG(flags, NL80211_STA_FLAG_WME);
3177
3178         if (total_flags & WPA_STA_SHORT_PREAMBLE)
3179                 NLA_PUT_FLAG(flags, NL80211_STA_FLAG_SHORT_PREAMBLE);
3180
3181         if (total_flags & WPA_STA_MFP)
3182                 NLA_PUT_FLAG(flags, NL80211_STA_FLAG_MFP);
3183
3184         if (nla_put_nested(msg, NL80211_ATTR_STA_FLAGS, flags))
3185                 goto nla_put_failure;
3186
3187         os_memset(&upd, 0, sizeof(upd));
3188         upd.mask = sta_flags_nl80211(flags_or | ~flags_and);
3189         upd.set = sta_flags_nl80211(flags_or);
3190         NLA_PUT(msg, NL80211_ATTR_STA_FLAGS2, sizeof(upd), &upd);
3191
3192         nlmsg_free(flags);
3193
3194         return send_and_recv_msgs(drv, msg, NULL, NULL);
3195  nla_put_failure:
3196         nlmsg_free(flags);
3197         return -ENOBUFS;
3198 }
3199
3200
3201 static int wpa_driver_nl80211_ap(struct wpa_driver_nl80211_data *drv,
3202                                  struct wpa_driver_associate_params *params)
3203 {
3204         if (wpa_driver_nl80211_set_mode(drv, params->mode) ||
3205             wpa_driver_nl80211_set_freq(drv, params->freq, 0, 0)) {
3206                 nl80211_remove_monitor_interface(drv);
3207                 return -1;
3208         }
3209
3210         /* TODO: setup monitor interface (and add code somewhere to remove this
3211          * when AP mode is stopped; associate with mode != 2 or drv_deinit) */
3212
3213         return 0;
3214 }
3215
3216
3217 static int nl80211_leave_ibss(struct wpa_driver_nl80211_data *drv)
3218 {
3219         struct nl_msg *msg;
3220         int ret = -1;
3221
3222         msg = nlmsg_alloc();
3223         if (!msg)
3224                 return -1;
3225
3226         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
3227                     NL80211_CMD_LEAVE_IBSS, 0);
3228         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
3229         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
3230         msg = NULL;
3231         if (ret) {
3232                 wpa_printf(MSG_DEBUG, "nl80211: Leave IBSS failed: ret=%d "
3233                            "(%s)", ret, strerror(-ret));
3234                 goto nla_put_failure;
3235         }
3236
3237         ret = 0;
3238         wpa_printf(MSG_DEBUG, "nl80211: Leave IBSS request sent successfully");
3239
3240 nla_put_failure:
3241         nlmsg_free(msg);
3242         return ret;
3243 }
3244
3245
3246 static int wpa_driver_nl80211_ibss(struct wpa_driver_nl80211_data *drv,
3247                                    struct wpa_driver_associate_params *params)
3248 {
3249         struct nl_msg *msg;
3250         int ret = -1;
3251         int count = 0;
3252
3253         wpa_printf(MSG_DEBUG, "nl80211: Join IBSS (ifindex=%d)", drv->ifindex);
3254
3255         if (wpa_driver_nl80211_set_mode(drv, params->mode)) {
3256                 wpa_printf(MSG_INFO, "nl80211: Failed to set interface into "
3257                            "IBSS mode");
3258                 return -1;
3259         }
3260
3261 retry:
3262         msg = nlmsg_alloc();
3263         if (!msg)
3264                 return -1;
3265
3266         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
3267                     NL80211_CMD_JOIN_IBSS, 0);
3268         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
3269
3270         if (params->ssid == NULL || params->ssid_len > sizeof(drv->ssid))
3271                 goto nla_put_failure;
3272
3273         wpa_hexdump_ascii(MSG_DEBUG, "  * SSID",
3274                           params->ssid, params->ssid_len);
3275         NLA_PUT(msg, NL80211_ATTR_SSID, params->ssid_len,
3276                 params->ssid);
3277         os_memcpy(drv->ssid, params->ssid, params->ssid_len);
3278         drv->ssid_len = params->ssid_len;
3279
3280         wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq);
3281         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
3282
3283         ret = nl80211_set_conn_keys(params, msg);
3284         if (ret)
3285                 goto nla_put_failure;
3286
3287         if (params->wpa_ie) {
3288                 wpa_hexdump(MSG_DEBUG,
3289                             "  * Extra IEs for Beacon/Probe Response frames",
3290                             params->wpa_ie, params->wpa_ie_len);
3291                 NLA_PUT(msg, NL80211_ATTR_IE, params->wpa_ie_len,
3292                         params->wpa_ie);
3293         }
3294
3295         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
3296         msg = NULL;
3297         if (ret) {
3298                 wpa_printf(MSG_DEBUG, "nl80211: Join IBSS failed: ret=%d (%s)",
3299                            ret, strerror(-ret));
3300                 count++;
3301                 if (ret == -EALREADY && count == 1) {
3302                         wpa_printf(MSG_DEBUG, "nl80211: Retry IBSS join after "
3303                                    "forced leave");
3304                         nl80211_leave_ibss(drv);
3305                         nlmsg_free(msg);
3306                         goto retry;
3307                 }
3308
3309                 goto nla_put_failure;
3310         }
3311         ret = 0;
3312         wpa_printf(MSG_DEBUG, "nl80211: Join IBSS request sent successfully");
3313
3314 nla_put_failure:
3315         nlmsg_free(msg);
3316         return ret;
3317 }
3318
3319
3320 static int wpa_driver_nl80211_connect(
3321         struct wpa_driver_nl80211_data *drv,
3322         struct wpa_driver_associate_params *params)
3323 {
3324         struct nl_msg *msg;
3325         enum nl80211_auth_type type;
3326         int ret = 0;
3327
3328         msg = nlmsg_alloc();
3329         if (!msg)
3330                 return -1;
3331
3332         wpa_printf(MSG_DEBUG, "nl80211: Connect (ifindex=%d)", drv->ifindex);
3333         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
3334                     NL80211_CMD_CONNECT, 0);
3335
3336         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
3337         if (params->bssid) {
3338                 wpa_printf(MSG_DEBUG, "  * bssid=" MACSTR,
3339                            MAC2STR(params->bssid));
3340                 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, params->bssid);
3341         }
3342         if (params->freq) {
3343                 wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq);
3344                 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
3345         }
3346         if (params->ssid) {
3347                 wpa_hexdump_ascii(MSG_DEBUG, "  * SSID",
3348                                   params->ssid, params->ssid_len);
3349                 NLA_PUT(msg, NL80211_ATTR_SSID, params->ssid_len,
3350                         params->ssid);
3351                 if (params->ssid_len > sizeof(drv->ssid))
3352                         goto nla_put_failure;
3353                 os_memcpy(drv->ssid, params->ssid, params->ssid_len);
3354                 drv->ssid_len = params->ssid_len;
3355         }
3356         wpa_hexdump(MSG_DEBUG, "  * IEs", params->wpa_ie, params->wpa_ie_len);
3357         if (params->wpa_ie)
3358                 NLA_PUT(msg, NL80211_ATTR_IE, params->wpa_ie_len,
3359                         params->wpa_ie);
3360
3361         if (params->auth_alg & WPA_AUTH_ALG_OPEN)
3362                 type = NL80211_AUTHTYPE_OPEN_SYSTEM;
3363         else if (params->auth_alg & WPA_AUTH_ALG_SHARED)
3364                 type = NL80211_AUTHTYPE_SHARED_KEY;
3365         else if (params->auth_alg & WPA_AUTH_ALG_LEAP)
3366                 type = NL80211_AUTHTYPE_NETWORK_EAP;
3367         else if (params->auth_alg & WPA_AUTH_ALG_FT)
3368                 type = NL80211_AUTHTYPE_FT;
3369         else
3370                 goto nla_put_failure;
3371
3372         wpa_printf(MSG_DEBUG, "  * Auth Type %d", type);
3373         NLA_PUT_U32(msg, NL80211_ATTR_AUTH_TYPE, type);
3374
3375         if (params->wpa_ie && params->wpa_ie_len) {
3376                 enum nl80211_wpa_versions ver;
3377
3378                 if (params->wpa_ie[0] == WLAN_EID_RSN)
3379                         ver = NL80211_WPA_VERSION_2;
3380                 else
3381                         ver = NL80211_WPA_VERSION_1;
3382
3383                 wpa_printf(MSG_DEBUG, "  * WPA Version %d", ver);
3384                 NLA_PUT_U32(msg, NL80211_ATTR_WPA_VERSIONS, ver);
3385         }
3386
3387         if (params->pairwise_suite != CIPHER_NONE) {
3388                 int cipher;
3389
3390                 switch (params->pairwise_suite) {
3391                 case CIPHER_WEP40:
3392                         cipher = WLAN_CIPHER_SUITE_WEP40;
3393                         break;
3394                 case CIPHER_WEP104:
3395                         cipher = WLAN_CIPHER_SUITE_WEP104;
3396                         break;
3397                 case CIPHER_CCMP:
3398                         cipher = WLAN_CIPHER_SUITE_CCMP;
3399                         break;
3400                 case CIPHER_TKIP:
3401                 default:
3402                         cipher = WLAN_CIPHER_SUITE_TKIP;
3403                         break;
3404                 }
3405                 NLA_PUT_U32(msg, NL80211_ATTR_CIPHER_SUITES_PAIRWISE, cipher);
3406         }
3407
3408         if (params->group_suite != CIPHER_NONE) {
3409                 int cipher;
3410
3411                 switch (params->group_suite) {
3412                 case CIPHER_WEP40:
3413                         cipher = WLAN_CIPHER_SUITE_WEP40;
3414                         break;
3415                 case CIPHER_WEP104:
3416                         cipher = WLAN_CIPHER_SUITE_WEP104;
3417                         break;
3418                 case CIPHER_CCMP:
3419                         cipher = WLAN_CIPHER_SUITE_CCMP;
3420                         break;
3421                 case CIPHER_TKIP:
3422                 default:
3423                         cipher = WLAN_CIPHER_SUITE_TKIP;
3424                         break;
3425                 }
3426                 NLA_PUT_U32(msg, NL80211_ATTR_CIPHER_SUITE_GROUP, cipher);
3427         }
3428
3429         if (params->key_mgmt_suite == KEY_MGMT_802_1X ||
3430             params->key_mgmt_suite == KEY_MGMT_PSK) {
3431                 int mgmt = WLAN_AKM_SUITE_PSK;
3432
3433                 switch (params->key_mgmt_suite) {
3434                 case KEY_MGMT_802_1X:
3435                         mgmt = WLAN_AKM_SUITE_8021X;
3436                         break;
3437                 case KEY_MGMT_PSK:
3438                 default:
3439                         mgmt = WLAN_AKM_SUITE_PSK;
3440                         break;
3441                 }
3442                 NLA_PUT_U32(msg, NL80211_ATTR_AKM_SUITES, mgmt);
3443         }
3444
3445         ret = nl80211_set_conn_keys(params, msg);
3446         if (ret)
3447                 goto nla_put_failure;
3448
3449         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
3450         msg = NULL;
3451         if (ret) {
3452                 wpa_printf(MSG_DEBUG, "nl80211: MLME connect failed: ret=%d "
3453                            "(%s)", ret, strerror(-ret));
3454                 goto nla_put_failure;
3455         }
3456         ret = 0;
3457         wpa_printf(MSG_DEBUG, "nl80211: Connect request send successfully");
3458
3459 nla_put_failure:
3460         nlmsg_free(msg);
3461         return ret;
3462
3463 }
3464
3465
3466 static int wpa_driver_nl80211_associate(
3467         void *priv, struct wpa_driver_associate_params *params)
3468 {
3469         struct wpa_driver_nl80211_data *drv = priv;
3470         int ret = -1;
3471         struct nl_msg *msg;
3472
3473         if (params->mode == IEEE80211_MODE_AP)
3474                 return wpa_driver_nl80211_ap(drv, params);
3475
3476         if (params->mode == IEEE80211_MODE_IBSS)
3477                 return wpa_driver_nl80211_ibss(drv, params);
3478
3479         if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME)) {
3480                 if (wpa_driver_nl80211_set_mode(drv, params->mode) < 0)
3481                         return -1;
3482                 return wpa_driver_nl80211_connect(drv, params);
3483         }
3484
3485         drv->associated = 0;
3486
3487         msg = nlmsg_alloc();
3488         if (!msg)
3489                 return -1;
3490
3491         wpa_printf(MSG_DEBUG, "nl80211: Associate (ifindex=%d)",
3492                    drv->ifindex);
3493         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
3494                     NL80211_CMD_ASSOCIATE, 0);
3495
3496         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
3497         if (params->bssid) {
3498                 wpa_printf(MSG_DEBUG, "  * bssid=" MACSTR,
3499                            MAC2STR(params->bssid));
3500                 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, params->bssid);
3501         }
3502         if (params->freq) {
3503                 wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq);
3504                 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
3505                 drv->assoc_freq = params->freq;
3506         } else
3507                 drv->assoc_freq = 0;
3508         if (params->ssid) {
3509                 wpa_hexdump_ascii(MSG_DEBUG, "  * SSID",
3510                                   params->ssid, params->ssid_len);
3511                 NLA_PUT(msg, NL80211_ATTR_SSID, params->ssid_len,
3512                         params->ssid);
3513                 if (params->ssid_len > sizeof(drv->ssid))
3514                         goto nla_put_failure;
3515                 os_memcpy(drv->ssid, params->ssid, params->ssid_len);
3516                 drv->ssid_len = params->ssid_len;
3517         }
3518         wpa_hexdump(MSG_DEBUG, "  * IEs", params->wpa_ie, params->wpa_ie_len);
3519         if (params->wpa_ie)
3520                 NLA_PUT(msg, NL80211_ATTR_IE, params->wpa_ie_len,
3521                         params->wpa_ie);
3522
3523 #ifdef CONFIG_IEEE80211W
3524         if (params->mgmt_frame_protection == MGMT_FRAME_PROTECTION_REQUIRED)
3525                 NLA_PUT_U32(msg, NL80211_ATTR_USE_MFP, NL80211_MFP_REQUIRED);
3526 #endif /* CONFIG_IEEE80211W */
3527
3528         NLA_PUT_FLAG(msg, NL80211_ATTR_CONTROL_PORT);
3529
3530         if (params->prev_bssid) {
3531                 wpa_printf(MSG_DEBUG, "  * prev_bssid=" MACSTR,
3532                            MAC2STR(params->prev_bssid));
3533                 NLA_PUT(msg, NL80211_ATTR_PREV_BSSID, ETH_ALEN,
3534                         params->prev_bssid);
3535         }
3536
3537         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
3538         msg = NULL;
3539         if (ret) {
3540                 wpa_printf(MSG_DEBUG, "nl80211: MLME command failed: ret=%d "
3541                            "(%s)", ret, strerror(-ret));
3542                 goto nla_put_failure;
3543         }
3544         ret = 0;
3545         wpa_printf(MSG_DEBUG, "nl80211: Association request send "
3546                    "successfully");
3547
3548 nla_put_failure:
3549         nlmsg_free(msg);
3550         return ret;
3551 }
3552
3553
3554 static int nl80211_set_mode(struct wpa_driver_nl80211_data *drv,
3555                             int ifindex, int mode)
3556 {
3557         struct nl_msg *msg;
3558         int ret = -ENOBUFS;
3559
3560         msg = nlmsg_alloc();
3561         if (!msg)
3562                 return -ENOMEM;
3563
3564         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3565                     0, NL80211_CMD_SET_INTERFACE, 0);
3566         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
3567         NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, mode);
3568
3569         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
3570         if (!ret)
3571                 return 0;
3572 nla_put_failure:
3573         wpa_printf(MSG_DEBUG, "nl80211: Failed to set interface %d to mode %d:"
3574                    " %d (%s)", ifindex, mode, ret, strerror(-ret));
3575         return ret;
3576 }
3577
3578
3579 static int wpa_driver_nl80211_set_mode(void *priv, int mode)
3580 {
3581         struct wpa_driver_nl80211_data *drv = priv;
3582         int ret = -1;
3583         int nlmode;
3584
3585         switch (mode) {
3586         case 0:
3587                 nlmode = NL80211_IFTYPE_STATION;
3588                 break;
3589         case 1:
3590                 nlmode = NL80211_IFTYPE_ADHOC;
3591                 break;
3592         case 2:
3593                 nlmode = NL80211_IFTYPE_AP;
3594                 break;
3595         default:
3596                 return -1;
3597         }
3598
3599         if (nl80211_set_mode(drv, drv->ifindex, nlmode) == 0) {
3600                 drv->nlmode = nlmode;
3601                 ret = 0;
3602                 goto done;
3603         }
3604
3605         if (nlmode == drv->nlmode) {
3606                 wpa_printf(MSG_DEBUG, "nl80211: Interface already in "
3607                            "requested mode - ignore error");
3608                 ret = 0;
3609                 goto done; /* Already in the requested mode */
3610         }
3611
3612         /* mac80211 doesn't allow mode changes while the device is up, so
3613          * take the device down, try to set the mode again, and bring the
3614          * device back up.
3615          */
3616         if (linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 0) == 0) {
3617                 /* Try to set the mode again while the interface is down */
3618                 ret = nl80211_set_mode(drv, drv->ifindex, nlmode);
3619                 if (linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 1))
3620                         ret = -1;
3621         }
3622
3623         if (!ret) {
3624                 wpa_printf(MSG_DEBUG, "nl80211: Mode change succeeded while "
3625                            "interface is down");
3626                 drv->nlmode = nlmode;
3627         }
3628
3629 done:
3630         if (!ret && nlmode == NL80211_IFTYPE_AP) {
3631                 /* Setup additional AP mode functionality if needed */
3632                 if (drv->monitor_ifidx < 0 &&
3633                     nl80211_create_monitor_interface(drv))
3634                         return -1;
3635         } else if (!ret && nlmode != NL80211_IFTYPE_AP) {
3636                 /* Remove additional AP mode functionality */
3637                 nl80211_remove_monitor_interface(drv);
3638 #ifndef HOSTAPD
3639                 drv->beacon_set = 0;
3640 #endif /* HOSTAPD */
3641         }
3642
3643         if (ret)
3644                 wpa_printf(MSG_DEBUG, "nl80211: Interface mode change to %d "
3645                            "from %d failed", nlmode, drv->nlmode);
3646
3647         return ret;
3648 }
3649
3650
3651 static int wpa_driver_nl80211_get_capa(void *priv,
3652                                        struct wpa_driver_capa *capa)
3653 {
3654         struct wpa_driver_nl80211_data *drv = priv;
3655         if (!drv->has_capability)
3656                 return -1;
3657         os_memcpy(capa, &drv->capa, sizeof(*capa));
3658         return 0;
3659 }
3660
3661
3662 static int wpa_driver_nl80211_set_operstate(void *priv, int state)
3663 {
3664         struct wpa_driver_nl80211_data *drv = priv;
3665
3666         wpa_printf(MSG_DEBUG, "%s: operstate %d->%d (%s)",
3667                    __func__, drv->operstate, state, state ? "UP" : "DORMANT");
3668         drv->operstate = state;
3669         return netlink_send_oper_ifla(drv->netlink, drv->ifindex, -1,
3670                                       state ? IF_OPER_UP : IF_OPER_DORMANT);
3671 }
3672
3673
3674 static int wpa_driver_nl80211_set_supp_port(void *priv, int authorized)
3675 {
3676         struct wpa_driver_nl80211_data *drv = priv;
3677         struct nl_msg *msg;
3678         struct nl80211_sta_flag_update upd;
3679
3680         msg = nlmsg_alloc();
3681         if (!msg)
3682                 return -ENOMEM;
3683
3684         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3685                     0, NL80211_CMD_SET_STATION, 0);
3686
3687         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
3688                     if_nametoindex(drv->ifname));
3689         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, drv->bssid);
3690
3691         os_memset(&upd, 0, sizeof(upd));
3692         upd.mask = BIT(NL80211_STA_FLAG_AUTHORIZED);
3693         if (authorized)
3694                 upd.set = BIT(NL80211_STA_FLAG_AUTHORIZED);
3695         NLA_PUT(msg, NL80211_ATTR_STA_FLAGS2, sizeof(upd), &upd);
3696
3697         return send_and_recv_msgs(drv, msg, NULL, NULL);
3698  nla_put_failure:
3699         return -ENOBUFS;
3700 }
3701
3702
3703 #ifdef HOSTAPD
3704
3705 static struct i802_bss * get_bss(struct wpa_driver_nl80211_data *drv,
3706                                  int ifindex)
3707 {
3708         struct i802_bss *bss = &drv->bss;
3709         while (bss) {
3710                 if (ifindex == bss->ifindex)
3711                         return bss;
3712                 bss = bss->next;
3713         }
3714         wpa_printf(MSG_DEBUG, "nl80211: get_bss(%d) failed", ifindex);
3715         return NULL;
3716 }
3717
3718
3719 static void add_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx)
3720 {
3721         int i;
3722         int *old;
3723
3724         wpa_printf(MSG_DEBUG, "nl80211: Add own interface ifindex %d",
3725                    ifidx);
3726         for (i = 0; i < drv->num_if_indices; i++) {
3727                 if (drv->if_indices[i] == 0) {
3728                         drv->if_indices[i] = ifidx;
3729                         return;
3730                 }
3731         }
3732
3733         if (drv->if_indices != drv->default_if_indices)
3734                 old = drv->if_indices;
3735         else
3736                 old = NULL;
3737
3738         drv->if_indices = os_realloc(old,
3739                                      sizeof(int) * (drv->num_if_indices + 1));
3740         if (!drv->if_indices) {
3741                 if (!old)
3742                         drv->if_indices = drv->default_if_indices;
3743                 else
3744                         drv->if_indices = old;
3745                 wpa_printf(MSG_ERROR, "Failed to reallocate memory for "
3746                            "interfaces");
3747                 wpa_printf(MSG_ERROR, "Ignoring EAPOL on interface %d", ifidx);
3748                 return;
3749         }
3750         drv->if_indices[drv->num_if_indices] = ifidx;
3751         drv->num_if_indices++;
3752 }
3753
3754
3755 static void del_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx)
3756 {
3757         int i;
3758
3759         for (i = 0; i < drv->num_if_indices; i++) {
3760                 if (drv->if_indices[i] == ifidx) {
3761                         drv->if_indices[i] = 0;
3762                         break;
3763                 }
3764         }
3765 }
3766
3767
3768 static int have_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx)
3769 {
3770         int i;
3771
3772         for (i = 0; i < drv->num_if_indices; i++)
3773                 if (drv->if_indices[i] == ifidx)
3774                         return 1;
3775
3776         return 0;
3777 }
3778
3779
3780 static inline int min_int(int a, int b)
3781 {
3782         if (a < b)
3783                 return a;
3784         return b;
3785 }
3786
3787
3788 static int get_key_handler(struct nl_msg *msg, void *arg)
3789 {
3790         struct nlattr *tb[NL80211_ATTR_MAX + 1];
3791         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
3792
3793         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
3794                   genlmsg_attrlen(gnlh, 0), NULL);
3795
3796         /*
3797          * TODO: validate the key index and mac address!
3798          * Otherwise, there's a race condition as soon as
3799          * the kernel starts sending key notifications.
3800          */
3801
3802         if (tb[NL80211_ATTR_KEY_SEQ])
3803                 memcpy(arg, nla_data(tb[NL80211_ATTR_KEY_SEQ]),
3804                        min_int(nla_len(tb[NL80211_ATTR_KEY_SEQ]), 6));
3805         return NL_SKIP;
3806 }
3807
3808
3809 static int i802_get_seqnum(const char *iface, void *priv, const u8 *addr,
3810                            int idx, u8 *seq)
3811 {
3812         struct wpa_driver_nl80211_data *drv = priv;
3813         struct nl_msg *msg;
3814
3815         msg = nlmsg_alloc();
3816         if (!msg)
3817                 return -ENOMEM;
3818
3819         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3820                     0, NL80211_CMD_GET_KEY, 0);
3821
3822         if (addr)
3823                 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
3824         NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, idx);
3825         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(iface));
3826
3827         memset(seq, 0, 6);
3828
3829         return send_and_recv_msgs(drv, msg, get_key_handler, seq);
3830  nla_put_failure:
3831         return -ENOBUFS;
3832 }
3833
3834
3835 static int i802_set_rate_sets(void *priv, int *supp_rates, int *basic_rates,
3836                               int mode)
3837 {
3838         struct wpa_driver_nl80211_data *drv = priv;
3839         struct nl_msg *msg;
3840         u8 rates[NL80211_MAX_SUPP_RATES];
3841         u8 rates_len = 0;
3842         int i;
3843
3844         msg = nlmsg_alloc();
3845         if (!msg)
3846                 return -ENOMEM;
3847
3848         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
3849                     NL80211_CMD_SET_BSS, 0);
3850
3851         for (i = 0; i < NL80211_MAX_SUPP_RATES && basic_rates[i] >= 0; i++)
3852                 rates[rates_len++] = basic_rates[i] / 5;
3853
3854         NLA_PUT(msg, NL80211_ATTR_BSS_BASIC_RATES, rates_len, rates);
3855
3856         /* TODO: multi-BSS support */
3857         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->ifname));
3858
3859         return send_and_recv_msgs(drv, msg, NULL, NULL);
3860  nla_put_failure:
3861         return -ENOBUFS;
3862 }
3863
3864
3865 /* Set kernel driver on given frequency (MHz) */
3866 static int i802_set_freq(void *priv, struct hostapd_freq_params *freq)
3867 {
3868         struct wpa_driver_nl80211_data *drv = priv;
3869         return wpa_driver_nl80211_set_freq(drv, freq->freq, freq->ht_enabled,
3870                                            freq->sec_channel_offset);
3871 }
3872
3873
3874 static int i802_set_rts(void *priv, int rts)
3875 {
3876         struct wpa_driver_nl80211_data *drv = priv;
3877         struct nl_msg *msg;
3878         int ret = -ENOBUFS;
3879         u32 val;
3880
3881         msg = nlmsg_alloc();
3882         if (!msg)
3883                 return -ENOMEM;
3884
3885         if (rts >= 2347)
3886                 val = (u32) -1;
3887         else
3888                 val = rts;
3889
3890         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3891                     0, NL80211_CMD_SET_WIPHY, 0);
3892         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
3893         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD, val);
3894
3895         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
3896         if (!ret)
3897                 return 0;
3898 nla_put_failure:
3899         wpa_printf(MSG_DEBUG, "nl80211: Failed to set RTS threshold %d: "
3900                    "%d (%s)", rts, ret, strerror(-ret));
3901         return ret;
3902 }
3903
3904
3905 static int i802_set_frag(void *priv, int frag)
3906 {
3907         struct wpa_driver_nl80211_data *drv = priv;
3908         struct nl_msg *msg;
3909         int ret = -ENOBUFS;
3910         u32 val;
3911
3912         msg = nlmsg_alloc();
3913         if (!msg)
3914                 return -ENOMEM;
3915
3916         if (frag >= 2346)
3917                 val = (u32) -1;
3918         else
3919                 val = frag;
3920
3921         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3922                     0, NL80211_CMD_SET_WIPHY, 0);
3923         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
3924         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD, val);
3925
3926         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
3927         if (!ret)
3928                 return 0;
3929 nla_put_failure:
3930         wpa_printf(MSG_DEBUG, "nl80211: Failed to set fragmentation threshold "
3931                    "%d: %d (%s)", frag, ret, strerror(-ret));
3932         return ret;
3933 }
3934
3935
3936 static int i802_flush(void *priv)
3937 {
3938         struct wpa_driver_nl80211_data *drv = priv;
3939         struct nl_msg *msg;
3940
3941         msg = nlmsg_alloc();
3942         if (!msg)
3943                 return -1;
3944
3945         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3946                     0, NL80211_CMD_DEL_STATION, 0);
3947
3948         /*
3949          * XXX: FIX! this needs to flush all VLANs too
3950          */
3951         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
3952                     if_nametoindex(drv->ifname));
3953
3954         return send_and_recv_msgs(drv, msg, NULL, NULL);
3955  nla_put_failure:
3956         return -ENOBUFS;
3957 }
3958
3959
3960 static int get_sta_handler(struct nl_msg *msg, void *arg)
3961 {
3962         struct nlattr *tb[NL80211_ATTR_MAX + 1];
3963         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
3964         struct hostap_sta_driver_data *data = arg;
3965         struct nlattr *stats[NL80211_STA_INFO_MAX + 1];
3966         static struct nla_policy stats_policy[NL80211_STA_INFO_MAX + 1] = {
3967                 [NL80211_STA_INFO_INACTIVE_TIME] = { .type = NLA_U32 },
3968                 [NL80211_STA_INFO_RX_BYTES] = { .type = NLA_U32 },
3969                 [NL80211_STA_INFO_TX_BYTES] = { .type = NLA_U32 },
3970                 [NL80211_STA_INFO_RX_PACKETS] = { .type = NLA_U32 },
3971                 [NL80211_STA_INFO_TX_PACKETS] = { .type = NLA_U32 },
3972         };
3973
3974         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
3975                   genlmsg_attrlen(gnlh, 0), NULL);
3976
3977         /*
3978          * TODO: validate the interface and mac address!
3979          * Otherwise, there's a race condition as soon as
3980          * the kernel starts sending station notifications.
3981          */
3982
3983         if (!tb[NL80211_ATTR_STA_INFO]) {
3984                 wpa_printf(MSG_DEBUG, "sta stats missing!");
3985                 return NL_SKIP;
3986         }
3987         if (nla_parse_nested(stats, NL80211_STA_INFO_MAX,
3988                              tb[NL80211_ATTR_STA_INFO],
3989                              stats_policy)) {
3990                 wpa_printf(MSG_DEBUG, "failed to parse nested attributes!");
3991                 return NL_SKIP;
3992         }
3993
3994         if (stats[NL80211_STA_INFO_INACTIVE_TIME])
3995                 data->inactive_msec =
3996                         nla_get_u32(stats[NL80211_STA_INFO_INACTIVE_TIME]);
3997         if (stats[NL80211_STA_INFO_RX_BYTES])
3998                 data->rx_bytes = nla_get_u32(stats[NL80211_STA_INFO_RX_BYTES]);
3999         if (stats[NL80211_STA_INFO_TX_BYTES])
4000                 data->tx_bytes = nla_get_u32(stats[NL80211_STA_INFO_TX_BYTES]);
4001         if (stats[NL80211_STA_INFO_RX_PACKETS])
4002                 data->rx_packets =
4003                         nla_get_u32(stats[NL80211_STA_INFO_RX_PACKETS]);
4004         if (stats[NL80211_STA_INFO_TX_PACKETS])
4005                 data->tx_packets =
4006                         nla_get_u32(stats[NL80211_STA_INFO_TX_PACKETS]);
4007
4008         return NL_SKIP;
4009 }
4010
4011 static int i802_read_sta_data(void *priv, struct hostap_sta_driver_data *data,
4012                               const u8 *addr)
4013 {
4014         struct wpa_driver_nl80211_data *drv = priv;
4015         struct nl_msg *msg;
4016
4017         os_memset(data, 0, sizeof(*data));
4018         msg = nlmsg_alloc();
4019         if (!msg)
4020                 return -ENOMEM;
4021
4022         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4023                     0, NL80211_CMD_GET_STATION, 0);
4024
4025         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
4026         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->ifname));
4027
4028         return send_and_recv_msgs(drv, msg, get_sta_handler, data);
4029  nla_put_failure:
4030         return -ENOBUFS;
4031 }
4032
4033
4034 static int i802_set_tx_queue_params(void *priv, int queue, int aifs,
4035                                     int cw_min, int cw_max, int burst_time)
4036 {
4037         struct wpa_driver_nl80211_data *drv = priv;
4038         struct nl_msg *msg;
4039         struct nlattr *txq, *params;
4040
4041         msg = nlmsg_alloc();
4042         if (!msg)
4043                 return -1;
4044
4045         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4046                     0, NL80211_CMD_SET_WIPHY, 0);
4047
4048         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->ifname));
4049
4050         txq = nla_nest_start(msg, NL80211_ATTR_WIPHY_TXQ_PARAMS);
4051         if (!txq)
4052                 goto nla_put_failure;
4053
4054         /* We are only sending parameters for a single TXQ at a time */
4055         params = nla_nest_start(msg, 1);
4056         if (!params)
4057                 goto nla_put_failure;
4058
4059         NLA_PUT_U8(msg, NL80211_TXQ_ATTR_QUEUE, queue);
4060         /* Burst time is configured in units of 0.1 msec and TXOP parameter in
4061          * 32 usec, so need to convert the value here. */
4062         NLA_PUT_U16(msg, NL80211_TXQ_ATTR_TXOP, (burst_time * 100 + 16) / 32);
4063         NLA_PUT_U16(msg, NL80211_TXQ_ATTR_CWMIN, cw_min);
4064         NLA_PUT_U16(msg, NL80211_TXQ_ATTR_CWMAX, cw_max);
4065         NLA_PUT_U8(msg, NL80211_TXQ_ATTR_AIFS, aifs);
4066
4067         nla_nest_end(msg, params);
4068
4069         nla_nest_end(msg, txq);
4070
4071         if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0)
4072                 return 0;
4073  nla_put_failure:
4074         return -1;
4075 }
4076
4077
4078 static int i802_set_bss(void *priv, int cts, int preamble, int slot)
4079 {
4080         struct wpa_driver_nl80211_data *drv = priv;
4081         struct nl_msg *msg;
4082
4083         msg = nlmsg_alloc();
4084         if (!msg)
4085                 return -ENOMEM;
4086
4087         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
4088                     NL80211_CMD_SET_BSS, 0);
4089
4090         if (cts >= 0)
4091                 NLA_PUT_U8(msg, NL80211_ATTR_BSS_CTS_PROT, cts);
4092         if (preamble >= 0)
4093                 NLA_PUT_U8(msg, NL80211_ATTR_BSS_SHORT_PREAMBLE, preamble);
4094         if (slot >= 0)
4095                 NLA_PUT_U8(msg, NL80211_ATTR_BSS_SHORT_SLOT_TIME, slot);
4096
4097         /* TODO: multi-BSS support */
4098         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->ifname));
4099
4100         return send_and_recv_msgs(drv, msg, NULL, NULL);
4101  nla_put_failure:
4102         return -ENOBUFS;
4103 }
4104
4105
4106 static int i802_set_cts_protect(void *priv, int value)
4107 {
4108         return i802_set_bss(priv, value, -1, -1);
4109 }
4110
4111
4112 static int i802_set_preamble(void *priv, int value)
4113 {
4114         return i802_set_bss(priv, -1, value, -1);
4115 }
4116
4117
4118 static int i802_set_short_slot_time(void *priv, int value)
4119 {
4120         return i802_set_bss(priv, -1, -1, value);
4121 }
4122
4123
4124 static int i802_set_sta_vlan(void *priv, const u8 *addr,
4125                              const char *ifname, int vlan_id)
4126 {
4127         struct wpa_driver_nl80211_data *drv = priv;
4128         struct nl_msg *msg;
4129
4130         msg = nlmsg_alloc();
4131         if (!msg)
4132                 return -ENOMEM;
4133
4134         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4135                     0, NL80211_CMD_SET_STATION, 0);
4136
4137         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
4138                     if_nametoindex(drv->ifname));
4139         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
4140         NLA_PUT_U32(msg, NL80211_ATTR_STA_VLAN,
4141                     if_nametoindex(ifname));
4142
4143         return send_and_recv_msgs(drv, msg, NULL, NULL);
4144  nla_put_failure:
4145         return -ENOBUFS;
4146 }
4147
4148
4149 static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val)
4150 {
4151         struct wpa_driver_nl80211_data *drv = priv;
4152         char name[16];
4153
4154         os_snprintf(name, sizeof(name), "%s.sta%d", drv->ifname, aid);
4155         if (val) {
4156                 if (nl80211_create_iface(priv, name, NL80211_IFTYPE_AP_VLAN,
4157                                          NULL, 1) < 0)
4158                         return -1;
4159                 linux_set_iface_flags(drv->ioctl_sock, name, 1);
4160                 return i802_set_sta_vlan(priv, addr, name, 0);
4161         } else {
4162                 i802_set_sta_vlan(priv, addr, drv->ifname, 0);
4163                 return wpa_driver_nl80211_if_remove(priv, WPA_IF_AP_VLAN,
4164                                                     name);
4165         }
4166 }
4167
4168
4169 static void handle_eapol(int sock, void *eloop_ctx, void *sock_ctx)
4170 {
4171         struct wpa_driver_nl80211_data *drv = eloop_ctx;
4172         struct sockaddr_ll lladdr;
4173         unsigned char buf[3000];
4174         int len;
4175         socklen_t fromlen = sizeof(lladdr);
4176
4177         len = recvfrom(sock, buf, sizeof(buf), 0,
4178                        (struct sockaddr *)&lladdr, &fromlen);
4179         if (len < 0) {
4180                 perror("recv");
4181                 return;
4182         }
4183
4184         if (have_ifidx(drv, lladdr.sll_ifindex))
4185                 drv_event_eapol_rx(drv->ctx, lladdr.sll_addr, buf, len);
4186 }
4187
4188
4189 static int i802_get_inact_sec(void *priv, const u8 *addr)
4190 {
4191         struct hostap_sta_driver_data data;
4192         int ret;
4193
4194         data.inactive_msec = (unsigned long) -1;
4195         ret = i802_read_sta_data(priv, &data, addr);
4196         if (ret || data.inactive_msec == (unsigned long) -1)
4197                 return -1;
4198         return data.inactive_msec / 1000;
4199 }
4200
4201
4202 static int i802_sta_clear_stats(void *priv, const u8 *addr)
4203 {
4204 #if 0
4205         /* TODO */
4206 #endif
4207         return 0;
4208 }
4209
4210
4211 static int i802_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
4212                            int reason)
4213 {
4214         struct wpa_driver_nl80211_data *drv = priv;
4215         struct ieee80211_mgmt mgmt;
4216
4217         memset(&mgmt, 0, sizeof(mgmt));
4218         mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
4219                                           WLAN_FC_STYPE_DEAUTH);
4220         memcpy(mgmt.da, addr, ETH_ALEN);
4221         memcpy(mgmt.sa, own_addr, ETH_ALEN);
4222         memcpy(mgmt.bssid, own_addr, ETH_ALEN);
4223         mgmt.u.deauth.reason_code = host_to_le16(reason);
4224         return wpa_driver_nl80211_send_mlme(drv, (u8 *) &mgmt,
4225                                             IEEE80211_HDRLEN +
4226                                             sizeof(mgmt.u.deauth));
4227 }
4228
4229
4230 static int i802_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
4231                              int reason)
4232 {
4233         struct wpa_driver_nl80211_data *drv = priv;
4234         struct ieee80211_mgmt mgmt;
4235
4236         memset(&mgmt, 0, sizeof(mgmt));
4237         mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
4238                                           WLAN_FC_STYPE_DISASSOC);
4239         memcpy(mgmt.da, addr, ETH_ALEN);
4240         memcpy(mgmt.sa, own_addr, ETH_ALEN);
4241         memcpy(mgmt.bssid, own_addr, ETH_ALEN);
4242         mgmt.u.disassoc.reason_code = host_to_le16(reason);
4243         return wpa_driver_nl80211_send_mlme(drv, (u8 *) &mgmt,
4244                                             IEEE80211_HDRLEN +
4245                                             sizeof(mgmt.u.disassoc));
4246 }
4247
4248
4249 static void *i802_init(struct hostapd_data *hapd,
4250                        struct wpa_init_params *params)
4251 {
4252         struct wpa_driver_nl80211_data *drv;
4253         size_t i;
4254
4255         drv = wpa_driver_nl80211_init(hapd, params->ifname);
4256         if (drv == NULL)
4257                 return NULL;
4258
4259         drv->bss.ifindex = drv->ifindex;
4260
4261         drv->num_if_indices = sizeof(drv->default_if_indices) / sizeof(int);
4262         drv->if_indices = drv->default_if_indices;
4263         for (i = 0; i < params->num_bridge; i++) {
4264                 if (params->bridge[i])
4265                         add_ifidx(drv, if_nametoindex(params->bridge[i]));
4266         }
4267
4268         /* start listening for EAPOL on the default AP interface */
4269         add_ifidx(drv, drv->ifindex);
4270
4271         if (linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 0))
4272                 goto failed;
4273
4274         if (params->bssid) {
4275                 if (linux_set_ifhwaddr(drv->ioctl_sock, drv->ifname,
4276                                        params->bssid))
4277                         goto failed;
4278         }
4279
4280         if (wpa_driver_nl80211_set_mode(drv, IEEE80211_MODE_AP)) {
4281                 wpa_printf(MSG_ERROR, "nl80211: Failed to set interface %s "
4282                            "into AP mode", drv->ifname);
4283                 goto failed;
4284         }
4285
4286         if (linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 1))
4287                 goto failed;
4288
4289         drv->eapol_sock = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_PAE));
4290         if (drv->eapol_sock < 0) {
4291                 perror("socket(PF_PACKET, SOCK_DGRAM, ETH_P_PAE)");
4292                 goto failed;
4293         }
4294
4295         if (eloop_register_read_sock(drv->eapol_sock, handle_eapol, drv, NULL))
4296         {
4297                 printf("Could not register read socket for eapol\n");
4298                 goto failed;
4299         }
4300
4301         if (linux_get_ifhwaddr(drv->ioctl_sock, drv->ifname, params->own_addr))
4302                 goto failed;
4303
4304         return drv;
4305
4306 failed:
4307         nl80211_remove_monitor_interface(drv);
4308         if (drv->ioctl_sock >= 0)
4309                 close(drv->ioctl_sock);
4310
4311         genl_family_put(drv->nl80211);
4312         nl_cache_free(drv->nl_cache);
4313         nl_handle_destroy(drv->nl_handle);
4314         nl_cb_put(drv->nl_cb);
4315
4316         os_free(drv);
4317         return NULL;
4318 }
4319
4320
4321 static void i802_deinit(void *priv)
4322 {
4323         wpa_driver_nl80211_deinit(priv);
4324 }
4325
4326 #endif /* HOSTAPD */
4327
4328
4329 static enum nl80211_iftype wpa_driver_nl80211_if_type(
4330         enum wpa_driver_if_type type)
4331 {
4332         switch (type) {
4333         case WPA_IF_STATION:
4334                 return NL80211_IFTYPE_STATION;
4335         case WPA_IF_AP_VLAN:
4336                 return NL80211_IFTYPE_AP_VLAN;
4337         case WPA_IF_AP_BSS:
4338                 return NL80211_IFTYPE_AP;
4339         }
4340         return -1;
4341 }
4342
4343
4344 static int wpa_driver_nl80211_if_add(const char *iface, void *priv,
4345                                      enum wpa_driver_if_type type,
4346                                      const char *ifname, const u8 *addr,
4347                                      void *bss_ctx)
4348 {
4349         struct wpa_driver_nl80211_data *drv = priv;
4350         int ifidx;
4351 #ifdef HOSTAPD
4352         struct i802_bss *bss = NULL;
4353
4354         if (type == WPA_IF_AP_BSS) {
4355                 bss = os_zalloc(sizeof(*bss));
4356                 if (bss == NULL)
4357                         return -1;
4358         }
4359 #endif /* HOSTAPD */
4360
4361         ifidx = nl80211_create_iface(drv, ifname,
4362                                      wpa_driver_nl80211_if_type(type), addr,
4363                                      0);
4364         if (ifidx < 0) {
4365 #ifdef HOSTAPD
4366                 os_free(bss);
4367 #endif /* HOSTAPD */
4368                 return -1;
4369         }
4370
4371 #ifdef HOSTAPD
4372         if (type == WPA_IF_AP_BSS) {
4373                 if (linux_set_iface_flags(drv->ioctl_sock, ifname, 1)) {
4374                         nl80211_remove_iface(drv, ifidx);
4375                         os_free(bss);
4376                         return -1;
4377                 }
4378                 bss->ifindex = ifidx;
4379                 bss->next = drv->bss.next;
4380                 drv->bss.next = bss;
4381         }
4382 #endif /* HOSTAPD */
4383
4384         return 0;
4385 }
4386
4387
4388 static int wpa_driver_nl80211_if_remove(void *priv,
4389                                         enum wpa_driver_if_type type,
4390                                         const char *ifname)
4391 {
4392         struct wpa_driver_nl80211_data *drv = priv;
4393         int ifindex = if_nametoindex(ifname);
4394
4395         nl80211_remove_iface(drv, ifindex);
4396
4397 #ifdef HOSTAPD
4398         if (type == WPA_IF_AP_BSS) {
4399                 struct i802_bss *bss, *prev;
4400                 prev = &drv->bss;
4401                 bss = drv->bss.next;
4402                 while (bss) {
4403                         if (ifindex == bss->ifindex) {
4404                                 prev->next = bss->next;
4405                                 os_free(bss);
4406                                 break;
4407                         }
4408                         prev = bss;
4409                         bss = bss->next;
4410                 }
4411         }
4412 #endif /* HOSTAPD */
4413
4414         return 0;
4415 }
4416
4417
4418 static int cookie_handler(struct nl_msg *msg, void *arg)
4419 {
4420         struct nlattr *tb[NL80211_ATTR_MAX + 1];
4421         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
4422         u64 *cookie = arg;
4423         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
4424                   genlmsg_attrlen(gnlh, 0), NULL);
4425         if (tb[NL80211_ATTR_COOKIE])
4426                 *cookie = nla_get_u64(tb[NL80211_ATTR_COOKIE]);
4427         return NL_SKIP;
4428 }
4429
4430
4431 static int wpa_driver_nl80211_remain_on_channel(void *priv, unsigned int freq,
4432                                                 unsigned int duration)
4433 {
4434         struct wpa_driver_nl80211_data *drv = priv;
4435         struct nl_msg *msg;
4436         int ret;
4437         u64 cookie;
4438
4439         msg = nlmsg_alloc();
4440         if (!msg)
4441                 return -1;
4442
4443         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
4444                     NL80211_CMD_REMAIN_ON_CHANNEL, 0);
4445
4446         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
4447         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
4448         NLA_PUT_U32(msg, NL80211_ATTR_DURATION, duration);
4449
4450         cookie = 0;
4451         ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie);
4452         if (ret == 0) {
4453                 wpa_printf(MSG_DEBUG, "nl80211: Remain-on-channel cookie "
4454                            "0x%llx for freq=%u MHz duration=%u",
4455                            (long long unsigned int) cookie, freq, duration);
4456                 drv->remain_on_chan_cookie = cookie;
4457                 return 0;
4458         }
4459         wpa_printf(MSG_DEBUG, "nl80211: Failed to request remain-on-channel "
4460                    "(freq=%d): %d (%s)", freq, ret, strerror(-ret));
4461 nla_put_failure:
4462         return -1;
4463 }
4464
4465
4466 static int wpa_driver_nl80211_cancel_remain_on_channel(void *priv)
4467 {
4468         struct wpa_driver_nl80211_data *drv = priv;
4469         struct nl_msg *msg;
4470         int ret;
4471
4472         if (!drv->pending_remain_on_chan) {
4473                 wpa_printf(MSG_DEBUG, "nl80211: No pending remain-on-channel "
4474                            "to cancel");
4475                 return -1;
4476         }
4477
4478         wpa_printf(MSG_DEBUG, "nl80211: Cancel remain-on-channel with cookie "
4479                    "0x%llx",
4480                    (long long unsigned int) drv->remain_on_chan_cookie);
4481
4482         msg = nlmsg_alloc();
4483         if (!msg)
4484                 return -1;
4485
4486         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
4487                     NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 0);
4488
4489         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
4490         NLA_PUT_U64(msg, NL80211_ATTR_COOKIE, drv->remain_on_chan_cookie);
4491
4492         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
4493         if (ret == 0)
4494                 return 0;
4495         wpa_printf(MSG_DEBUG, "nl80211: Failed to cancel remain-on-channel: "
4496                    "%d (%s)", ret, strerror(-ret));
4497 nla_put_failure:
4498         return -1;
4499 }
4500
4501
4502 static void wpa_driver_nl80211_probe_req_report_timeout(void *eloop_ctx,
4503                                                         void *timeout_ctx)
4504 {
4505         struct wpa_driver_nl80211_data *drv = eloop_ctx;
4506         if (drv->monitor_ifidx < 0)
4507                 return; /* monitor interface already removed */
4508
4509         if (drv->nlmode != NL80211_IFTYPE_STATION)
4510                 return; /* not in station mode anymore */
4511
4512         if (drv->probe_req_report)
4513                 return; /* reporting enabled */
4514
4515         wpa_printf(MSG_DEBUG, "nl80211: Remove monitor interface due to no "
4516                    "Probe Request reporting needed anymore");
4517         nl80211_remove_monitor_interface(drv);
4518 }
4519
4520
4521 static int wpa_driver_nl80211_probe_req_report(void *priv, int report)
4522 {
4523         struct wpa_driver_nl80211_data *drv = priv;
4524
4525         if (drv->nlmode != NL80211_IFTYPE_STATION) {
4526                 wpa_printf(MSG_DEBUG, "nl80211: probe_req_report control only "
4527                            "allowed in station mode (iftype=%d)",
4528                            drv->nlmode);
4529                 return -1;
4530         }
4531         drv->probe_req_report = report;
4532
4533         if (report) {
4534                 eloop_cancel_timeout(
4535                         wpa_driver_nl80211_probe_req_report_timeout,
4536                         drv, NULL);
4537                 if (drv->monitor_ifidx < 0 &&
4538                     nl80211_create_monitor_interface(drv))
4539                         return -1;
4540         } else {
4541                 /*
4542                  * It takes a while to remove the monitor interface, so try to
4543                  * avoid doing this if it is needed again shortly. Instead,
4544                  * schedule the interface to be removed later if no need for it
4545                  * is seen.
4546                  */
4547                 wpa_printf(MSG_DEBUG, "nl80211: Scheduling monitor interface "
4548                            "to be removed after 10 seconds of no use");
4549                 eloop_register_timeout(
4550                         10, 0, wpa_driver_nl80211_probe_req_report_timeout,
4551                         drv, NULL);
4552         }
4553
4554         return 0;
4555 }
4556
4557
4558 static int wpa_driver_nl80211_alloc_interface_addr(void *priv, u8 *addr)
4559 {
4560         struct wpa_driver_nl80211_data *drv = priv;
4561
4562         if (linux_get_ifhwaddr(drv->ioctl_sock, drv->ifname, addr) < 0)
4563                 return -1;
4564
4565         if (addr[0] & 0x02) {
4566                 /* TODO: add support for generating multiple addresses */
4567                 addr[0] ^= 0x80;
4568         } else
4569                 addr[0] = 0x02; /* locally administered */
4570
4571         return 0;
4572 }
4573
4574
4575 static void wpa_driver_nl80211_release_interface_addr(void *priv,
4576                                                       const u8 *addr)
4577 {
4578         /* TODO: keep list of allocated address and release them here */
4579 }
4580
4581
4582 static int nl80211_disable_11b_rates(struct wpa_driver_nl80211_data *drv,
4583                                      int ifindex, int disabled)
4584 {
4585         struct nl_msg *msg;
4586         struct nlattr *bands, *band;
4587         int ret;
4588
4589         msg = nlmsg_alloc();
4590         if (!msg)
4591                 return -1;
4592
4593         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
4594                     NL80211_CMD_SET_TX_BITRATE_MASK, 0);
4595         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
4596
4597         bands = nla_nest_start(msg, NL80211_ATTR_TX_RATES);
4598         if (!bands)
4599                 goto nla_put_failure;
4600
4601         /*
4602          * Disable 2 GHz rates 1, 2, 5.5, 11 Mbps by masking out everything
4603          * else apart from 6, 9, 12, 18, 24, 36, 48, 54 Mbps from non-MCS
4604          * rates. All 5 GHz rates are left enabled.
4605          */
4606         band = nla_nest_start(msg, NL80211_BAND_2GHZ);
4607         if (!band)
4608                 goto nla_put_failure;
4609         NLA_PUT(msg, NL80211_TXRATE_LEGACY, 8,
4610                 "\x0c\x12\x18\x24\x30\x48\x60\x6c");
4611         nla_nest_end(msg, band);
4612
4613         nla_nest_end(msg, bands);
4614
4615         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
4616         msg = NULL;
4617         if (ret) {
4618                 wpa_printf(MSG_DEBUG, "nl80211: Set TX rates failed: ret=%d "
4619                            "(%s)", ret, strerror(-ret));
4620         }
4621
4622         return ret;
4623
4624 nla_put_failure:
4625         nlmsg_free(msg);
4626         return -1;
4627 }
4628
4629
4630 static int wpa_driver_nl80211_disable_11b_rates(void *priv, int disabled)
4631 {
4632         struct wpa_driver_nl80211_data *drv = priv;
4633         drv->disable_11b_rates = disabled;
4634         return nl80211_disable_11b_rates(drv, drv->ifindex, disabled);
4635 }
4636
4637
4638 static int wpa_driver_nl80211_deinit_ap(void *priv)
4639 {
4640         struct wpa_driver_nl80211_data *drv = priv;
4641         if (drv->nlmode != NL80211_IFTYPE_AP)
4642                 return -1;
4643         wpa_driver_nl80211_del_beacon(drv);
4644         return wpa_driver_nl80211_set_mode(drv, IEEE80211_MODE_INFRA);
4645 }
4646
4647
4648 const struct wpa_driver_ops wpa_driver_nl80211_ops = {
4649         .name = "nl80211",
4650         .desc = "Linux nl80211/cfg80211",
4651         .get_bssid = wpa_driver_nl80211_get_bssid,
4652         .get_ssid = wpa_driver_nl80211_get_ssid,
4653         .set_key = wpa_driver_nl80211_set_key,
4654         .scan2 = wpa_driver_nl80211_scan,
4655         .get_scan_results2 = wpa_driver_nl80211_get_scan_results,
4656         .deauthenticate = wpa_driver_nl80211_deauthenticate,
4657         .disassociate = wpa_driver_nl80211_disassociate,
4658         .authenticate = wpa_driver_nl80211_authenticate,
4659         .associate = wpa_driver_nl80211_associate,
4660         .init = wpa_driver_nl80211_init,
4661         .deinit = wpa_driver_nl80211_deinit,
4662         .get_capa = wpa_driver_nl80211_get_capa,
4663         .set_operstate = wpa_driver_nl80211_set_operstate,
4664         .set_supp_port = wpa_driver_nl80211_set_supp_port,
4665         .set_country = wpa_driver_nl80211_set_country,
4666         .set_beacon = wpa_driver_nl80211_set_beacon,
4667         .if_add = wpa_driver_nl80211_if_add,
4668         .if_remove = wpa_driver_nl80211_if_remove,
4669         .send_mlme = wpa_driver_nl80211_send_mlme,
4670         .get_hw_feature_data = wpa_driver_nl80211_get_hw_feature_data,
4671         .sta_add = wpa_driver_nl80211_sta_add,
4672         .sta_remove = wpa_driver_nl80211_sta_remove,
4673         .hapd_send_eapol = wpa_driver_nl80211_hapd_send_eapol,
4674         .sta_set_flags = wpa_driver_nl80211_sta_set_flags,
4675 #ifdef HOSTAPD
4676         .hapd_init = i802_init,
4677         .hapd_deinit = i802_deinit,
4678         .get_seqnum = i802_get_seqnum,
4679         .flush = i802_flush,
4680         .read_sta_data = i802_read_sta_data,
4681         .sta_deauth = i802_sta_deauth,
4682         .sta_disassoc = i802_sta_disassoc,
4683         .get_inact_sec = i802_get_inact_sec,
4684         .sta_clear_stats = i802_sta_clear_stats,
4685         .set_freq = i802_set_freq,
4686         .set_rts = i802_set_rts,
4687         .set_frag = i802_set_frag,
4688         .set_rate_sets = i802_set_rate_sets,
4689         .set_cts_protect = i802_set_cts_protect,
4690         .set_preamble = i802_set_preamble,
4691         .set_short_slot_time = i802_set_short_slot_time,
4692         .set_tx_queue_params = i802_set_tx_queue_params,
4693         .set_sta_vlan = i802_set_sta_vlan,
4694         .set_wds_sta = i802_set_wds_sta,
4695 #endif /* HOSTAPD */
4696         .remain_on_channel = wpa_driver_nl80211_remain_on_channel,
4697         .cancel_remain_on_channel =
4698         wpa_driver_nl80211_cancel_remain_on_channel,
4699         .probe_req_report = wpa_driver_nl80211_probe_req_report,
4700         .alloc_interface_addr = wpa_driver_nl80211_alloc_interface_addr,
4701         .release_interface_addr = wpa_driver_nl80211_release_interface_addr,
4702         .disable_11b_rates = wpa_driver_nl80211_disable_11b_rates,
4703         .deinit_ap = wpa_driver_nl80211_deinit_ap,
4704 };