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