nl80211: Generate EVENT_IBSS_RSN_START events
[mech_eap.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-2010, 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 <sys/types.h>
22 #include <sys/stat.h>
23 #include <fcntl.h>
24 #include <net/if.h>
25 #include <netlink/genl/genl.h>
26 #include <netlink/genl/family.h>
27 #include <netlink/genl/ctrl.h>
28 #include <linux/rtnetlink.h>
29 #include <netpacket/packet.h>
30 #include <linux/filter.h>
31 #include "nl80211_copy.h"
32
33 #include "common.h"
34 #include "eloop.h"
35 #include "utils/list.h"
36 #include "common/ieee802_11_defs.h"
37 #include "netlink.h"
38 #include "linux_ioctl.h"
39 #include "radiotap.h"
40 #include "radiotap_iter.h"
41 #include "rfkill.h"
42 #include "driver.h"
43
44 #ifdef CONFIG_LIBNL20
45 /* libnl 2.0 compatibility code */
46 #define nl_handle nl_sock
47 #define nl80211_handle_alloc nl_socket_alloc_cb
48 #define nl80211_handle_destroy nl_socket_free
49 #else
50 /*
51  * libnl 1.1 has a bug, it tries to allocate socket numbers densely
52  * but when you free a socket again it will mess up its bitmap and
53  * and use the wrong number the next time it needs a socket ID.
54  * Therefore, we wrap the handle alloc/destroy and add our own pid
55  * accounting.
56  */
57 static uint32_t port_bitmap[32] = { 0 };
58
59 static struct nl_handle *nl80211_handle_alloc(void *cb)
60 {
61         struct nl_handle *handle;
62         uint32_t pid = getpid() & 0x3FFFFF;
63         int i;
64
65         handle = nl_handle_alloc_cb(cb);
66
67         for (i = 0; i < 1024; i++) {
68                 if (port_bitmap[i / 32] & (1 << (i % 32)))
69                         continue;
70                 port_bitmap[i / 32] |= 1 << (i % 32);
71                 pid += i << 22;
72                 break;
73         }
74
75         nl_socket_set_local_port(handle, pid);
76
77         return handle;
78 }
79
80 static void nl80211_handle_destroy(struct nl_handle *handle)
81 {
82         uint32_t port = nl_socket_get_local_port(handle);
83
84         port >>= 22;
85         port_bitmap[port / 32] &= ~(1 << (port % 32));
86
87         nl_handle_destroy(handle);
88 }
89 #endif /* CONFIG_LIBNL20 */
90
91
92 #ifndef IFF_LOWER_UP
93 #define IFF_LOWER_UP   0x10000         /* driver signals L1 up         */
94 #endif
95 #ifndef IFF_DORMANT
96 #define IFF_DORMANT    0x20000         /* driver signals dormant       */
97 #endif
98
99 #ifndef IF_OPER_DORMANT
100 #define IF_OPER_DORMANT 5
101 #endif
102 #ifndef IF_OPER_UP
103 #define IF_OPER_UP 6
104 #endif
105
106 struct nl80211_global {
107         struct dl_list interfaces;
108 };
109
110 struct i802_bss {
111         struct wpa_driver_nl80211_data *drv;
112         struct i802_bss *next;
113         int ifindex;
114         char ifname[IFNAMSIZ + 1];
115         unsigned int beacon_set:1;
116 };
117
118 struct wpa_driver_nl80211_data {
119         struct nl80211_global *global;
120         struct dl_list list;
121         u8 addr[ETH_ALEN];
122         char phyname[32];
123         void *ctx;
124         struct netlink_data *netlink;
125         int ioctl_sock; /* socket for ioctl() use */
126         char brname[IFNAMSIZ];
127         int ifindex;
128         int if_removed;
129         int if_disabled;
130         struct rfkill_data *rfkill;
131         struct wpa_driver_capa capa;
132         int has_capability;
133
134         int operstate;
135
136         int scan_complete_events;
137
138         struct nl_handle *nl_handle;
139         struct nl_handle *nl_handle_event;
140         struct nl_handle *nl_handle_preq;
141         struct nl_cache *nl_cache;
142         struct nl_cache *nl_cache_event;
143         struct nl_cache *nl_cache_preq;
144         struct nl_cb *nl_cb;
145         struct genl_family *nl80211;
146
147         u8 auth_bssid[ETH_ALEN];
148         u8 bssid[ETH_ALEN];
149         int associated;
150         u8 ssid[32];
151         size_t ssid_len;
152         int nlmode;
153         int ap_scan_as_station;
154         unsigned int assoc_freq;
155
156         int monitor_sock;
157         int monitor_ifidx;
158         int disable_11b_rates;
159
160         unsigned int pending_remain_on_chan:1;
161         unsigned int added_bridge:1;
162         unsigned int added_if_into_bridge:1;
163
164         u64 remain_on_chan_cookie;
165         u64 send_action_cookie;
166
167         unsigned int last_mgmt_freq;
168
169         struct wpa_driver_scan_filter *filter_ssids;
170         size_t num_filter_ssids;
171
172         struct i802_bss first_bss;
173
174 #ifdef HOSTAPD
175         int eapol_sock; /* socket for EAPOL frames */
176
177         int default_if_indices[16];
178         int *if_indices;
179         int num_if_indices;
180
181         int last_freq;
182         int last_freq_ht;
183 #endif /* HOSTAPD */
184 };
185
186
187 static void wpa_driver_nl80211_scan_timeout(void *eloop_ctx,
188                                             void *timeout_ctx);
189 static int wpa_driver_nl80211_set_mode(void *priv, int mode);
190 static int
191 wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv);
192 static int wpa_driver_nl80211_mlme(struct wpa_driver_nl80211_data *drv,
193                                    const u8 *addr, int cmd, u16 reason_code,
194                                    int local_state_change);
195 static void nl80211_remove_monitor_interface(
196         struct wpa_driver_nl80211_data *drv);
197 static int nl80211_send_frame_cmd(struct wpa_driver_nl80211_data *drv,
198                                   unsigned int freq, const u8 *buf,
199                                   size_t buf_len, u64 *cookie);
200 static int wpa_driver_nl80211_probe_req_report(void *priv, int report);
201
202 #ifdef HOSTAPD
203 static void add_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx);
204 static void del_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx);
205 static int have_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx);
206 static int wpa_driver_nl80211_if_remove(void *priv,
207                                         enum wpa_driver_if_type type,
208                                         const char *ifname);
209 #else /* HOSTAPD */
210 static int have_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx)
211 {
212         return 0;
213 }
214 #endif /* HOSTAPD */
215
216 static int i802_set_freq(void *priv, struct hostapd_freq_params *freq);
217 static int nl80211_disable_11b_rates(struct wpa_driver_nl80211_data *drv,
218                                      int ifindex, int disabled);
219
220
221 /* nl80211 code */
222 static int ack_handler(struct nl_msg *msg, void *arg)
223 {
224         int *err = arg;
225         *err = 0;
226         return NL_STOP;
227 }
228
229 static int finish_handler(struct nl_msg *msg, void *arg)
230 {
231         int *ret = arg;
232         *ret = 0;
233         return NL_SKIP;
234 }
235
236 static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err,
237                          void *arg)
238 {
239         int *ret = arg;
240         *ret = err->error;
241         return NL_SKIP;
242 }
243
244
245 static int no_seq_check(struct nl_msg *msg, void *arg)
246 {
247         return NL_OK;
248 }
249
250
251 static int send_and_recv(struct wpa_driver_nl80211_data *drv,
252                          struct nl_handle *nl_handle, struct nl_msg *msg,
253                          int (*valid_handler)(struct nl_msg *, void *),
254                          void *valid_data)
255 {
256         struct nl_cb *cb;
257         int err = -ENOMEM;
258
259         cb = nl_cb_clone(drv->nl_cb);
260         if (!cb)
261                 goto out;
262
263         err = nl_send_auto_complete(nl_handle, msg);
264         if (err < 0)
265                 goto out;
266
267         err = 1;
268
269         nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
270         nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err);
271         nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, &err);
272
273         if (valid_handler)
274                 nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM,
275                           valid_handler, valid_data);
276
277         while (err > 0)
278                 nl_recvmsgs(nl_handle, cb);
279  out:
280         nl_cb_put(cb);
281         nlmsg_free(msg);
282         return err;
283 }
284
285
286 static int send_and_recv_msgs(struct wpa_driver_nl80211_data *drv,
287                               struct nl_msg *msg,
288                               int (*valid_handler)(struct nl_msg *, void *),
289                               void *valid_data)
290 {
291         return send_and_recv(drv, drv->nl_handle, msg, valid_handler,
292                              valid_data);
293 }
294
295
296 struct family_data {
297         const char *group;
298         int id;
299 };
300
301
302 static int family_handler(struct nl_msg *msg, void *arg)
303 {
304         struct family_data *res = arg;
305         struct nlattr *tb[CTRL_ATTR_MAX + 1];
306         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
307         struct nlattr *mcgrp;
308         int i;
309
310         nla_parse(tb, CTRL_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
311                   genlmsg_attrlen(gnlh, 0), NULL);
312         if (!tb[CTRL_ATTR_MCAST_GROUPS])
313                 return NL_SKIP;
314
315         nla_for_each_nested(mcgrp, tb[CTRL_ATTR_MCAST_GROUPS], i) {
316                 struct nlattr *tb2[CTRL_ATTR_MCAST_GRP_MAX + 1];
317                 nla_parse(tb2, CTRL_ATTR_MCAST_GRP_MAX, nla_data(mcgrp),
318                           nla_len(mcgrp), NULL);
319                 if (!tb2[CTRL_ATTR_MCAST_GRP_NAME] ||
320                     !tb2[CTRL_ATTR_MCAST_GRP_ID] ||
321                     os_strncmp(nla_data(tb2[CTRL_ATTR_MCAST_GRP_NAME]),
322                                res->group,
323                                nla_len(tb2[CTRL_ATTR_MCAST_GRP_NAME])) != 0)
324                         continue;
325                 res->id = nla_get_u32(tb2[CTRL_ATTR_MCAST_GRP_ID]);
326                 break;
327         };
328
329         return NL_SKIP;
330 }
331
332
333 static int nl_get_multicast_id(struct wpa_driver_nl80211_data *drv,
334                                const char *family, const char *group)
335 {
336         struct nl_msg *msg;
337         int ret = -1;
338         struct family_data res = { group, -ENOENT };
339
340         msg = nlmsg_alloc();
341         if (!msg)
342                 return -ENOMEM;
343         genlmsg_put(msg, 0, 0, genl_ctrl_resolve(drv->nl_handle, "nlctrl"),
344                     0, 0, CTRL_CMD_GETFAMILY, 0);
345         NLA_PUT_STRING(msg, CTRL_ATTR_FAMILY_NAME, family);
346
347         ret = send_and_recv_msgs(drv, msg, family_handler, &res);
348         msg = NULL;
349         if (ret == 0)
350                 ret = res.id;
351
352 nla_put_failure:
353         nlmsg_free(msg);
354         return ret;
355 }
356
357
358 static int wpa_driver_nl80211_get_bssid(void *priv, u8 *bssid)
359 {
360         struct i802_bss *bss = priv;
361         struct wpa_driver_nl80211_data *drv = bss->drv;
362         if (!drv->associated)
363                 return -1;
364         os_memcpy(bssid, drv->bssid, ETH_ALEN);
365         return 0;
366 }
367
368
369 static int wpa_driver_nl80211_get_ssid(void *priv, u8 *ssid)
370 {
371         struct i802_bss *bss = priv;
372         struct wpa_driver_nl80211_data *drv = bss->drv;
373         if (!drv->associated)
374                 return -1;
375         os_memcpy(ssid, drv->ssid, drv->ssid_len);
376         return drv->ssid_len;
377 }
378
379
380 static void wpa_driver_nl80211_event_link(struct wpa_driver_nl80211_data *drv,
381                                           char *buf, size_t len, int del)
382 {
383         union wpa_event_data event;
384
385         os_memset(&event, 0, sizeof(event));
386         if (len > sizeof(event.interface_status.ifname))
387                 len = sizeof(event.interface_status.ifname) - 1;
388         os_memcpy(event.interface_status.ifname, buf, len);
389         event.interface_status.ievent = del ? EVENT_INTERFACE_REMOVED :
390                 EVENT_INTERFACE_ADDED;
391
392         wpa_printf(MSG_DEBUG, "RTM_%sLINK, IFLA_IFNAME: Interface '%s' %s",
393                    del ? "DEL" : "NEW",
394                    event.interface_status.ifname,
395                    del ? "removed" : "added");
396
397         if (os_strcmp(drv->first_bss.ifname, event.interface_status.ifname) == 0) {
398                 if (del)
399                         drv->if_removed = 1;
400                 else
401                         drv->if_removed = 0;
402         }
403
404         wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_STATUS, &event);
405 }
406
407
408 static int wpa_driver_nl80211_own_ifname(struct wpa_driver_nl80211_data *drv,
409                                          u8 *buf, size_t len)
410 {
411         int attrlen, rta_len;
412         struct rtattr *attr;
413
414         attrlen = len;
415         attr = (struct rtattr *) buf;
416
417         rta_len = RTA_ALIGN(sizeof(struct rtattr));
418         while (RTA_OK(attr, attrlen)) {
419                 if (attr->rta_type == IFLA_IFNAME) {
420                         if (os_strcmp(((char *) attr) + rta_len, drv->first_bss.ifname)
421                             == 0)
422                                 return 1;
423                         else
424                                 break;
425                 }
426                 attr = RTA_NEXT(attr, attrlen);
427         }
428
429         return 0;
430 }
431
432
433 static int wpa_driver_nl80211_own_ifindex(struct wpa_driver_nl80211_data *drv,
434                                           int ifindex, u8 *buf, size_t len)
435 {
436         if (drv->ifindex == ifindex)
437                 return 1;
438
439         if (drv->if_removed && wpa_driver_nl80211_own_ifname(drv, buf, len)) {
440                 drv->first_bss.ifindex = if_nametoindex(drv->first_bss.ifname);
441                 wpa_printf(MSG_DEBUG, "nl80211: Update ifindex for a removed "
442                            "interface");
443                 wpa_driver_nl80211_finish_drv_init(drv);
444                 return 1;
445         }
446
447         return 0;
448 }
449
450
451 static void wpa_driver_nl80211_event_rtm_newlink(void *ctx,
452                                                  struct ifinfomsg *ifi,
453                                                  u8 *buf, size_t len)
454 {
455         struct wpa_driver_nl80211_data *drv = ctx;
456         int attrlen, rta_len;
457         struct rtattr *attr;
458         u32 brid = 0;
459
460         if (!wpa_driver_nl80211_own_ifindex(drv, ifi->ifi_index, buf, len) &&
461             !have_ifidx(drv, ifi->ifi_index)) {
462                 wpa_printf(MSG_DEBUG, "nl80211: Ignore event for foreign "
463                            "ifindex %d", ifi->ifi_index);
464                 return;
465         }
466
467         wpa_printf(MSG_DEBUG, "RTM_NEWLINK: operstate=%d ifi_flags=0x%x "
468                    "(%s%s%s%s)",
469                    drv->operstate, ifi->ifi_flags,
470                    (ifi->ifi_flags & IFF_UP) ? "[UP]" : "",
471                    (ifi->ifi_flags & IFF_RUNNING) ? "[RUNNING]" : "",
472                    (ifi->ifi_flags & IFF_LOWER_UP) ? "[LOWER_UP]" : "",
473                    (ifi->ifi_flags & IFF_DORMANT) ? "[DORMANT]" : "");
474
475         if (!drv->if_disabled && !(ifi->ifi_flags & IFF_UP)) {
476                 wpa_printf(MSG_DEBUG, "nl80211: Interface down");
477                 drv->if_disabled = 1;
478                 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_DISABLED, NULL);
479         }
480
481         if (drv->if_disabled && (ifi->ifi_flags & IFF_UP)) {
482                 wpa_printf(MSG_DEBUG, "nl80211: Interface up");
483                 drv->if_disabled = 0;
484                 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_ENABLED, NULL);
485         }
486
487         /*
488          * Some drivers send the association event before the operup event--in
489          * this case, lifting operstate in wpa_driver_nl80211_set_operstate()
490          * fails. This will hit us when wpa_supplicant does not need to do
491          * IEEE 802.1X authentication
492          */
493         if (drv->operstate == 1 &&
494             (ifi->ifi_flags & (IFF_LOWER_UP | IFF_DORMANT)) == IFF_LOWER_UP &&
495             !(ifi->ifi_flags & IFF_RUNNING))
496                 netlink_send_oper_ifla(drv->netlink, drv->ifindex,
497                                        -1, IF_OPER_UP);
498
499         attrlen = len;
500         attr = (struct rtattr *) buf;
501         rta_len = RTA_ALIGN(sizeof(struct rtattr));
502         while (RTA_OK(attr, attrlen)) {
503                 if (attr->rta_type == IFLA_IFNAME) {
504                         wpa_driver_nl80211_event_link(
505                                 drv,
506                                 ((char *) attr) + rta_len,
507                                 attr->rta_len - rta_len, 0);
508                 } else if (attr->rta_type == IFLA_MASTER)
509                         brid = nla_get_u32((struct nlattr *) attr);
510                 attr = RTA_NEXT(attr, attrlen);
511         }
512
513 #ifdef HOSTAPD
514         if (ifi->ifi_family == AF_BRIDGE && brid) {
515                 /* device has been added to bridge */
516                 char namebuf[IFNAMSIZ];
517                 if_indextoname(brid, namebuf);
518                 wpa_printf(MSG_DEBUG, "nl80211: Add ifindex %u for bridge %s",
519                            brid, namebuf);
520                 add_ifidx(drv, brid);
521         }
522 #endif /* HOSTAPD */
523 }
524
525
526 static void wpa_driver_nl80211_event_rtm_dellink(void *ctx,
527                                                  struct ifinfomsg *ifi,
528                                                  u8 *buf, size_t len)
529 {
530         struct wpa_driver_nl80211_data *drv = ctx;
531         int attrlen, rta_len;
532         struct rtattr *attr;
533         u32 brid = 0;
534
535         attrlen = len;
536         attr = (struct rtattr *) buf;
537
538         rta_len = RTA_ALIGN(sizeof(struct rtattr));
539         while (RTA_OK(attr, attrlen)) {
540                 if (attr->rta_type == IFLA_IFNAME) {
541                         wpa_driver_nl80211_event_link(
542                                 drv,
543                                 ((char *) attr) + rta_len,
544                                 attr->rta_len - rta_len, 1);
545                 } else if (attr->rta_type == IFLA_MASTER)
546                         brid = nla_get_u32((struct nlattr *) attr);
547                 attr = RTA_NEXT(attr, attrlen);
548         }
549
550 #ifdef HOSTAPD
551         if (ifi->ifi_family == AF_BRIDGE && brid) {
552                 /* device has been removed from bridge */
553                 char namebuf[IFNAMSIZ];
554                 if_indextoname(brid, namebuf);
555                 wpa_printf(MSG_DEBUG, "nl80211: Remove ifindex %u for bridge "
556                            "%s", brid, namebuf);
557                 del_ifidx(drv, brid);
558         }
559 #endif /* HOSTAPD */
560 }
561
562
563 static void mlme_event_auth(struct wpa_driver_nl80211_data *drv,
564                             const u8 *frame, size_t len)
565 {
566         const struct ieee80211_mgmt *mgmt;
567         union wpa_event_data event;
568
569         mgmt = (const struct ieee80211_mgmt *) frame;
570         if (len < 24 + sizeof(mgmt->u.auth)) {
571                 wpa_printf(MSG_DEBUG, "nl80211: Too short association event "
572                            "frame");
573                 return;
574         }
575
576         os_memcpy(drv->auth_bssid, mgmt->sa, ETH_ALEN);
577         os_memset(&event, 0, sizeof(event));
578         os_memcpy(event.auth.peer, mgmt->sa, ETH_ALEN);
579         event.auth.auth_type = le_to_host16(mgmt->u.auth.auth_alg);
580         event.auth.status_code = le_to_host16(mgmt->u.auth.status_code);
581         if (len > 24 + sizeof(mgmt->u.auth)) {
582                 event.auth.ies = mgmt->u.auth.variable;
583                 event.auth.ies_len = len - 24 - sizeof(mgmt->u.auth);
584         }
585
586         wpa_supplicant_event(drv->ctx, EVENT_AUTH, &event);
587 }
588
589
590 static void mlme_event_assoc(struct wpa_driver_nl80211_data *drv,
591                             const u8 *frame, size_t len)
592 {
593         const struct ieee80211_mgmt *mgmt;
594         union wpa_event_data event;
595         u16 status;
596
597         mgmt = (const struct ieee80211_mgmt *) frame;
598         if (len < 24 + sizeof(mgmt->u.assoc_resp)) {
599                 wpa_printf(MSG_DEBUG, "nl80211: Too short association event "
600                            "frame");
601                 return;
602         }
603
604         status = le_to_host16(mgmt->u.assoc_resp.status_code);
605         if (status != WLAN_STATUS_SUCCESS) {
606                 os_memset(&event, 0, sizeof(event));
607                 event.assoc_reject.bssid = mgmt->bssid;
608                 if (len > 24 + sizeof(mgmt->u.assoc_resp)) {
609                         event.assoc_reject.resp_ies =
610                                 (u8 *) mgmt->u.assoc_resp.variable;
611                         event.assoc_reject.resp_ies_len =
612                                 len - 24 - sizeof(mgmt->u.assoc_resp);
613                 }
614                 event.assoc_reject.status_code = status;
615
616                 wpa_supplicant_event(drv->ctx, EVENT_ASSOC_REJECT, &event);
617                 return;
618         }
619
620         drv->associated = 1;
621         os_memcpy(drv->bssid, mgmt->sa, ETH_ALEN);
622
623         os_memset(&event, 0, sizeof(event));
624         if (len > 24 + sizeof(mgmt->u.assoc_resp)) {
625                 event.assoc_info.resp_ies = (u8 *) mgmt->u.assoc_resp.variable;
626                 event.assoc_info.resp_ies_len =
627                         len - 24 - sizeof(mgmt->u.assoc_resp);
628         }
629
630         event.assoc_info.freq = drv->assoc_freq;
631
632         wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event);
633 }
634
635
636 static void mlme_event_connect(struct wpa_driver_nl80211_data *drv,
637                                enum nl80211_commands cmd, struct nlattr *status,
638                                struct nlattr *addr, struct nlattr *req_ie,
639                                struct nlattr *resp_ie)
640 {
641         union wpa_event_data event;
642
643         if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) {
644                 /*
645                  * Avoid reporting two association events that would confuse
646                  * the core code.
647                  */
648                 wpa_printf(MSG_DEBUG, "nl80211: Ignore connect event (cmd=%d) "
649                            "when using userspace SME", cmd);
650                 return;
651         }
652
653         os_memset(&event, 0, sizeof(event));
654         if (cmd == NL80211_CMD_CONNECT &&
655             nla_get_u16(status) != WLAN_STATUS_SUCCESS) {
656                 if (addr)
657                         event.assoc_reject.bssid = nla_data(addr);
658                 if (resp_ie) {
659                         event.assoc_reject.resp_ies = nla_data(resp_ie);
660                         event.assoc_reject.resp_ies_len = nla_len(resp_ie);
661                 }
662                 event.assoc_reject.status_code = nla_get_u16(status);
663                 wpa_supplicant_event(drv->ctx, EVENT_ASSOC_REJECT, &event);
664                 return;
665         }
666
667         drv->associated = 1;
668         if (addr)
669                 os_memcpy(drv->bssid, nla_data(addr), ETH_ALEN);
670
671         if (req_ie) {
672                 event.assoc_info.req_ies = nla_data(req_ie);
673                 event.assoc_info.req_ies_len = nla_len(req_ie);
674         }
675         if (resp_ie) {
676                 event.assoc_info.resp_ies = nla_data(resp_ie);
677                 event.assoc_info.resp_ies_len = nla_len(resp_ie);
678         }
679
680         wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event);
681 }
682
683
684 static void mlme_timeout_event(struct wpa_driver_nl80211_data *drv,
685                                enum nl80211_commands cmd, struct nlattr *addr)
686 {
687         union wpa_event_data event;
688         enum wpa_event_type ev;
689
690         if (nla_len(addr) != ETH_ALEN)
691                 return;
692
693         wpa_printf(MSG_DEBUG, "nl80211: MLME event %d; timeout with " MACSTR,
694                    cmd, MAC2STR((u8 *) nla_data(addr)));
695
696         if (cmd == NL80211_CMD_AUTHENTICATE)
697                 ev = EVENT_AUTH_TIMED_OUT;
698         else if (cmd == NL80211_CMD_ASSOCIATE)
699                 ev = EVENT_ASSOC_TIMED_OUT;
700         else
701                 return;
702
703         os_memset(&event, 0, sizeof(event));
704         os_memcpy(event.timeout_event.addr, nla_data(addr), ETH_ALEN);
705         wpa_supplicant_event(drv->ctx, ev, &event);
706 }
707
708
709 static void mlme_event_mgmt(struct wpa_driver_nl80211_data *drv,
710                             struct nlattr *freq, const u8 *frame, size_t len)
711 {
712         const struct ieee80211_mgmt *mgmt;
713         union wpa_event_data event;
714         u16 fc, stype;
715
716         mgmt = (const struct ieee80211_mgmt *) frame;
717         if (len < 24) {
718                 wpa_printf(MSG_DEBUG, "nl80211: Too short action frame");
719                 return;
720         }
721
722         fc = le_to_host16(mgmt->frame_control);
723         stype = WLAN_FC_GET_STYPE(fc);
724
725         os_memset(&event, 0, sizeof(event));
726         if (freq) {
727                 event.rx_action.freq = nla_get_u32(freq);
728                 drv->last_mgmt_freq = event.rx_action.freq;
729         }
730         if (stype == WLAN_FC_STYPE_ACTION) {
731                 event.rx_action.da = mgmt->da;
732                 event.rx_action.sa = mgmt->sa;
733                 event.rx_action.bssid = mgmt->bssid;
734                 event.rx_action.category = mgmt->u.action.category;
735                 event.rx_action.data = &mgmt->u.action.category + 1;
736                 event.rx_action.len = frame + len - event.rx_action.data;
737                 wpa_supplicant_event(drv->ctx, EVENT_RX_ACTION, &event);
738         } else {
739                 event.rx_mgmt.frame = frame;
740                 event.rx_mgmt.frame_len = len;
741                 wpa_supplicant_event(drv->ctx, EVENT_RX_MGMT, &event);
742         }
743 }
744
745
746 static void mlme_event_action_tx_status(struct wpa_driver_nl80211_data *drv,
747                                         struct nlattr *cookie, const u8 *frame,
748                                         size_t len, struct nlattr *ack)
749 {
750         union wpa_event_data event;
751         const struct ieee80211_hdr *hdr;
752         u16 fc;
753         u64 cookie_val;
754
755         if (!cookie)
756                 return;
757
758         cookie_val = nla_get_u64(cookie);
759         wpa_printf(MSG_DEBUG, "nl80211: Action TX status: cookie=0%llx%s "
760                    "(ack=%d)",
761                    (long long unsigned int) cookie_val,
762                    cookie_val == drv->send_action_cookie ?
763                    " (match)" : " (unknown)", ack != NULL);
764         if (cookie_val != drv->send_action_cookie)
765                 return;
766
767         hdr = (const struct ieee80211_hdr *) frame;
768         fc = le_to_host16(hdr->frame_control);
769
770         os_memset(&event, 0, sizeof(event));
771         event.tx_status.type = WLAN_FC_GET_TYPE(fc);
772         event.tx_status.stype = WLAN_FC_GET_STYPE(fc);
773         event.tx_status.dst = hdr->addr1;
774         event.tx_status.data = frame;
775         event.tx_status.data_len = len;
776         event.tx_status.ack = ack != NULL;
777         wpa_supplicant_event(drv->ctx, EVENT_TX_STATUS, &event);
778 }
779
780
781 static void mlme_event_deauth_disassoc(struct wpa_driver_nl80211_data *drv,
782                                        enum wpa_event_type type,
783                                        const u8 *frame, size_t len)
784 {
785         const struct ieee80211_mgmt *mgmt;
786         union wpa_event_data event;
787         const u8 *bssid = NULL;
788         u16 reason_code = 0;
789
790         mgmt = (const struct ieee80211_mgmt *) frame;
791         if (len >= 24) {
792                 bssid = mgmt->bssid;
793
794                 if (drv->associated != 0 &&
795                     os_memcmp(bssid, drv->bssid, ETH_ALEN) != 0 &&
796                     os_memcmp(bssid, drv->auth_bssid, ETH_ALEN) != 0) {
797                         /*
798                          * We have presumably received this deauth as a
799                          * response to a clear_state_mismatch() outgoing
800                          * deauth.  Don't let it take us offline!
801                          */
802                         wpa_printf(MSG_DEBUG, "nl80211: Deauth received "
803                                    "from Unknown BSSID " MACSTR " -- ignoring",
804                                    MAC2STR(bssid));
805                         return;
806                 }
807         }
808
809         drv->associated = 0;
810         os_memset(&event, 0, sizeof(event));
811
812         /* Note: Same offset for Reason Code in both frame subtypes */
813         if (len >= 24 + sizeof(mgmt->u.deauth))
814                 reason_code = le_to_host16(mgmt->u.deauth.reason_code);
815
816         if (type == EVENT_DISASSOC) {
817                 event.disassoc_info.addr = bssid;
818                 event.disassoc_info.reason_code = reason_code;
819                 if (frame + len > mgmt->u.disassoc.variable) {
820                         event.disassoc_info.ie = mgmt->u.disassoc.variable;
821                         event.disassoc_info.ie_len = frame + len -
822                                 mgmt->u.disassoc.variable;
823                 }
824         } else {
825                 event.deauth_info.addr = bssid;
826                 event.deauth_info.reason_code = reason_code;
827                 if (frame + len > mgmt->u.deauth.variable) {
828                         event.deauth_info.ie = mgmt->u.deauth.variable;
829                         event.deauth_info.ie_len = frame + len -
830                                 mgmt->u.deauth.variable;
831                 }
832         }
833
834         wpa_supplicant_event(drv->ctx, type, &event);
835 }
836
837
838 static void mlme_event(struct wpa_driver_nl80211_data *drv,
839                        enum nl80211_commands cmd, struct nlattr *frame,
840                        struct nlattr *addr, struct nlattr *timed_out,
841                        struct nlattr *freq, struct nlattr *ack,
842                        struct nlattr *cookie)
843 {
844         if (timed_out && addr) {
845                 mlme_timeout_event(drv, cmd, addr);
846                 return;
847         }
848
849         if (frame == NULL) {
850                 wpa_printf(MSG_DEBUG, "nl80211: MLME event %d without frame "
851                            "data", cmd);
852                 return;
853         }
854
855         wpa_printf(MSG_DEBUG, "nl80211: MLME event %d", cmd);
856         wpa_hexdump(MSG_MSGDUMP, "nl80211: MLME event frame",
857                     nla_data(frame), nla_len(frame));
858
859         switch (cmd) {
860         case NL80211_CMD_AUTHENTICATE:
861                 mlme_event_auth(drv, nla_data(frame), nla_len(frame));
862                 break;
863         case NL80211_CMD_ASSOCIATE:
864                 mlme_event_assoc(drv, nla_data(frame), nla_len(frame));
865                 break;
866         case NL80211_CMD_DEAUTHENTICATE:
867                 mlme_event_deauth_disassoc(drv, EVENT_DEAUTH,
868                                            nla_data(frame), nla_len(frame));
869                 break;
870         case NL80211_CMD_DISASSOCIATE:
871                 mlme_event_deauth_disassoc(drv, EVENT_DISASSOC,
872                                            nla_data(frame), nla_len(frame));
873                 break;
874         case NL80211_CMD_FRAME:
875                 mlme_event_mgmt(drv, freq, nla_data(frame), nla_len(frame));
876                 break;
877         case NL80211_CMD_FRAME_TX_STATUS:
878                 mlme_event_action_tx_status(drv, cookie, nla_data(frame),
879                                             nla_len(frame), ack);
880                 break;
881         default:
882                 break;
883         }
884 }
885
886
887 static void mlme_event_michael_mic_failure(struct wpa_driver_nl80211_data *drv,
888                                            struct nlattr *tb[])
889 {
890         union wpa_event_data data;
891
892         wpa_printf(MSG_DEBUG, "nl80211: MLME event Michael MIC failure");
893         os_memset(&data, 0, sizeof(data));
894         if (tb[NL80211_ATTR_MAC]) {
895                 wpa_hexdump(MSG_DEBUG, "nl80211: Source MAC address",
896                             nla_data(tb[NL80211_ATTR_MAC]),
897                             nla_len(tb[NL80211_ATTR_MAC]));
898                 data.michael_mic_failure.src = nla_data(tb[NL80211_ATTR_MAC]);
899         }
900         if (tb[NL80211_ATTR_KEY_SEQ]) {
901                 wpa_hexdump(MSG_DEBUG, "nl80211: TSC",
902                             nla_data(tb[NL80211_ATTR_KEY_SEQ]),
903                             nla_len(tb[NL80211_ATTR_KEY_SEQ]));
904         }
905         if (tb[NL80211_ATTR_KEY_TYPE]) {
906                 enum nl80211_key_type key_type =
907                         nla_get_u32(tb[NL80211_ATTR_KEY_TYPE]);
908                 wpa_printf(MSG_DEBUG, "nl80211: Key Type %d", key_type);
909                 if (key_type == NL80211_KEYTYPE_PAIRWISE)
910                         data.michael_mic_failure.unicast = 1;
911         } else
912                 data.michael_mic_failure.unicast = 1;
913
914         if (tb[NL80211_ATTR_KEY_IDX]) {
915                 u8 key_id = nla_get_u8(tb[NL80211_ATTR_KEY_IDX]);
916                 wpa_printf(MSG_DEBUG, "nl80211: Key Id %d", key_id);
917         }
918
919         wpa_supplicant_event(drv->ctx, EVENT_MICHAEL_MIC_FAILURE, &data);
920 }
921
922
923 static void mlme_event_join_ibss(struct wpa_driver_nl80211_data *drv,
924                                  struct nlattr *tb[])
925 {
926         if (tb[NL80211_ATTR_MAC] == NULL) {
927                 wpa_printf(MSG_DEBUG, "nl80211: No address in IBSS joined "
928                            "event");
929                 return;
930         }
931         os_memcpy(drv->bssid, nla_data(tb[NL80211_ATTR_MAC]), ETH_ALEN);
932         drv->associated = 1;
933         wpa_printf(MSG_DEBUG, "nl80211: IBSS " MACSTR " joined",
934                    MAC2STR(drv->bssid));
935
936         wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
937 }
938
939
940 static void mlme_event_remain_on_channel(struct wpa_driver_nl80211_data *drv,
941                                          int cancel_event, struct nlattr *tb[])
942 {
943         unsigned int freq, chan_type, duration;
944         union wpa_event_data data;
945         u64 cookie;
946
947         if (tb[NL80211_ATTR_WIPHY_FREQ])
948                 freq = nla_get_u32(tb[NL80211_ATTR_WIPHY_FREQ]);
949         else
950                 freq = 0;
951
952         if (tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE])
953                 chan_type = nla_get_u32(tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
954         else
955                 chan_type = 0;
956
957         if (tb[NL80211_ATTR_DURATION])
958                 duration = nla_get_u32(tb[NL80211_ATTR_DURATION]);
959         else
960                 duration = 0;
961
962         if (tb[NL80211_ATTR_COOKIE])
963                 cookie = nla_get_u64(tb[NL80211_ATTR_COOKIE]);
964         else
965                 cookie = 0;
966
967         wpa_printf(MSG_DEBUG, "nl80211: Remain-on-channel event (cancel=%d "
968                    "freq=%u channel_type=%u duration=%u cookie=0x%llx (%s))",
969                    cancel_event, freq, chan_type, duration,
970                    (long long unsigned int) cookie,
971                    cookie == drv->remain_on_chan_cookie ? "match" : "unknown");
972
973         if (cookie != drv->remain_on_chan_cookie)
974                 return; /* not for us */
975
976         drv->pending_remain_on_chan = !cancel_event;
977
978         os_memset(&data, 0, sizeof(data));
979         data.remain_on_channel.freq = freq;
980         data.remain_on_channel.duration = duration;
981         wpa_supplicant_event(drv->ctx, cancel_event ?
982                              EVENT_CANCEL_REMAIN_ON_CHANNEL :
983                              EVENT_REMAIN_ON_CHANNEL, &data);
984 }
985
986
987 static void send_scan_event(struct wpa_driver_nl80211_data *drv, int aborted,
988                             struct nlattr *tb[])
989 {
990         union wpa_event_data event;
991         struct nlattr *nl;
992         int rem;
993         struct scan_info *info;
994 #define MAX_REPORT_FREQS 50
995         int freqs[MAX_REPORT_FREQS];
996         int num_freqs = 0;
997
998         os_memset(&event, 0, sizeof(event));
999         info = &event.scan_info;
1000         info->aborted = aborted;
1001
1002         if (tb[NL80211_ATTR_SCAN_SSIDS]) {
1003                 nla_for_each_nested(nl, tb[NL80211_ATTR_SCAN_SSIDS], rem) {
1004                         struct wpa_driver_scan_ssid *s =
1005                                 &info->ssids[info->num_ssids];
1006                         s->ssid = nla_data(nl);
1007                         s->ssid_len = nla_len(nl);
1008                         info->num_ssids++;
1009                         if (info->num_ssids == WPAS_MAX_SCAN_SSIDS)
1010                                 break;
1011                 }
1012         }
1013         if (tb[NL80211_ATTR_SCAN_FREQUENCIES]) {
1014                 nla_for_each_nested(nl, tb[NL80211_ATTR_SCAN_FREQUENCIES], rem)
1015                 {
1016                         freqs[num_freqs] = nla_get_u32(nl);
1017                         num_freqs++;
1018                         if (num_freqs == MAX_REPORT_FREQS - 1)
1019                                 break;
1020                 }
1021                 info->freqs = freqs;
1022                 info->num_freqs = num_freqs;
1023         }
1024         wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS, &event);
1025 }
1026
1027
1028 static int get_link_signal(struct nl_msg *msg, void *arg)
1029 {
1030         struct nlattr *tb[NL80211_ATTR_MAX + 1];
1031         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
1032         struct nlattr *sinfo[NL80211_STA_INFO_MAX + 1];
1033         static struct nla_policy policy[NL80211_STA_INFO_MAX + 1] = {
1034                 [NL80211_STA_INFO_SIGNAL] = { .type = NLA_U8 },
1035         };
1036         struct nlattr *rinfo[NL80211_RATE_INFO_MAX + 1];
1037         static struct nla_policy rate_policy[NL80211_RATE_INFO_MAX + 1] = {
1038                 [NL80211_RATE_INFO_BITRATE] = { .type = NLA_U16 },
1039                 [NL80211_RATE_INFO_MCS] = { .type = NLA_U8 },
1040                 [NL80211_RATE_INFO_40_MHZ_WIDTH] = { .type = NLA_FLAG },
1041                 [NL80211_RATE_INFO_SHORT_GI] = { .type = NLA_FLAG },
1042         };
1043         struct signal_change *sig_change = arg;
1044
1045         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
1046                   genlmsg_attrlen(gnlh, 0), NULL);
1047         if (!tb[NL80211_ATTR_STA_INFO] ||
1048             nla_parse_nested(sinfo, NL80211_STA_INFO_MAX,
1049                              tb[NL80211_ATTR_STA_INFO], policy))
1050                 return NL_SKIP;
1051         if (!sinfo[NL80211_STA_INFO_SIGNAL])
1052                 return NL_SKIP;
1053
1054         sig_change->current_signal =
1055                 (s8) nla_get_u8(sinfo[NL80211_STA_INFO_SIGNAL]);
1056
1057         if (sinfo[NL80211_STA_INFO_TX_BITRATE]) {
1058                 if (nla_parse_nested(rinfo, NL80211_RATE_INFO_MAX,
1059                                      sinfo[NL80211_STA_INFO_TX_BITRATE],
1060                                      rate_policy)) {
1061                         sig_change->current_txrate = 0;
1062                 } else {
1063                         if (rinfo[NL80211_RATE_INFO_BITRATE]) {
1064                                 sig_change->current_txrate =
1065                                         nla_get_u16(rinfo[
1066                                              NL80211_RATE_INFO_BITRATE]) * 100;
1067                         }
1068                 }
1069         }
1070
1071         return NL_SKIP;
1072 }
1073
1074
1075 static int nl80211_get_link_signal(struct wpa_driver_nl80211_data *drv,
1076                                    struct signal_change *sig)
1077 {
1078         struct nl_msg *msg;
1079
1080         sig->current_signal = -9999;
1081         sig->current_txrate = 0;
1082
1083         msg = nlmsg_alloc();
1084         if (!msg)
1085                 return -ENOMEM;
1086
1087         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1088                     0, NL80211_CMD_GET_STATION, 0);
1089
1090         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1091         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, drv->bssid);
1092
1093         return send_and_recv_msgs(drv, msg, get_link_signal, sig);
1094  nla_put_failure:
1095         return -ENOBUFS;
1096 }
1097
1098
1099 static int get_link_noise(struct nl_msg *msg, void *arg)
1100 {
1101         struct nlattr *tb[NL80211_ATTR_MAX + 1];
1102         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
1103         struct nlattr *sinfo[NL80211_SURVEY_INFO_MAX + 1];
1104         static struct nla_policy survey_policy[NL80211_SURVEY_INFO_MAX + 1] = {
1105                 [NL80211_SURVEY_INFO_FREQUENCY] = { .type = NLA_U32 },
1106                 [NL80211_SURVEY_INFO_NOISE] = { .type = NLA_U8 },
1107         };
1108         struct signal_change *sig_change = arg;
1109
1110         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
1111                   genlmsg_attrlen(gnlh, 0), NULL);
1112
1113         if (!tb[NL80211_ATTR_SURVEY_INFO]) {
1114                 wpa_printf(MSG_DEBUG, "nl80211: survey data missing!");
1115                 return NL_SKIP;
1116         }
1117
1118         if (nla_parse_nested(sinfo, NL80211_SURVEY_INFO_MAX,
1119                              tb[NL80211_ATTR_SURVEY_INFO],
1120                              survey_policy)) {
1121                 wpa_printf(MSG_DEBUG, "nl80211: failed to parse nested "
1122                            "attributes!");
1123                 return NL_SKIP;
1124         }
1125
1126         if (!sinfo[NL80211_SURVEY_INFO_FREQUENCY])
1127                 return NL_SKIP;
1128
1129         if (nla_get_u32(sinfo[NL80211_SURVEY_INFO_FREQUENCY]) !=
1130             sig_change->frequency)
1131                 return NL_SKIP;
1132
1133         if (!sinfo[NL80211_SURVEY_INFO_NOISE])
1134                 return NL_SKIP;
1135
1136         sig_change->current_noise =
1137                 (s8) nla_get_u8(sinfo[NL80211_SURVEY_INFO_NOISE]);
1138
1139         return NL_SKIP;
1140 }
1141
1142
1143 static int nl80211_get_link_noise(struct wpa_driver_nl80211_data *drv,
1144                                   struct signal_change *sig_change)
1145 {
1146         struct nl_msg *msg;
1147
1148         sig_change->current_noise = 9999;
1149         sig_change->frequency = drv->assoc_freq;
1150
1151         msg = nlmsg_alloc();
1152         if (!msg)
1153                 return -ENOMEM;
1154
1155         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1156                     NLM_F_DUMP, NL80211_CMD_GET_SURVEY, 0);
1157
1158         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1159
1160         return send_and_recv_msgs(drv, msg, get_link_noise, sig_change);
1161  nla_put_failure:
1162         return -ENOBUFS;
1163 }
1164
1165
1166 static void nl80211_cqm_event(struct wpa_driver_nl80211_data *drv,
1167                               struct nlattr *tb[])
1168 {
1169         static struct nla_policy cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
1170                 [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_U32 },
1171                 [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U8 },
1172                 [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
1173         };
1174         struct nlattr *cqm[NL80211_ATTR_CQM_MAX + 1];
1175         enum nl80211_cqm_rssi_threshold_event event;
1176         union wpa_event_data ed;
1177         struct signal_change sig;
1178         int res;
1179
1180         if (tb[NL80211_ATTR_CQM] == NULL ||
1181             nla_parse_nested(cqm, NL80211_ATTR_CQM_MAX, tb[NL80211_ATTR_CQM],
1182                              cqm_policy)) {
1183                 wpa_printf(MSG_DEBUG, "nl80211: Ignore invalid CQM event");
1184                 return;
1185         }
1186
1187         if (cqm[NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] == NULL)
1188                 return;
1189         event = nla_get_u32(cqm[NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT]);
1190
1191         os_memset(&ed, 0, sizeof(ed));
1192
1193         if (event == NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH) {
1194                 wpa_printf(MSG_DEBUG, "nl80211: Connection quality monitor "
1195                            "event: RSSI high");
1196                 ed.signal_change.above_threshold = 1;
1197         } else if (event == NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW) {
1198                 wpa_printf(MSG_DEBUG, "nl80211: Connection quality monitor "
1199                            "event: RSSI low");
1200                 ed.signal_change.above_threshold = 0;
1201         } else
1202                 return;
1203
1204         res = nl80211_get_link_signal(drv, &sig);
1205         if (res == 0) {
1206                 ed.signal_change.current_signal = sig.current_signal;
1207                 ed.signal_change.current_txrate = sig.current_txrate;
1208                 wpa_printf(MSG_DEBUG, "nl80211: Signal: %d dBm  txrate: %d",
1209                            sig.current_signal, sig.current_txrate);
1210         }
1211
1212         res = nl80211_get_link_noise(drv, &sig);
1213         if (res == 0) {
1214                 ed.signal_change.current_noise = sig.current_noise;
1215                 wpa_printf(MSG_DEBUG, "nl80211: Noise: %d dBm",
1216                            sig.current_noise);
1217         }
1218
1219         wpa_supplicant_event(drv->ctx, EVENT_SIGNAL_CHANGE, &ed);
1220 }
1221
1222
1223 static void nl80211_new_station_event(struct wpa_driver_nl80211_data *drv,
1224                                       struct nlattr **tb)
1225 {
1226         u8 *addr;
1227         union wpa_event_data data;
1228
1229         if (tb[NL80211_ATTR_MAC] == NULL)
1230                 return;
1231         addr = nla_data(tb[NL80211_ATTR_MAC]);
1232         wpa_printf(MSG_DEBUG, "nl80211: New station " MACSTR, MAC2STR(addr));
1233         if (drv->nlmode != NL80211_IFTYPE_ADHOC)
1234                 return;
1235
1236         os_memset(&data, 0, sizeof(data));
1237         os_memcpy(data.ibss_rsn_start.peer, addr, ETH_ALEN);
1238         wpa_supplicant_event(drv->ctx, EVENT_IBSS_RSN_START, &data);
1239 }
1240
1241
1242 static int process_event(struct nl_msg *msg, void *arg)
1243 {
1244         struct wpa_driver_nl80211_data *drv = arg;
1245         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
1246         struct nlattr *tb[NL80211_ATTR_MAX + 1];
1247         union wpa_event_data data;
1248
1249         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
1250                   genlmsg_attrlen(gnlh, 0), NULL);
1251
1252         if (tb[NL80211_ATTR_IFINDEX]) {
1253                 int ifindex = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
1254                 if (ifindex != drv->ifindex && !have_ifidx(drv, ifindex)) {
1255                         wpa_printf(MSG_DEBUG, "nl80211: Ignored event (cmd=%d)"
1256                                    " for foreign interface (ifindex %d)",
1257                                    gnlh->cmd, ifindex);
1258                         return NL_SKIP;
1259                 }
1260         }
1261
1262         if (drv->ap_scan_as_station &&
1263             (gnlh->cmd == NL80211_CMD_NEW_SCAN_RESULTS ||
1264              gnlh->cmd == NL80211_CMD_SCAN_ABORTED)) {
1265                 wpa_driver_nl80211_set_mode(&drv->first_bss,
1266                                             IEEE80211_MODE_AP);
1267                 drv->ap_scan_as_station = 0;
1268         }
1269
1270         switch (gnlh->cmd) {
1271         case NL80211_CMD_TRIGGER_SCAN:
1272                 wpa_printf(MSG_DEBUG, "nl80211: Scan trigger");
1273                 break;
1274         case NL80211_CMD_NEW_SCAN_RESULTS:
1275                 wpa_printf(MSG_DEBUG, "nl80211: New scan results available");
1276                 drv->scan_complete_events = 1;
1277                 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv,
1278                                      drv->ctx);
1279                 send_scan_event(drv, 0, tb);
1280                 break;
1281         case NL80211_CMD_SCAN_ABORTED:
1282                 wpa_printf(MSG_DEBUG, "nl80211: Scan aborted");
1283                 /*
1284                  * Need to indicate that scan results are available in order
1285                  * not to make wpa_supplicant stop its scanning.
1286                  */
1287                 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv,
1288                                      drv->ctx);
1289                 send_scan_event(drv, 1, tb);
1290                 break;
1291         case NL80211_CMD_AUTHENTICATE:
1292         case NL80211_CMD_ASSOCIATE:
1293         case NL80211_CMD_DEAUTHENTICATE:
1294         case NL80211_CMD_DISASSOCIATE:
1295         case NL80211_CMD_FRAME:
1296         case NL80211_CMD_FRAME_TX_STATUS:
1297                 mlme_event(drv, gnlh->cmd, tb[NL80211_ATTR_FRAME],
1298                            tb[NL80211_ATTR_MAC], tb[NL80211_ATTR_TIMED_OUT],
1299                            tb[NL80211_ATTR_WIPHY_FREQ], tb[NL80211_ATTR_ACK],
1300                            tb[NL80211_ATTR_COOKIE]);
1301                 break;
1302         case NL80211_CMD_CONNECT:
1303         case NL80211_CMD_ROAM:
1304                 mlme_event_connect(drv, gnlh->cmd,
1305                                    tb[NL80211_ATTR_STATUS_CODE],
1306                                    tb[NL80211_ATTR_MAC],
1307                                    tb[NL80211_ATTR_REQ_IE],
1308                                    tb[NL80211_ATTR_RESP_IE]);
1309                 break;
1310         case NL80211_CMD_DISCONNECT:
1311                 if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) {
1312                         /*
1313                          * Avoid reporting two disassociation events that could
1314                          * confuse the core code.
1315                          */
1316                         wpa_printf(MSG_DEBUG, "nl80211: Ignore disconnect "
1317                                    "event when using userspace SME");
1318                         break;
1319                 }
1320                 drv->associated = 0;
1321                 os_memset(&data, 0, sizeof(data));
1322                 if (tb[NL80211_ATTR_REASON_CODE])
1323                         data.disassoc_info.reason_code =
1324                                 nla_get_u16(tb[NL80211_ATTR_REASON_CODE]);
1325                 wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, &data);
1326                 break;
1327         case NL80211_CMD_MICHAEL_MIC_FAILURE:
1328                 mlme_event_michael_mic_failure(drv, tb);
1329                 break;
1330         case NL80211_CMD_JOIN_IBSS:
1331                 mlme_event_join_ibss(drv, tb);
1332                 break;
1333         case NL80211_CMD_REMAIN_ON_CHANNEL:
1334                 mlme_event_remain_on_channel(drv, 0, tb);
1335                 break;
1336         case NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL:
1337                 mlme_event_remain_on_channel(drv, 1, tb);
1338                 break;
1339         case NL80211_CMD_NOTIFY_CQM:
1340                 nl80211_cqm_event(drv, tb);
1341                 break;
1342         case NL80211_CMD_REG_CHANGE:
1343                 wpa_printf(MSG_DEBUG, "nl80211: Regulatory domain change");
1344                 wpa_supplicant_event(drv->ctx, EVENT_CHANNEL_LIST_CHANGED,
1345                                      NULL);
1346                 break;
1347         case NL80211_CMD_REG_BEACON_HINT:
1348                 wpa_printf(MSG_DEBUG, "nl80211: Regulatory beacon hint");
1349                 wpa_supplicant_event(drv->ctx, EVENT_CHANNEL_LIST_CHANGED,
1350                                      NULL);
1351                 break;
1352         case NL80211_CMD_NEW_STATION:
1353                 nl80211_new_station_event(drv, tb);
1354                 break;
1355         default:
1356                 wpa_printf(MSG_DEBUG, "nl80211: Ignored unknown event "
1357                            "(cmd=%d)", gnlh->cmd);
1358                 break;
1359         }
1360
1361         return NL_SKIP;
1362 }
1363
1364
1365 static void wpa_driver_nl80211_event_receive(int sock, void *eloop_ctx,
1366                                              void *handle)
1367 {
1368         struct nl_cb *cb;
1369         struct wpa_driver_nl80211_data *drv = eloop_ctx;
1370
1371         wpa_printf(MSG_DEBUG, "nl80211: Event message available");
1372
1373         cb = nl_cb_clone(drv->nl_cb);
1374         if (!cb)
1375                 return;
1376         nl_cb_set(cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, no_seq_check, NULL);
1377         nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, process_event, drv);
1378         nl_recvmsgs(handle, cb);
1379         nl_cb_put(cb);
1380 }
1381
1382
1383 /**
1384  * wpa_driver_nl80211_set_country - ask nl80211 to set the regulatory domain
1385  * @priv: driver_nl80211 private data
1386  * @alpha2_arg: country to which to switch to
1387  * Returns: 0 on success, -1 on failure
1388  *
1389  * This asks nl80211 to set the regulatory domain for given
1390  * country ISO / IEC alpha2.
1391  */
1392 static int wpa_driver_nl80211_set_country(void *priv, const char *alpha2_arg)
1393 {
1394         struct i802_bss *bss = priv;
1395         struct wpa_driver_nl80211_data *drv = bss->drv;
1396         char alpha2[3];
1397         struct nl_msg *msg;
1398
1399         msg = nlmsg_alloc();
1400         if (!msg)
1401                 return -ENOMEM;
1402
1403         alpha2[0] = alpha2_arg[0];
1404         alpha2[1] = alpha2_arg[1];
1405         alpha2[2] = '\0';
1406
1407         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1408                     0, NL80211_CMD_REQ_SET_REG, 0);
1409
1410         NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2, alpha2);
1411         if (send_and_recv_msgs(drv, msg, NULL, NULL))
1412                 return -EINVAL;
1413         return 0;
1414 nla_put_failure:
1415         return -EINVAL;
1416 }
1417
1418
1419 #ifndef HOSTAPD
1420 struct wiphy_info_data {
1421         int max_scan_ssids;
1422         int ap_supported;
1423         int auth_supported;
1424         int connect_supported;
1425 };
1426
1427
1428 static int wiphy_info_handler(struct nl_msg *msg, void *arg)
1429 {
1430         struct nlattr *tb[NL80211_ATTR_MAX + 1];
1431         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
1432         struct wiphy_info_data *info = arg;
1433
1434         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
1435                   genlmsg_attrlen(gnlh, 0), NULL);
1436
1437         if (tb[NL80211_ATTR_MAX_NUM_SCAN_SSIDS])
1438                 info->max_scan_ssids =
1439                         nla_get_u8(tb[NL80211_ATTR_MAX_NUM_SCAN_SSIDS]);
1440
1441         if (tb[NL80211_ATTR_SUPPORTED_IFTYPES]) {
1442                 struct nlattr *nl_mode;
1443                 int i;
1444                 nla_for_each_nested(nl_mode,
1445                                     tb[NL80211_ATTR_SUPPORTED_IFTYPES], i) {
1446                         if (nl_mode->nla_type == NL80211_IFTYPE_AP) {
1447                                 info->ap_supported = 1;
1448                                 break;
1449                         }
1450                 }
1451         }
1452
1453         if (tb[NL80211_ATTR_SUPPORTED_COMMANDS]) {
1454                 struct nlattr *nl_cmd;
1455                 int i;
1456
1457                 nla_for_each_nested(nl_cmd,
1458                                     tb[NL80211_ATTR_SUPPORTED_COMMANDS], i) {
1459                         u32 cmd = nla_get_u32(nl_cmd);
1460                         if (cmd == NL80211_CMD_AUTHENTICATE)
1461                                 info->auth_supported = 1;
1462                         else if (cmd == NL80211_CMD_CONNECT)
1463                                 info->connect_supported = 1;
1464                 }
1465         }
1466
1467         return NL_SKIP;
1468 }
1469
1470
1471 static int wpa_driver_nl80211_get_info(struct wpa_driver_nl80211_data *drv,
1472                                        struct wiphy_info_data *info)
1473 {
1474         struct nl_msg *msg;
1475
1476         os_memset(info, 0, sizeof(*info));
1477         msg = nlmsg_alloc();
1478         if (!msg)
1479                 return -1;
1480
1481         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1482                     0, NL80211_CMD_GET_WIPHY, 0);
1483
1484         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->first_bss.ifindex);
1485
1486         if (send_and_recv_msgs(drv, msg, wiphy_info_handler, info) == 0)
1487                 return 0;
1488         msg = NULL;
1489 nla_put_failure:
1490         nlmsg_free(msg);
1491         return -1;
1492 }
1493
1494
1495 static int wpa_driver_nl80211_capa(struct wpa_driver_nl80211_data *drv)
1496 {
1497         struct wiphy_info_data info;
1498         if (wpa_driver_nl80211_get_info(drv, &info))
1499                 return -1;
1500         drv->has_capability = 1;
1501         /* For now, assume TKIP, CCMP, WPA, WPA2 are supported */
1502         drv->capa.key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA |
1503                 WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
1504                 WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
1505                 WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK;
1506         drv->capa.enc = WPA_DRIVER_CAPA_ENC_WEP40 |
1507                 WPA_DRIVER_CAPA_ENC_WEP104 |
1508                 WPA_DRIVER_CAPA_ENC_TKIP |
1509                 WPA_DRIVER_CAPA_ENC_CCMP;
1510         drv->capa.auth = WPA_DRIVER_AUTH_OPEN |
1511                 WPA_DRIVER_AUTH_SHARED |
1512                 WPA_DRIVER_AUTH_LEAP;
1513
1514         drv->capa.max_scan_ssids = info.max_scan_ssids;
1515         if (info.ap_supported)
1516                 drv->capa.flags |= WPA_DRIVER_FLAGS_AP;
1517
1518         if (info.auth_supported)
1519                 drv->capa.flags |= WPA_DRIVER_FLAGS_SME;
1520         else if (!info.connect_supported) {
1521                 wpa_printf(MSG_INFO, "nl80211: Driver does not support "
1522                            "authentication/association or connect commands");
1523                 return -1;
1524         }
1525
1526         drv->capa.flags |= WPA_DRIVER_FLAGS_SANE_ERROR_CODES;
1527         drv->capa.flags |= WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC_DONE;
1528         drv->capa.flags |= WPA_DRIVER_FLAGS_P2P_CAPABLE;
1529         drv->capa.max_remain_on_chan = 5000;
1530
1531         return 0;
1532 }
1533 #endif /* HOSTAPD */
1534
1535
1536 static int wpa_driver_nl80211_init_nl(struct wpa_driver_nl80211_data *drv)
1537 {
1538         int ret;
1539
1540         /* Initialize generic netlink and nl80211 */
1541
1542         drv->nl_cb = nl_cb_alloc(NL_CB_DEFAULT);
1543         if (drv->nl_cb == NULL) {
1544                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate netlink "
1545                            "callbacks");
1546                 goto err1;
1547         }
1548
1549         drv->nl_handle = nl80211_handle_alloc(drv->nl_cb);
1550         if (drv->nl_handle == NULL) {
1551                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate netlink "
1552                            "callbacks");
1553                 goto err2;
1554         }
1555
1556         drv->nl_handle_event = nl80211_handle_alloc(drv->nl_cb);
1557         if (drv->nl_handle_event == NULL) {
1558                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate netlink "
1559                            "callbacks (event)");
1560                 goto err2b;
1561         }
1562
1563         if (genl_connect(drv->nl_handle)) {
1564                 wpa_printf(MSG_ERROR, "nl80211: Failed to connect to generic "
1565                            "netlink");
1566                 goto err3;
1567         }
1568
1569         if (genl_connect(drv->nl_handle_event)) {
1570                 wpa_printf(MSG_ERROR, "nl80211: Failed to connect to generic "
1571                            "netlink (event)");
1572                 goto err3;
1573         }
1574
1575 #ifdef CONFIG_LIBNL20
1576         if (genl_ctrl_alloc_cache(drv->nl_handle, &drv->nl_cache) < 0) {
1577                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic "
1578                            "netlink cache");
1579                 goto err3;
1580         }
1581         if (genl_ctrl_alloc_cache(drv->nl_handle_event, &drv->nl_cache_event) <
1582             0) {
1583                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic "
1584                            "netlink cache (event)");
1585                 goto err3b;
1586         }
1587 #else /* CONFIG_LIBNL20 */
1588         drv->nl_cache = genl_ctrl_alloc_cache(drv->nl_handle);
1589         if (drv->nl_cache == NULL) {
1590                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic "
1591                            "netlink cache");
1592                 goto err3;
1593         }
1594         drv->nl_cache_event = genl_ctrl_alloc_cache(drv->nl_handle_event);
1595         if (drv->nl_cache_event == NULL) {
1596                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic "
1597                            "netlink cache (event)");
1598                 goto err3b;
1599         }
1600 #endif /* CONFIG_LIBNL20 */
1601
1602         drv->nl80211 = genl_ctrl_search_by_name(drv->nl_cache, "nl80211");
1603         if (drv->nl80211 == NULL) {
1604                 wpa_printf(MSG_ERROR, "nl80211: 'nl80211' generic netlink not "
1605                            "found");
1606                 goto err4;
1607         }
1608
1609         ret = nl_get_multicast_id(drv, "nl80211", "scan");
1610         if (ret >= 0)
1611                 ret = nl_socket_add_membership(drv->nl_handle_event, ret);
1612         if (ret < 0) {
1613                 wpa_printf(MSG_ERROR, "nl80211: Could not add multicast "
1614                            "membership for scan events: %d (%s)",
1615                            ret, strerror(-ret));
1616                 goto err4;
1617         }
1618
1619         ret = nl_get_multicast_id(drv, "nl80211", "mlme");
1620         if (ret >= 0)
1621                 ret = nl_socket_add_membership(drv->nl_handle_event, ret);
1622         if (ret < 0) {
1623                 wpa_printf(MSG_ERROR, "nl80211: Could not add multicast "
1624                            "membership for mlme events: %d (%s)",
1625                            ret, strerror(-ret));
1626                 goto err4;
1627         }
1628
1629         ret = nl_get_multicast_id(drv, "nl80211", "regulatory");
1630         if (ret >= 0)
1631                 ret = nl_socket_add_membership(drv->nl_handle_event, ret);
1632         if (ret < 0) {
1633                 wpa_printf(MSG_DEBUG, "nl80211: Could not add multicast "
1634                            "membership for regulatory events: %d (%s)",
1635                            ret, strerror(-ret));
1636                 /* Continue without regulatory events */
1637         }
1638
1639         eloop_register_read_sock(nl_socket_get_fd(drv->nl_handle_event),
1640                                  wpa_driver_nl80211_event_receive, drv,
1641                                  drv->nl_handle_event);
1642
1643         return 0;
1644
1645 err4:
1646         nl_cache_free(drv->nl_cache_event);
1647 err3b:
1648         nl_cache_free(drv->nl_cache);
1649 err3:
1650         nl80211_handle_destroy(drv->nl_handle_event);
1651 err2b:
1652         nl80211_handle_destroy(drv->nl_handle);
1653 err2:
1654         nl_cb_put(drv->nl_cb);
1655 err1:
1656         return -1;
1657 }
1658
1659
1660 static void wpa_driver_nl80211_rfkill_blocked(void *ctx)
1661 {
1662         wpa_printf(MSG_DEBUG, "nl80211: RFKILL blocked");
1663         /*
1664          * This may be for any interface; use ifdown event to disable
1665          * interface.
1666          */
1667 }
1668
1669
1670 static void wpa_driver_nl80211_rfkill_unblocked(void *ctx)
1671 {
1672         struct wpa_driver_nl80211_data *drv = ctx;
1673         wpa_printf(MSG_DEBUG, "nl80211: RFKILL unblocked");
1674         if (linux_set_iface_flags(drv->ioctl_sock, drv->first_bss.ifname, 1)) {
1675                 wpa_printf(MSG_DEBUG, "nl80211: Could not set interface UP "
1676                            "after rfkill unblock");
1677                 return;
1678         }
1679         /* rtnetlink ifup handler will report interface as enabled */
1680 }
1681
1682
1683 static void nl80211_get_phy_name(struct wpa_driver_nl80211_data *drv)
1684 {
1685         /* Find phy (radio) to which this interface belongs */
1686         char buf[90], *pos;
1687         int f, rv;
1688
1689         drv->phyname[0] = '\0';
1690         snprintf(buf, sizeof(buf) - 1, "/sys/class/net/%s/phy80211/name",
1691                  drv->first_bss.ifname);
1692         f = open(buf, O_RDONLY);
1693         if (f < 0) {
1694                 wpa_printf(MSG_DEBUG, "Could not open file %s: %s",
1695                            buf, strerror(errno));
1696                 return;
1697         }
1698
1699         rv = read(f, drv->phyname, sizeof(drv->phyname) - 1);
1700         close(f);
1701         if (rv < 0) {
1702                 wpa_printf(MSG_DEBUG, "Could not read file %s: %s",
1703                            buf, strerror(errno));
1704                 return;
1705         }
1706
1707         drv->phyname[rv] = '\0';
1708         pos = os_strchr(drv->phyname, '\n');
1709         if (pos)
1710                 *pos = '\0';
1711         wpa_printf(MSG_DEBUG, "nl80211: interface %s in phy %s",
1712                    drv->first_bss.ifname, drv->phyname);
1713 }
1714
1715
1716 /**
1717  * wpa_driver_nl80211_init - Initialize nl80211 driver interface
1718  * @ctx: context to be used when calling wpa_supplicant functions,
1719  * e.g., wpa_supplicant_event()
1720  * @ifname: interface name, e.g., wlan0
1721  * @global_priv: private driver global data from global_init()
1722  * Returns: Pointer to private data, %NULL on failure
1723  */
1724 static void * wpa_driver_nl80211_init(void *ctx, const char *ifname,
1725                                       void *global_priv)
1726 {
1727         struct wpa_driver_nl80211_data *drv;
1728         struct netlink_config *cfg;
1729         struct rfkill_config *rcfg;
1730         struct i802_bss *bss;
1731
1732         drv = os_zalloc(sizeof(*drv));
1733         if (drv == NULL)
1734                 return NULL;
1735         drv->global = global_priv;
1736         if (drv->global)
1737                 dl_list_add(&drv->global->interfaces, &drv->list);
1738         drv->ctx = ctx;
1739         bss = &drv->first_bss;
1740         bss->drv = drv;
1741         os_strlcpy(bss->ifname, ifname, sizeof(bss->ifname));
1742         drv->monitor_ifidx = -1;
1743         drv->monitor_sock = -1;
1744         drv->ioctl_sock = -1;
1745
1746         if (wpa_driver_nl80211_init_nl(drv)) {
1747                 os_free(drv);
1748                 return NULL;
1749         }
1750
1751         nl80211_get_phy_name(drv);
1752
1753         drv->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);
1754         if (drv->ioctl_sock < 0) {
1755                 perror("socket(PF_INET,SOCK_DGRAM)");
1756                 goto failed;
1757         }
1758
1759         cfg = os_zalloc(sizeof(*cfg));
1760         if (cfg == NULL)
1761                 goto failed;
1762         cfg->ctx = drv;
1763         cfg->newlink_cb = wpa_driver_nl80211_event_rtm_newlink;
1764         cfg->dellink_cb = wpa_driver_nl80211_event_rtm_dellink;
1765         drv->netlink = netlink_init(cfg);
1766         if (drv->netlink == NULL) {
1767                 os_free(cfg);
1768                 goto failed;
1769         }
1770
1771         rcfg = os_zalloc(sizeof(*rcfg));
1772         if (rcfg == NULL)
1773                 goto failed;
1774         rcfg->ctx = drv;
1775         os_strlcpy(rcfg->ifname, ifname, sizeof(rcfg->ifname));
1776         rcfg->blocked_cb = wpa_driver_nl80211_rfkill_blocked;
1777         rcfg->unblocked_cb = wpa_driver_nl80211_rfkill_unblocked;
1778         drv->rfkill = rfkill_init(rcfg);
1779         if (drv->rfkill == NULL) {
1780                 wpa_printf(MSG_DEBUG, "nl80211: RFKILL status not available");
1781                 os_free(rcfg);
1782         }
1783
1784         if (wpa_driver_nl80211_finish_drv_init(drv))
1785                 goto failed;
1786
1787         return bss;
1788
1789 failed:
1790         rfkill_deinit(drv->rfkill);
1791         netlink_deinit(drv->netlink);
1792         if (drv->ioctl_sock >= 0)
1793                 close(drv->ioctl_sock);
1794
1795         genl_family_put(drv->nl80211);
1796         nl_cache_free(drv->nl_cache);
1797         nl80211_handle_destroy(drv->nl_handle);
1798         nl_cb_put(drv->nl_cb);
1799         eloop_unregister_read_sock(nl_socket_get_fd(drv->nl_handle_event));
1800
1801         os_free(drv);
1802         return NULL;
1803 }
1804
1805
1806 static int nl80211_register_frame(struct wpa_driver_nl80211_data *drv,
1807                                   struct nl_handle *nl_handle,
1808                                   u16 type, const u8 *match, size_t match_len)
1809 {
1810         struct nl_msg *msg;
1811         int ret = -1;
1812
1813         msg = nlmsg_alloc();
1814         if (!msg)
1815                 return -1;
1816
1817         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
1818                     NL80211_CMD_REGISTER_ACTION, 0);
1819
1820         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1821         NLA_PUT_U16(msg, NL80211_ATTR_FRAME_TYPE, type);
1822         NLA_PUT(msg, NL80211_ATTR_FRAME_MATCH, match_len, match);
1823
1824         ret = send_and_recv(drv, nl_handle, msg, NULL, NULL);
1825         msg = NULL;
1826         if (ret) {
1827                 wpa_printf(MSG_DEBUG, "nl80211: Register frame command "
1828                            "failed (type=%u): ret=%d (%s)",
1829                            type, ret, strerror(-ret));
1830                 wpa_hexdump(MSG_DEBUG, "nl80211: Register frame match",
1831                             match, match_len);
1832                 goto nla_put_failure;
1833         }
1834         ret = 0;
1835 nla_put_failure:
1836         nlmsg_free(msg);
1837         return ret;
1838 }
1839
1840
1841 static int nl80211_register_action_frame(struct wpa_driver_nl80211_data *drv,
1842                                          const u8 *match, size_t match_len)
1843 {
1844         u16 type = (WLAN_FC_TYPE_MGMT << 2) | (WLAN_FC_STYPE_ACTION << 4);
1845         return nl80211_register_frame(drv, drv->nl_handle_event,
1846                                       type, match, match_len);
1847 }
1848
1849
1850 static int nl80211_register_action_frames(struct wpa_driver_nl80211_data *drv)
1851 {
1852 #ifdef CONFIG_P2P
1853         /* GAS Initial Request */
1854         if (nl80211_register_action_frame(drv, (u8 *) "\x04\x0a", 2) < 0)
1855                 return -1;
1856         /* GAS Initial Response */
1857         if (nl80211_register_action_frame(drv, (u8 *) "\x04\x0b", 2) < 0)
1858                 return -1;
1859         /* GAS Comeback Request */
1860         if (nl80211_register_action_frame(drv, (u8 *) "\x04\x0c", 2) < 0)
1861                 return -1;
1862         /* GAS Comeback Response */
1863         if (nl80211_register_action_frame(drv, (u8 *) "\x04\x0d", 2) < 0)
1864                 return -1;
1865         /* P2P Public Action */
1866         if (nl80211_register_action_frame(drv,
1867                                           (u8 *) "\x04\x09\x50\x6f\x9a\x09",
1868                                           6) < 0)
1869                 return -1;
1870         /* P2P Action */
1871         if (nl80211_register_action_frame(drv,
1872                                           (u8 *) "\x7f\x50\x6f\x9a\x09",
1873                                           5) < 0)
1874                 return -1;
1875 #endif /* CONFIG_P2P */
1876
1877         /* FT Action frames */
1878         if (nl80211_register_action_frame(drv, (u8 *) "\x06", 1) < 0)
1879                 return -1;
1880         else
1881                 drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_FT |
1882                         WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK;
1883
1884         return 0;
1885 }
1886
1887
1888 static void wpa_driver_nl80211_send_rfkill(void *eloop_ctx, void *timeout_ctx)
1889 {
1890         wpa_supplicant_event(timeout_ctx, EVENT_INTERFACE_DISABLED, NULL);
1891 }
1892
1893
1894 static int
1895 wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv)
1896 {
1897         struct i802_bss *bss = &drv->first_bss;
1898         int send_rfkill_event = 0;
1899
1900         drv->ifindex = if_nametoindex(bss->ifname);
1901         drv->first_bss.ifindex = drv->ifindex;
1902
1903 #ifndef HOSTAPD
1904         if (wpa_driver_nl80211_set_mode(bss, IEEE80211_MODE_INFRA) < 0) {
1905                 wpa_printf(MSG_DEBUG, "nl80211: Could not configure driver to "
1906                            "use managed mode");
1907         }
1908
1909         if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 1)) {
1910                 if (rfkill_is_blocked(drv->rfkill)) {
1911                         wpa_printf(MSG_DEBUG, "nl80211: Could not yet enable "
1912                                    "interface '%s' due to rfkill",
1913                                    bss->ifname);
1914                         drv->if_disabled = 1;
1915                         send_rfkill_event = 1;
1916                 } else {
1917                         wpa_printf(MSG_ERROR, "nl80211: Could not set "
1918                                    "interface '%s' UP", bss->ifname);
1919                         return -1;
1920                 }
1921         }
1922
1923         if (wpa_driver_nl80211_capa(drv))
1924                 return -1;
1925
1926         netlink_send_oper_ifla(drv->netlink, drv->ifindex,
1927                                1, IF_OPER_DORMANT);
1928 #endif /* HOSTAPD */
1929
1930         linux_get_ifhwaddr(drv->ioctl_sock, bss->ifname, drv->addr);
1931
1932         if (nl80211_register_action_frames(drv) < 0) {
1933                 wpa_printf(MSG_DEBUG, "nl80211: Failed to register Action "
1934                            "frame processing - ignore for now");
1935                 /*
1936                  * Older kernel versions did not support this, so ignore the
1937                  * error for now. Some functionality may not be available
1938                  * because of this.
1939                  */
1940         }
1941
1942         if (send_rfkill_event) {
1943                 eloop_register_timeout(0, 0, wpa_driver_nl80211_send_rfkill,
1944                                        drv, drv->ctx);
1945         }
1946
1947         return 0;
1948 }
1949
1950
1951 static int wpa_driver_nl80211_del_beacon(struct wpa_driver_nl80211_data *drv)
1952 {
1953         struct nl_msg *msg;
1954
1955         msg = nlmsg_alloc();
1956         if (!msg)
1957                 return -ENOMEM;
1958
1959         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1960                     0, NL80211_CMD_DEL_BEACON, 0);
1961         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1962
1963         return send_and_recv_msgs(drv, msg, NULL, NULL);
1964  nla_put_failure:
1965         return -ENOBUFS;
1966 }
1967
1968
1969 /**
1970  * wpa_driver_nl80211_deinit - Deinitialize nl80211 driver interface
1971  * @priv: Pointer to private nl80211 data from wpa_driver_nl80211_init()
1972  *
1973  * Shut down driver interface and processing of driver events. Free
1974  * private data buffer if one was allocated in wpa_driver_nl80211_init().
1975  */
1976 static void wpa_driver_nl80211_deinit(void *priv)
1977 {
1978         struct i802_bss *bss = priv;
1979         struct wpa_driver_nl80211_data *drv = bss->drv;
1980
1981         if (drv->nl_handle_preq)
1982                 wpa_driver_nl80211_probe_req_report(bss, 0);
1983         if (drv->added_if_into_bridge) {
1984                 if (linux_br_del_if(drv->ioctl_sock, drv->brname, bss->ifname)
1985                     < 0)
1986                         wpa_printf(MSG_INFO, "nl80211: Failed to remove "
1987                                    "interface %s from bridge %s: %s",
1988                                    bss->ifname, drv->brname, strerror(errno));
1989         }
1990         if (drv->added_bridge) {
1991                 if (linux_br_del(drv->ioctl_sock, drv->brname) < 0)
1992                         wpa_printf(MSG_INFO, "nl80211: Failed to remove "
1993                                    "bridge %s: %s",
1994                                    drv->brname, strerror(errno));
1995         }
1996
1997         nl80211_remove_monitor_interface(drv);
1998
1999         if (drv->nlmode == NL80211_IFTYPE_AP)
2000                 wpa_driver_nl80211_del_beacon(drv);
2001
2002 #ifdef HOSTAPD
2003         if (drv->last_freq_ht) {
2004                 /* Clear HT flags from the driver */
2005                 struct hostapd_freq_params freq;
2006                 os_memset(&freq, 0, sizeof(freq));
2007                 freq.freq = drv->last_freq;
2008                 i802_set_freq(priv, &freq);
2009         }
2010
2011         if (drv->eapol_sock >= 0) {
2012                 eloop_unregister_read_sock(drv->eapol_sock);
2013                 close(drv->eapol_sock);
2014         }
2015
2016         if (drv->if_indices != drv->default_if_indices)
2017                 os_free(drv->if_indices);
2018 #endif /* HOSTAPD */
2019
2020         if (drv->disable_11b_rates)
2021                 nl80211_disable_11b_rates(drv, drv->ifindex, 0);
2022
2023         netlink_send_oper_ifla(drv->netlink, drv->ifindex, 0, IF_OPER_UP);
2024         netlink_deinit(drv->netlink);
2025         rfkill_deinit(drv->rfkill);
2026
2027         eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx);
2028
2029         (void) linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 0);
2030         wpa_driver_nl80211_set_mode(bss, IEEE80211_MODE_INFRA);
2031
2032         if (drv->ioctl_sock >= 0)
2033                 close(drv->ioctl_sock);
2034
2035         eloop_unregister_read_sock(nl_socket_get_fd(drv->nl_handle_event));
2036         genl_family_put(drv->nl80211);
2037         nl_cache_free(drv->nl_cache);
2038         nl_cache_free(drv->nl_cache_event);
2039         nl80211_handle_destroy(drv->nl_handle);
2040         nl80211_handle_destroy(drv->nl_handle_event);
2041         nl_cb_put(drv->nl_cb);
2042
2043         os_free(drv->filter_ssids);
2044
2045         if (drv->global)
2046                 dl_list_del(&drv->list);
2047
2048         os_free(drv);
2049 }
2050
2051
2052 /**
2053  * wpa_driver_nl80211_scan_timeout - Scan timeout to report scan completion
2054  * @eloop_ctx: Driver private data
2055  * @timeout_ctx: ctx argument given to wpa_driver_nl80211_init()
2056  *
2057  * This function can be used as registered timeout when starting a scan to
2058  * generate a scan completed event if the driver does not report this.
2059  */
2060 static void wpa_driver_nl80211_scan_timeout(void *eloop_ctx, void *timeout_ctx)
2061 {
2062         struct wpa_driver_nl80211_data *drv = eloop_ctx;
2063         if (drv->ap_scan_as_station) {
2064                 wpa_driver_nl80211_set_mode(&drv->first_bss,
2065                                             IEEE80211_MODE_AP);
2066                 drv->ap_scan_as_station = 0;
2067         }
2068         wpa_printf(MSG_DEBUG, "Scan timeout - try to get results");
2069         wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL);
2070 }
2071
2072
2073 /**
2074  * wpa_driver_nl80211_scan - Request the driver to initiate scan
2075  * @priv: Pointer to private driver data from wpa_driver_nl80211_init()
2076  * @params: Scan parameters
2077  * Returns: 0 on success, -1 on failure
2078  */
2079 static int wpa_driver_nl80211_scan(void *priv,
2080                                    struct wpa_driver_scan_params *params)
2081 {
2082         struct i802_bss *bss = priv;
2083         struct wpa_driver_nl80211_data *drv = bss->drv;
2084         int ret = 0, timeout;
2085         struct nl_msg *msg, *ssids, *freqs;
2086         size_t i;
2087
2088         msg = nlmsg_alloc();
2089         ssids = nlmsg_alloc();
2090         freqs = nlmsg_alloc();
2091         if (!msg || !ssids || !freqs) {
2092                 nlmsg_free(msg);
2093                 nlmsg_free(ssids);
2094                 nlmsg_free(freqs);
2095                 return -1;
2096         }
2097
2098         os_free(drv->filter_ssids);
2099         drv->filter_ssids = params->filter_ssids;
2100         params->filter_ssids = NULL;
2101         drv->num_filter_ssids = params->num_filter_ssids;
2102
2103         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
2104                     NL80211_CMD_TRIGGER_SCAN, 0);
2105
2106         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
2107
2108         for (i = 0; i < params->num_ssids; i++) {
2109                 wpa_hexdump_ascii(MSG_MSGDUMP, "nl80211: Scan SSID",
2110                                   params->ssids[i].ssid,
2111                                   params->ssids[i].ssid_len);
2112                 NLA_PUT(ssids, i + 1, params->ssids[i].ssid_len,
2113                         params->ssids[i].ssid);
2114         }
2115         if (params->num_ssids)
2116                 nla_put_nested(msg, NL80211_ATTR_SCAN_SSIDS, ssids);
2117
2118         if (params->extra_ies) {
2119                 wpa_hexdump_ascii(MSG_MSGDUMP, "nl80211: Scan extra IEs",
2120                                   params->extra_ies, params->extra_ies_len);
2121                 NLA_PUT(msg, NL80211_ATTR_IE, params->extra_ies_len,
2122                         params->extra_ies);
2123         }
2124
2125         if (params->freqs) {
2126                 for (i = 0; params->freqs[i]; i++) {
2127                         wpa_printf(MSG_MSGDUMP, "nl80211: Scan frequency %u "
2128                                    "MHz", params->freqs[i]);
2129                         NLA_PUT_U32(freqs, i + 1, params->freqs[i]);
2130                 }
2131                 nla_put_nested(msg, NL80211_ATTR_SCAN_FREQUENCIES, freqs);
2132         }
2133
2134         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
2135         msg = NULL;
2136         if (ret) {
2137                 wpa_printf(MSG_DEBUG, "nl80211: Scan trigger failed: ret=%d "
2138                            "(%s)", ret, strerror(-ret));
2139 #ifdef HOSTAPD
2140                 if (drv->nlmode == NL80211_IFTYPE_AP) {
2141                         /*
2142                          * mac80211 does not allow scan requests in AP mode, so
2143                          * try to do this in station mode.
2144                          */
2145                         if (wpa_driver_nl80211_set_mode(bss,
2146                                                         IEEE80211_MODE_INFRA))
2147                                 goto nla_put_failure;
2148
2149                         if (wpa_driver_nl80211_scan(drv, params)) {
2150                                 wpa_driver_nl80211_set_mode(bss,
2151                                                             IEEE80211_MODE_AP);
2152                                 goto nla_put_failure;
2153                         }
2154
2155                         /* Restore AP mode when processing scan results */
2156                         drv->ap_scan_as_station = 1;
2157                         ret = 0;
2158                 } else
2159                         goto nla_put_failure;
2160 #else /* HOSTAPD */
2161                 goto nla_put_failure;
2162 #endif /* HOSTAPD */
2163         }
2164
2165         /* Not all drivers generate "scan completed" wireless event, so try to
2166          * read results after a timeout. */
2167         timeout = 10;
2168         if (drv->scan_complete_events) {
2169                 /*
2170                  * The driver seems to deliver events to notify when scan is
2171                  * complete, so use longer timeout to avoid race conditions
2172                  * with scanning and following association request.
2173                  */
2174                 timeout = 30;
2175         }
2176         wpa_printf(MSG_DEBUG, "Scan requested (ret=%d) - scan timeout %d "
2177                    "seconds", ret, timeout);
2178         eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx);
2179         eloop_register_timeout(timeout, 0, wpa_driver_nl80211_scan_timeout,
2180                                drv, drv->ctx);
2181
2182 nla_put_failure:
2183         nlmsg_free(ssids);
2184         nlmsg_free(msg);
2185         nlmsg_free(freqs);
2186         return ret;
2187 }
2188
2189
2190 static const u8 * nl80211_get_ie(const u8 *ies, size_t ies_len, u8 ie)
2191 {
2192         const u8 *end, *pos;
2193
2194         if (ies == NULL)
2195                 return NULL;
2196
2197         pos = ies;
2198         end = ies + ies_len;
2199
2200         while (pos + 1 < end) {
2201                 if (pos + 2 + pos[1] > end)
2202                         break;
2203                 if (pos[0] == ie)
2204                         return pos;
2205                 pos += 2 + pos[1];
2206         }
2207
2208         return NULL;
2209 }
2210
2211
2212 static int nl80211_scan_filtered(struct wpa_driver_nl80211_data *drv,
2213                                  const u8 *ie, size_t ie_len)
2214 {
2215         const u8 *ssid;
2216         size_t i;
2217
2218         if (drv->filter_ssids == NULL)
2219                 return 0;
2220
2221         ssid = nl80211_get_ie(ie, ie_len, WLAN_EID_SSID);
2222         if (ssid == NULL)
2223                 return 1;
2224
2225         for (i = 0; i < drv->num_filter_ssids; i++) {
2226                 if (ssid[1] == drv->filter_ssids[i].ssid_len &&
2227                     os_memcmp(ssid + 2, drv->filter_ssids[i].ssid, ssid[1]) ==
2228                     0)
2229                         return 0;
2230         }
2231
2232         return 1;
2233 }
2234
2235
2236 struct nl80211_bss_info_arg {
2237         struct wpa_driver_nl80211_data *drv;
2238         struct wpa_scan_results *res;
2239 };
2240
2241 static int bss_info_handler(struct nl_msg *msg, void *arg)
2242 {
2243         struct nlattr *tb[NL80211_ATTR_MAX + 1];
2244         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
2245         struct nlattr *bss[NL80211_BSS_MAX + 1];
2246         static struct nla_policy bss_policy[NL80211_BSS_MAX + 1] = {
2247                 [NL80211_BSS_BSSID] = { .type = NLA_UNSPEC },
2248                 [NL80211_BSS_FREQUENCY] = { .type = NLA_U32 },
2249                 [NL80211_BSS_TSF] = { .type = NLA_U64 },
2250                 [NL80211_BSS_BEACON_INTERVAL] = { .type = NLA_U16 },
2251                 [NL80211_BSS_CAPABILITY] = { .type = NLA_U16 },
2252                 [NL80211_BSS_INFORMATION_ELEMENTS] = { .type = NLA_UNSPEC },
2253                 [NL80211_BSS_SIGNAL_MBM] = { .type = NLA_U32 },
2254                 [NL80211_BSS_SIGNAL_UNSPEC] = { .type = NLA_U8 },
2255                 [NL80211_BSS_STATUS] = { .type = NLA_U32 },
2256                 [NL80211_BSS_SEEN_MS_AGO] = { .type = NLA_U32 },
2257                 [NL80211_BSS_BEACON_IES] = { .type = NLA_UNSPEC },
2258         };
2259         struct nl80211_bss_info_arg *_arg = arg;
2260         struct wpa_scan_results *res = _arg->res;
2261         struct wpa_scan_res **tmp;
2262         struct wpa_scan_res *r;
2263         const u8 *ie, *beacon_ie;
2264         size_t ie_len, beacon_ie_len;
2265         u8 *pos;
2266
2267         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
2268                   genlmsg_attrlen(gnlh, 0), NULL);
2269         if (!tb[NL80211_ATTR_BSS])
2270                 return NL_SKIP;
2271         if (nla_parse_nested(bss, NL80211_BSS_MAX, tb[NL80211_ATTR_BSS],
2272                              bss_policy))
2273                 return NL_SKIP;
2274         if (bss[NL80211_BSS_INFORMATION_ELEMENTS]) {
2275                 ie = nla_data(bss[NL80211_BSS_INFORMATION_ELEMENTS]);
2276                 ie_len = nla_len(bss[NL80211_BSS_INFORMATION_ELEMENTS]);
2277         } else {
2278                 ie = NULL;
2279                 ie_len = 0;
2280         }
2281         if (bss[NL80211_BSS_BEACON_IES]) {
2282                 beacon_ie = nla_data(bss[NL80211_BSS_BEACON_IES]);
2283                 beacon_ie_len = nla_len(bss[NL80211_BSS_BEACON_IES]);
2284         } else {
2285                 beacon_ie = NULL;
2286                 beacon_ie_len = 0;
2287         }
2288
2289         if (nl80211_scan_filtered(_arg->drv, ie ? ie : beacon_ie,
2290                                   ie ? ie_len : beacon_ie_len))
2291                 return NL_SKIP;
2292
2293         r = os_zalloc(sizeof(*r) + ie_len + beacon_ie_len);
2294         if (r == NULL)
2295                 return NL_SKIP;
2296         if (bss[NL80211_BSS_BSSID])
2297                 os_memcpy(r->bssid, nla_data(bss[NL80211_BSS_BSSID]),
2298                           ETH_ALEN);
2299         if (bss[NL80211_BSS_FREQUENCY])
2300                 r->freq = nla_get_u32(bss[NL80211_BSS_FREQUENCY]);
2301         if (bss[NL80211_BSS_BEACON_INTERVAL])
2302                 r->beacon_int = nla_get_u16(bss[NL80211_BSS_BEACON_INTERVAL]);
2303         if (bss[NL80211_BSS_CAPABILITY])
2304                 r->caps = nla_get_u16(bss[NL80211_BSS_CAPABILITY]);
2305         r->flags |= WPA_SCAN_NOISE_INVALID;
2306         if (bss[NL80211_BSS_SIGNAL_MBM]) {
2307                 r->level = nla_get_u32(bss[NL80211_BSS_SIGNAL_MBM]);
2308                 r->level /= 100; /* mBm to dBm */
2309                 r->flags |= WPA_SCAN_LEVEL_DBM | WPA_SCAN_QUAL_INVALID;
2310         } else if (bss[NL80211_BSS_SIGNAL_UNSPEC]) {
2311                 r->level = nla_get_u8(bss[NL80211_BSS_SIGNAL_UNSPEC]);
2312                 r->flags |= WPA_SCAN_LEVEL_INVALID;
2313         } else
2314                 r->flags |= WPA_SCAN_LEVEL_INVALID | WPA_SCAN_QUAL_INVALID;
2315         if (bss[NL80211_BSS_TSF])
2316                 r->tsf = nla_get_u64(bss[NL80211_BSS_TSF]);
2317         if (bss[NL80211_BSS_SEEN_MS_AGO])
2318                 r->age = nla_get_u32(bss[NL80211_BSS_SEEN_MS_AGO]);
2319         r->ie_len = ie_len;
2320         pos = (u8 *) (r + 1);
2321         if (ie) {
2322                 os_memcpy(pos, ie, ie_len);
2323                 pos += ie_len;
2324         }
2325         r->beacon_ie_len = beacon_ie_len;
2326         if (beacon_ie)
2327                 os_memcpy(pos, beacon_ie, beacon_ie_len);
2328
2329         if (bss[NL80211_BSS_STATUS]) {
2330                 enum nl80211_bss_status status;
2331                 status = nla_get_u32(bss[NL80211_BSS_STATUS]);
2332                 switch (status) {
2333                 case NL80211_BSS_STATUS_AUTHENTICATED:
2334                         r->flags |= WPA_SCAN_AUTHENTICATED;
2335                         break;
2336                 case NL80211_BSS_STATUS_ASSOCIATED:
2337                         r->flags |= WPA_SCAN_ASSOCIATED;
2338                         break;
2339                 default:
2340                         break;
2341                 }
2342         }
2343
2344         tmp = os_realloc(res->res,
2345                          (res->num + 1) * sizeof(struct wpa_scan_res *));
2346         if (tmp == NULL) {
2347                 os_free(r);
2348                 return NL_SKIP;
2349         }
2350         tmp[res->num++] = r;
2351         res->res = tmp;
2352
2353         return NL_SKIP;
2354 }
2355
2356
2357 static void clear_state_mismatch(struct wpa_driver_nl80211_data *drv,
2358                                  const u8 *addr)
2359 {
2360         if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) {
2361                 wpa_printf(MSG_DEBUG, "nl80211: Clear possible state "
2362                            "mismatch (" MACSTR ")", MAC2STR(addr));
2363                 wpa_driver_nl80211_mlme(drv, addr,
2364                                         NL80211_CMD_DEAUTHENTICATE,
2365                                         WLAN_REASON_PREV_AUTH_NOT_VALID, 1);
2366         }
2367 }
2368
2369
2370 static void wpa_driver_nl80211_check_bss_status(
2371         struct wpa_driver_nl80211_data *drv, struct wpa_scan_results *res)
2372 {
2373         size_t i;
2374
2375         for (i = 0; i < res->num; i++) {
2376                 struct wpa_scan_res *r = res->res[i];
2377                 if (r->flags & WPA_SCAN_AUTHENTICATED) {
2378                         wpa_printf(MSG_DEBUG, "nl80211: Scan results "
2379                                    "indicates BSS status with " MACSTR
2380                                    " as authenticated",
2381                                    MAC2STR(r->bssid));
2382                         if (drv->nlmode == NL80211_IFTYPE_STATION &&
2383                             os_memcmp(r->bssid, drv->bssid, ETH_ALEN) != 0 &&
2384                             os_memcmp(r->bssid, drv->auth_bssid, ETH_ALEN) !=
2385                             0) {
2386                                 wpa_printf(MSG_DEBUG, "nl80211: Unknown BSSID"
2387                                            " in local state (auth=" MACSTR
2388                                            " assoc=" MACSTR ")",
2389                                            MAC2STR(drv->auth_bssid),
2390                                            MAC2STR(drv->bssid));
2391                                 clear_state_mismatch(drv, r->bssid);
2392                         }
2393                 }
2394
2395                 if (r->flags & WPA_SCAN_ASSOCIATED) {
2396                         wpa_printf(MSG_DEBUG, "nl80211: Scan results "
2397                                    "indicate BSS status with " MACSTR
2398                                    " as associated",
2399                                    MAC2STR(r->bssid));
2400                         if (drv->nlmode == NL80211_IFTYPE_STATION &&
2401                             !drv->associated) {
2402                                 wpa_printf(MSG_DEBUG, "nl80211: Local state "
2403                                            "(not associated) does not match "
2404                                            "with BSS state");
2405                                 clear_state_mismatch(drv, r->bssid);
2406                         } else if (drv->nlmode == NL80211_IFTYPE_STATION &&
2407                                    os_memcmp(drv->bssid, r->bssid, ETH_ALEN) !=
2408                                    0) {
2409                                 wpa_printf(MSG_DEBUG, "nl80211: Local state "
2410                                            "(associated with " MACSTR ") does "
2411                                            "not match with BSS state",
2412                                            MAC2STR(drv->bssid));
2413                                 clear_state_mismatch(drv, r->bssid);
2414                                 clear_state_mismatch(drv, drv->bssid);
2415                         }
2416                 }
2417         }
2418 }
2419
2420
2421 static void wpa_scan_results_free(struct wpa_scan_results *res)
2422 {
2423         size_t i;
2424
2425         if (res == NULL)
2426                 return;
2427
2428         for (i = 0; i < res->num; i++)
2429                 os_free(res->res[i]);
2430         os_free(res->res);
2431         os_free(res);
2432 }
2433
2434
2435 static struct wpa_scan_results *
2436 nl80211_get_scan_results(struct wpa_driver_nl80211_data *drv)
2437 {
2438         struct nl_msg *msg;
2439         struct wpa_scan_results *res;
2440         int ret;
2441         struct nl80211_bss_info_arg arg;
2442
2443         res = os_zalloc(sizeof(*res));
2444         if (res == NULL)
2445                 return NULL;
2446         msg = nlmsg_alloc();
2447         if (!msg)
2448                 goto nla_put_failure;
2449
2450         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, NLM_F_DUMP,
2451                     NL80211_CMD_GET_SCAN, 0);
2452         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
2453
2454         arg.drv = drv;
2455         arg.res = res;
2456         ret = send_and_recv_msgs(drv, msg, bss_info_handler, &arg);
2457         msg = NULL;
2458         if (ret == 0) {
2459                 wpa_printf(MSG_DEBUG, "Received scan results (%lu BSSes)",
2460                            (unsigned long) res->num);
2461                 return res;
2462         }
2463         wpa_printf(MSG_DEBUG, "nl80211: Scan result fetch failed: ret=%d "
2464                    "(%s)", ret, strerror(-ret));
2465 nla_put_failure:
2466         nlmsg_free(msg);
2467         wpa_scan_results_free(res);
2468         return NULL;
2469 }
2470
2471
2472 /**
2473  * wpa_driver_nl80211_get_scan_results - Fetch the latest scan results
2474  * @priv: Pointer to private wext data from wpa_driver_nl80211_init()
2475  * Returns: Scan results on success, -1 on failure
2476  */
2477 static struct wpa_scan_results *
2478 wpa_driver_nl80211_get_scan_results(void *priv)
2479 {
2480         struct i802_bss *bss = priv;
2481         struct wpa_driver_nl80211_data *drv = bss->drv;
2482         struct wpa_scan_results *res;
2483
2484         res = nl80211_get_scan_results(drv);
2485         if (res)
2486                 wpa_driver_nl80211_check_bss_status(drv, res);
2487         return res;
2488 }
2489
2490
2491 static void nl80211_dump_scan(struct wpa_driver_nl80211_data *drv)
2492 {
2493         struct wpa_scan_results *res;
2494         size_t i;
2495
2496         res = nl80211_get_scan_results(drv);
2497         if (res == NULL) {
2498                 wpa_printf(MSG_DEBUG, "nl80211: Failed to get scan results");
2499                 return;
2500         }
2501
2502         wpa_printf(MSG_DEBUG, "nl80211: Scan result dump");
2503         for (i = 0; i < res->num; i++) {
2504                 struct wpa_scan_res *r = res->res[i];
2505                 wpa_printf(MSG_DEBUG, "nl80211: %d/%d " MACSTR "%s%s",
2506                            (int) i, (int) res->num, MAC2STR(r->bssid),
2507                            r->flags & WPA_SCAN_AUTHENTICATED ? " [auth]" : "",
2508                            r->flags & WPA_SCAN_ASSOCIATED ? " [assoc]" : "");
2509         }
2510
2511         wpa_scan_results_free(res);
2512 }
2513
2514
2515 static int wpa_driver_nl80211_set_key(const char *ifname, void *priv,
2516                                       enum wpa_alg alg, const u8 *addr,
2517                                       int key_idx, int set_tx,
2518                                       const u8 *seq, size_t seq_len,
2519                                       const u8 *key, size_t key_len)
2520 {
2521         struct i802_bss *bss = priv;
2522         struct wpa_driver_nl80211_data *drv = bss->drv;
2523         int ifindex = if_nametoindex(ifname);
2524         struct nl_msg *msg;
2525         int ret;
2526
2527         wpa_printf(MSG_DEBUG, "%s: ifindex=%d alg=%d addr=%p key_idx=%d "
2528                    "set_tx=%d seq_len=%lu key_len=%lu",
2529                    __func__, ifindex, alg, addr, key_idx, set_tx,
2530                    (unsigned long) seq_len, (unsigned long) key_len);
2531
2532         msg = nlmsg_alloc();
2533         if (!msg)
2534                 return -ENOMEM;
2535
2536         if (alg == WPA_ALG_NONE) {
2537                 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
2538                             0, NL80211_CMD_DEL_KEY, 0);
2539         } else {
2540                 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
2541                             0, NL80211_CMD_NEW_KEY, 0);
2542                 NLA_PUT(msg, NL80211_ATTR_KEY_DATA, key_len, key);
2543                 switch (alg) {
2544                 case WPA_ALG_WEP:
2545                         if (key_len == 5)
2546                                 NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
2547                                             WLAN_CIPHER_SUITE_WEP40);
2548                         else
2549                                 NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
2550                                             WLAN_CIPHER_SUITE_WEP104);
2551                         break;
2552                 case WPA_ALG_TKIP:
2553                         NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
2554                                     WLAN_CIPHER_SUITE_TKIP);
2555                         break;
2556                 case WPA_ALG_CCMP:
2557                         NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
2558                                     WLAN_CIPHER_SUITE_CCMP);
2559                         break;
2560                 case WPA_ALG_IGTK:
2561                         NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
2562                                     WLAN_CIPHER_SUITE_AES_CMAC);
2563                         break;
2564                 default:
2565                         wpa_printf(MSG_ERROR, "%s: Unsupported encryption "
2566                                    "algorithm %d", __func__, alg);
2567                         nlmsg_free(msg);
2568                         return -1;
2569                 }
2570         }
2571
2572         if (seq && seq_len)
2573                 NLA_PUT(msg, NL80211_ATTR_KEY_SEQ, seq_len, seq);
2574
2575         if (addr && os_memcmp(addr, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) != 0)
2576         {
2577                 wpa_printf(MSG_DEBUG, "   addr=" MACSTR, MAC2STR(addr));
2578                 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
2579         }
2580         NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_idx);
2581         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
2582
2583         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
2584         if ((ret == -ENOENT || ret == -ENOLINK) && alg == WPA_ALG_NONE)
2585                 ret = 0;
2586         if (ret)
2587                 wpa_printf(MSG_DEBUG, "nl80211: set_key failed; err=%d %s)",
2588                            ret, strerror(-ret));
2589
2590         /*
2591          * If we failed or don't need to set the default TX key (below),
2592          * we're done here.
2593          */
2594         if (ret || !set_tx || alg == WPA_ALG_NONE)
2595                 return ret;
2596 #ifdef HOSTAPD
2597         if (addr)
2598                 return ret;
2599 #else /* HOSTAPD */
2600         if (drv->nlmode == NL80211_IFTYPE_AP && addr)
2601                 return ret;
2602 #endif /* HOSTAPD */
2603
2604         msg = nlmsg_alloc();
2605         if (!msg)
2606                 return -ENOMEM;
2607
2608         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
2609                     0, NL80211_CMD_SET_KEY, 0);
2610         NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_idx);
2611         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
2612         if (alg == WPA_ALG_IGTK)
2613                 NLA_PUT_FLAG(msg, NL80211_ATTR_KEY_DEFAULT_MGMT);
2614         else
2615                 NLA_PUT_FLAG(msg, NL80211_ATTR_KEY_DEFAULT);
2616
2617         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
2618         if (ret == -ENOENT)
2619                 ret = 0;
2620         if (ret)
2621                 wpa_printf(MSG_DEBUG, "nl80211: set_key default failed; "
2622                            "err=%d %s)", ret, strerror(-ret));
2623         return ret;
2624
2625 nla_put_failure:
2626         return -ENOBUFS;
2627 }
2628
2629
2630 static int nl_add_key(struct nl_msg *msg, enum wpa_alg alg,
2631                       int key_idx, int defkey,
2632                       const u8 *seq, size_t seq_len,
2633                       const u8 *key, size_t key_len)
2634 {
2635         struct nlattr *key_attr = nla_nest_start(msg, NL80211_ATTR_KEY);
2636         if (!key_attr)
2637                 return -1;
2638
2639         if (defkey && alg == WPA_ALG_IGTK)
2640                 NLA_PUT_FLAG(msg, NL80211_KEY_DEFAULT_MGMT);
2641         else if (defkey)
2642                 NLA_PUT_FLAG(msg, NL80211_KEY_DEFAULT);
2643
2644         NLA_PUT_U8(msg, NL80211_KEY_IDX, key_idx);
2645
2646         switch (alg) {
2647         case WPA_ALG_WEP:
2648                 if (key_len == 5)
2649                         NLA_PUT_U32(msg, NL80211_KEY_CIPHER,
2650                                     WLAN_CIPHER_SUITE_WEP40);
2651                 else
2652                         NLA_PUT_U32(msg, NL80211_KEY_CIPHER,
2653                                     WLAN_CIPHER_SUITE_WEP104);
2654                 break;
2655         case WPA_ALG_TKIP:
2656                 NLA_PUT_U32(msg, NL80211_KEY_CIPHER, WLAN_CIPHER_SUITE_TKIP);
2657                 break;
2658         case WPA_ALG_CCMP:
2659                 NLA_PUT_U32(msg, NL80211_KEY_CIPHER, WLAN_CIPHER_SUITE_CCMP);
2660                 break;
2661         case WPA_ALG_IGTK:
2662                 NLA_PUT_U32(msg, NL80211_KEY_CIPHER,
2663                             WLAN_CIPHER_SUITE_AES_CMAC);
2664                 break;
2665         default:
2666                 wpa_printf(MSG_ERROR, "%s: Unsupported encryption "
2667                            "algorithm %d", __func__, alg);
2668                 return -1;
2669         }
2670
2671         if (seq && seq_len)
2672                 NLA_PUT(msg, NL80211_KEY_SEQ, seq_len, seq);
2673
2674         NLA_PUT(msg, NL80211_KEY_DATA, key_len, key);
2675
2676         nla_nest_end(msg, key_attr);
2677
2678         return 0;
2679  nla_put_failure:
2680         return -1;
2681 }
2682
2683
2684 static int nl80211_set_conn_keys(struct wpa_driver_associate_params *params,
2685                                  struct nl_msg *msg)
2686 {
2687         int i, privacy = 0;
2688         struct nlattr *nl_keys, *nl_key;
2689
2690         for (i = 0; i < 4; i++) {
2691                 if (!params->wep_key[i])
2692                         continue;
2693                 privacy = 1;
2694                 break;
2695         }
2696         if (params->wps == WPS_MODE_PRIVACY)
2697                 privacy = 1;
2698         if (params->pairwise_suite &&
2699             params->pairwise_suite != WPA_CIPHER_NONE)
2700                 privacy = 1;
2701
2702         if (!privacy)
2703                 return 0;
2704
2705         NLA_PUT_FLAG(msg, NL80211_ATTR_PRIVACY);
2706
2707         nl_keys = nla_nest_start(msg, NL80211_ATTR_KEYS);
2708         if (!nl_keys)
2709                 goto nla_put_failure;
2710
2711         for (i = 0; i < 4; i++) {
2712                 if (!params->wep_key[i])
2713                         continue;
2714
2715                 nl_key = nla_nest_start(msg, i);
2716                 if (!nl_key)
2717                         goto nla_put_failure;
2718
2719                 NLA_PUT(msg, NL80211_KEY_DATA, params->wep_key_len[i],
2720                         params->wep_key[i]);
2721                 if (params->wep_key_len[i] == 5)
2722                         NLA_PUT_U32(msg, NL80211_KEY_CIPHER,
2723                                     WLAN_CIPHER_SUITE_WEP40);
2724                 else
2725                         NLA_PUT_U32(msg, NL80211_KEY_CIPHER,
2726                                     WLAN_CIPHER_SUITE_WEP104);
2727
2728                 NLA_PUT_U8(msg, NL80211_KEY_IDX, i);
2729
2730                 if (i == params->wep_tx_keyidx)
2731                         NLA_PUT_FLAG(msg, NL80211_KEY_DEFAULT);
2732
2733                 nla_nest_end(msg, nl_key);
2734         }
2735         nla_nest_end(msg, nl_keys);
2736
2737         return 0;
2738
2739 nla_put_failure:
2740         return -ENOBUFS;
2741 }
2742
2743
2744 static int wpa_driver_nl80211_mlme(struct wpa_driver_nl80211_data *drv,
2745                                    const u8 *addr, int cmd, u16 reason_code,
2746                                    int local_state_change)
2747 {
2748         int ret = -1;
2749         struct nl_msg *msg;
2750
2751         msg = nlmsg_alloc();
2752         if (!msg)
2753                 return -1;
2754
2755         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0, cmd, 0);
2756
2757         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
2758         NLA_PUT_U16(msg, NL80211_ATTR_REASON_CODE, reason_code);
2759         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
2760         if (local_state_change)
2761                 NLA_PUT_FLAG(msg, NL80211_ATTR_LOCAL_STATE_CHANGE);
2762
2763         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
2764         msg = NULL;
2765         if (ret) {
2766                 wpa_printf(MSG_DEBUG, "nl80211: MLME command failed: ret=%d "
2767                            "(%s)", ret, strerror(-ret));
2768                 goto nla_put_failure;
2769         }
2770         ret = 0;
2771
2772 nla_put_failure:
2773         nlmsg_free(msg);
2774         return ret;
2775 }
2776
2777
2778 static int wpa_driver_nl80211_disconnect(struct wpa_driver_nl80211_data *drv,
2779                                          const u8 *addr, int reason_code)
2780 {
2781         wpa_printf(MSG_DEBUG, "%s(addr=" MACSTR " reason_code=%d)",
2782                    __func__, MAC2STR(addr), reason_code);
2783         drv->associated = 0;
2784         return wpa_driver_nl80211_mlme(drv, addr, NL80211_CMD_DISCONNECT,
2785                                        reason_code, 0);
2786 }
2787
2788
2789 static int wpa_driver_nl80211_deauthenticate(void *priv, const u8 *addr,
2790                                              int reason_code)
2791 {
2792         struct i802_bss *bss = priv;
2793         struct wpa_driver_nl80211_data *drv = bss->drv;
2794         if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME))
2795                 return wpa_driver_nl80211_disconnect(drv, addr, reason_code);
2796         wpa_printf(MSG_DEBUG, "%s(addr=" MACSTR " reason_code=%d)",
2797                    __func__, MAC2STR(addr), reason_code);
2798         drv->associated = 0;
2799         return wpa_driver_nl80211_mlme(drv, addr, NL80211_CMD_DEAUTHENTICATE,
2800                                        reason_code, 0);
2801 }
2802
2803
2804 static int wpa_driver_nl80211_disassociate(void *priv, const u8 *addr,
2805                                            int reason_code)
2806 {
2807         struct i802_bss *bss = priv;
2808         struct wpa_driver_nl80211_data *drv = bss->drv;
2809         if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME))
2810                 return wpa_driver_nl80211_disconnect(drv, addr, reason_code);
2811         wpa_printf(MSG_DEBUG, "%s", __func__);
2812         drv->associated = 0;
2813         return wpa_driver_nl80211_mlme(drv, addr, NL80211_CMD_DISASSOCIATE,
2814                                        reason_code, 0);
2815 }
2816
2817
2818 static int wpa_driver_nl80211_authenticate(
2819         void *priv, struct wpa_driver_auth_params *params)
2820 {
2821         struct i802_bss *bss = priv;
2822         struct wpa_driver_nl80211_data *drv = bss->drv;
2823         int ret = -1, i;
2824         struct nl_msg *msg;
2825         enum nl80211_auth_type type;
2826         int count = 0;
2827
2828         drv->associated = 0;
2829         os_memset(drv->auth_bssid, 0, ETH_ALEN);
2830         /* FIX: IBSS mode */
2831         if (drv->nlmode != NL80211_IFTYPE_STATION)
2832                 wpa_driver_nl80211_set_mode(priv, IEEE80211_MODE_INFRA);
2833
2834         if (wpa_driver_nl80211_set_mode(priv, IEEE80211_MODE_INFRA) < 0)
2835                 return -1;
2836
2837 retry:
2838         msg = nlmsg_alloc();
2839         if (!msg)
2840                 return -1;
2841
2842         wpa_printf(MSG_DEBUG, "nl80211: Authenticate (ifindex=%d)",
2843                    drv->ifindex);
2844
2845         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
2846                     NL80211_CMD_AUTHENTICATE, 0);
2847
2848         for (i = 0; i < 4; i++) {
2849                 if (!params->wep_key[i])
2850                         continue;
2851                 wpa_driver_nl80211_set_key(bss->ifname, priv, WPA_ALG_WEP,
2852                                            NULL, i,
2853                                            i == params->wep_tx_keyidx, NULL, 0,
2854                                            params->wep_key[i],
2855                                            params->wep_key_len[i]);
2856                 if (params->wep_tx_keyidx != i)
2857                         continue;
2858                 if (nl_add_key(msg, WPA_ALG_WEP, i, 1, NULL, 0,
2859                                params->wep_key[i], params->wep_key_len[i])) {
2860                         nlmsg_free(msg);
2861                         return -1;
2862                 }
2863         }
2864
2865         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
2866         if (params->bssid) {
2867                 wpa_printf(MSG_DEBUG, "  * bssid=" MACSTR,
2868                            MAC2STR(params->bssid));
2869                 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, params->bssid);
2870         }
2871         if (params->freq) {
2872                 wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq);
2873                 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
2874         }
2875         if (params->ssid) {
2876                 wpa_hexdump_ascii(MSG_DEBUG, "  * SSID",
2877                                   params->ssid, params->ssid_len);
2878                 NLA_PUT(msg, NL80211_ATTR_SSID, params->ssid_len,
2879                         params->ssid);
2880         }
2881         wpa_hexdump(MSG_DEBUG, "  * IEs", params->ie, params->ie_len);
2882         if (params->ie)
2883                 NLA_PUT(msg, NL80211_ATTR_IE, params->ie_len, params->ie);
2884         if (params->auth_alg & WPA_AUTH_ALG_OPEN)
2885                 type = NL80211_AUTHTYPE_OPEN_SYSTEM;
2886         else if (params->auth_alg & WPA_AUTH_ALG_SHARED)
2887                 type = NL80211_AUTHTYPE_SHARED_KEY;
2888         else if (params->auth_alg & WPA_AUTH_ALG_LEAP)
2889                 type = NL80211_AUTHTYPE_NETWORK_EAP;
2890         else if (params->auth_alg & WPA_AUTH_ALG_FT)
2891                 type = NL80211_AUTHTYPE_FT;
2892         else
2893                 goto nla_put_failure;
2894         wpa_printf(MSG_DEBUG, "  * Auth Type %d", type);
2895         NLA_PUT_U32(msg, NL80211_ATTR_AUTH_TYPE, type);
2896         if (params->local_state_change) {
2897                 wpa_printf(MSG_DEBUG, "  * Local state change only");
2898                 NLA_PUT_FLAG(msg, NL80211_ATTR_LOCAL_STATE_CHANGE);
2899         }
2900
2901         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
2902         msg = NULL;
2903         if (ret) {
2904                 wpa_printf(MSG_DEBUG, "nl80211: MLME command failed: ret=%d "
2905                            "(%s)", ret, strerror(-ret));
2906                 count++;
2907                 if (ret == -EALREADY && count == 1 && params->bssid &&
2908                     !params->local_state_change) {
2909                         /*
2910                          * mac80211 does not currently accept new
2911                          * authentication if we are already authenticated. As a
2912                          * workaround, force deauthentication and try again.
2913                          */
2914                         wpa_printf(MSG_DEBUG, "nl80211: Retry authentication "
2915                                    "after forced deauthentication");
2916                         wpa_driver_nl80211_deauthenticate(
2917                                 bss, params->bssid,
2918                                 WLAN_REASON_PREV_AUTH_NOT_VALID);
2919                         nlmsg_free(msg);
2920                         goto retry;
2921                 }
2922                 goto nla_put_failure;
2923         }
2924         ret = 0;
2925         wpa_printf(MSG_DEBUG, "nl80211: Authentication request send "
2926                    "successfully");
2927
2928 nla_put_failure:
2929         nlmsg_free(msg);
2930         return ret;
2931 }
2932
2933
2934 struct phy_info_arg {
2935         u16 *num_modes;
2936         struct hostapd_hw_modes *modes;
2937 };
2938
2939 static int phy_info_handler(struct nl_msg *msg, void *arg)
2940 {
2941         struct nlattr *tb_msg[NL80211_ATTR_MAX + 1];
2942         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
2943         struct phy_info_arg *phy_info = arg;
2944
2945         struct nlattr *tb_band[NL80211_BAND_ATTR_MAX + 1];
2946
2947         struct nlattr *tb_freq[NL80211_FREQUENCY_ATTR_MAX + 1];
2948         static struct nla_policy freq_policy[NL80211_FREQUENCY_ATTR_MAX + 1] = {
2949                 [NL80211_FREQUENCY_ATTR_FREQ] = { .type = NLA_U32 },
2950                 [NL80211_FREQUENCY_ATTR_DISABLED] = { .type = NLA_FLAG },
2951                 [NL80211_FREQUENCY_ATTR_PASSIVE_SCAN] = { .type = NLA_FLAG },
2952                 [NL80211_FREQUENCY_ATTR_NO_IBSS] = { .type = NLA_FLAG },
2953                 [NL80211_FREQUENCY_ATTR_RADAR] = { .type = NLA_FLAG },
2954                 [NL80211_FREQUENCY_ATTR_MAX_TX_POWER] = { .type = NLA_U32 },
2955         };
2956
2957         struct nlattr *tb_rate[NL80211_BITRATE_ATTR_MAX + 1];
2958         static struct nla_policy rate_policy[NL80211_BITRATE_ATTR_MAX + 1] = {
2959                 [NL80211_BITRATE_ATTR_RATE] = { .type = NLA_U32 },
2960                 [NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE] = { .type = NLA_FLAG },
2961         };
2962
2963         struct nlattr *nl_band;
2964         struct nlattr *nl_freq;
2965         struct nlattr *nl_rate;
2966         int rem_band, rem_freq, rem_rate;
2967         struct hostapd_hw_modes *mode;
2968         int idx, mode_is_set;
2969
2970         nla_parse(tb_msg, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
2971                   genlmsg_attrlen(gnlh, 0), NULL);
2972
2973         if (!tb_msg[NL80211_ATTR_WIPHY_BANDS])
2974                 return NL_SKIP;
2975
2976         nla_for_each_nested(nl_band, tb_msg[NL80211_ATTR_WIPHY_BANDS], rem_band) {
2977                 mode = os_realloc(phy_info->modes, (*phy_info->num_modes + 1) * sizeof(*mode));
2978                 if (!mode)
2979                         return NL_SKIP;
2980                 phy_info->modes = mode;
2981
2982                 mode_is_set = 0;
2983
2984                 mode = &phy_info->modes[*(phy_info->num_modes)];
2985                 memset(mode, 0, sizeof(*mode));
2986                 *(phy_info->num_modes) += 1;
2987
2988                 nla_parse(tb_band, NL80211_BAND_ATTR_MAX, nla_data(nl_band),
2989                           nla_len(nl_band), NULL);
2990
2991                 if (tb_band[NL80211_BAND_ATTR_HT_CAPA]) {
2992                         mode->ht_capab = nla_get_u16(
2993                                 tb_band[NL80211_BAND_ATTR_HT_CAPA]);
2994                 }
2995
2996                 if (tb_band[NL80211_BAND_ATTR_HT_AMPDU_FACTOR]) {
2997                         mode->a_mpdu_params |= nla_get_u8(
2998                                 tb_band[NL80211_BAND_ATTR_HT_AMPDU_FACTOR]) &
2999                                 0x03;
3000                 }
3001
3002                 if (tb_band[NL80211_BAND_ATTR_HT_AMPDU_DENSITY]) {
3003                         mode->a_mpdu_params |= nla_get_u8(
3004                                 tb_band[NL80211_BAND_ATTR_HT_AMPDU_DENSITY]) <<
3005                                 2;
3006                 }
3007
3008                 if (tb_band[NL80211_BAND_ATTR_HT_MCS_SET] &&
3009                     nla_len(tb_band[NL80211_BAND_ATTR_HT_MCS_SET])) {
3010                         u8 *mcs;
3011                         mcs = nla_data(tb_band[NL80211_BAND_ATTR_HT_MCS_SET]);
3012                         os_memcpy(mode->mcs_set, mcs, 16);
3013                 }
3014
3015                 nla_for_each_nested(nl_freq, tb_band[NL80211_BAND_ATTR_FREQS], rem_freq) {
3016                         nla_parse(tb_freq, NL80211_FREQUENCY_ATTR_MAX, nla_data(nl_freq),
3017                                   nla_len(nl_freq), freq_policy);
3018                         if (!tb_freq[NL80211_FREQUENCY_ATTR_FREQ])
3019                                 continue;
3020                         mode->num_channels++;
3021                 }
3022
3023                 mode->channels = os_zalloc(mode->num_channels * sizeof(struct hostapd_channel_data));
3024                 if (!mode->channels)
3025                         return NL_SKIP;
3026
3027                 idx = 0;
3028
3029                 nla_for_each_nested(nl_freq, tb_band[NL80211_BAND_ATTR_FREQS], rem_freq) {
3030                         nla_parse(tb_freq, NL80211_FREQUENCY_ATTR_MAX, nla_data(nl_freq),
3031                                   nla_len(nl_freq), freq_policy);
3032                         if (!tb_freq[NL80211_FREQUENCY_ATTR_FREQ])
3033                                 continue;
3034
3035                         mode->channels[idx].freq = nla_get_u32(tb_freq[NL80211_FREQUENCY_ATTR_FREQ]);
3036                         mode->channels[idx].flag = 0;
3037
3038                         if (!mode_is_set) {
3039                                 /* crude heuristic */
3040                                 if (mode->channels[idx].freq < 4000)
3041                                         mode->mode = HOSTAPD_MODE_IEEE80211B;
3042                                 else
3043                                         mode->mode = HOSTAPD_MODE_IEEE80211A;
3044                                 mode_is_set = 1;
3045                         }
3046
3047                         /* crude heuristic */
3048                         if (mode->channels[idx].freq < 4000)
3049                                 if (mode->channels[idx].freq == 2484)
3050                                         mode->channels[idx].chan = 14;
3051                                 else
3052                                         mode->channels[idx].chan = (mode->channels[idx].freq - 2407) / 5;
3053                         else
3054                                 mode->channels[idx].chan = mode->channels[idx].freq/5 - 1000;
3055
3056                         if (tb_freq[NL80211_FREQUENCY_ATTR_DISABLED])
3057                                 mode->channels[idx].flag |=
3058                                         HOSTAPD_CHAN_DISABLED;
3059                         if (tb_freq[NL80211_FREQUENCY_ATTR_PASSIVE_SCAN])
3060                                 mode->channels[idx].flag |=
3061                                         HOSTAPD_CHAN_PASSIVE_SCAN;
3062                         if (tb_freq[NL80211_FREQUENCY_ATTR_NO_IBSS])
3063                                 mode->channels[idx].flag |=
3064                                         HOSTAPD_CHAN_NO_IBSS;
3065                         if (tb_freq[NL80211_FREQUENCY_ATTR_RADAR])
3066                                 mode->channels[idx].flag |=
3067                                         HOSTAPD_CHAN_RADAR;
3068
3069                         if (tb_freq[NL80211_FREQUENCY_ATTR_MAX_TX_POWER] &&
3070                             !tb_freq[NL80211_FREQUENCY_ATTR_DISABLED])
3071                                 mode->channels[idx].max_tx_power =
3072                                         nla_get_u32(tb_freq[NL80211_FREQUENCY_ATTR_MAX_TX_POWER]) / 100;
3073
3074                         idx++;
3075                 }
3076
3077                 nla_for_each_nested(nl_rate, tb_band[NL80211_BAND_ATTR_RATES], rem_rate) {
3078                         nla_parse(tb_rate, NL80211_BITRATE_ATTR_MAX, nla_data(nl_rate),
3079                                   nla_len(nl_rate), rate_policy);
3080                         if (!tb_rate[NL80211_BITRATE_ATTR_RATE])
3081                                 continue;
3082                         mode->num_rates++;
3083                 }
3084
3085                 mode->rates = os_zalloc(mode->num_rates * sizeof(int));
3086                 if (!mode->rates)
3087                         return NL_SKIP;
3088
3089                 idx = 0;
3090
3091                 nla_for_each_nested(nl_rate, tb_band[NL80211_BAND_ATTR_RATES], rem_rate) {
3092                         nla_parse(tb_rate, NL80211_BITRATE_ATTR_MAX, nla_data(nl_rate),
3093                                   nla_len(nl_rate), rate_policy);
3094                         if (!tb_rate[NL80211_BITRATE_ATTR_RATE])
3095                                 continue;
3096                         mode->rates[idx] = nla_get_u32(tb_rate[NL80211_BITRATE_ATTR_RATE]);
3097
3098                         /* crude heuristic */
3099                         if (mode->mode == HOSTAPD_MODE_IEEE80211B &&
3100                             mode->rates[idx] > 200)
3101                                 mode->mode = HOSTAPD_MODE_IEEE80211G;
3102
3103                         idx++;
3104                 }
3105         }
3106
3107         return NL_SKIP;
3108 }
3109
3110 static struct hostapd_hw_modes *
3111 wpa_driver_nl80211_add_11b(struct hostapd_hw_modes *modes, u16 *num_modes)
3112 {
3113         u16 m;
3114         struct hostapd_hw_modes *mode11g = NULL, *nmodes, *mode;
3115         int i, mode11g_idx = -1;
3116
3117         /* If only 802.11g mode is included, use it to construct matching
3118          * 802.11b mode data. */
3119
3120         for (m = 0; m < *num_modes; m++) {
3121                 if (modes[m].mode == HOSTAPD_MODE_IEEE80211B)
3122                         return modes; /* 802.11b already included */
3123                 if (modes[m].mode == HOSTAPD_MODE_IEEE80211G)
3124                         mode11g_idx = m;
3125         }
3126
3127         if (mode11g_idx < 0)
3128                 return modes; /* 2.4 GHz band not supported at all */
3129
3130         nmodes = os_realloc(modes, (*num_modes + 1) * sizeof(*nmodes));
3131         if (nmodes == NULL)
3132                 return modes; /* Could not add 802.11b mode */
3133
3134         mode = &nmodes[*num_modes];
3135         os_memset(mode, 0, sizeof(*mode));
3136         (*num_modes)++;
3137         modes = nmodes;
3138
3139         mode->mode = HOSTAPD_MODE_IEEE80211B;
3140
3141         mode11g = &modes[mode11g_idx];
3142         mode->num_channels = mode11g->num_channels;
3143         mode->channels = os_malloc(mode11g->num_channels *
3144                                    sizeof(struct hostapd_channel_data));
3145         if (mode->channels == NULL) {
3146                 (*num_modes)--;
3147                 return modes; /* Could not add 802.11b mode */
3148         }
3149         os_memcpy(mode->channels, mode11g->channels,
3150                   mode11g->num_channels * sizeof(struct hostapd_channel_data));
3151
3152         mode->num_rates = 0;
3153         mode->rates = os_malloc(4 * sizeof(int));
3154         if (mode->rates == NULL) {
3155                 os_free(mode->channels);
3156                 (*num_modes)--;
3157                 return modes; /* Could not add 802.11b mode */
3158         }
3159
3160         for (i = 0; i < mode11g->num_rates; i++) {
3161                 if (mode11g->rates[i] != 10 && mode11g->rates[i] != 20 &&
3162                     mode11g->rates[i] != 55 && mode11g->rates[i] != 110)
3163                         continue;
3164                 mode->rates[mode->num_rates] = mode11g->rates[i];
3165                 mode->num_rates++;
3166                 if (mode->num_rates == 4)
3167                         break;
3168         }
3169
3170         if (mode->num_rates == 0) {
3171                 os_free(mode->channels);
3172                 os_free(mode->rates);
3173                 (*num_modes)--;
3174                 return modes; /* No 802.11b rates */
3175         }
3176
3177         wpa_printf(MSG_DEBUG, "nl80211: Added 802.11b mode based on 802.11g "
3178                    "information");
3179
3180         return modes;
3181 }
3182
3183
3184 static void nl80211_set_ht40_mode(struct hostapd_hw_modes *mode, int start,
3185                                   int end)
3186 {
3187         int c;
3188
3189         for (c = 0; c < mode->num_channels; c++) {
3190                 struct hostapd_channel_data *chan = &mode->channels[c];
3191                 if (chan->freq - 10 >= start && chan->freq + 10 <= end)
3192                         chan->flag |= HOSTAPD_CHAN_HT40;
3193         }
3194 }
3195
3196
3197 static void nl80211_set_ht40_mode_sec(struct hostapd_hw_modes *mode, int start,
3198                                       int end)
3199 {
3200         int c;
3201
3202         for (c = 0; c < mode->num_channels; c++) {
3203                 struct hostapd_channel_data *chan = &mode->channels[c];
3204                 if (!(chan->flag & HOSTAPD_CHAN_HT40))
3205                         continue;
3206                 if (chan->freq - 30 >= start && chan->freq - 10 <= end)
3207                         chan->flag |= HOSTAPD_CHAN_HT40MINUS;
3208                 if (chan->freq + 10 >= start && chan->freq + 30 <= end)
3209                         chan->flag |= HOSTAPD_CHAN_HT40PLUS;
3210         }
3211 }
3212
3213
3214 static void nl80211_reg_rule_ht40(struct nlattr *tb[],
3215                                   struct phy_info_arg *results)
3216 {
3217         u32 start, end, max_bw;
3218         u16 m;
3219
3220         if (tb[NL80211_ATTR_FREQ_RANGE_START] == NULL ||
3221             tb[NL80211_ATTR_FREQ_RANGE_END] == NULL ||
3222             tb[NL80211_ATTR_FREQ_RANGE_MAX_BW] == NULL)
3223                 return;
3224
3225         start = nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]) / 1000;
3226         end = nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]) / 1000;
3227         max_bw = nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]) / 1000;
3228
3229         wpa_printf(MSG_DEBUG, "nl80211: %u-%u @ %u MHz",
3230                    start, end, max_bw);
3231         if (max_bw < 40)
3232                 return;
3233
3234         for (m = 0; m < *results->num_modes; m++) {
3235                 if (!(results->modes[m].ht_capab &
3236                       HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET))
3237                         continue;
3238                 nl80211_set_ht40_mode(&results->modes[m], start, end);
3239         }
3240 }
3241
3242
3243 static void nl80211_reg_rule_sec(struct nlattr *tb[],
3244                                  struct phy_info_arg *results)
3245 {
3246         u32 start, end, max_bw;
3247         u16 m;
3248
3249         if (tb[NL80211_ATTR_FREQ_RANGE_START] == NULL ||
3250             tb[NL80211_ATTR_FREQ_RANGE_END] == NULL ||
3251             tb[NL80211_ATTR_FREQ_RANGE_MAX_BW] == NULL)
3252                 return;
3253
3254         start = nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]) / 1000;
3255         end = nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]) / 1000;
3256         max_bw = nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]) / 1000;
3257
3258         if (max_bw < 20)
3259                 return;
3260
3261         for (m = 0; m < *results->num_modes; m++) {
3262                 if (!(results->modes[m].ht_capab &
3263                       HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET))
3264                         continue;
3265                 nl80211_set_ht40_mode_sec(&results->modes[m], start, end);
3266         }
3267 }
3268
3269
3270 static int nl80211_get_reg(struct nl_msg *msg, void *arg)
3271 {
3272         struct phy_info_arg *results = arg;
3273         struct nlattr *tb_msg[NL80211_ATTR_MAX + 1];
3274         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
3275         struct nlattr *nl_rule;
3276         struct nlattr *tb_rule[NL80211_FREQUENCY_ATTR_MAX + 1];
3277         int rem_rule;
3278         static struct nla_policy reg_policy[NL80211_FREQUENCY_ATTR_MAX + 1] = {
3279                 [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 },
3280                 [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 },
3281                 [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 },
3282                 [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 },
3283                 [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 },
3284                 [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 },
3285         };
3286
3287         nla_parse(tb_msg, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
3288                   genlmsg_attrlen(gnlh, 0), NULL);
3289         if (!tb_msg[NL80211_ATTR_REG_ALPHA2] ||
3290             !tb_msg[NL80211_ATTR_REG_RULES]) {
3291                 wpa_printf(MSG_DEBUG, "nl80211: No regulatory information "
3292                            "available");
3293                 return NL_SKIP;
3294         }
3295
3296         wpa_printf(MSG_DEBUG, "nl80211: Regulatory information - country=%s",
3297                    (char *) nla_data(tb_msg[NL80211_ATTR_REG_ALPHA2]));
3298
3299         nla_for_each_nested(nl_rule, tb_msg[NL80211_ATTR_REG_RULES], rem_rule)
3300         {
3301                 nla_parse(tb_rule, NL80211_FREQUENCY_ATTR_MAX,
3302                           nla_data(nl_rule), nla_len(nl_rule), reg_policy);
3303                 nl80211_reg_rule_ht40(tb_rule, results);
3304         }
3305
3306         nla_for_each_nested(nl_rule, tb_msg[NL80211_ATTR_REG_RULES], rem_rule)
3307         {
3308                 nla_parse(tb_rule, NL80211_FREQUENCY_ATTR_MAX,
3309                           nla_data(nl_rule), nla_len(nl_rule), reg_policy);
3310                 nl80211_reg_rule_sec(tb_rule, results);
3311         }
3312
3313         return NL_SKIP;
3314 }
3315
3316
3317 static int nl80211_set_ht40_flags(struct wpa_driver_nl80211_data *drv,
3318                                   struct phy_info_arg *results)
3319 {
3320         struct nl_msg *msg;
3321
3322         msg = nlmsg_alloc();
3323         if (!msg)
3324                 return -ENOMEM;
3325
3326         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3327                     0, NL80211_CMD_GET_REG, 0);
3328         return send_and_recv_msgs(drv, msg, nl80211_get_reg, results);
3329 }
3330
3331
3332 static struct hostapd_hw_modes *
3333 wpa_driver_nl80211_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags)
3334 {
3335         struct i802_bss *bss = priv;
3336         struct wpa_driver_nl80211_data *drv = bss->drv;
3337         struct nl_msg *msg;
3338         struct phy_info_arg result = {
3339                 .num_modes = num_modes,
3340                 .modes = NULL,
3341         };
3342
3343         *num_modes = 0;
3344         *flags = 0;
3345
3346         msg = nlmsg_alloc();
3347         if (!msg)
3348                 return NULL;
3349
3350         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3351                     0, NL80211_CMD_GET_WIPHY, 0);
3352
3353         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
3354
3355         if (send_and_recv_msgs(drv, msg, phy_info_handler, &result) == 0) {
3356                 nl80211_set_ht40_flags(drv, &result);
3357                 return wpa_driver_nl80211_add_11b(result.modes, num_modes);
3358         }
3359  nla_put_failure:
3360         return NULL;
3361 }
3362
3363
3364 static int wpa_driver_nl80211_send_frame(struct wpa_driver_nl80211_data *drv,
3365                                          const void *data, size_t len,
3366                                          int encrypt)
3367 {
3368         __u8 rtap_hdr[] = {
3369                 0x00, 0x00, /* radiotap version */
3370                 0x0e, 0x00, /* radiotap length */
3371                 0x02, 0xc0, 0x00, 0x00, /* bmap: flags, tx and rx flags */
3372                 IEEE80211_RADIOTAP_F_FRAG, /* F_FRAG (fragment if required) */
3373                 0x00,       /* padding */
3374                 0x00, 0x00, /* RX and TX flags to indicate that */
3375                 0x00, 0x00, /* this is the injected frame directly */
3376         };
3377         struct iovec iov[2] = {
3378                 {
3379                         .iov_base = &rtap_hdr,
3380                         .iov_len = sizeof(rtap_hdr),
3381                 },
3382                 {
3383                         .iov_base = (void *) data,
3384                         .iov_len = len,
3385                 }
3386         };
3387         struct msghdr msg = {
3388                 .msg_name = NULL,
3389                 .msg_namelen = 0,
3390                 .msg_iov = iov,
3391                 .msg_iovlen = 2,
3392                 .msg_control = NULL,
3393                 .msg_controllen = 0,
3394                 .msg_flags = 0,
3395         };
3396         int res;
3397
3398         if (encrypt)
3399                 rtap_hdr[8] |= IEEE80211_RADIOTAP_F_WEP;
3400
3401         res = sendmsg(drv->monitor_sock, &msg, 0);
3402         if (res < 0) {
3403                 wpa_printf(MSG_INFO, "nl80211: sendmsg: %s", strerror(errno));
3404                 return -1;
3405         }
3406         return 0;
3407 }
3408
3409
3410 static int wpa_driver_nl80211_send_mlme(void *priv, const u8 *data,
3411                                         size_t data_len)
3412 {
3413         struct i802_bss *bss = priv;
3414         struct wpa_driver_nl80211_data *drv = bss->drv;
3415         struct ieee80211_mgmt *mgmt;
3416         int encrypt = 1;
3417         u16 fc;
3418
3419         mgmt = (struct ieee80211_mgmt *) data;
3420         fc = le_to_host16(mgmt->frame_control);
3421
3422         if (drv->nlmode == NL80211_IFTYPE_STATION &&
3423             WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
3424             WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_PROBE_RESP) {
3425                 /*
3426                  * The use of last_mgmt_freq is a bit of a hack,
3427                  * but it works due to the single-threaded nature
3428                  * of wpa_supplicant.
3429                  */
3430                 return nl80211_send_frame_cmd(drv, drv->last_mgmt_freq,
3431                                               data, data_len, NULL);
3432         }
3433
3434         if (WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
3435             WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_AUTH) {
3436                 /*
3437                  * Only one of the authentication frame types is encrypted.
3438                  * In order for static WEP encryption to work properly (i.e.,
3439                  * to not encrypt the frame), we need to tell mac80211 about
3440                  * the frames that must not be encrypted.
3441                  */
3442                 u16 auth_alg = le_to_host16(mgmt->u.auth.auth_alg);
3443                 u16 auth_trans = le_to_host16(mgmt->u.auth.auth_transaction);
3444                 if (auth_alg != WLAN_AUTH_SHARED_KEY || auth_trans != 3)
3445                         encrypt = 0;
3446         }
3447
3448         return wpa_driver_nl80211_send_frame(drv, data, data_len, encrypt);
3449 }
3450
3451
3452 static int wpa_driver_nl80211_set_beacon(void *priv,
3453                                          const u8 *head, size_t head_len,
3454                                          const u8 *tail, size_t tail_len,
3455                                          int dtim_period, int beacon_int)
3456 {
3457         struct i802_bss *bss = priv;
3458         struct wpa_driver_nl80211_data *drv = bss->drv;
3459         struct nl_msg *msg;
3460         u8 cmd = NL80211_CMD_NEW_BEACON;
3461         int ret;
3462         int beacon_set;
3463         int ifindex = if_nametoindex(bss->ifname);
3464
3465         beacon_set = bss->beacon_set;
3466
3467         msg = nlmsg_alloc();
3468         if (!msg)
3469                 return -ENOMEM;
3470
3471         wpa_printf(MSG_DEBUG, "nl80211: Set beacon (beacon_set=%d)",
3472                    beacon_set);
3473         if (beacon_set)
3474                 cmd = NL80211_CMD_SET_BEACON;
3475
3476         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3477                     0, cmd, 0);
3478         NLA_PUT(msg, NL80211_ATTR_BEACON_HEAD, head_len, head);
3479         NLA_PUT(msg, NL80211_ATTR_BEACON_TAIL, tail_len, tail);
3480         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
3481         NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL, beacon_int);
3482         NLA_PUT_U32(msg, NL80211_ATTR_DTIM_PERIOD, dtim_period);
3483
3484         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
3485         if (ret) {
3486                 wpa_printf(MSG_DEBUG, "nl80211: Beacon set failed: %d (%s)",
3487                            ret, strerror(-ret));
3488         } else {
3489                 bss->beacon_set = 1;
3490         }
3491         return ret;
3492  nla_put_failure:
3493         return -ENOBUFS;
3494 }
3495
3496
3497 static int wpa_driver_nl80211_set_freq(struct wpa_driver_nl80211_data *drv,
3498                                        int freq, int ht_enabled,
3499                                        int sec_channel_offset)
3500 {
3501         struct nl_msg *msg;
3502         int ret;
3503
3504         msg = nlmsg_alloc();
3505         if (!msg)
3506                 return -1;
3507
3508         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
3509                     NL80211_CMD_SET_WIPHY, 0);
3510
3511         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
3512         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
3513         if (ht_enabled) {
3514                 switch (sec_channel_offset) {
3515                 case -1:
3516                         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
3517                                     NL80211_CHAN_HT40MINUS);
3518                         break;
3519                 case 1:
3520                         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
3521                                     NL80211_CHAN_HT40PLUS);
3522                         break;
3523                 default:
3524                         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
3525                                     NL80211_CHAN_HT20);
3526                         break;
3527                 }
3528         }
3529
3530         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
3531         if (ret == 0)
3532                 return 0;
3533         wpa_printf(MSG_DEBUG, "nl80211: Failed to set channel (freq=%d): "
3534                    "%d (%s)", freq, ret, strerror(-ret));
3535 nla_put_failure:
3536         return -1;
3537 }
3538
3539
3540 static int wpa_driver_nl80211_sta_add(void *priv,
3541                                       struct hostapd_sta_add_params *params)
3542 {
3543         struct i802_bss *bss = priv;
3544         struct wpa_driver_nl80211_data *drv = bss->drv;
3545         struct nl_msg *msg;
3546         int ret = -ENOBUFS;
3547
3548         msg = nlmsg_alloc();
3549         if (!msg)
3550                 return -ENOMEM;
3551
3552         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3553                     0, NL80211_CMD_NEW_STATION, 0);
3554
3555         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname));
3556         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, params->addr);
3557         NLA_PUT_U16(msg, NL80211_ATTR_STA_AID, params->aid);
3558         NLA_PUT(msg, NL80211_ATTR_STA_SUPPORTED_RATES, params->supp_rates_len,
3559                 params->supp_rates);
3560         NLA_PUT_U16(msg, NL80211_ATTR_STA_LISTEN_INTERVAL,
3561                     params->listen_interval);
3562         if (params->ht_capabilities) {
3563                 NLA_PUT(msg, NL80211_ATTR_HT_CAPABILITY,
3564                         sizeof(*params->ht_capabilities),
3565                         params->ht_capabilities);
3566         }
3567
3568         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
3569         if (ret)
3570                 wpa_printf(MSG_DEBUG, "nl80211: NL80211_CMD_NEW_STATION "
3571                            "result: %d (%s)", ret, strerror(-ret));
3572         if (ret == -EEXIST)
3573                 ret = 0;
3574  nla_put_failure:
3575         return ret;
3576 }
3577
3578
3579 static int wpa_driver_nl80211_sta_remove(void *priv, const u8 *addr)
3580 {
3581         struct i802_bss *bss = priv;
3582         struct wpa_driver_nl80211_data *drv = bss->drv;
3583         struct nl_msg *msg;
3584         int ret;
3585
3586         msg = nlmsg_alloc();
3587         if (!msg)
3588                 return -ENOMEM;
3589
3590         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3591                     0, NL80211_CMD_DEL_STATION, 0);
3592
3593         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
3594                     if_nametoindex(bss->ifname));
3595         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
3596
3597         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
3598         if (ret == -ENOENT)
3599                 return 0;
3600         return ret;
3601  nla_put_failure:
3602         return -ENOBUFS;
3603 }
3604
3605
3606 static void nl80211_remove_iface(struct wpa_driver_nl80211_data *drv,
3607                                  int ifidx)
3608 {
3609         struct nl_msg *msg;
3610
3611         wpa_printf(MSG_DEBUG, "nl80211: Remove interface ifindex=%d", ifidx);
3612
3613 #ifdef HOSTAPD
3614         /* stop listening for EAPOL on this interface */
3615         del_ifidx(drv, ifidx);
3616 #endif /* HOSTAPD */
3617
3618         msg = nlmsg_alloc();
3619         if (!msg)
3620                 goto nla_put_failure;
3621
3622         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3623                     0, NL80211_CMD_DEL_INTERFACE, 0);
3624         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifidx);
3625
3626         if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0)
3627                 return;
3628  nla_put_failure:
3629         wpa_printf(MSG_ERROR, "Failed to remove interface (ifidx=%d)", ifidx);
3630 }
3631
3632
3633 static int nl80211_create_iface_once(struct wpa_driver_nl80211_data *drv,
3634                                      const char *ifname,
3635                                      enum nl80211_iftype iftype,
3636                                      const u8 *addr, int wds)
3637 {
3638         struct nl_msg *msg, *flags = NULL;
3639         int ifidx;
3640         int ret = -ENOBUFS;
3641
3642         msg = nlmsg_alloc();
3643         if (!msg)
3644                 return -1;
3645
3646         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
3647                     0, NL80211_CMD_NEW_INTERFACE, 0);
3648         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
3649         NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, ifname);
3650         NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, iftype);
3651
3652         if (iftype == NL80211_IFTYPE_MONITOR) {
3653                 int err;
3654
3655                 flags = nlmsg_alloc();
3656                 if (!flags)
3657                         goto nla_put_failure;
3658
3659                 NLA_PUT_FLAG(flags, NL80211_MNTR_FLAG_COOK_FRAMES);
3660
3661                 err = nla_put_nested(msg, NL80211_ATTR_MNTR_FLAGS, flags);
3662
3663                 nlmsg_free(flags);
3664
3665                 if (err)
3666                         goto nla_put_failure;
3667         } else if (wds) {
3668                 NLA_PUT_U8(msg, NL80211_ATTR_4ADDR, wds);
3669         }
3670
3671         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
3672         if (ret) {
3673  nla_put_failure:
3674                 wpa_printf(MSG_ERROR, "Failed to create interface %s: %d (%s)",
3675                            ifname, ret, strerror(-ret));
3676                 return ret;
3677         }
3678
3679         ifidx = if_nametoindex(ifname);
3680         wpa_printf(MSG_DEBUG, "nl80211: New interface %s created: ifindex=%d",
3681                    ifname, ifidx);
3682
3683         if (ifidx <= 0)
3684                 return -1;
3685
3686 #ifdef HOSTAPD
3687         /* start listening for EAPOL on this interface */
3688         add_ifidx(drv, ifidx);
3689 #endif /* HOSTAPD */
3690
3691         if (addr && iftype != NL80211_IFTYPE_MONITOR &&
3692             linux_set_ifhwaddr(drv->ioctl_sock, ifname, addr)) {
3693                 nl80211_remove_iface(drv, ifidx);
3694                 return -1;
3695         }
3696
3697         return ifidx;
3698 }
3699
3700
3701 static int nl80211_create_iface(struct wpa_driver_nl80211_data *drv,
3702                                 const char *ifname, enum nl80211_iftype iftype,
3703                                 const u8 *addr, int wds)
3704 {
3705         int ret;
3706
3707         ret = nl80211_create_iface_once(drv, ifname, iftype, addr, wds);
3708
3709         /* if error occured and interface exists already */
3710         if (ret == -ENFILE && if_nametoindex(ifname)) {
3711                 wpa_printf(MSG_INFO, "Try to remove and re-create %s", ifname);
3712
3713                 /* Try to remove the interface that was already there. */
3714                 nl80211_remove_iface(drv, if_nametoindex(ifname));
3715
3716                 /* Try to create the interface again */
3717                 ret = nl80211_create_iface_once(drv, ifname, iftype, addr,
3718                                                 wds);
3719         }
3720
3721         if (ret >= 0 && drv->disable_11b_rates)
3722                 nl80211_disable_11b_rates(drv, ret, 1);
3723
3724         return ret;
3725 }
3726
3727
3728 static void handle_tx_callback(void *ctx, u8 *buf, size_t len, int ok)
3729 {
3730         struct ieee80211_hdr *hdr;
3731         u16 fc;
3732         union wpa_event_data event;
3733
3734         hdr = (struct ieee80211_hdr *) buf;
3735         fc = le_to_host16(hdr->frame_control);
3736
3737         os_memset(&event, 0, sizeof(event));
3738         event.tx_status.type = WLAN_FC_GET_TYPE(fc);
3739         event.tx_status.stype = WLAN_FC_GET_STYPE(fc);
3740         event.tx_status.dst = hdr->addr1;
3741         event.tx_status.data = buf;
3742         event.tx_status.data_len = len;
3743         event.tx_status.ack = ok;
3744         wpa_supplicant_event(ctx, EVENT_TX_STATUS, &event);
3745 }
3746
3747
3748 static void from_unknown_sta(struct wpa_driver_nl80211_data *drv,
3749                              u8 *buf, size_t len)
3750 {
3751         union wpa_event_data event;
3752         os_memset(&event, 0, sizeof(event));
3753         event.rx_from_unknown.frame = buf;
3754         event.rx_from_unknown.len = len;
3755         wpa_supplicant_event(drv->ctx, EVENT_RX_FROM_UNKNOWN, &event);
3756 }
3757
3758
3759 static void handle_frame(struct wpa_driver_nl80211_data *drv,
3760                          u8 *buf, size_t len, int datarate, int ssi_signal)
3761 {
3762         struct ieee80211_hdr *hdr;
3763         u16 fc;
3764         union wpa_event_data event;
3765
3766         hdr = (struct ieee80211_hdr *) buf;
3767         fc = le_to_host16(hdr->frame_control);
3768
3769         switch (WLAN_FC_GET_TYPE(fc)) {
3770         case WLAN_FC_TYPE_MGMT:
3771                 os_memset(&event, 0, sizeof(event));
3772                 event.rx_mgmt.frame = buf;
3773                 event.rx_mgmt.frame_len = len;
3774                 event.rx_mgmt.datarate = datarate;
3775                 event.rx_mgmt.ssi_signal = ssi_signal;
3776                 wpa_supplicant_event(drv->ctx, EVENT_RX_MGMT, &event);
3777                 break;
3778         case WLAN_FC_TYPE_CTRL:
3779                 /* can only get here with PS-Poll frames */
3780                 wpa_printf(MSG_DEBUG, "CTRL");
3781                 from_unknown_sta(drv, buf, len);
3782                 break;
3783         case WLAN_FC_TYPE_DATA:
3784                 from_unknown_sta(drv, buf, len);
3785                 break;
3786         }
3787 }
3788
3789
3790 static void handle_monitor_read(int sock, void *eloop_ctx, void *sock_ctx)
3791 {
3792         struct wpa_driver_nl80211_data *drv = eloop_ctx;
3793         int len;
3794         unsigned char buf[3000];
3795         struct ieee80211_radiotap_iterator iter;
3796         int ret;
3797         int datarate = 0, ssi_signal = 0;
3798         int injected = 0, failed = 0, rxflags = 0;
3799
3800         len = recv(sock, buf, sizeof(buf), 0);
3801         if (len < 0) {
3802                 perror("recv");
3803                 return;
3804         }
3805
3806         if (ieee80211_radiotap_iterator_init(&iter, (void*)buf, len)) {
3807                 printf("received invalid radiotap frame\n");
3808                 return;
3809         }
3810
3811         while (1) {
3812                 ret = ieee80211_radiotap_iterator_next(&iter);
3813                 if (ret == -ENOENT)
3814                         break;
3815                 if (ret) {
3816                         printf("received invalid radiotap frame (%d)\n", ret);
3817                         return;
3818                 }
3819                 switch (iter.this_arg_index) {
3820                 case IEEE80211_RADIOTAP_FLAGS:
3821                         if (*iter.this_arg & IEEE80211_RADIOTAP_F_FCS)
3822                                 len -= 4;
3823                         break;
3824                 case IEEE80211_RADIOTAP_RX_FLAGS:
3825                         rxflags = 1;
3826                         break;
3827                 case IEEE80211_RADIOTAP_TX_FLAGS:
3828                         injected = 1;
3829                         failed = le_to_host16((*(uint16_t *) iter.this_arg)) &
3830                                         IEEE80211_RADIOTAP_F_TX_FAIL;
3831                         break;
3832                 case IEEE80211_RADIOTAP_DATA_RETRIES:
3833                         break;
3834                 case IEEE80211_RADIOTAP_CHANNEL:
3835                         /* TODO: convert from freq/flags to channel number */
3836                         break;
3837                 case IEEE80211_RADIOTAP_RATE:
3838                         datarate = *iter.this_arg * 5;
3839                         break;
3840                 case IEEE80211_RADIOTAP_DB_ANTSIGNAL:
3841                         ssi_signal = *iter.this_arg;
3842                         break;
3843                 }
3844         }
3845
3846         if (rxflags && injected)
3847                 return;
3848
3849         if (!injected)
3850                 handle_frame(drv, buf + iter.max_length,
3851                              len - iter.max_length, datarate, ssi_signal);
3852         else
3853                 handle_tx_callback(drv->ctx, buf + iter.max_length,
3854                                    len - iter.max_length, !failed);
3855 }
3856
3857
3858 /*
3859  * we post-process the filter code later and rewrite
3860  * this to the offset to the last instruction
3861  */
3862 #define PASS    0xFF
3863 #define FAIL    0xFE
3864
3865 static struct sock_filter msock_filter_insns[] = {
3866         /*
3867          * do a little-endian load of the radiotap length field
3868          */
3869         /* load lower byte into A */
3870         BPF_STMT(BPF_LD  | BPF_B | BPF_ABS, 2),
3871         /* put it into X (== index register) */
3872         BPF_STMT(BPF_MISC| BPF_TAX, 0),
3873         /* load upper byte into A */
3874         BPF_STMT(BPF_LD  | BPF_B | BPF_ABS, 3),
3875         /* left-shift it by 8 */
3876         BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 8),
3877         /* or with X */
3878         BPF_STMT(BPF_ALU | BPF_OR | BPF_X, 0),
3879         /* put result into X */
3880         BPF_STMT(BPF_MISC| BPF_TAX, 0),
3881
3882         /*
3883          * Allow management frames through, this also gives us those
3884          * management frames that we sent ourselves with status
3885          */
3886         /* load the lower byte of the IEEE 802.11 frame control field */
3887         BPF_STMT(BPF_LD  | BPF_B | BPF_IND, 0),
3888         /* mask off frame type and version */
3889         BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xF),
3890         /* accept frame if it's both 0, fall through otherwise */
3891         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, PASS, 0),
3892
3893         /*
3894          * TODO: add a bit to radiotap RX flags that indicates
3895          * that the sending station is not associated, then
3896          * add a filter here that filters on our DA and that flag
3897          * to allow us to deauth frames to that bad station.
3898          *
3899          * For now allow all To DS data frames through.
3900          */
3901         /* load the IEEE 802.11 frame control field */
3902         BPF_STMT(BPF_LD  | BPF_H | BPF_IND, 0),
3903         /* mask off frame type, version and DS status */
3904         BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0x0F03),
3905         /* accept frame if version 0, type 2 and To DS, fall through otherwise
3906          */
3907         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0801, PASS, 0),
3908
3909 #if 0
3910         /*
3911          * drop non-data frames
3912          */
3913         /* load the lower byte of the frame control field */
3914         BPF_STMT(BPF_LD   | BPF_B | BPF_IND, 0),
3915         /* mask off QoS bit */
3916         BPF_STMT(BPF_ALU  | BPF_AND | BPF_K, 0x0c),
3917         /* drop non-data frames */
3918         BPF_JUMP(BPF_JMP  | BPF_JEQ | BPF_K, 8, 0, FAIL),
3919 #endif
3920         /* load the upper byte of the frame control field */
3921         BPF_STMT(BPF_LD   | BPF_B | BPF_IND, 1),
3922         /* mask off toDS/fromDS */
3923         BPF_STMT(BPF_ALU  | BPF_AND | BPF_K, 0x03),
3924         /* accept WDS frames */
3925         BPF_JUMP(BPF_JMP  | BPF_JEQ | BPF_K, 3, PASS, 0),
3926
3927         /*
3928          * add header length to index
3929          */
3930         /* load the lower byte of the frame control field */
3931         BPF_STMT(BPF_LD   | BPF_B | BPF_IND, 0),
3932         /* mask off QoS bit */
3933         BPF_STMT(BPF_ALU  | BPF_AND | BPF_K, 0x80),
3934         /* right shift it by 6 to give 0 or 2 */
3935         BPF_STMT(BPF_ALU  | BPF_RSH | BPF_K, 6),
3936         /* add data frame header length */
3937         BPF_STMT(BPF_ALU  | BPF_ADD | BPF_K, 24),
3938         /* add index, was start of 802.11 header */
3939         BPF_STMT(BPF_ALU  | BPF_ADD | BPF_X, 0),
3940         /* move to index, now start of LL header */
3941         BPF_STMT(BPF_MISC | BPF_TAX, 0),
3942
3943         /*
3944          * Accept empty data frames, we use those for
3945          * polling activity.
3946          */
3947         BPF_STMT(BPF_LD  | BPF_W | BPF_LEN, 0),
3948         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, PASS, 0),
3949
3950         /*
3951          * Accept EAPOL frames
3952          */
3953         BPF_STMT(BPF_LD  | BPF_W | BPF_IND, 0),
3954         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0xAAAA0300, 0, FAIL),
3955         BPF_STMT(BPF_LD  | BPF_W | BPF_IND, 4),
3956         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0000888E, PASS, FAIL),
3957
3958         /* keep these last two statements or change the code below */
3959         /* return 0 == "DROP" */
3960         BPF_STMT(BPF_RET | BPF_K, 0),
3961         /* return ~0 == "keep all" */
3962         BPF_STMT(BPF_RET | BPF_K, ~0),
3963 };
3964
3965 static struct sock_fprog msock_filter = {
3966         .len = sizeof(msock_filter_insns)/sizeof(msock_filter_insns[0]),
3967         .filter = msock_filter_insns,
3968 };
3969
3970
3971 static int add_monitor_filter(int s)
3972 {
3973         int idx;
3974
3975         /* rewrite all PASS/FAIL jump offsets */
3976         for (idx = 0; idx < msock_filter.len; idx++) {
3977                 struct sock_filter *insn = &msock_filter_insns[idx];
3978
3979                 if (BPF_CLASS(insn->code) == BPF_JMP) {
3980                         if (insn->code == (BPF_JMP|BPF_JA)) {
3981                                 if (insn->k == PASS)
3982                                         insn->k = msock_filter.len - idx - 2;
3983                                 else if (insn->k == FAIL)
3984                                         insn->k = msock_filter.len - idx - 3;
3985                         }
3986
3987                         if (insn->jt == PASS)
3988                                 insn->jt = msock_filter.len - idx - 2;
3989                         else if (insn->jt == FAIL)
3990                                 insn->jt = msock_filter.len - idx - 3;
3991
3992                         if (insn->jf == PASS)
3993                                 insn->jf = msock_filter.len - idx - 2;
3994                         else if (insn->jf == FAIL)
3995                                 insn->jf = msock_filter.len - idx - 3;
3996                 }
3997         }
3998
3999         if (setsockopt(s, SOL_SOCKET, SO_ATTACH_FILTER,
4000                        &msock_filter, sizeof(msock_filter))) {
4001                 perror("SO_ATTACH_FILTER");
4002                 return -1;
4003         }
4004
4005         return 0;
4006 }
4007
4008
4009 static void nl80211_remove_monitor_interface(
4010         struct wpa_driver_nl80211_data *drv)
4011 {
4012         if (drv->monitor_ifidx >= 0) {
4013                 nl80211_remove_iface(drv, drv->monitor_ifidx);
4014                 drv->monitor_ifidx = -1;
4015         }
4016         if (drv->monitor_sock >= 0) {
4017                 eloop_unregister_read_sock(drv->monitor_sock);
4018                 close(drv->monitor_sock);
4019                 drv->monitor_sock = -1;
4020         }
4021 }
4022
4023
4024 static int
4025 nl80211_create_monitor_interface(struct wpa_driver_nl80211_data *drv)
4026 {
4027         char buf[IFNAMSIZ];
4028         struct sockaddr_ll ll;
4029         int optval;
4030         socklen_t optlen;
4031
4032         snprintf(buf, IFNAMSIZ, "mon.%s", drv->first_bss.ifname);
4033         buf[IFNAMSIZ - 1] = '\0';
4034
4035         drv->monitor_ifidx =
4036                 nl80211_create_iface(drv, buf, NL80211_IFTYPE_MONITOR, NULL,
4037                                      0);
4038
4039         if (drv->monitor_ifidx < 0)
4040                 return -1;
4041
4042         if (linux_set_iface_flags(drv->ioctl_sock, buf, 1))
4043                 goto error;
4044
4045         memset(&ll, 0, sizeof(ll));
4046         ll.sll_family = AF_PACKET;
4047         ll.sll_ifindex = drv->monitor_ifidx;
4048         drv->monitor_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
4049         if (drv->monitor_sock < 0) {
4050                 perror("socket[PF_PACKET,SOCK_RAW]");
4051                 goto error;
4052         }
4053
4054         if (add_monitor_filter(drv->monitor_sock)) {
4055                 wpa_printf(MSG_INFO, "Failed to set socket filter for monitor "
4056                            "interface; do filtering in user space");
4057                 /* This works, but will cost in performance. */
4058         }
4059
4060         if (bind(drv->monitor_sock, (struct sockaddr *) &ll, sizeof(ll)) < 0) {
4061                 perror("monitor socket bind");
4062                 goto error;
4063         }
4064
4065         optlen = sizeof(optval);
4066         optval = 20;
4067         if (setsockopt
4068             (drv->monitor_sock, SOL_SOCKET, SO_PRIORITY, &optval, optlen)) {
4069                 perror("Failed to set socket priority");
4070                 goto error;
4071         }
4072
4073         if (eloop_register_read_sock(drv->monitor_sock, handle_monitor_read,
4074                                      drv, NULL)) {
4075                 printf("Could not register monitor read socket\n");
4076                 goto error;
4077         }
4078
4079         return 0;
4080  error:
4081         nl80211_remove_monitor_interface(drv);
4082         return -1;
4083 }
4084
4085
4086 static const u8 rfc1042_header[6] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
4087
4088 static int wpa_driver_nl80211_hapd_send_eapol(
4089         void *priv, const u8 *addr, const u8 *data,
4090         size_t data_len, int encrypt, const u8 *own_addr)
4091 {
4092         struct i802_bss *bss = priv;
4093         struct wpa_driver_nl80211_data *drv = bss->drv;
4094         struct ieee80211_hdr *hdr;
4095         size_t len;
4096         u8 *pos;
4097         int res;
4098 #if 0 /* FIX */
4099         int qos = sta->flags & WPA_STA_WMM;
4100 #else
4101         int qos = 0;
4102 #endif
4103
4104         len = sizeof(*hdr) + (qos ? 2 : 0) + sizeof(rfc1042_header) + 2 +
4105                 data_len;
4106         hdr = os_zalloc(len);
4107         if (hdr == NULL) {
4108                 printf("malloc() failed for i802_send_data(len=%lu)\n",
4109                        (unsigned long) len);
4110                 return -1;
4111         }
4112
4113         hdr->frame_control =
4114                 IEEE80211_FC(WLAN_FC_TYPE_DATA, WLAN_FC_STYPE_DATA);
4115         hdr->frame_control |= host_to_le16(WLAN_FC_FROMDS);
4116         if (encrypt)
4117                 hdr->frame_control |= host_to_le16(WLAN_FC_ISWEP);
4118 #if 0 /* To be enabled if qos determination is added above */
4119         if (qos) {
4120                 hdr->frame_control |=
4121                         host_to_le16(WLAN_FC_STYPE_QOS_DATA << 4);
4122         }
4123 #endif
4124
4125         memcpy(hdr->IEEE80211_DA_FROMDS, addr, ETH_ALEN);
4126         memcpy(hdr->IEEE80211_BSSID_FROMDS, own_addr, ETH_ALEN);
4127         memcpy(hdr->IEEE80211_SA_FROMDS, own_addr, ETH_ALEN);
4128         pos = (u8 *) (hdr + 1);
4129
4130 #if 0 /* To be enabled if qos determination is added above */
4131         if (qos) {
4132                 /* add an empty QoS header if needed */
4133                 pos[0] = 0;
4134                 pos[1] = 0;
4135                 pos += 2;
4136         }
4137 #endif
4138
4139         memcpy(pos, rfc1042_header, sizeof(rfc1042_header));
4140         pos += sizeof(rfc1042_header);
4141         WPA_PUT_BE16(pos, ETH_P_PAE);
4142         pos += 2;
4143         memcpy(pos, data, data_len);
4144
4145         res = wpa_driver_nl80211_send_frame(drv, (u8 *) hdr, len, encrypt);
4146         if (res < 0) {
4147                 wpa_printf(MSG_ERROR, "i802_send_eapol - packet len: %lu - "
4148                            "failed: %d (%s)",
4149                            (unsigned long) len, errno, strerror(errno));
4150         }
4151         os_free(hdr);
4152
4153         return res;
4154 }
4155
4156
4157 static u32 sta_flags_nl80211(int flags)
4158 {
4159         u32 f = 0;
4160
4161         if (flags & WPA_STA_AUTHORIZED)
4162                 f |= BIT(NL80211_STA_FLAG_AUTHORIZED);
4163         if (flags & WPA_STA_WMM)
4164                 f |= BIT(NL80211_STA_FLAG_WME);
4165         if (flags & WPA_STA_SHORT_PREAMBLE)
4166                 f |= BIT(NL80211_STA_FLAG_SHORT_PREAMBLE);
4167         if (flags & WPA_STA_MFP)
4168                 f |= BIT(NL80211_STA_FLAG_MFP);
4169
4170         return f;
4171 }
4172
4173
4174 static int wpa_driver_nl80211_sta_set_flags(void *priv, const u8 *addr,
4175                                             int total_flags,
4176                                             int flags_or, int flags_and)
4177 {
4178         struct i802_bss *bss = priv;
4179         struct wpa_driver_nl80211_data *drv = bss->drv;
4180         struct nl_msg *msg, *flags = NULL;
4181         struct nl80211_sta_flag_update upd;
4182
4183         msg = nlmsg_alloc();
4184         if (!msg)
4185                 return -ENOMEM;
4186
4187         flags = nlmsg_alloc();
4188         if (!flags) {
4189                 nlmsg_free(msg);
4190                 return -ENOMEM;
4191         }
4192
4193         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4194                     0, NL80211_CMD_SET_STATION, 0);
4195
4196         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
4197                     if_nametoindex(bss->ifname));
4198         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
4199
4200         /*
4201          * Backwards compatibility version using NL80211_ATTR_STA_FLAGS. This
4202          * can be removed eventually.
4203          */
4204         if (total_flags & WPA_STA_AUTHORIZED)
4205                 NLA_PUT_FLAG(flags, NL80211_STA_FLAG_AUTHORIZED);
4206
4207         if (total_flags & WPA_STA_WMM)
4208                 NLA_PUT_FLAG(flags, NL80211_STA_FLAG_WME);
4209
4210         if (total_flags & WPA_STA_SHORT_PREAMBLE)
4211                 NLA_PUT_FLAG(flags, NL80211_STA_FLAG_SHORT_PREAMBLE);
4212
4213         if (total_flags & WPA_STA_MFP)
4214                 NLA_PUT_FLAG(flags, NL80211_STA_FLAG_MFP);
4215
4216         if (nla_put_nested(msg, NL80211_ATTR_STA_FLAGS, flags))
4217                 goto nla_put_failure;
4218
4219         os_memset(&upd, 0, sizeof(upd));
4220         upd.mask = sta_flags_nl80211(flags_or | ~flags_and);
4221         upd.set = sta_flags_nl80211(flags_or);
4222         NLA_PUT(msg, NL80211_ATTR_STA_FLAGS2, sizeof(upd), &upd);
4223
4224         nlmsg_free(flags);
4225
4226         return send_and_recv_msgs(drv, msg, NULL, NULL);
4227  nla_put_failure:
4228         nlmsg_free(flags);
4229         return -ENOBUFS;
4230 }
4231
4232
4233 static int wpa_driver_nl80211_ap(struct wpa_driver_nl80211_data *drv,
4234                                  struct wpa_driver_associate_params *params)
4235 {
4236         if (params->p2p)
4237                 wpa_printf(MSG_DEBUG, "nl80211: Setup AP operations for P2P "
4238                            "group (GO)");
4239         if (wpa_driver_nl80211_set_mode(&drv->first_bss, params->mode) ||
4240             wpa_driver_nl80211_set_freq(drv, params->freq, 0, 0)) {
4241                 nl80211_remove_monitor_interface(drv);
4242                 return -1;
4243         }
4244
4245         /* TODO: setup monitor interface (and add code somewhere to remove this
4246          * when AP mode is stopped; associate with mode != 2 or drv_deinit) */
4247
4248         return 0;
4249 }
4250
4251
4252 static int nl80211_leave_ibss(struct wpa_driver_nl80211_data *drv)
4253 {
4254         struct nl_msg *msg;
4255         int ret = -1;
4256
4257         msg = nlmsg_alloc();
4258         if (!msg)
4259                 return -1;
4260
4261         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
4262                     NL80211_CMD_LEAVE_IBSS, 0);
4263         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
4264         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
4265         msg = NULL;
4266         if (ret) {
4267                 wpa_printf(MSG_DEBUG, "nl80211: Leave IBSS failed: ret=%d "
4268                            "(%s)", ret, strerror(-ret));
4269                 goto nla_put_failure;
4270         }
4271
4272         ret = 0;
4273         wpa_printf(MSG_DEBUG, "nl80211: Leave IBSS request sent successfully");
4274
4275 nla_put_failure:
4276         nlmsg_free(msg);
4277         return ret;
4278 }
4279
4280
4281 static int wpa_driver_nl80211_ibss(struct wpa_driver_nl80211_data *drv,
4282                                    struct wpa_driver_associate_params *params)
4283 {
4284         struct nl_msg *msg;
4285         int ret = -1;
4286         int count = 0;
4287
4288         wpa_printf(MSG_DEBUG, "nl80211: Join IBSS (ifindex=%d)", drv->ifindex);
4289
4290         if (wpa_driver_nl80211_set_mode(&drv->first_bss, params->mode)) {
4291                 wpa_printf(MSG_INFO, "nl80211: Failed to set interface into "
4292                            "IBSS mode");
4293                 return -1;
4294         }
4295
4296 retry:
4297         msg = nlmsg_alloc();
4298         if (!msg)
4299                 return -1;
4300
4301         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
4302                     NL80211_CMD_JOIN_IBSS, 0);
4303         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
4304
4305         if (params->ssid == NULL || params->ssid_len > sizeof(drv->ssid))
4306                 goto nla_put_failure;
4307
4308         wpa_hexdump_ascii(MSG_DEBUG, "  * SSID",
4309                           params->ssid, params->ssid_len);
4310         NLA_PUT(msg, NL80211_ATTR_SSID, params->ssid_len,
4311                 params->ssid);
4312         os_memcpy(drv->ssid, params->ssid, params->ssid_len);
4313         drv->ssid_len = params->ssid_len;
4314
4315         wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq);
4316         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
4317
4318         ret = nl80211_set_conn_keys(params, msg);
4319         if (ret)
4320                 goto nla_put_failure;
4321
4322         if (params->wpa_ie) {
4323                 wpa_hexdump(MSG_DEBUG,
4324                             "  * Extra IEs for Beacon/Probe Response frames",
4325                             params->wpa_ie, params->wpa_ie_len);
4326                 NLA_PUT(msg, NL80211_ATTR_IE, params->wpa_ie_len,
4327                         params->wpa_ie);
4328         }
4329
4330         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
4331         msg = NULL;
4332         if (ret) {
4333                 wpa_printf(MSG_DEBUG, "nl80211: Join IBSS failed: ret=%d (%s)",
4334                            ret, strerror(-ret));
4335                 count++;
4336                 if (ret == -EALREADY && count == 1) {
4337                         wpa_printf(MSG_DEBUG, "nl80211: Retry IBSS join after "
4338                                    "forced leave");
4339                         nl80211_leave_ibss(drv);
4340                         nlmsg_free(msg);
4341                         goto retry;
4342                 }
4343
4344                 goto nla_put_failure;
4345         }
4346         ret = 0;
4347         wpa_printf(MSG_DEBUG, "nl80211: Join IBSS request sent successfully");
4348
4349 nla_put_failure:
4350         nlmsg_free(msg);
4351         return ret;
4352 }
4353
4354
4355 static int wpa_driver_nl80211_connect(
4356         struct wpa_driver_nl80211_data *drv,
4357         struct wpa_driver_associate_params *params)
4358 {
4359         struct nl_msg *msg;
4360         enum nl80211_auth_type type;
4361         int ret = 0;
4362
4363         msg = nlmsg_alloc();
4364         if (!msg)
4365                 return -1;
4366
4367         wpa_printf(MSG_DEBUG, "nl80211: Connect (ifindex=%d)", drv->ifindex);
4368         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
4369                     NL80211_CMD_CONNECT, 0);
4370
4371         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
4372         if (params->bssid) {
4373                 wpa_printf(MSG_DEBUG, "  * bssid=" MACSTR,
4374                            MAC2STR(params->bssid));
4375                 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, params->bssid);
4376         }
4377         if (params->freq) {
4378                 wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq);
4379                 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
4380         }
4381         if (params->ssid) {
4382                 wpa_hexdump_ascii(MSG_DEBUG, "  * SSID",
4383                                   params->ssid, params->ssid_len);
4384                 NLA_PUT(msg, NL80211_ATTR_SSID, params->ssid_len,
4385                         params->ssid);
4386                 if (params->ssid_len > sizeof(drv->ssid))
4387                         goto nla_put_failure;
4388                 os_memcpy(drv->ssid, params->ssid, params->ssid_len);
4389                 drv->ssid_len = params->ssid_len;
4390         }
4391         wpa_hexdump(MSG_DEBUG, "  * IEs", params->wpa_ie, params->wpa_ie_len);
4392         if (params->wpa_ie)
4393                 NLA_PUT(msg, NL80211_ATTR_IE, params->wpa_ie_len,
4394                         params->wpa_ie);
4395
4396         if (params->auth_alg & WPA_AUTH_ALG_OPEN)
4397                 type = NL80211_AUTHTYPE_OPEN_SYSTEM;
4398         else if (params->auth_alg & WPA_AUTH_ALG_SHARED)
4399                 type = NL80211_AUTHTYPE_SHARED_KEY;
4400         else if (params->auth_alg & WPA_AUTH_ALG_LEAP)
4401                 type = NL80211_AUTHTYPE_NETWORK_EAP;
4402         else if (params->auth_alg & WPA_AUTH_ALG_FT)
4403                 type = NL80211_AUTHTYPE_FT;
4404         else
4405                 goto nla_put_failure;
4406
4407         wpa_printf(MSG_DEBUG, "  * Auth Type %d", type);
4408         NLA_PUT_U32(msg, NL80211_ATTR_AUTH_TYPE, type);
4409
4410         if (params->wpa_ie && params->wpa_ie_len) {
4411                 enum nl80211_wpa_versions ver;
4412
4413                 if (params->wpa_ie[0] == WLAN_EID_RSN)
4414                         ver = NL80211_WPA_VERSION_2;
4415                 else
4416                         ver = NL80211_WPA_VERSION_1;
4417
4418                 wpa_printf(MSG_DEBUG, "  * WPA Version %d", ver);
4419                 NLA_PUT_U32(msg, NL80211_ATTR_WPA_VERSIONS, ver);
4420         }
4421
4422         if (params->pairwise_suite != CIPHER_NONE) {
4423                 int cipher;
4424
4425                 switch (params->pairwise_suite) {
4426                 case CIPHER_WEP40:
4427                         cipher = WLAN_CIPHER_SUITE_WEP40;
4428                         break;
4429                 case CIPHER_WEP104:
4430                         cipher = WLAN_CIPHER_SUITE_WEP104;
4431                         break;
4432                 case CIPHER_CCMP:
4433                         cipher = WLAN_CIPHER_SUITE_CCMP;
4434                         break;
4435                 case CIPHER_TKIP:
4436                 default:
4437                         cipher = WLAN_CIPHER_SUITE_TKIP;
4438                         break;
4439                 }
4440                 NLA_PUT_U32(msg, NL80211_ATTR_CIPHER_SUITES_PAIRWISE, cipher);
4441         }
4442
4443         if (params->group_suite != CIPHER_NONE) {
4444                 int cipher;
4445
4446                 switch (params->group_suite) {
4447                 case CIPHER_WEP40:
4448                         cipher = WLAN_CIPHER_SUITE_WEP40;
4449                         break;
4450                 case CIPHER_WEP104:
4451                         cipher = WLAN_CIPHER_SUITE_WEP104;
4452                         break;
4453                 case CIPHER_CCMP:
4454                         cipher = WLAN_CIPHER_SUITE_CCMP;
4455                         break;
4456                 case CIPHER_TKIP:
4457                 default:
4458                         cipher = WLAN_CIPHER_SUITE_TKIP;
4459                         break;
4460                 }
4461                 NLA_PUT_U32(msg, NL80211_ATTR_CIPHER_SUITE_GROUP, cipher);
4462         }
4463
4464         if (params->key_mgmt_suite == KEY_MGMT_802_1X ||
4465             params->key_mgmt_suite == KEY_MGMT_PSK) {
4466                 int mgmt = WLAN_AKM_SUITE_PSK;
4467
4468                 switch (params->key_mgmt_suite) {
4469                 case KEY_MGMT_802_1X:
4470                         mgmt = WLAN_AKM_SUITE_8021X;
4471                         break;
4472                 case KEY_MGMT_PSK:
4473                 default:
4474                         mgmt = WLAN_AKM_SUITE_PSK;
4475                         break;
4476                 }
4477                 NLA_PUT_U32(msg, NL80211_ATTR_AKM_SUITES, mgmt);
4478         }
4479
4480         ret = nl80211_set_conn_keys(params, msg);
4481         if (ret)
4482                 goto nla_put_failure;
4483
4484         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
4485         msg = NULL;
4486         if (ret) {
4487                 wpa_printf(MSG_DEBUG, "nl80211: MLME connect failed: ret=%d "
4488                            "(%s)", ret, strerror(-ret));
4489                 goto nla_put_failure;
4490         }
4491         ret = 0;
4492         wpa_printf(MSG_DEBUG, "nl80211: Connect request send successfully");
4493
4494 nla_put_failure:
4495         nlmsg_free(msg);
4496         return ret;
4497
4498 }
4499
4500
4501 static int wpa_driver_nl80211_associate(
4502         void *priv, struct wpa_driver_associate_params *params)
4503 {
4504         struct i802_bss *bss = priv;
4505         struct wpa_driver_nl80211_data *drv = bss->drv;
4506         int ret = -1;
4507         struct nl_msg *msg;
4508
4509         if (params->mode == IEEE80211_MODE_AP)
4510                 return wpa_driver_nl80211_ap(drv, params);
4511
4512         if (params->mode == IEEE80211_MODE_IBSS)
4513                 return wpa_driver_nl80211_ibss(drv, params);
4514
4515         if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME)) {
4516                 if (wpa_driver_nl80211_set_mode(priv, params->mode) < 0)
4517                         return -1;
4518                 return wpa_driver_nl80211_connect(drv, params);
4519         }
4520
4521         drv->associated = 0;
4522
4523         msg = nlmsg_alloc();
4524         if (!msg)
4525                 return -1;
4526
4527         wpa_printf(MSG_DEBUG, "nl80211: Associate (ifindex=%d)",
4528                    drv->ifindex);
4529         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
4530                     NL80211_CMD_ASSOCIATE, 0);
4531
4532         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
4533         if (params->bssid) {
4534                 wpa_printf(MSG_DEBUG, "  * bssid=" MACSTR,
4535                            MAC2STR(params->bssid));
4536                 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, params->bssid);
4537         }
4538         if (params->freq) {
4539                 wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq);
4540                 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
4541                 drv->assoc_freq = params->freq;
4542         } else
4543                 drv->assoc_freq = 0;
4544         if (params->ssid) {
4545                 wpa_hexdump_ascii(MSG_DEBUG, "  * SSID",
4546                                   params->ssid, params->ssid_len);
4547                 NLA_PUT(msg, NL80211_ATTR_SSID, params->ssid_len,
4548                         params->ssid);
4549                 if (params->ssid_len > sizeof(drv->ssid))
4550                         goto nla_put_failure;
4551                 os_memcpy(drv->ssid, params->ssid, params->ssid_len);
4552                 drv->ssid_len = params->ssid_len;
4553         }
4554         wpa_hexdump(MSG_DEBUG, "  * IEs", params->wpa_ie, params->wpa_ie_len);
4555         if (params->wpa_ie)
4556                 NLA_PUT(msg, NL80211_ATTR_IE, params->wpa_ie_len,
4557                         params->wpa_ie);
4558
4559 #ifdef CONFIG_IEEE80211W
4560         if (params->mgmt_frame_protection == MGMT_FRAME_PROTECTION_REQUIRED)
4561                 NLA_PUT_U32(msg, NL80211_ATTR_USE_MFP, NL80211_MFP_REQUIRED);
4562 #endif /* CONFIG_IEEE80211W */
4563
4564         NLA_PUT_FLAG(msg, NL80211_ATTR_CONTROL_PORT);
4565
4566         if (params->prev_bssid) {
4567                 wpa_printf(MSG_DEBUG, "  * prev_bssid=" MACSTR,
4568                            MAC2STR(params->prev_bssid));
4569                 NLA_PUT(msg, NL80211_ATTR_PREV_BSSID, ETH_ALEN,
4570                         params->prev_bssid);
4571         }
4572
4573         if (params->p2p)
4574                 wpa_printf(MSG_DEBUG, "  * P2P group");
4575
4576         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
4577         msg = NULL;
4578         if (ret) {
4579                 wpa_printf(MSG_DEBUG, "nl80211: MLME command failed: ret=%d "
4580                            "(%s)", ret, strerror(-ret));
4581                 nl80211_dump_scan(drv);
4582                 goto nla_put_failure;
4583         }
4584         ret = 0;
4585         wpa_printf(MSG_DEBUG, "nl80211: Association request send "
4586                    "successfully");
4587
4588 nla_put_failure:
4589         nlmsg_free(msg);
4590         return ret;
4591 }
4592
4593
4594 static int nl80211_set_mode(struct wpa_driver_nl80211_data *drv,
4595                             int ifindex, int mode)
4596 {
4597         struct nl_msg *msg;
4598         int ret = -ENOBUFS;
4599
4600         msg = nlmsg_alloc();
4601         if (!msg)
4602                 return -ENOMEM;
4603
4604         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4605                     0, NL80211_CMD_SET_INTERFACE, 0);
4606         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
4607         NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, mode);
4608
4609         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
4610         if (!ret)
4611                 return 0;
4612 nla_put_failure:
4613         wpa_printf(MSG_DEBUG, "nl80211: Failed to set interface %d to mode %d:"
4614                    " %d (%s)", ifindex, mode, ret, strerror(-ret));
4615         return ret;
4616 }
4617
4618
4619 static int wpa_driver_nl80211_set_mode(void *priv, int mode)
4620 {
4621         struct i802_bss *bss = priv;
4622         struct wpa_driver_nl80211_data *drv = bss->drv;
4623         int ret = -1;
4624         int nlmode;
4625         int i;
4626
4627         switch (mode) {
4628         case 0:
4629                 nlmode = NL80211_IFTYPE_STATION;
4630                 break;
4631         case 1:
4632                 nlmode = NL80211_IFTYPE_ADHOC;
4633                 break;
4634         case 2:
4635                 nlmode = NL80211_IFTYPE_AP;
4636                 break;
4637         default:
4638                 return -1;
4639         }
4640
4641         if (nl80211_set_mode(drv, drv->ifindex, nlmode) == 0) {
4642                 drv->nlmode = nlmode;
4643                 ret = 0;
4644                 goto done;
4645         }
4646
4647         if (nlmode == drv->nlmode) {
4648                 wpa_printf(MSG_DEBUG, "nl80211: Interface already in "
4649                            "requested mode - ignore error");
4650                 ret = 0;
4651                 goto done; /* Already in the requested mode */
4652         }
4653
4654         /* mac80211 doesn't allow mode changes while the device is up, so
4655          * take the device down, try to set the mode again, and bring the
4656          * device back up.
4657          */
4658         wpa_printf(MSG_DEBUG, "nl80211: Try mode change after setting "
4659                    "interface down");
4660         for (i = 0; i < 10; i++) {
4661                 if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 0) ==
4662                     0) {
4663                         /* Try to set the mode again while the interface is
4664                          * down */
4665                         ret = nl80211_set_mode(drv, drv->ifindex, nlmode);
4666                         if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname,
4667                                                   1))
4668                                 ret = -1;
4669                         if (!ret)
4670                                 break;
4671                 } else
4672                         wpa_printf(MSG_DEBUG, "nl80211: Failed to set "
4673                                    "interface down");
4674                 os_sleep(0, 100000);
4675         }
4676
4677         if (!ret) {
4678                 wpa_printf(MSG_DEBUG, "nl80211: Mode change succeeded while "
4679                            "interface is down");
4680                 drv->nlmode = nlmode;
4681         }
4682
4683 done:
4684         if (!ret && nlmode == NL80211_IFTYPE_AP) {
4685                 /* Setup additional AP mode functionality if needed */
4686                 if (drv->monitor_ifidx < 0 &&
4687                     nl80211_create_monitor_interface(drv))
4688                         return -1;
4689         } else if (!ret && nlmode != NL80211_IFTYPE_AP) {
4690                 /* Remove additional AP mode functionality */
4691                 nl80211_remove_monitor_interface(drv);
4692                 bss->beacon_set = 0;
4693         }
4694
4695         if (ret)
4696                 wpa_printf(MSG_DEBUG, "nl80211: Interface mode change to %d "
4697                            "from %d failed", nlmode, drv->nlmode);
4698
4699         return ret;
4700 }
4701
4702
4703 static int wpa_driver_nl80211_get_capa(void *priv,
4704                                        struct wpa_driver_capa *capa)
4705 {
4706         struct i802_bss *bss = priv;
4707         struct wpa_driver_nl80211_data *drv = bss->drv;
4708         if (!drv->has_capability)
4709                 return -1;
4710         os_memcpy(capa, &drv->capa, sizeof(*capa));
4711         return 0;
4712 }
4713
4714
4715 static int wpa_driver_nl80211_set_operstate(void *priv, int state)
4716 {
4717         struct i802_bss *bss = priv;
4718         struct wpa_driver_nl80211_data *drv = bss->drv;
4719
4720         wpa_printf(MSG_DEBUG, "%s: operstate %d->%d (%s)",
4721                    __func__, drv->operstate, state, state ? "UP" : "DORMANT");
4722         drv->operstate = state;
4723         return netlink_send_oper_ifla(drv->netlink, drv->ifindex, -1,
4724                                       state ? IF_OPER_UP : IF_OPER_DORMANT);
4725 }
4726
4727
4728 static int wpa_driver_nl80211_set_supp_port(void *priv, int authorized)
4729 {
4730         struct i802_bss *bss = priv;
4731         struct wpa_driver_nl80211_data *drv = bss->drv;
4732         struct nl_msg *msg;
4733         struct nl80211_sta_flag_update upd;
4734
4735         msg = nlmsg_alloc();
4736         if (!msg)
4737                 return -ENOMEM;
4738
4739         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4740                     0, NL80211_CMD_SET_STATION, 0);
4741
4742         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
4743                     if_nametoindex(bss->ifname));
4744         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, drv->bssid);
4745
4746         os_memset(&upd, 0, sizeof(upd));
4747         upd.mask = BIT(NL80211_STA_FLAG_AUTHORIZED);
4748         if (authorized)
4749                 upd.set = BIT(NL80211_STA_FLAG_AUTHORIZED);
4750         NLA_PUT(msg, NL80211_ATTR_STA_FLAGS2, sizeof(upd), &upd);
4751
4752         return send_and_recv_msgs(drv, msg, NULL, NULL);
4753  nla_put_failure:
4754         return -ENOBUFS;
4755 }
4756
4757
4758 #ifdef HOSTAPD
4759
4760 static void add_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx)
4761 {
4762         int i;
4763         int *old;
4764
4765         wpa_printf(MSG_DEBUG, "nl80211: Add own interface ifindex %d",
4766                    ifidx);
4767         for (i = 0; i < drv->num_if_indices; i++) {
4768                 if (drv->if_indices[i] == 0) {
4769                         drv->if_indices[i] = ifidx;
4770                         return;
4771                 }
4772         }
4773
4774         if (drv->if_indices != drv->default_if_indices)
4775                 old = drv->if_indices;
4776         else
4777                 old = NULL;
4778
4779         drv->if_indices = os_realloc(old,
4780                                      sizeof(int) * (drv->num_if_indices + 1));
4781         if (!drv->if_indices) {
4782                 if (!old)
4783                         drv->if_indices = drv->default_if_indices;
4784                 else
4785                         drv->if_indices = old;
4786                 wpa_printf(MSG_ERROR, "Failed to reallocate memory for "
4787                            "interfaces");
4788                 wpa_printf(MSG_ERROR, "Ignoring EAPOL on interface %d", ifidx);
4789                 return;
4790         } else if (!old)
4791                 os_memcpy(drv->if_indices, drv->default_if_indices,
4792                           sizeof(drv->default_if_indices));
4793         drv->if_indices[drv->num_if_indices] = ifidx;
4794         drv->num_if_indices++;
4795 }
4796
4797
4798 static void del_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx)
4799 {
4800         int i;
4801
4802         for (i = 0; i < drv->num_if_indices; i++) {
4803                 if (drv->if_indices[i] == ifidx) {
4804                         drv->if_indices[i] = 0;
4805                         break;
4806                 }
4807         }
4808 }
4809
4810
4811 static int have_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx)
4812 {
4813         int i;
4814
4815         for (i = 0; i < drv->num_if_indices; i++)
4816                 if (drv->if_indices[i] == ifidx)
4817                         return 1;
4818
4819         return 0;
4820 }
4821
4822
4823 static inline int min_int(int a, int b)
4824 {
4825         if (a < b)
4826                 return a;
4827         return b;
4828 }
4829
4830
4831 static int get_key_handler(struct nl_msg *msg, void *arg)
4832 {
4833         struct nlattr *tb[NL80211_ATTR_MAX + 1];
4834         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
4835
4836         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
4837                   genlmsg_attrlen(gnlh, 0), NULL);
4838
4839         /*
4840          * TODO: validate the key index and mac address!
4841          * Otherwise, there's a race condition as soon as
4842          * the kernel starts sending key notifications.
4843          */
4844
4845         if (tb[NL80211_ATTR_KEY_SEQ])
4846                 memcpy(arg, nla_data(tb[NL80211_ATTR_KEY_SEQ]),
4847                        min_int(nla_len(tb[NL80211_ATTR_KEY_SEQ]), 6));
4848         return NL_SKIP;
4849 }
4850
4851
4852 static int i802_get_seqnum(const char *iface, void *priv, const u8 *addr,
4853                            int idx, u8 *seq)
4854 {
4855         struct i802_bss *bss = priv;
4856         struct wpa_driver_nl80211_data *drv = bss->drv;
4857         struct nl_msg *msg;
4858
4859         msg = nlmsg_alloc();
4860         if (!msg)
4861                 return -ENOMEM;
4862
4863         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4864                     0, NL80211_CMD_GET_KEY, 0);
4865
4866         if (addr)
4867                 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
4868         NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, idx);
4869         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(iface));
4870
4871         memset(seq, 0, 6);
4872
4873         return send_and_recv_msgs(drv, msg, get_key_handler, seq);
4874  nla_put_failure:
4875         return -ENOBUFS;
4876 }
4877
4878
4879 static int i802_set_rate_sets(void *priv, int *supp_rates, int *basic_rates,
4880                               int mode)
4881 {
4882         struct i802_bss *bss = priv;
4883         struct wpa_driver_nl80211_data *drv = bss->drv;
4884         struct nl_msg *msg;
4885         u8 rates[NL80211_MAX_SUPP_RATES];
4886         u8 rates_len = 0;
4887         int i;
4888
4889         msg = nlmsg_alloc();
4890         if (!msg)
4891                 return -ENOMEM;
4892
4893         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
4894                     NL80211_CMD_SET_BSS, 0);
4895
4896         for (i = 0; i < NL80211_MAX_SUPP_RATES && basic_rates[i] >= 0; i++)
4897                 rates[rates_len++] = basic_rates[i] / 5;
4898
4899         NLA_PUT(msg, NL80211_ATTR_BSS_BASIC_RATES, rates_len, rates);
4900
4901         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname));
4902
4903         return send_and_recv_msgs(drv, msg, NULL, NULL);
4904  nla_put_failure:
4905         return -ENOBUFS;
4906 }
4907
4908 #endif /* HOSTAPD */
4909
4910
4911 /* Set kernel driver on given frequency (MHz) */
4912 static int i802_set_freq(void *priv, struct hostapd_freq_params *freq)
4913 {
4914         struct i802_bss *bss = priv;
4915         struct wpa_driver_nl80211_data *drv = bss->drv;
4916         return wpa_driver_nl80211_set_freq(drv, freq->freq, freq->ht_enabled,
4917                                            freq->sec_channel_offset);
4918 }
4919
4920
4921 #ifdef HOSTAPD
4922
4923 static int i802_set_rts(void *priv, int rts)
4924 {
4925         struct i802_bss *bss = priv;
4926         struct wpa_driver_nl80211_data *drv = bss->drv;
4927         struct nl_msg *msg;
4928         int ret = -ENOBUFS;
4929         u32 val;
4930
4931         msg = nlmsg_alloc();
4932         if (!msg)
4933                 return -ENOMEM;
4934
4935         if (rts >= 2347)
4936                 val = (u32) -1;
4937         else
4938                 val = rts;
4939
4940         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4941                     0, NL80211_CMD_SET_WIPHY, 0);
4942         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
4943         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD, val);
4944
4945         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
4946         if (!ret)
4947                 return 0;
4948 nla_put_failure:
4949         wpa_printf(MSG_DEBUG, "nl80211: Failed to set RTS threshold %d: "
4950                    "%d (%s)", rts, ret, strerror(-ret));
4951         return ret;
4952 }
4953
4954
4955 static int i802_set_frag(void *priv, int frag)
4956 {
4957         struct i802_bss *bss = priv;
4958         struct wpa_driver_nl80211_data *drv = bss->drv;
4959         struct nl_msg *msg;
4960         int ret = -ENOBUFS;
4961         u32 val;
4962
4963         msg = nlmsg_alloc();
4964         if (!msg)
4965                 return -ENOMEM;
4966
4967         if (frag >= 2346)
4968                 val = (u32) -1;
4969         else
4970                 val = frag;
4971
4972         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4973                     0, NL80211_CMD_SET_WIPHY, 0);
4974         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
4975         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD, val);
4976
4977         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
4978         if (!ret)
4979                 return 0;
4980 nla_put_failure:
4981         wpa_printf(MSG_DEBUG, "nl80211: Failed to set fragmentation threshold "
4982                    "%d: %d (%s)", frag, ret, strerror(-ret));
4983         return ret;
4984 }
4985
4986
4987 static int i802_flush(void *priv)
4988 {
4989         struct i802_bss *bss = priv;
4990         struct wpa_driver_nl80211_data *drv = bss->drv;
4991         struct nl_msg *msg;
4992
4993         msg = nlmsg_alloc();
4994         if (!msg)
4995                 return -1;
4996
4997         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4998                     0, NL80211_CMD_DEL_STATION, 0);
4999
5000         /*
5001          * XXX: FIX! this needs to flush all VLANs too
5002          */
5003         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
5004                     if_nametoindex(bss->ifname));
5005
5006         return send_and_recv_msgs(drv, msg, NULL, NULL);
5007  nla_put_failure:
5008         return -ENOBUFS;
5009 }
5010
5011
5012 static int get_sta_handler(struct nl_msg *msg, void *arg)
5013 {
5014         struct nlattr *tb[NL80211_ATTR_MAX + 1];
5015         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
5016         struct hostap_sta_driver_data *data = arg;
5017         struct nlattr *stats[NL80211_STA_INFO_MAX + 1];
5018         static struct nla_policy stats_policy[NL80211_STA_INFO_MAX + 1] = {
5019                 [NL80211_STA_INFO_INACTIVE_TIME] = { .type = NLA_U32 },
5020                 [NL80211_STA_INFO_RX_BYTES] = { .type = NLA_U32 },
5021                 [NL80211_STA_INFO_TX_BYTES] = { .type = NLA_U32 },
5022                 [NL80211_STA_INFO_RX_PACKETS] = { .type = NLA_U32 },
5023                 [NL80211_STA_INFO_TX_PACKETS] = { .type = NLA_U32 },
5024         };
5025
5026         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
5027                   genlmsg_attrlen(gnlh, 0), NULL);
5028
5029         /*
5030          * TODO: validate the interface and mac address!
5031          * Otherwise, there's a race condition as soon as
5032          * the kernel starts sending station notifications.
5033          */
5034
5035         if (!tb[NL80211_ATTR_STA_INFO]) {
5036                 wpa_printf(MSG_DEBUG, "sta stats missing!");
5037                 return NL_SKIP;
5038         }
5039         if (nla_parse_nested(stats, NL80211_STA_INFO_MAX,
5040                              tb[NL80211_ATTR_STA_INFO],
5041                              stats_policy)) {
5042                 wpa_printf(MSG_DEBUG, "failed to parse nested attributes!");
5043                 return NL_SKIP;
5044         }
5045
5046         if (stats[NL80211_STA_INFO_INACTIVE_TIME])
5047                 data->inactive_msec =
5048                         nla_get_u32(stats[NL80211_STA_INFO_INACTIVE_TIME]);
5049         if (stats[NL80211_STA_INFO_RX_BYTES])
5050                 data->rx_bytes = nla_get_u32(stats[NL80211_STA_INFO_RX_BYTES]);
5051         if (stats[NL80211_STA_INFO_TX_BYTES])
5052                 data->tx_bytes = nla_get_u32(stats[NL80211_STA_INFO_TX_BYTES]);
5053         if (stats[NL80211_STA_INFO_RX_PACKETS])
5054                 data->rx_packets =
5055                         nla_get_u32(stats[NL80211_STA_INFO_RX_PACKETS]);
5056         if (stats[NL80211_STA_INFO_TX_PACKETS])
5057                 data->tx_packets =
5058                         nla_get_u32(stats[NL80211_STA_INFO_TX_PACKETS]);
5059
5060         return NL_SKIP;
5061 }
5062
5063 static int i802_read_sta_data(void *priv, struct hostap_sta_driver_data *data,
5064                               const u8 *addr)
5065 {
5066         struct i802_bss *bss = priv;
5067         struct wpa_driver_nl80211_data *drv = bss->drv;
5068         struct nl_msg *msg;
5069
5070         os_memset(data, 0, sizeof(*data));
5071         msg = nlmsg_alloc();
5072         if (!msg)
5073                 return -ENOMEM;
5074
5075         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
5076                     0, NL80211_CMD_GET_STATION, 0);
5077
5078         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
5079         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname));
5080
5081         return send_and_recv_msgs(drv, msg, get_sta_handler, data);
5082  nla_put_failure:
5083         return -ENOBUFS;
5084 }
5085
5086
5087 static int i802_set_tx_queue_params(void *priv, int queue, int aifs,
5088                                     int cw_min, int cw_max, int burst_time)
5089 {
5090         struct i802_bss *bss = priv;
5091         struct wpa_driver_nl80211_data *drv = bss->drv;
5092         struct nl_msg *msg;
5093         struct nlattr *txq, *params;
5094
5095         msg = nlmsg_alloc();
5096         if (!msg)
5097                 return -1;
5098
5099         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
5100                     0, NL80211_CMD_SET_WIPHY, 0);
5101
5102         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname));
5103
5104         txq = nla_nest_start(msg, NL80211_ATTR_WIPHY_TXQ_PARAMS);
5105         if (!txq)
5106                 goto nla_put_failure;
5107
5108         /* We are only sending parameters for a single TXQ at a time */
5109         params = nla_nest_start(msg, 1);
5110         if (!params)
5111                 goto nla_put_failure;
5112
5113         switch (queue) {
5114         case 0:
5115                 NLA_PUT_U8(msg, NL80211_TXQ_ATTR_QUEUE, NL80211_TXQ_Q_VO);
5116                 break;
5117         case 1:
5118                 NLA_PUT_U8(msg, NL80211_TXQ_ATTR_QUEUE, NL80211_TXQ_Q_VI);
5119                 break;
5120         case 2:
5121                 NLA_PUT_U8(msg, NL80211_TXQ_ATTR_QUEUE, NL80211_TXQ_Q_BE);
5122                 break;
5123         case 3:
5124                 NLA_PUT_U8(msg, NL80211_TXQ_ATTR_QUEUE, NL80211_TXQ_Q_BK);
5125                 break;
5126         }
5127         /* Burst time is configured in units of 0.1 msec and TXOP parameter in
5128          * 32 usec, so need to convert the value here. */
5129         NLA_PUT_U16(msg, NL80211_TXQ_ATTR_TXOP, (burst_time * 100 + 16) / 32);
5130         NLA_PUT_U16(msg, NL80211_TXQ_ATTR_CWMIN, cw_min);
5131         NLA_PUT_U16(msg, NL80211_TXQ_ATTR_CWMAX, cw_max);
5132         NLA_PUT_U8(msg, NL80211_TXQ_ATTR_AIFS, aifs);
5133
5134         nla_nest_end(msg, params);
5135
5136         nla_nest_end(msg, txq);
5137
5138         if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0)
5139                 return 0;
5140  nla_put_failure:
5141         return -1;
5142 }
5143
5144
5145 static int i802_set_bss(void *priv, int cts, int preamble, int slot)
5146 {
5147         struct i802_bss *bss = priv;
5148         struct wpa_driver_nl80211_data *drv = bss->drv;
5149         struct nl_msg *msg;
5150
5151         msg = nlmsg_alloc();
5152         if (!msg)
5153                 return -ENOMEM;
5154
5155         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
5156                     NL80211_CMD_SET_BSS, 0);
5157
5158         if (cts >= 0)
5159                 NLA_PUT_U8(msg, NL80211_ATTR_BSS_CTS_PROT, cts);
5160         if (preamble >= 0)
5161                 NLA_PUT_U8(msg, NL80211_ATTR_BSS_SHORT_PREAMBLE, preamble);
5162         if (slot >= 0)
5163                 NLA_PUT_U8(msg, NL80211_ATTR_BSS_SHORT_SLOT_TIME, slot);
5164
5165         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname));
5166
5167         return send_and_recv_msgs(drv, msg, NULL, NULL);
5168  nla_put_failure:
5169         return -ENOBUFS;
5170 }
5171
5172
5173 static int i802_set_cts_protect(void *priv, int value)
5174 {
5175         return i802_set_bss(priv, value, -1, -1);
5176 }
5177
5178
5179 static int i802_set_preamble(void *priv, int value)
5180 {
5181         return i802_set_bss(priv, -1, value, -1);
5182 }
5183
5184
5185 static int i802_set_short_slot_time(void *priv, int value)
5186 {
5187         return i802_set_bss(priv, -1, -1, value);
5188 }
5189
5190
5191 static int i802_set_sta_vlan(void *priv, const u8 *addr,
5192                              const char *ifname, int vlan_id)
5193 {
5194         struct i802_bss *bss = priv;
5195         struct wpa_driver_nl80211_data *drv = bss->drv;
5196         struct nl_msg *msg;
5197         int ret = -ENOBUFS;
5198
5199         msg = nlmsg_alloc();
5200         if (!msg)
5201                 return -ENOMEM;
5202
5203         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
5204                     0, NL80211_CMD_SET_STATION, 0);
5205
5206         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
5207                     if_nametoindex(bss->ifname));
5208         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
5209         NLA_PUT_U32(msg, NL80211_ATTR_STA_VLAN,
5210                     if_nametoindex(ifname));
5211
5212         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
5213         if (ret < 0) {
5214                 wpa_printf(MSG_ERROR, "nl80211: NL80211_ATTR_STA_VLAN (addr="
5215                            MACSTR " ifname=%s vlan_id=%d) failed: %d (%s)",
5216                            MAC2STR(addr), ifname, vlan_id, ret,
5217                            strerror(-ret));
5218         }
5219  nla_put_failure:
5220         return ret;
5221 }
5222
5223
5224 static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val,
5225                             const char *bridge_ifname)
5226 {
5227         struct i802_bss *bss = priv;
5228         struct wpa_driver_nl80211_data *drv = bss->drv;
5229         char name[IFNAMSIZ + 1];
5230
5231         os_snprintf(name, sizeof(name), "%s.sta%d", bss->ifname, aid);
5232         wpa_printf(MSG_DEBUG, "nl80211: Set WDS STA addr=" MACSTR
5233                    " aid=%d val=%d name=%s", MAC2STR(addr), aid, val, name);
5234         if (val) {
5235                 if (!if_nametoindex(name)) {
5236                         if (nl80211_create_iface(drv, name,
5237                                                  NL80211_IFTYPE_AP_VLAN,
5238                                                  NULL, 1) < 0)
5239                                 return -1;
5240                         if (bridge_ifname &&
5241                             linux_br_add_if(drv->ioctl_sock, bridge_ifname,
5242                                             name) < 0)
5243                                 return -1;
5244                 }
5245                 linux_set_iface_flags(drv->ioctl_sock, name, 1);
5246                 return i802_set_sta_vlan(priv, addr, name, 0);
5247         } else {
5248                 i802_set_sta_vlan(priv, addr, bss->ifname, 0);
5249                 return wpa_driver_nl80211_if_remove(priv, WPA_IF_AP_VLAN,
5250                                                     name);
5251         }
5252 }
5253
5254
5255 static void handle_eapol(int sock, void *eloop_ctx, void *sock_ctx)
5256 {
5257         struct wpa_driver_nl80211_data *drv = eloop_ctx;
5258         struct sockaddr_ll lladdr;
5259         unsigned char buf[3000];
5260         int len;
5261         socklen_t fromlen = sizeof(lladdr);
5262
5263         len = recvfrom(sock, buf, sizeof(buf), 0,
5264                        (struct sockaddr *)&lladdr, &fromlen);
5265         if (len < 0) {
5266                 perror("recv");
5267                 return;
5268         }
5269
5270         if (have_ifidx(drv, lladdr.sll_ifindex))
5271                 drv_event_eapol_rx(drv->ctx, lladdr.sll_addr, buf, len);
5272 }
5273
5274
5275 static int i802_get_inact_sec(void *priv, const u8 *addr)
5276 {
5277         struct hostap_sta_driver_data data;
5278         int ret;
5279
5280         data.inactive_msec = (unsigned long) -1;
5281         ret = i802_read_sta_data(priv, &data, addr);
5282         if (ret || data.inactive_msec == (unsigned long) -1)
5283                 return -1;
5284         return data.inactive_msec / 1000;
5285 }
5286
5287
5288 static int i802_sta_clear_stats(void *priv, const u8 *addr)
5289 {
5290 #if 0
5291         /* TODO */
5292 #endif
5293         return 0;
5294 }
5295
5296
5297 static int i802_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
5298                            int reason)
5299 {
5300         struct i802_bss *bss = priv;
5301         struct ieee80211_mgmt mgmt;
5302
5303         memset(&mgmt, 0, sizeof(mgmt));
5304         mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
5305                                           WLAN_FC_STYPE_DEAUTH);
5306         memcpy(mgmt.da, addr, ETH_ALEN);
5307         memcpy(mgmt.sa, own_addr, ETH_ALEN);
5308         memcpy(mgmt.bssid, own_addr, ETH_ALEN);
5309         mgmt.u.deauth.reason_code = host_to_le16(reason);
5310         return wpa_driver_nl80211_send_mlme(bss, (u8 *) &mgmt,
5311                                             IEEE80211_HDRLEN +
5312                                             sizeof(mgmt.u.deauth));
5313 }
5314
5315
5316 static int i802_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
5317                              int reason)
5318 {
5319         struct i802_bss *bss = priv;
5320         struct ieee80211_mgmt mgmt;
5321
5322         memset(&mgmt, 0, sizeof(mgmt));
5323         mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
5324                                           WLAN_FC_STYPE_DISASSOC);
5325         memcpy(mgmt.da, addr, ETH_ALEN);
5326         memcpy(mgmt.sa, own_addr, ETH_ALEN);
5327         memcpy(mgmt.bssid, own_addr, ETH_ALEN);
5328         mgmt.u.disassoc.reason_code = host_to_le16(reason);
5329         return wpa_driver_nl80211_send_mlme(bss, (u8 *) &mgmt,
5330                                             IEEE80211_HDRLEN +
5331                                             sizeof(mgmt.u.disassoc));
5332 }
5333
5334
5335 static int i802_check_bridge(struct wpa_driver_nl80211_data *drv,
5336                              const char *brname, const char *ifname)
5337 {
5338         int ifindex;
5339         char in_br[IFNAMSIZ];
5340
5341         os_strlcpy(drv->brname, brname, IFNAMSIZ);
5342         ifindex = if_nametoindex(brname);
5343         if (ifindex == 0) {
5344                 /*
5345                  * Bridge was configured, but the bridge device does
5346                  * not exist. Try to add it now.
5347                  */
5348                 if (linux_br_add(drv->ioctl_sock, brname) < 0) {
5349                         wpa_printf(MSG_ERROR, "nl80211: Failed to add the "
5350                                    "bridge interface %s: %s",
5351                                    brname, strerror(errno));
5352                         return -1;
5353                 }
5354                 drv->added_bridge = 1;
5355                 add_ifidx(drv, if_nametoindex(brname));
5356         }
5357
5358         if (linux_br_get(in_br, ifname) == 0) {
5359                 if (os_strcmp(in_br, brname) == 0)
5360                         return 0; /* already in the bridge */
5361
5362                 wpa_printf(MSG_DEBUG, "nl80211: Removing interface %s from "
5363                            "bridge %s", ifname, in_br);
5364                 if (linux_br_del_if(drv->ioctl_sock, in_br, ifname) < 0) {
5365                         wpa_printf(MSG_ERROR, "nl80211: Failed to "
5366                                    "remove interface %s from bridge "
5367                                    "%s: %s",
5368                                    ifname, brname, strerror(errno));
5369                         return -1;
5370                 }
5371         }
5372
5373         wpa_printf(MSG_DEBUG, "nl80211: Adding interface %s into bridge %s",
5374                    ifname, brname);
5375         if (linux_br_add_if(drv->ioctl_sock, brname, ifname) < 0) {
5376                 wpa_printf(MSG_ERROR, "nl80211: Failed to add interface %s "
5377                            "into bridge %s: %s",
5378                            ifname, brname, strerror(errno));
5379                 return -1;
5380         }
5381         drv->added_if_into_bridge = 1;
5382
5383         return 0;
5384 }
5385
5386
5387 static void *i802_init(struct hostapd_data *hapd,
5388                        struct wpa_init_params *params)
5389 {
5390         struct wpa_driver_nl80211_data *drv;
5391         struct i802_bss *bss;
5392         size_t i;
5393         char brname[IFNAMSIZ];
5394         int ifindex, br_ifindex;
5395         int br_added = 0;
5396
5397         bss = wpa_driver_nl80211_init(hapd, params->ifname, NULL);
5398         if (bss == NULL)
5399                 return NULL;
5400
5401         drv = bss->drv;
5402         if (linux_br_get(brname, params->ifname) == 0) {
5403                 wpa_printf(MSG_DEBUG, "nl80211: Interface %s is in bridge %s",
5404                            params->ifname, brname);
5405                 br_ifindex = if_nametoindex(brname);
5406         } else {
5407                 brname[0] = '\0';
5408                 br_ifindex = 0;
5409         }
5410
5411         drv->num_if_indices = sizeof(drv->default_if_indices) / sizeof(int);
5412         drv->if_indices = drv->default_if_indices;
5413         for (i = 0; i < params->num_bridge; i++) {
5414                 if (params->bridge[i]) {
5415                         ifindex = if_nametoindex(params->bridge[i]);
5416                         if (ifindex)
5417                                 add_ifidx(drv, ifindex);
5418                         if (ifindex == br_ifindex)
5419                                 br_added = 1;
5420                 }
5421         }
5422         if (!br_added && br_ifindex &&
5423             (params->num_bridge == 0 || !params->bridge[0]))
5424                 add_ifidx(drv, br_ifindex);
5425
5426         /* start listening for EAPOL on the default AP interface */
5427         add_ifidx(drv, drv->ifindex);
5428
5429         if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 0))
5430                 goto failed;
5431
5432         if (params->bssid) {
5433                 if (linux_set_ifhwaddr(drv->ioctl_sock, bss->ifname,
5434                                        params->bssid))
5435                         goto failed;
5436         }
5437
5438         if (wpa_driver_nl80211_set_mode(bss, IEEE80211_MODE_AP)) {
5439                 wpa_printf(MSG_ERROR, "nl80211: Failed to set interface %s "
5440                            "into AP mode", bss->ifname);
5441                 goto failed;
5442         }
5443
5444         if (params->num_bridge && params->bridge[0] &&
5445             i802_check_bridge(drv, params->bridge[0], params->ifname) < 0)
5446                 goto failed;
5447
5448         if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 1))
5449                 goto failed;
5450
5451         drv->eapol_sock = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_PAE));
5452         if (drv->eapol_sock < 0) {
5453                 perror("socket(PF_PACKET, SOCK_DGRAM, ETH_P_PAE)");
5454                 goto failed;
5455         }
5456
5457         if (eloop_register_read_sock(drv->eapol_sock, handle_eapol, drv, NULL))
5458         {
5459                 printf("Could not register read socket for eapol\n");
5460                 goto failed;
5461         }
5462
5463         if (linux_get_ifhwaddr(drv->ioctl_sock, bss->ifname, params->own_addr))
5464                 goto failed;
5465
5466         return bss;
5467
5468 failed:
5469         nl80211_remove_monitor_interface(drv);
5470         if (drv->ioctl_sock >= 0)
5471                 close(drv->ioctl_sock);
5472
5473         genl_family_put(drv->nl80211);
5474         nl_cache_free(drv->nl_cache);
5475         nl80211_handle_destroy(drv->nl_handle);
5476         nl_cb_put(drv->nl_cb);
5477
5478         os_free(drv);
5479         return NULL;
5480 }
5481
5482
5483 static void i802_deinit(void *priv)
5484 {
5485         wpa_driver_nl80211_deinit(priv);
5486 }
5487
5488 #endif /* HOSTAPD */
5489
5490
5491 static enum nl80211_iftype wpa_driver_nl80211_if_type(
5492         enum wpa_driver_if_type type)
5493 {
5494         switch (type) {
5495         case WPA_IF_STATION:
5496         case WPA_IF_P2P_CLIENT:
5497         case WPA_IF_P2P_GROUP:
5498                 return NL80211_IFTYPE_STATION;
5499         case WPA_IF_AP_VLAN:
5500                 return NL80211_IFTYPE_AP_VLAN;
5501         case WPA_IF_AP_BSS:
5502         case WPA_IF_P2P_GO:
5503                 return NL80211_IFTYPE_AP;
5504         }
5505         return -1;
5506 }
5507
5508
5509 #ifdef CONFIG_P2P
5510
5511 static int nl80211_addr_in_use(struct nl80211_global *global, const u8 *addr)
5512 {
5513         struct wpa_driver_nl80211_data *drv;
5514         dl_list_for_each(drv, &global->interfaces,
5515                          struct wpa_driver_nl80211_data, list) {
5516                 if (os_memcmp(addr, drv->addr, ETH_ALEN) == 0)
5517                         return 1;
5518         }
5519         return 0;
5520 }
5521
5522
5523 static int nl80211_p2p_interface_addr(struct wpa_driver_nl80211_data *drv,
5524                                       u8 *new_addr)
5525 {
5526         unsigned int idx;
5527
5528         if (!drv->global)
5529                 return -1;
5530
5531         os_memcpy(new_addr, drv->addr, ETH_ALEN);
5532         for (idx = 0; idx < 64; idx++) {
5533                 new_addr[0] = drv->addr[0] | 0x02;
5534                 new_addr[0] ^= idx << 2;
5535                 if (!nl80211_addr_in_use(drv->global, new_addr))
5536                         break;
5537         }
5538         if (idx == 64)
5539                 return -1;
5540
5541         wpa_printf(MSG_DEBUG, "nl80211: Assigned new P2P Interface Address "
5542                    MACSTR, MAC2STR(new_addr));
5543
5544         return 0;
5545 }
5546
5547 #endif /* CONFIG_P2P */
5548
5549
5550 static int wpa_driver_nl80211_if_add(void *priv, enum wpa_driver_if_type type,
5551                                      const char *ifname, const u8 *addr,
5552                                      void *bss_ctx, void **drv_priv,
5553                                      char *force_ifname, u8 *if_addr)
5554 {
5555         struct i802_bss *bss = priv;
5556         struct wpa_driver_nl80211_data *drv = bss->drv;
5557         int ifidx;
5558 #ifdef HOSTAPD
5559         struct i802_bss *new_bss = NULL;
5560
5561         if (type == WPA_IF_AP_BSS) {
5562                 new_bss = os_zalloc(sizeof(*new_bss));
5563                 if (new_bss == NULL)
5564                         return -1;
5565         }
5566 #endif /* HOSTAPD */
5567
5568         if (addr)
5569                 os_memcpy(if_addr, addr, ETH_ALEN);
5570         ifidx = nl80211_create_iface(drv, ifname,
5571                                      wpa_driver_nl80211_if_type(type), addr,
5572                                      0);
5573         if (ifidx < 0) {
5574 #ifdef HOSTAPD
5575                 os_free(new_bss);
5576 #endif /* HOSTAPD */
5577                 return -1;
5578         }
5579
5580         if (!addr &&
5581             linux_get_ifhwaddr(drv->ioctl_sock, bss->ifname, if_addr) < 0) {
5582                 nl80211_remove_iface(drv, ifidx);
5583                 return -1;
5584         }
5585
5586 #ifdef CONFIG_P2P
5587         if (!addr &&
5588             (type == WPA_IF_P2P_CLIENT || type == WPA_IF_P2P_GROUP ||
5589              type == WPA_IF_P2P_GO)) {
5590                 /* Enforce unique P2P Interface Address */
5591                 u8 new_addr[ETH_ALEN], own_addr[ETH_ALEN];
5592
5593                 if (linux_get_ifhwaddr(drv->ioctl_sock, bss->ifname, own_addr)
5594                     < 0 ||
5595                     linux_get_ifhwaddr(drv->ioctl_sock, ifname, new_addr) < 0)
5596                 {
5597                         nl80211_remove_iface(drv, ifidx);
5598                         return -1;
5599                 }
5600                 if (os_memcmp(own_addr, new_addr, ETH_ALEN) == 0) {
5601                         wpa_printf(MSG_DEBUG, "nl80211: Allocate new address "
5602                                    "for P2P group interface");
5603                         if (nl80211_p2p_interface_addr(drv, new_addr) < 0) {
5604                                 nl80211_remove_iface(drv, ifidx);
5605                                 return -1;
5606                         }
5607                         if (linux_set_ifhwaddr(drv->ioctl_sock, ifname,
5608                                                new_addr) < 0) {
5609                                 nl80211_remove_iface(drv, ifidx);
5610                                 return -1;
5611                         }
5612                         os_memcpy(if_addr, new_addr, ETH_ALEN);
5613                 }
5614         }
5615 #endif /* CONFIG_P2P */
5616
5617 #ifdef HOSTAPD
5618         if (type == WPA_IF_AP_BSS) {
5619                 if (linux_set_iface_flags(drv->ioctl_sock, ifname, 1)) {
5620                         nl80211_remove_iface(drv, ifidx);
5621                         os_free(new_bss);
5622                         return -1;
5623                 }
5624                 os_strlcpy(new_bss->ifname, ifname, IFNAMSIZ);
5625                 new_bss->ifindex = ifidx;
5626                 new_bss->drv = drv;
5627                 new_bss->next = drv->first_bss.next;
5628                 drv->first_bss.next = new_bss;
5629                 if (drv_priv)
5630                         *drv_priv = new_bss;
5631         }
5632 #endif /* HOSTAPD */
5633
5634         return 0;
5635 }
5636
5637
5638 static int wpa_driver_nl80211_if_remove(void *priv,
5639                                         enum wpa_driver_if_type type,
5640                                         const char *ifname)
5641 {
5642         struct i802_bss *bss = priv;
5643         struct wpa_driver_nl80211_data *drv = bss->drv;
5644         int ifindex = if_nametoindex(ifname);
5645
5646         wpa_printf(MSG_DEBUG, "nl80211: %s(type=%d ifname=%s) ifindex=%d",
5647                    __func__, type, ifname, ifindex);
5648         if (ifindex <= 0)
5649                 return -1;
5650         nl80211_remove_iface(drv, ifindex);
5651
5652 #ifdef HOSTAPD
5653         if (type != WPA_IF_AP_BSS)
5654                 return 0;
5655
5656         if (bss != &drv->first_bss) {
5657                 struct i802_bss *tbss = &drv->first_bss;
5658
5659                 while (tbss) {
5660                         if (tbss->next != bss)
5661                                 continue;
5662
5663                         tbss->next = bss->next;
5664                         os_free(bss);
5665                         break;
5666                 }
5667         }
5668 #endif /* HOSTAPD */
5669
5670         return 0;
5671 }
5672
5673
5674 static int cookie_handler(struct nl_msg *msg, void *arg)
5675 {
5676         struct nlattr *tb[NL80211_ATTR_MAX + 1];
5677         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
5678         u64 *cookie = arg;
5679         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
5680                   genlmsg_attrlen(gnlh, 0), NULL);
5681         if (tb[NL80211_ATTR_COOKIE])
5682                 *cookie = nla_get_u64(tb[NL80211_ATTR_COOKIE]);
5683         return NL_SKIP;
5684 }
5685
5686
5687 static int nl80211_send_frame_cmd(struct wpa_driver_nl80211_data *drv,
5688                                   unsigned int freq, const u8 *buf,
5689                                   size_t buf_len, u64 *cookie_out)
5690 {
5691         struct nl_msg *msg;
5692         u64 cookie;
5693         int ret = -1;
5694
5695         msg = nlmsg_alloc();
5696         if (!msg)
5697                 return -1;
5698
5699         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
5700                     NL80211_CMD_FRAME, 0);
5701
5702         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
5703         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
5704         NLA_PUT(msg, NL80211_ATTR_FRAME, buf_len, buf);
5705
5706         cookie = 0;
5707         ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie);
5708         msg = NULL;
5709         if (ret) {
5710                 wpa_printf(MSG_DEBUG, "nl80211: Frame command failed: ret=%d "
5711                            "(%s)", ret, strerror(-ret));
5712                 goto nla_put_failure;
5713         }
5714         wpa_printf(MSG_DEBUG, "nl80211: Frame TX command accepted; "
5715                    "cookie 0x%llx", (long long unsigned int) cookie);
5716
5717         if (cookie_out)
5718                 *cookie_out = cookie;
5719
5720 nla_put_failure:
5721         nlmsg_free(msg);
5722         return ret;
5723 }
5724
5725
5726 static int wpa_driver_nl80211_send_action(void *priv, unsigned int freq,
5727                                           const u8 *dst, const u8 *src,
5728                                           const u8 *bssid,
5729                                           const u8 *data, size_t data_len)
5730 {
5731         struct i802_bss *bss = priv;
5732         struct wpa_driver_nl80211_data *drv = bss->drv;
5733         int ret = -1;
5734         u8 *buf;
5735         struct ieee80211_hdr *hdr;
5736
5737         wpa_printf(MSG_DEBUG, "nl80211: Send Action frame (ifindex=%d)",
5738                    drv->ifindex);
5739
5740         buf = os_zalloc(24 + data_len);
5741         if (buf == NULL)
5742                 return ret;
5743         os_memcpy(buf + 24, data, data_len);
5744         hdr = (struct ieee80211_hdr *) buf;
5745         hdr->frame_control =
5746                 IEEE80211_FC(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_ACTION);
5747         os_memcpy(hdr->addr1, dst, ETH_ALEN);
5748         os_memcpy(hdr->addr2, src, ETH_ALEN);
5749         os_memcpy(hdr->addr3, bssid, ETH_ALEN);
5750
5751         if (drv->nlmode == NL80211_IFTYPE_AP)
5752                 ret = wpa_driver_nl80211_send_mlme(priv, buf, 24 + data_len);
5753         else
5754                 ret = nl80211_send_frame_cmd(drv, freq, buf, 24 + data_len,
5755                                              &drv->send_action_cookie);
5756
5757         os_free(buf);
5758         return ret;
5759 }
5760
5761
5762 static int wpa_driver_nl80211_remain_on_channel(void *priv, unsigned int freq,
5763                                                 unsigned int duration)
5764 {
5765         struct i802_bss *bss = priv;
5766         struct wpa_driver_nl80211_data *drv = bss->drv;
5767         struct nl_msg *msg;
5768         int ret;
5769         u64 cookie;
5770
5771         msg = nlmsg_alloc();
5772         if (!msg)
5773                 return -1;
5774
5775         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
5776                     NL80211_CMD_REMAIN_ON_CHANNEL, 0);
5777
5778         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
5779         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
5780         NLA_PUT_U32(msg, NL80211_ATTR_DURATION, duration);
5781
5782         cookie = 0;
5783         ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie);
5784         if (ret == 0) {
5785                 wpa_printf(MSG_DEBUG, "nl80211: Remain-on-channel cookie "
5786                            "0x%llx for freq=%u MHz duration=%u",
5787                            (long long unsigned int) cookie, freq, duration);
5788                 drv->remain_on_chan_cookie = cookie;
5789                 return 0;
5790         }
5791         wpa_printf(MSG_DEBUG, "nl80211: Failed to request remain-on-channel "
5792                    "(freq=%d duration=%u): %d (%s)",
5793                    freq, duration, ret, strerror(-ret));
5794 nla_put_failure:
5795         return -1;
5796 }
5797
5798
5799 static int wpa_driver_nl80211_cancel_remain_on_channel(void *priv)
5800 {
5801         struct i802_bss *bss = priv;
5802         struct wpa_driver_nl80211_data *drv = bss->drv;
5803         struct nl_msg *msg;
5804         int ret;
5805
5806         if (!drv->pending_remain_on_chan) {
5807                 wpa_printf(MSG_DEBUG, "nl80211: No pending remain-on-channel "
5808                            "to cancel");
5809                 return -1;
5810         }
5811
5812         wpa_printf(MSG_DEBUG, "nl80211: Cancel remain-on-channel with cookie "
5813                    "0x%llx",
5814                    (long long unsigned int) drv->remain_on_chan_cookie);
5815
5816         msg = nlmsg_alloc();
5817         if (!msg)
5818                 return -1;
5819
5820         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
5821                     NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 0);
5822
5823         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
5824         NLA_PUT_U64(msg, NL80211_ATTR_COOKIE, drv->remain_on_chan_cookie);
5825
5826         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
5827         if (ret == 0)
5828                 return 0;
5829         wpa_printf(MSG_DEBUG, "nl80211: Failed to cancel remain-on-channel: "
5830                    "%d (%s)", ret, strerror(-ret));
5831 nla_put_failure:
5832         return -1;
5833 }
5834
5835
5836 static int wpa_driver_nl80211_probe_req_report(void *priv, int report)
5837 {
5838         struct i802_bss *bss = priv;
5839         struct wpa_driver_nl80211_data *drv = bss->drv;
5840
5841         if (drv->nlmode != NL80211_IFTYPE_STATION) {
5842                 wpa_printf(MSG_DEBUG, "nl80211: probe_req_report control only "
5843                            "allowed in station mode (iftype=%d)",
5844                            drv->nlmode);
5845                 return -1;
5846         }
5847
5848         if (!report) {
5849                 if (drv->nl_handle_preq) {
5850                         eloop_unregister_read_sock(
5851                                 nl_socket_get_fd(drv->nl_handle_preq));
5852                         nl_cache_free(drv->nl_cache_preq);
5853                         nl80211_handle_destroy(drv->nl_handle_preq);
5854                         drv->nl_handle_preq = NULL;
5855                 }
5856                 return 0;
5857         }
5858
5859         if (drv->nl_handle_preq) {
5860                 wpa_printf(MSG_DEBUG, "nl80211: Probe Request reporting "
5861                            "already on!");
5862                 return 0;
5863         }
5864
5865         drv->nl_handle_preq = nl80211_handle_alloc(drv->nl_cb);
5866         if (drv->nl_handle_preq == NULL) {
5867                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate "
5868                            "netlink callbacks (preq)");
5869                 goto out_err1;
5870         }
5871
5872         if (genl_connect(drv->nl_handle_preq)) {
5873                 wpa_printf(MSG_ERROR, "nl80211: Failed to connect to "
5874                            "generic netlink (preq)");
5875                 goto out_err2;
5876                 return -1;
5877         }
5878
5879 #ifdef CONFIG_LIBNL20
5880         if (genl_ctrl_alloc_cache(drv->nl_handle_preq,
5881                                   &drv->nl_cache_preq) < 0) {
5882                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic "
5883                            "netlink cache (preq)");
5884                 goto out_err2;
5885         }
5886 #else /* CONFIG_LIBNL20 */
5887         drv->nl_cache_preq = genl_ctrl_alloc_cache(drv->nl_handle_preq);
5888         if (drv->nl_cache_preq == NULL) {
5889                 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic "
5890                            "netlink cache (preq)");
5891                 goto out_err2;
5892         }
5893 #endif /* CONFIG_LIBNL20 */
5894
5895         if (nl80211_register_frame(drv, drv->nl_handle_preq,
5896                                    (WLAN_FC_TYPE_MGMT << 2) |
5897                                    (WLAN_FC_STYPE_PROBE_REQ << 4),
5898                                    NULL, 0) < 0) {
5899                 goto out_err3;
5900         }
5901
5902         eloop_register_read_sock(nl_socket_get_fd(drv->nl_handle_preq),
5903                                  wpa_driver_nl80211_event_receive, drv,
5904                                  drv->nl_handle_preq);
5905
5906         return 0;
5907
5908  out_err3:
5909         nl_cache_free(drv->nl_cache_preq);
5910  out_err2:
5911         nl80211_handle_destroy(drv->nl_handle_preq);
5912         drv->nl_handle_preq = NULL;
5913  out_err1:
5914         return -1;
5915 }
5916
5917
5918 static int nl80211_disable_11b_rates(struct wpa_driver_nl80211_data *drv,
5919                                      int ifindex, int disabled)
5920 {
5921         struct nl_msg *msg;
5922         struct nlattr *bands, *band;
5923         int ret;
5924
5925         msg = nlmsg_alloc();
5926         if (!msg)
5927                 return -1;
5928
5929         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
5930                     NL80211_CMD_SET_TX_BITRATE_MASK, 0);
5931         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
5932
5933         bands = nla_nest_start(msg, NL80211_ATTR_TX_RATES);
5934         if (!bands)
5935                 goto nla_put_failure;
5936
5937         /*
5938          * Disable 2 GHz rates 1, 2, 5.5, 11 Mbps by masking out everything
5939          * else apart from 6, 9, 12, 18, 24, 36, 48, 54 Mbps from non-MCS
5940          * rates. All 5 GHz rates are left enabled.
5941          */
5942         band = nla_nest_start(msg, NL80211_BAND_2GHZ);
5943         if (!band)
5944                 goto nla_put_failure;
5945         NLA_PUT(msg, NL80211_TXRATE_LEGACY, 8,
5946                 "\x0c\x12\x18\x24\x30\x48\x60\x6c");
5947         nla_nest_end(msg, band);
5948
5949         nla_nest_end(msg, bands);
5950
5951         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
5952         msg = NULL;
5953         if (ret) {
5954                 wpa_printf(MSG_DEBUG, "nl80211: Set TX rates failed: ret=%d "
5955                            "(%s)", ret, strerror(-ret));
5956         }
5957
5958         return ret;
5959
5960 nla_put_failure:
5961         nlmsg_free(msg);
5962         return -1;
5963 }
5964
5965
5966 static int wpa_driver_nl80211_disable_11b_rates(void *priv, int disabled)
5967 {
5968         struct i802_bss *bss = priv;
5969         struct wpa_driver_nl80211_data *drv = bss->drv;
5970         drv->disable_11b_rates = disabled;
5971         return nl80211_disable_11b_rates(drv, drv->ifindex, disabled);
5972 }
5973
5974
5975 static int wpa_driver_nl80211_deinit_ap(void *priv)
5976 {
5977         struct i802_bss *bss = priv;
5978         struct wpa_driver_nl80211_data *drv = bss->drv;
5979         if (drv->nlmode != NL80211_IFTYPE_AP)
5980                 return -1;
5981         wpa_driver_nl80211_del_beacon(drv);
5982         return wpa_driver_nl80211_set_mode(priv, IEEE80211_MODE_INFRA);
5983 }
5984
5985
5986 static void wpa_driver_nl80211_resume(void *priv)
5987 {
5988         struct i802_bss *bss = priv;
5989         struct wpa_driver_nl80211_data *drv = bss->drv;
5990         if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 1)) {
5991                 wpa_printf(MSG_DEBUG, "nl80211: Failed to set interface up on "
5992                            "resume event");
5993         }
5994 }
5995
5996
5997 static int nl80211_send_ft_action(void *priv, u8 action, const u8 *target_ap,
5998                                   const u8 *ies, size_t ies_len)
5999 {
6000         struct i802_bss *bss = priv;
6001         struct wpa_driver_nl80211_data *drv = bss->drv;
6002         int ret;
6003         u8 *data, *pos;
6004         size_t data_len;
6005         u8 own_addr[ETH_ALEN];
6006
6007         if (linux_get_ifhwaddr(drv->ioctl_sock, bss->ifname, own_addr) < 0)
6008                 return -1;
6009
6010         if (action != 1) {
6011                 wpa_printf(MSG_ERROR, "nl80211: Unsupported send_ft_action "
6012                            "action %d", action);
6013                 return -1;
6014         }
6015
6016         /*
6017          * Action frame payload:
6018          * Category[1] = 6 (Fast BSS Transition)
6019          * Action[1] = 1 (Fast BSS Transition Request)
6020          * STA Address
6021          * Target AP Address
6022          * FT IEs
6023          */
6024
6025         data_len = 2 + 2 * ETH_ALEN + ies_len;
6026         data = os_malloc(data_len);
6027         if (data == NULL)
6028                 return -1;
6029         pos = data;
6030         *pos++ = 0x06; /* FT Action category */
6031         *pos++ = action;
6032         os_memcpy(pos, own_addr, ETH_ALEN);
6033         pos += ETH_ALEN;
6034         os_memcpy(pos, target_ap, ETH_ALEN);
6035         pos += ETH_ALEN;
6036         os_memcpy(pos, ies, ies_len);
6037
6038         ret = wpa_driver_nl80211_send_action(bss, drv->assoc_freq, drv->bssid,
6039                                              own_addr, drv->bssid,
6040                                              data, data_len);
6041         os_free(data);
6042
6043         return ret;
6044 }
6045
6046
6047 static int nl80211_signal_monitor(void *priv, int threshold, int hysteresis)
6048 {
6049         struct i802_bss *bss = priv;
6050         struct wpa_driver_nl80211_data *drv = bss->drv;
6051         struct nl_msg *msg, *cqm = NULL;
6052
6053         wpa_printf(MSG_DEBUG, "nl80211: Signal monitor threshold=%d "
6054                    "hysteresis=%d", threshold, hysteresis);
6055
6056         msg = nlmsg_alloc();
6057         if (!msg)
6058                 return -1;
6059
6060         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
6061                     0, NL80211_CMD_SET_CQM, 0);
6062
6063         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss->ifindex);
6064
6065         cqm = nlmsg_alloc();
6066         if (cqm == NULL)
6067                 return -1;
6068
6069         NLA_PUT_U32(cqm, NL80211_ATTR_CQM_RSSI_THOLD, threshold);
6070         NLA_PUT_U32(cqm, NL80211_ATTR_CQM_RSSI_HYST, hysteresis);
6071         nla_put_nested(msg, NL80211_ATTR_CQM, cqm);
6072
6073         if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0)
6074                 return 0;
6075         msg = NULL;
6076
6077 nla_put_failure:
6078         if (cqm)
6079                 nlmsg_free(cqm);
6080         nlmsg_free(msg);
6081         return -1;
6082 }
6083
6084
6085 static int nl80211_send_frame(void *priv, const u8 *data, size_t data_len,
6086                               int encrypt)
6087 {
6088         struct i802_bss *bss = priv;
6089         struct wpa_driver_nl80211_data *drv = bss->drv;
6090         return wpa_driver_nl80211_send_frame(drv, data, data_len, encrypt);
6091 }
6092
6093
6094 static int nl80211_set_intra_bss(void *priv, int enabled)
6095 {
6096         struct i802_bss *bss = priv;
6097         struct wpa_driver_nl80211_data *drv = bss->drv;
6098         struct nl_msg *msg;
6099
6100         msg = nlmsg_alloc();
6101         if (!msg)
6102                 return -ENOMEM;
6103
6104         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
6105                     NL80211_CMD_SET_BSS, 0);
6106
6107         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname));
6108         NLA_PUT_U8(msg, NL80211_ATTR_AP_ISOLATE, !enabled);
6109
6110         return send_and_recv_msgs(drv, msg, NULL, NULL);
6111  nla_put_failure:
6112         return -ENOBUFS;
6113 }
6114
6115
6116 static int nl80211_set_param(void *priv, const char *param)
6117 {
6118         wpa_printf(MSG_DEBUG, "nl80211: driver param='%s'", param);
6119         if (param == NULL)
6120                 return 0;
6121
6122 #ifdef CONFIG_P2P
6123         if (os_strstr(param, "use_p2p_group_interface=1")) {
6124                 struct i802_bss *bss = priv;
6125                 struct wpa_driver_nl80211_data *drv = bss->drv;
6126
6127                 wpa_printf(MSG_DEBUG, "nl80211: Use separate P2P group "
6128                            "interface");
6129                 drv->capa.flags |= WPA_DRIVER_FLAGS_P2P_CONCURRENT;
6130                 drv->capa.flags |= WPA_DRIVER_FLAGS_P2P_MGMT_AND_NON_P2P;
6131         }
6132 #endif /* CONFIG_P2P */
6133
6134         return 0;
6135 }
6136
6137
6138 static void * nl80211_global_init(void)
6139 {
6140         struct nl80211_global *global;
6141         global = os_zalloc(sizeof(*global));
6142         if (global == NULL)
6143                 return NULL;
6144         dl_list_init(&global->interfaces);
6145         return global;
6146 }
6147
6148
6149 static void nl80211_global_deinit(void *priv)
6150 {
6151         struct nl80211_global *global = priv;
6152         if (global == NULL)
6153                 return;
6154         if (!dl_list_empty(&global->interfaces)) {
6155                 wpa_printf(MSG_ERROR, "nl80211: %u interface(s) remain at "
6156                            "nl80211_global_deinit",
6157                            dl_list_len(&global->interfaces));
6158         }
6159         os_free(global);
6160 }
6161
6162
6163 static const char * nl80211_get_radio_name(void *priv)
6164 {
6165         struct i802_bss *bss = priv;
6166         struct wpa_driver_nl80211_data *drv = bss->drv;
6167         return drv->phyname;
6168 }
6169
6170
6171 const struct wpa_driver_ops wpa_driver_nl80211_ops = {
6172         .name = "nl80211",
6173         .desc = "Linux nl80211/cfg80211",
6174         .get_bssid = wpa_driver_nl80211_get_bssid,
6175         .get_ssid = wpa_driver_nl80211_get_ssid,
6176         .set_key = wpa_driver_nl80211_set_key,
6177         .scan2 = wpa_driver_nl80211_scan,
6178         .get_scan_results2 = wpa_driver_nl80211_get_scan_results,
6179         .deauthenticate = wpa_driver_nl80211_deauthenticate,
6180         .disassociate = wpa_driver_nl80211_disassociate,
6181         .authenticate = wpa_driver_nl80211_authenticate,
6182         .associate = wpa_driver_nl80211_associate,
6183         .global_init = nl80211_global_init,
6184         .global_deinit = nl80211_global_deinit,
6185         .init2 = wpa_driver_nl80211_init,
6186         .deinit = wpa_driver_nl80211_deinit,
6187         .get_capa = wpa_driver_nl80211_get_capa,
6188         .set_operstate = wpa_driver_nl80211_set_operstate,
6189         .set_supp_port = wpa_driver_nl80211_set_supp_port,
6190         .set_country = wpa_driver_nl80211_set_country,
6191         .set_beacon = wpa_driver_nl80211_set_beacon,
6192         .if_add = wpa_driver_nl80211_if_add,
6193         .if_remove = wpa_driver_nl80211_if_remove,
6194         .send_mlme = wpa_driver_nl80211_send_mlme,
6195         .get_hw_feature_data = wpa_driver_nl80211_get_hw_feature_data,
6196         .sta_add = wpa_driver_nl80211_sta_add,
6197         .sta_remove = wpa_driver_nl80211_sta_remove,
6198         .hapd_send_eapol = wpa_driver_nl80211_hapd_send_eapol,
6199         .sta_set_flags = wpa_driver_nl80211_sta_set_flags,
6200 #ifdef HOSTAPD
6201         .hapd_init = i802_init,
6202         .hapd_deinit = i802_deinit,
6203         .get_seqnum = i802_get_seqnum,
6204         .flush = i802_flush,
6205         .read_sta_data = i802_read_sta_data,
6206         .sta_deauth = i802_sta_deauth,
6207         .sta_disassoc = i802_sta_disassoc,
6208         .get_inact_sec = i802_get_inact_sec,
6209         .sta_clear_stats = i802_sta_clear_stats,
6210         .set_rts = i802_set_rts,
6211         .set_frag = i802_set_frag,
6212         .set_rate_sets = i802_set_rate_sets,
6213         .set_cts_protect = i802_set_cts_protect,
6214         .set_preamble = i802_set_preamble,
6215         .set_short_slot_time = i802_set_short_slot_time,
6216         .set_tx_queue_params = i802_set_tx_queue_params,
6217         .set_sta_vlan = i802_set_sta_vlan,
6218         .set_wds_sta = i802_set_wds_sta,
6219 #endif /* HOSTAPD */
6220         .set_freq = i802_set_freq,
6221         .send_action = wpa_driver_nl80211_send_action,
6222         .remain_on_channel = wpa_driver_nl80211_remain_on_channel,
6223         .cancel_remain_on_channel =
6224         wpa_driver_nl80211_cancel_remain_on_channel,
6225         .probe_req_report = wpa_driver_nl80211_probe_req_report,
6226         .disable_11b_rates = wpa_driver_nl80211_disable_11b_rates,
6227         .deinit_ap = wpa_driver_nl80211_deinit_ap,
6228         .resume = wpa_driver_nl80211_resume,
6229         .send_ft_action = nl80211_send_ft_action,
6230         .signal_monitor = nl80211_signal_monitor,
6231         .send_frame = nl80211_send_frame,
6232         .set_intra_bss = nl80211_set_intra_bss,
6233         .set_param = nl80211_set_param,
6234         .get_radio_name = nl80211_get_radio_name,
6235 };