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