nl80211: Remove unused pending_send_action
[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 added_bridge:1;
108         unsigned int added_if_into_bridge:1;
109
110         u64 remain_on_chan_cookie;
111         u64 send_action_cookie;
112
113         struct wpa_driver_scan_filter *filter_ssids;
114         size_t num_filter_ssids;
115
116         struct i802_bss first_bss;
117
118 #ifdef HOSTAPD
119         int eapol_sock; /* socket for EAPOL frames */
120
121         int default_if_indices[16];
122         int *if_indices;
123         int num_if_indices;
124
125         int last_freq;
126         int last_freq_ht;
127 #endif /* HOSTAPD */
128 };
129
130
131 static void wpa_driver_nl80211_scan_timeout(void *eloop_ctx,
132                                             void *timeout_ctx);
133 static int wpa_driver_nl80211_set_mode(void *priv, int mode);
134 static int
135 wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv);
136 static int wpa_driver_nl80211_mlme(struct wpa_driver_nl80211_data *drv,
137                                    const u8 *addr, int cmd, u16 reason_code,
138                                    int local_state_change);
139 static void nl80211_remove_monitor_interface(
140         struct wpa_driver_nl80211_data *drv);
141
142 #ifdef HOSTAPD
143 static void add_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx);
144 static void del_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx);
145 static int have_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx);
146 static int wpa_driver_nl80211_if_remove(void *priv,
147                                         enum wpa_driver_if_type type,
148                                         const char *ifname);
149 #else /* HOSTAPD */
150 static int have_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx)
151 {
152         return 0;
153 }
154 #endif /* HOSTAPD */
155
156 static int i802_set_freq(void *priv, struct hostapd_freq_params *freq);
157 static void wpa_driver_nl80211_probe_req_report_timeout(void *eloop_ctx,
158                                                         void *timeout_ctx);
159 static int nl80211_disable_11b_rates(struct wpa_driver_nl80211_data *drv,
160                                      int ifindex, int disabled);
161
162
163 /* nl80211 code */
164 static int ack_handler(struct nl_msg *msg, void *arg)
165 {
166         int *err = arg;
167         *err = 0;
168         return NL_STOP;
169 }
170
171 static int finish_handler(struct nl_msg *msg, void *arg)
172 {
173         int *ret = arg;
174         *ret = 0;
175         return NL_SKIP;
176 }
177
178 static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err,
179                          void *arg)
180 {
181         int *ret = arg;
182         *ret = err->error;
183         return NL_SKIP;
184 }
185
186
187 static int no_seq_check(struct nl_msg *msg, void *arg)
188 {
189         return NL_OK;
190 }
191
192
193 static int send_and_recv(struct wpa_driver_nl80211_data *drv,
194                          struct nl_handle *nl_handle, struct nl_msg *msg,
195                          int (*valid_handler)(struct nl_msg *, void *),
196                          void *valid_data)
197 {
198         struct nl_cb *cb;
199         int err = -ENOMEM;
200
201         cb = nl_cb_clone(drv->nl_cb);
202         if (!cb)
203                 goto out;
204
205         err = nl_send_auto_complete(nl_handle, msg);
206         if (err < 0)
207                 goto out;
208
209         err = 1;
210
211         nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
212         nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err);
213         nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, &err);
214
215         if (valid_handler)
216                 nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM,
217                           valid_handler, valid_data);
218
219         while (err > 0)
220                 nl_recvmsgs(nl_handle, cb);
221  out:
222         nl_cb_put(cb);
223         nlmsg_free(msg);
224         return err;
225 }
226
227
228 static int send_and_recv_msgs(struct wpa_driver_nl80211_data *drv,
229                               struct nl_msg *msg,
230                               int (*valid_handler)(struct nl_msg *, void *),
231                               void *valid_data)
232 {
233         return send_and_recv(drv, drv->nl_handle, msg, valid_handler,
234                              valid_data);
235 }
236
237
238 struct family_data {
239         const char *group;
240         int id;
241 };
242
243
244 static int family_handler(struct nl_msg *msg, void *arg)
245 {
246         struct family_data *res = arg;
247         struct nlattr *tb[CTRL_ATTR_MAX + 1];
248         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
249         struct nlattr *mcgrp;
250         int i;
251
252         nla_parse(tb, CTRL_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
253                   genlmsg_attrlen(gnlh, 0), NULL);
254         if (!tb[CTRL_ATTR_MCAST_GROUPS])
255                 return NL_SKIP;
256
257         nla_for_each_nested(mcgrp, tb[CTRL_ATTR_MCAST_GROUPS], i) {
258                 struct nlattr *tb2[CTRL_ATTR_MCAST_GRP_MAX + 1];
259                 nla_parse(tb2, CTRL_ATTR_MCAST_GRP_MAX, nla_data(mcgrp),
260                           nla_len(mcgrp), NULL);
261                 if (!tb2[CTRL_ATTR_MCAST_GRP_NAME] ||
262                     !tb2[CTRL_ATTR_MCAST_GRP_ID] ||
263                     os_strncmp(nla_data(tb2[CTRL_ATTR_MCAST_GRP_NAME]),
264                                res->group,
265                                nla_len(tb2[CTRL_ATTR_MCAST_GRP_NAME])) != 0)
266                         continue;
267                 res->id = nla_get_u32(tb2[CTRL_ATTR_MCAST_GRP_ID]);
268                 break;
269         };
270
271         return NL_SKIP;
272 }
273
274
275 static int nl_get_multicast_id(struct wpa_driver_nl80211_data *drv,
276                                const char *family, const char *group)
277 {
278         struct nl_msg *msg;
279         int ret = -1;
280         struct family_data res = { group, -ENOENT };
281
282         msg = nlmsg_alloc();
283         if (!msg)
284                 return -ENOMEM;
285         genlmsg_put(msg, 0, 0, genl_ctrl_resolve(drv->nl_handle, "nlctrl"),
286                     0, 0, CTRL_CMD_GETFAMILY, 0);
287         NLA_PUT_STRING(msg, CTRL_ATTR_FAMILY_NAME, family);
288
289         ret = send_and_recv_msgs(drv, msg, family_handler, &res);
290         msg = NULL;
291         if (ret == 0)
292                 ret = res.id;
293
294 nla_put_failure:
295         nlmsg_free(msg);
296         return ret;
297 }
298
299
300 static int wpa_driver_nl80211_get_bssid(void *priv, u8 *bssid)
301 {
302         struct i802_bss *bss = priv;
303         struct wpa_driver_nl80211_data *drv = bss->drv;
304         if (!drv->associated)
305                 return -1;
306         os_memcpy(bssid, drv->bssid, ETH_ALEN);
307         return 0;
308 }
309
310
311 static int wpa_driver_nl80211_get_ssid(void *priv, u8 *ssid)
312 {
313         struct i802_bss *bss = priv;
314         struct wpa_driver_nl80211_data *drv = bss->drv;
315         if (!drv->associated)
316                 return -1;
317         os_memcpy(ssid, drv->ssid, drv->ssid_len);
318         return drv->ssid_len;
319 }
320
321
322 static void wpa_driver_nl80211_event_link(struct wpa_driver_nl80211_data *drv,
323                                           char *buf, size_t len, int del)
324 {
325         union wpa_event_data event;
326
327         os_memset(&event, 0, sizeof(event));
328         if (len > sizeof(event.interface_status.ifname))
329                 len = sizeof(event.interface_status.ifname) - 1;
330         os_memcpy(event.interface_status.ifname, buf, len);
331         event.interface_status.ievent = del ? EVENT_INTERFACE_REMOVED :
332                 EVENT_INTERFACE_ADDED;
333
334         wpa_printf(MSG_DEBUG, "RTM_%sLINK, IFLA_IFNAME: Interface '%s' %s",
335                    del ? "DEL" : "NEW",
336                    event.interface_status.ifname,
337                    del ? "removed" : "added");
338
339         if (os_strcmp(drv->first_bss.ifname, event.interface_status.ifname) == 0) {
340                 if (del)
341                         drv->if_removed = 1;
342                 else
343                         drv->if_removed = 0;
344         }
345
346         wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_STATUS, &event);
347 }
348
349
350 static int wpa_driver_nl80211_own_ifname(struct wpa_driver_nl80211_data *drv,
351                                          u8 *buf, size_t len)
352 {
353         int attrlen, rta_len;
354         struct rtattr *attr;
355
356         attrlen = len;
357         attr = (struct rtattr *) buf;
358
359         rta_len = RTA_ALIGN(sizeof(struct rtattr));
360         while (RTA_OK(attr, attrlen)) {
361                 if (attr->rta_type == IFLA_IFNAME) {
362                         if (os_strcmp(((char *) attr) + rta_len, drv->first_bss.ifname)
363                             == 0)
364                                 return 1;
365                         else
366                                 break;
367                 }
368                 attr = RTA_NEXT(attr, attrlen);
369         }
370
371         return 0;
372 }
373
374
375 static int wpa_driver_nl80211_own_ifindex(struct wpa_driver_nl80211_data *drv,
376                                           int ifindex, u8 *buf, size_t len)
377 {
378         if (drv->ifindex == ifindex)
379                 return 1;
380
381         if (drv->if_removed && wpa_driver_nl80211_own_ifname(drv, buf, len)) {
382                 drv->first_bss.ifindex = if_nametoindex(drv->first_bss.ifname);
383                 wpa_printf(MSG_DEBUG, "nl80211: Update ifindex for a removed "
384                            "interface");
385                 wpa_driver_nl80211_finish_drv_init(drv);
386                 return 1;
387         }
388
389         return 0;
390 }
391
392
393 static void wpa_driver_nl80211_event_rtm_newlink(void *ctx,
394                                                  struct ifinfomsg *ifi,
395                                                  u8 *buf, size_t len)
396 {
397         struct wpa_driver_nl80211_data *drv = ctx;
398         int attrlen, rta_len;
399         struct rtattr *attr;
400         u32 brid = 0;
401
402         if (!wpa_driver_nl80211_own_ifindex(drv, ifi->ifi_index, buf, len) &&
403             !have_ifidx(drv, ifi->ifi_index)) {
404                 wpa_printf(MSG_DEBUG, "nl80211: Ignore event for foreign "
405                            "ifindex %d", ifi->ifi_index);
406                 return;
407         }
408
409         wpa_printf(MSG_DEBUG, "RTM_NEWLINK: operstate=%d ifi_flags=0x%x "
410                    "(%s%s%s%s)",
411                    drv->operstate, ifi->ifi_flags,
412                    (ifi->ifi_flags & IFF_UP) ? "[UP]" : "",
413                    (ifi->ifi_flags & IFF_RUNNING) ? "[RUNNING]" : "",
414                    (ifi->ifi_flags & IFF_LOWER_UP) ? "[LOWER_UP]" : "",
415                    (ifi->ifi_flags & IFF_DORMANT) ? "[DORMANT]" : "");
416
417         if (!drv->if_disabled && !(ifi->ifi_flags & IFF_UP)) {
418                 wpa_printf(MSG_DEBUG, "nl80211: Interface down");
419                 drv->if_disabled = 1;
420                 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_DISABLED, NULL);
421         }
422
423         if (drv->if_disabled && (ifi->ifi_flags & IFF_UP)) {
424                 wpa_printf(MSG_DEBUG, "nl80211: Interface up");
425                 drv->if_disabled = 0;
426                 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_ENABLED, NULL);
427         }
428
429         /*
430          * Some drivers send the association event before the operup event--in
431          * this case, lifting operstate in wpa_driver_nl80211_set_operstate()
432          * fails. This will hit us when wpa_supplicant does not need to do
433          * IEEE 802.1X authentication
434          */
435         if (drv->operstate == 1 &&
436             (ifi->ifi_flags & (IFF_LOWER_UP | IFF_DORMANT)) == IFF_LOWER_UP &&
437             !(ifi->ifi_flags & IFF_RUNNING))
438                 netlink_send_oper_ifla(drv->netlink, drv->ifindex,
439                                        -1, IF_OPER_UP);
440
441         attrlen = len;
442         attr = (struct rtattr *) buf;
443         rta_len = RTA_ALIGN(sizeof(struct rtattr));
444         while (RTA_OK(attr, attrlen)) {
445                 if (attr->rta_type == IFLA_IFNAME) {
446                         wpa_driver_nl80211_event_link(
447                                 drv,
448                                 ((char *) attr) + rta_len,
449                                 attr->rta_len - rta_len, 0);
450                 } else if (attr->rta_type == IFLA_MASTER)
451                         brid = nla_get_u32((struct nlattr *) attr);
452                 attr = RTA_NEXT(attr, attrlen);
453         }
454
455 #ifdef HOSTAPD
456         if (ifi->ifi_family == AF_BRIDGE && brid) {
457                 /* device has been added to bridge */
458                 char namebuf[IFNAMSIZ];
459                 if_indextoname(brid, namebuf);
460                 wpa_printf(MSG_DEBUG, "nl80211: Add ifindex %u for bridge %s",
461                            brid, namebuf);
462                 add_ifidx(drv, brid);
463         }
464 #endif /* HOSTAPD */
465 }
466
467
468 static void wpa_driver_nl80211_event_rtm_dellink(void *ctx,
469                                                  struct ifinfomsg *ifi,
470                                                  u8 *buf, size_t len)
471 {
472         struct wpa_driver_nl80211_data *drv = ctx;
473         int attrlen, rta_len;
474         struct rtattr *attr;
475         u32 brid = 0;
476
477         attrlen = len;
478         attr = (struct rtattr *) buf;
479
480         rta_len = RTA_ALIGN(sizeof(struct rtattr));
481         while (RTA_OK(attr, attrlen)) {
482                 if (attr->rta_type == IFLA_IFNAME) {
483                         wpa_driver_nl80211_event_link(
484                                 drv,
485                                 ((char *) attr) + rta_len,
486                                 attr->rta_len - rta_len, 1);
487                 } else if (attr->rta_type == IFLA_MASTER)
488                         brid = nla_get_u32((struct nlattr *) attr);
489                 attr = RTA_NEXT(attr, attrlen);
490         }
491
492 #ifdef HOSTAPD
493         if (ifi->ifi_family == AF_BRIDGE && brid) {
494                 /* device has been removed from bridge */
495                 char namebuf[IFNAMSIZ];
496                 if_indextoname(brid, namebuf);
497                 wpa_printf(MSG_DEBUG, "nl80211: Remove ifindex %u for bridge "
498                            "%s", brid, namebuf);
499                 del_ifidx(drv, brid);
500         }
501 #endif /* HOSTAPD */
502 }
503
504
505 static void mlme_event_auth(struct wpa_driver_nl80211_data *drv,
506                             const u8 *frame, size_t len)
507 {
508         const struct ieee80211_mgmt *mgmt;
509         union wpa_event_data event;
510
511         mgmt = (const struct ieee80211_mgmt *) frame;
512         if (len < 24 + sizeof(mgmt->u.auth)) {
513                 wpa_printf(MSG_DEBUG, "nl80211: Too short association event "
514                            "frame");
515                 return;
516         }
517
518         os_memcpy(drv->auth_bssid, mgmt->sa, ETH_ALEN);
519         os_memset(&event, 0, sizeof(event));
520         os_memcpy(event.auth.peer, mgmt->sa, ETH_ALEN);
521         event.auth.auth_type = le_to_host16(mgmt->u.auth.auth_alg);
522         event.auth.status_code = le_to_host16(mgmt->u.auth.status_code);
523         if (len > 24 + sizeof(mgmt->u.auth)) {
524                 event.auth.ies = mgmt->u.auth.variable;
525                 event.auth.ies_len = len - 24 - sizeof(mgmt->u.auth);
526         }
527
528         wpa_supplicant_event(drv->ctx, EVENT_AUTH, &event);
529 }
530
531
532 static void mlme_event_assoc(struct wpa_driver_nl80211_data *drv,
533                             const u8 *frame, size_t len)
534 {
535         const struct ieee80211_mgmt *mgmt;
536         union wpa_event_data event;
537         u16 status;
538
539         mgmt = (const struct ieee80211_mgmt *) frame;
540         if (len < 24 + sizeof(mgmt->u.assoc_resp)) {
541                 wpa_printf(MSG_DEBUG, "nl80211: Too short association event "
542                            "frame");
543                 return;
544         }
545
546         status = le_to_host16(mgmt->u.assoc_resp.status_code);
547         if (status != WLAN_STATUS_SUCCESS) {
548                 os_memset(&event, 0, sizeof(event));
549                 if (len > 24 + sizeof(mgmt->u.assoc_resp)) {
550                         event.assoc_reject.resp_ies =
551                                 (u8 *) mgmt->u.assoc_resp.variable;
552                         event.assoc_reject.resp_ies_len =
553                                 len - 24 - sizeof(mgmt->u.assoc_resp);
554                 }
555                 event.assoc_reject.status_code = status;
556
557                 wpa_supplicant_event(drv->ctx, EVENT_ASSOC_REJECT, &event);
558                 return;
559         }
560
561         drv->associated = 1;
562         os_memcpy(drv->bssid, mgmt->sa, ETH_ALEN);
563
564         os_memset(&event, 0, sizeof(event));
565         if (len > 24 + sizeof(mgmt->u.assoc_resp)) {
566                 event.assoc_info.resp_ies = (u8 *) mgmt->u.assoc_resp.variable;
567                 event.assoc_info.resp_ies_len =
568                         len - 24 - sizeof(mgmt->u.assoc_resp);
569         }
570
571         event.assoc_info.freq = drv->assoc_freq;
572
573         wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event);
574 }
575
576
577 static void mlme_event_connect(struct wpa_driver_nl80211_data *drv,
578                                enum nl80211_commands cmd, struct nlattr *status,
579                                struct nlattr *addr, struct nlattr *req_ie,
580                                struct nlattr *resp_ie)
581 {
582         union wpa_event_data event;
583
584         if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) {
585                 /*
586                  * Avoid reporting two association events that would confuse
587                  * the core code.
588                  */
589                 wpa_printf(MSG_DEBUG, "nl80211: Ignore connect event (cmd=%d) "
590                            "when using userspace SME", cmd);
591                 return;
592         }
593
594         os_memset(&event, 0, sizeof(event));
595         if (cmd == NL80211_CMD_CONNECT &&
596             nla_get_u16(status) != WLAN_STATUS_SUCCESS) {
597                 if (resp_ie) {
598                         event.assoc_reject.resp_ies = nla_data(resp_ie);
599                         event.assoc_reject.resp_ies_len = nla_len(resp_ie);
600                 }
601                 event.assoc_reject.status_code = nla_get_u16(status);
602                 wpa_supplicant_event(drv->ctx, EVENT_ASSOC_REJECT, &event);
603                 return;
604         }
605
606         drv->associated = 1;
607         if (addr)
608                 os_memcpy(drv->bssid, nla_data(addr), ETH_ALEN);
609
610         if (req_ie) {
611                 event.assoc_info.req_ies = nla_data(req_ie);
612                 event.assoc_info.req_ies_len = nla_len(req_ie);
613         }
614         if (resp_ie) {
615                 event.assoc_info.resp_ies = nla_data(resp_ie);
616                 event.assoc_info.resp_ies_len = nla_len(resp_ie);
617         }
618
619         wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event);
620 }
621
622
623 static void mlme_timeout_event(struct wpa_driver_nl80211_data *drv,
624                                enum nl80211_commands cmd, struct nlattr *addr)
625 {
626         union wpa_event_data event;
627         enum wpa_event_type ev;
628
629         if (nla_len(addr) != ETH_ALEN)
630                 return;
631
632         wpa_printf(MSG_DEBUG, "nl80211: MLME event %d; timeout with " MACSTR,
633                    cmd, MAC2STR((u8 *) nla_data(addr)));
634
635         if (cmd == NL80211_CMD_AUTHENTICATE)
636                 ev = EVENT_AUTH_TIMED_OUT;
637         else if (cmd == NL80211_CMD_ASSOCIATE)
638                 ev = EVENT_ASSOC_TIMED_OUT;
639         else
640                 return;
641
642         os_memset(&event, 0, sizeof(event));
643         os_memcpy(event.timeout_event.addr, nla_data(addr), ETH_ALEN);
644         wpa_supplicant_event(drv->ctx, ev, &event);
645 }
646
647
648 static void mlme_event_action(struct wpa_driver_nl80211_data *drv,
649                               struct nlattr *freq, const u8 *frame, size_t len)
650 {
651         const struct ieee80211_mgmt *mgmt;
652         union wpa_event_data event;
653         u16 fc, stype;
654
655         mgmt = (const struct ieee80211_mgmt *) frame;
656         if (len < 24) {
657                 wpa_printf(MSG_DEBUG, "nl80211: Too short action frame");
658                 return;
659         }
660
661         fc = le_to_host16(mgmt->frame_control);
662         stype = WLAN_FC_GET_STYPE(fc);
663
664         os_memset(&event, 0, sizeof(event));
665         event.rx_action.da = mgmt->da;
666         event.rx_action.sa = mgmt->sa;
667         event.rx_action.bssid = mgmt->bssid;
668         event.rx_action.category = mgmt->u.action.category;
669         event.rx_action.data = &mgmt->u.action.category + 1;
670         event.rx_action.len = frame + len - event.rx_action.data;
671         if (freq)
672                 event.rx_action.freq = nla_get_u32(freq);
673         wpa_supplicant_event(drv->ctx, EVENT_RX_ACTION, &event);
674 }
675
676
677 static void mlme_event_action_tx_status(struct wpa_driver_nl80211_data *drv,
678                                         struct nlattr *cookie, const u8 *frame,
679                                         size_t len, struct nlattr *ack)
680 {
681         union wpa_event_data event;
682         const struct ieee80211_hdr *hdr;
683         u16 fc;
684         u64 cookie_val;
685
686         if (!cookie)
687                 return;
688
689         cookie_val = nla_get_u64(cookie);
690         wpa_printf(MSG_DEBUG, "nl80211: Action TX status: cookie=0%llx%s "
691                    "(ack=%d)",
692                    (long long unsigned int) cookie_val,
693                    cookie_val == drv->send_action_cookie ?
694                    " (match)" : " (unknown)", ack != NULL);
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         int i;
4072
4073         switch (mode) {
4074         case 0:
4075                 nlmode = NL80211_IFTYPE_STATION;
4076                 break;
4077         case 1:
4078                 nlmode = NL80211_IFTYPE_ADHOC;
4079                 break;
4080         case 2:
4081                 nlmode = NL80211_IFTYPE_AP;
4082                 break;
4083         default:
4084                 return -1;
4085         }
4086
4087         if (nl80211_set_mode(drv, drv->ifindex, nlmode) == 0) {
4088                 drv->nlmode = nlmode;
4089                 ret = 0;
4090                 goto done;
4091         }
4092
4093         if (nlmode == drv->nlmode) {
4094                 wpa_printf(MSG_DEBUG, "nl80211: Interface already in "
4095                            "requested mode - ignore error");
4096                 ret = 0;
4097                 goto done; /* Already in the requested mode */
4098         }
4099
4100         /* mac80211 doesn't allow mode changes while the device is up, so
4101          * take the device down, try to set the mode again, and bring the
4102          * device back up.
4103          */
4104         wpa_printf(MSG_DEBUG, "nl80211: Try mode change after setting "
4105                    "interface down");
4106         for (i = 0; i < 10; i++) {
4107                 if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 0) ==
4108                     0) {
4109                         /* Try to set the mode again while the interface is
4110                          * down */
4111                         ret = nl80211_set_mode(drv, drv->ifindex, nlmode);
4112                         if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname,
4113                                                   1))
4114                                 ret = -1;
4115                         if (!ret)
4116                                 break;
4117                 } else
4118                         wpa_printf(MSG_DEBUG, "nl80211: Failed to set "
4119                                    "interface down");
4120                 os_sleep(0, 100000);
4121         }
4122
4123         if (!ret) {
4124                 wpa_printf(MSG_DEBUG, "nl80211: Mode change succeeded while "
4125                            "interface is down");
4126                 drv->nlmode = nlmode;
4127         }
4128
4129 done:
4130         if (!ret && nlmode == NL80211_IFTYPE_AP) {
4131                 /* Setup additional AP mode functionality if needed */
4132                 if (drv->monitor_ifidx < 0 &&
4133                     nl80211_create_monitor_interface(drv))
4134                         return -1;
4135         } else if (!ret && nlmode != NL80211_IFTYPE_AP) {
4136                 /* Remove additional AP mode functionality */
4137                 nl80211_remove_monitor_interface(drv);
4138                 bss->beacon_set = 0;
4139         }
4140
4141         if (ret)
4142                 wpa_printf(MSG_DEBUG, "nl80211: Interface mode change to %d "
4143                            "from %d failed", nlmode, drv->nlmode);
4144
4145         return ret;
4146 }
4147
4148
4149 static int wpa_driver_nl80211_get_capa(void *priv,
4150                                        struct wpa_driver_capa *capa)
4151 {
4152         struct i802_bss *bss = priv;
4153         struct wpa_driver_nl80211_data *drv = bss->drv;
4154         if (!drv->has_capability)
4155                 return -1;
4156         os_memcpy(capa, &drv->capa, sizeof(*capa));
4157         return 0;
4158 }
4159
4160
4161 static int wpa_driver_nl80211_set_operstate(void *priv, int state)
4162 {
4163         struct i802_bss *bss = priv;
4164         struct wpa_driver_nl80211_data *drv = bss->drv;
4165
4166         wpa_printf(MSG_DEBUG, "%s: operstate %d->%d (%s)",
4167                    __func__, drv->operstate, state, state ? "UP" : "DORMANT");
4168         drv->operstate = state;
4169         return netlink_send_oper_ifla(drv->netlink, drv->ifindex, -1,
4170                                       state ? IF_OPER_UP : IF_OPER_DORMANT);
4171 }
4172
4173
4174 static int wpa_driver_nl80211_set_supp_port(void *priv, int authorized)
4175 {
4176         struct i802_bss *bss = priv;
4177         struct wpa_driver_nl80211_data *drv = bss->drv;
4178         struct nl_msg *msg;
4179         struct nl80211_sta_flag_update upd;
4180
4181         msg = nlmsg_alloc();
4182         if (!msg)
4183                 return -ENOMEM;
4184
4185         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4186                     0, NL80211_CMD_SET_STATION, 0);
4187
4188         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
4189                     if_nametoindex(bss->ifname));
4190         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, drv->bssid);
4191
4192         os_memset(&upd, 0, sizeof(upd));
4193         upd.mask = BIT(NL80211_STA_FLAG_AUTHORIZED);
4194         if (authorized)
4195                 upd.set = BIT(NL80211_STA_FLAG_AUTHORIZED);
4196         NLA_PUT(msg, NL80211_ATTR_STA_FLAGS2, sizeof(upd), &upd);
4197
4198         return send_and_recv_msgs(drv, msg, NULL, NULL);
4199  nla_put_failure:
4200         return -ENOBUFS;
4201 }
4202
4203
4204 #ifdef HOSTAPD
4205
4206 static void add_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx)
4207 {
4208         int i;
4209         int *old;
4210
4211         wpa_printf(MSG_DEBUG, "nl80211: Add own interface ifindex %d",
4212                    ifidx);
4213         for (i = 0; i < drv->num_if_indices; i++) {
4214                 if (drv->if_indices[i] == 0) {
4215                         drv->if_indices[i] = ifidx;
4216                         return;
4217                 }
4218         }
4219
4220         if (drv->if_indices != drv->default_if_indices)
4221                 old = drv->if_indices;
4222         else
4223                 old = NULL;
4224
4225         drv->if_indices = os_realloc(old,
4226                                      sizeof(int) * (drv->num_if_indices + 1));
4227         if (!drv->if_indices) {
4228                 if (!old)
4229                         drv->if_indices = drv->default_if_indices;
4230                 else
4231                         drv->if_indices = old;
4232                 wpa_printf(MSG_ERROR, "Failed to reallocate memory for "
4233                            "interfaces");
4234                 wpa_printf(MSG_ERROR, "Ignoring EAPOL on interface %d", ifidx);
4235                 return;
4236         } else if (!old)
4237                 os_memcpy(drv->if_indices, drv->default_if_indices,
4238                           sizeof(drv->default_if_indices));
4239         drv->if_indices[drv->num_if_indices] = ifidx;
4240         drv->num_if_indices++;
4241 }
4242
4243
4244 static void del_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                         drv->if_indices[i] = 0;
4251                         break;
4252                 }
4253         }
4254 }
4255
4256
4257 static int have_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx)
4258 {
4259         int i;
4260
4261         for (i = 0; i < drv->num_if_indices; i++)
4262                 if (drv->if_indices[i] == ifidx)
4263                         return 1;
4264
4265         return 0;
4266 }
4267
4268
4269 static inline int min_int(int a, int b)
4270 {
4271         if (a < b)
4272                 return a;
4273         return b;
4274 }
4275
4276
4277 static int get_key_handler(struct nl_msg *msg, void *arg)
4278 {
4279         struct nlattr *tb[NL80211_ATTR_MAX + 1];
4280         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
4281
4282         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
4283                   genlmsg_attrlen(gnlh, 0), NULL);
4284
4285         /*
4286          * TODO: validate the key index and mac address!
4287          * Otherwise, there's a race condition as soon as
4288          * the kernel starts sending key notifications.
4289          */
4290
4291         if (tb[NL80211_ATTR_KEY_SEQ])
4292                 memcpy(arg, nla_data(tb[NL80211_ATTR_KEY_SEQ]),
4293                        min_int(nla_len(tb[NL80211_ATTR_KEY_SEQ]), 6));
4294         return NL_SKIP;
4295 }
4296
4297
4298 static int i802_get_seqnum(const char *iface, void *priv, const u8 *addr,
4299                            int idx, u8 *seq)
4300 {
4301         struct i802_bss *bss = priv;
4302         struct wpa_driver_nl80211_data *drv = bss->drv;
4303         struct nl_msg *msg;
4304
4305         msg = nlmsg_alloc();
4306         if (!msg)
4307                 return -ENOMEM;
4308
4309         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4310                     0, NL80211_CMD_GET_KEY, 0);
4311
4312         if (addr)
4313                 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
4314         NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, idx);
4315         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(iface));
4316
4317         memset(seq, 0, 6);
4318
4319         return send_and_recv_msgs(drv, msg, get_key_handler, seq);
4320  nla_put_failure:
4321         return -ENOBUFS;
4322 }
4323
4324
4325 static int i802_set_rate_sets(void *priv, int *supp_rates, int *basic_rates,
4326                               int mode)
4327 {
4328         struct i802_bss *bss = priv;
4329         struct wpa_driver_nl80211_data *drv = bss->drv;
4330         struct nl_msg *msg;
4331         u8 rates[NL80211_MAX_SUPP_RATES];
4332         u8 rates_len = 0;
4333         int i;
4334
4335         msg = nlmsg_alloc();
4336         if (!msg)
4337                 return -ENOMEM;
4338
4339         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
4340                     NL80211_CMD_SET_BSS, 0);
4341
4342         for (i = 0; i < NL80211_MAX_SUPP_RATES && basic_rates[i] >= 0; i++)
4343                 rates[rates_len++] = basic_rates[i] / 5;
4344
4345         NLA_PUT(msg, NL80211_ATTR_BSS_BASIC_RATES, rates_len, rates);
4346
4347         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname));
4348
4349         return send_and_recv_msgs(drv, msg, NULL, NULL);
4350  nla_put_failure:
4351         return -ENOBUFS;
4352 }
4353
4354 #endif /* HOSTAPD */
4355
4356
4357 /* Set kernel driver on given frequency (MHz) */
4358 static int i802_set_freq(void *priv, struct hostapd_freq_params *freq)
4359 {
4360         struct i802_bss *bss = priv;
4361         struct wpa_driver_nl80211_data *drv = bss->drv;
4362         return wpa_driver_nl80211_set_freq(drv, freq->freq, freq->ht_enabled,
4363                                            freq->sec_channel_offset);
4364 }
4365
4366
4367 #ifdef HOSTAPD
4368
4369 static int i802_set_rts(void *priv, int rts)
4370 {
4371         struct i802_bss *bss = priv;
4372         struct wpa_driver_nl80211_data *drv = bss->drv;
4373         struct nl_msg *msg;
4374         int ret = -ENOBUFS;
4375         u32 val;
4376
4377         msg = nlmsg_alloc();
4378         if (!msg)
4379                 return -ENOMEM;
4380
4381         if (rts >= 2347)
4382                 val = (u32) -1;
4383         else
4384                 val = rts;
4385
4386         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4387                     0, NL80211_CMD_SET_WIPHY, 0);
4388         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
4389         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD, val);
4390
4391         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
4392         if (!ret)
4393                 return 0;
4394 nla_put_failure:
4395         wpa_printf(MSG_DEBUG, "nl80211: Failed to set RTS threshold %d: "
4396                    "%d (%s)", rts, ret, strerror(-ret));
4397         return ret;
4398 }
4399
4400
4401 static int i802_set_frag(void *priv, int frag)
4402 {
4403         struct i802_bss *bss = priv;
4404         struct wpa_driver_nl80211_data *drv = bss->drv;
4405         struct nl_msg *msg;
4406         int ret = -ENOBUFS;
4407         u32 val;
4408
4409         msg = nlmsg_alloc();
4410         if (!msg)
4411                 return -ENOMEM;
4412
4413         if (frag >= 2346)
4414                 val = (u32) -1;
4415         else
4416                 val = frag;
4417
4418         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4419                     0, NL80211_CMD_SET_WIPHY, 0);
4420         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
4421         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD, val);
4422
4423         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
4424         if (!ret)
4425                 return 0;
4426 nla_put_failure:
4427         wpa_printf(MSG_DEBUG, "nl80211: Failed to set fragmentation threshold "
4428                    "%d: %d (%s)", frag, ret, strerror(-ret));
4429         return ret;
4430 }
4431
4432
4433 static int i802_flush(void *priv)
4434 {
4435         struct i802_bss *bss = priv;
4436         struct wpa_driver_nl80211_data *drv = bss->drv;
4437         struct nl_msg *msg;
4438
4439         msg = nlmsg_alloc();
4440         if (!msg)
4441                 return -1;
4442
4443         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4444                     0, NL80211_CMD_DEL_STATION, 0);
4445
4446         /*
4447          * XXX: FIX! this needs to flush all VLANs too
4448          */
4449         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
4450                     if_nametoindex(bss->ifname));
4451
4452         return send_and_recv_msgs(drv, msg, NULL, NULL);
4453  nla_put_failure:
4454         return -ENOBUFS;
4455 }
4456
4457
4458 static int get_sta_handler(struct nl_msg *msg, void *arg)
4459 {
4460         struct nlattr *tb[NL80211_ATTR_MAX + 1];
4461         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
4462         struct hostap_sta_driver_data *data = arg;
4463         struct nlattr *stats[NL80211_STA_INFO_MAX + 1];
4464         static struct nla_policy stats_policy[NL80211_STA_INFO_MAX + 1] = {
4465                 [NL80211_STA_INFO_INACTIVE_TIME] = { .type = NLA_U32 },
4466                 [NL80211_STA_INFO_RX_BYTES] = { .type = NLA_U32 },
4467                 [NL80211_STA_INFO_TX_BYTES] = { .type = NLA_U32 },
4468                 [NL80211_STA_INFO_RX_PACKETS] = { .type = NLA_U32 },
4469                 [NL80211_STA_INFO_TX_PACKETS] = { .type = NLA_U32 },
4470         };
4471
4472         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
4473                   genlmsg_attrlen(gnlh, 0), NULL);
4474
4475         /*
4476          * TODO: validate the interface and mac address!
4477          * Otherwise, there's a race condition as soon as
4478          * the kernel starts sending station notifications.
4479          */
4480
4481         if (!tb[NL80211_ATTR_STA_INFO]) {
4482                 wpa_printf(MSG_DEBUG, "sta stats missing!");
4483                 return NL_SKIP;
4484         }
4485         if (nla_parse_nested(stats, NL80211_STA_INFO_MAX,
4486                              tb[NL80211_ATTR_STA_INFO],
4487                              stats_policy)) {
4488                 wpa_printf(MSG_DEBUG, "failed to parse nested attributes!");
4489                 return NL_SKIP;
4490         }
4491
4492         if (stats[NL80211_STA_INFO_INACTIVE_TIME])
4493                 data->inactive_msec =
4494                         nla_get_u32(stats[NL80211_STA_INFO_INACTIVE_TIME]);
4495         if (stats[NL80211_STA_INFO_RX_BYTES])
4496                 data->rx_bytes = nla_get_u32(stats[NL80211_STA_INFO_RX_BYTES]);
4497         if (stats[NL80211_STA_INFO_TX_BYTES])
4498                 data->tx_bytes = nla_get_u32(stats[NL80211_STA_INFO_TX_BYTES]);
4499         if (stats[NL80211_STA_INFO_RX_PACKETS])
4500                 data->rx_packets =
4501                         nla_get_u32(stats[NL80211_STA_INFO_RX_PACKETS]);
4502         if (stats[NL80211_STA_INFO_TX_PACKETS])
4503                 data->tx_packets =
4504                         nla_get_u32(stats[NL80211_STA_INFO_TX_PACKETS]);
4505
4506         return NL_SKIP;
4507 }
4508
4509 static int i802_read_sta_data(void *priv, struct hostap_sta_driver_data *data,
4510                               const u8 *addr)
4511 {
4512         struct i802_bss *bss = priv;
4513         struct wpa_driver_nl80211_data *drv = bss->drv;
4514         struct nl_msg *msg;
4515
4516         os_memset(data, 0, sizeof(*data));
4517         msg = nlmsg_alloc();
4518         if (!msg)
4519                 return -ENOMEM;
4520
4521         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4522                     0, NL80211_CMD_GET_STATION, 0);
4523
4524         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
4525         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname));
4526
4527         return send_and_recv_msgs(drv, msg, get_sta_handler, data);
4528  nla_put_failure:
4529         return -ENOBUFS;
4530 }
4531
4532
4533 static int i802_set_tx_queue_params(void *priv, int queue, int aifs,
4534                                     int cw_min, int cw_max, int burst_time)
4535 {
4536         struct i802_bss *bss = priv;
4537         struct wpa_driver_nl80211_data *drv = bss->drv;
4538         struct nl_msg *msg;
4539         struct nlattr *txq, *params;
4540
4541         msg = nlmsg_alloc();
4542         if (!msg)
4543                 return -1;
4544
4545         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4546                     0, NL80211_CMD_SET_WIPHY, 0);
4547
4548         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname));
4549
4550         txq = nla_nest_start(msg, NL80211_ATTR_WIPHY_TXQ_PARAMS);
4551         if (!txq)
4552                 goto nla_put_failure;
4553
4554         /* We are only sending parameters for a single TXQ at a time */
4555         params = nla_nest_start(msg, 1);
4556         if (!params)
4557                 goto nla_put_failure;
4558
4559         NLA_PUT_U8(msg, NL80211_TXQ_ATTR_QUEUE, queue);
4560         /* Burst time is configured in units of 0.1 msec and TXOP parameter in
4561          * 32 usec, so need to convert the value here. */
4562         NLA_PUT_U16(msg, NL80211_TXQ_ATTR_TXOP, (burst_time * 100 + 16) / 32);
4563         NLA_PUT_U16(msg, NL80211_TXQ_ATTR_CWMIN, cw_min);
4564         NLA_PUT_U16(msg, NL80211_TXQ_ATTR_CWMAX, cw_max);
4565         NLA_PUT_U8(msg, NL80211_TXQ_ATTR_AIFS, aifs);
4566
4567         nla_nest_end(msg, params);
4568
4569         nla_nest_end(msg, txq);
4570
4571         if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0)
4572                 return 0;
4573  nla_put_failure:
4574         return -1;
4575 }
4576
4577
4578 static int i802_set_bss(void *priv, int cts, int preamble, int slot)
4579 {
4580         struct i802_bss *bss = priv;
4581         struct wpa_driver_nl80211_data *drv = bss->drv;
4582         struct nl_msg *msg;
4583
4584         msg = nlmsg_alloc();
4585         if (!msg)
4586                 return -ENOMEM;
4587
4588         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
4589                     NL80211_CMD_SET_BSS, 0);
4590
4591         if (cts >= 0)
4592                 NLA_PUT_U8(msg, NL80211_ATTR_BSS_CTS_PROT, cts);
4593         if (preamble >= 0)
4594                 NLA_PUT_U8(msg, NL80211_ATTR_BSS_SHORT_PREAMBLE, preamble);
4595         if (slot >= 0)
4596                 NLA_PUT_U8(msg, NL80211_ATTR_BSS_SHORT_SLOT_TIME, slot);
4597
4598         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname));
4599
4600         return send_and_recv_msgs(drv, msg, NULL, NULL);
4601  nla_put_failure:
4602         return -ENOBUFS;
4603 }
4604
4605
4606 static int i802_set_cts_protect(void *priv, int value)
4607 {
4608         return i802_set_bss(priv, value, -1, -1);
4609 }
4610
4611
4612 static int i802_set_preamble(void *priv, int value)
4613 {
4614         return i802_set_bss(priv, -1, value, -1);
4615 }
4616
4617
4618 static int i802_set_short_slot_time(void *priv, int value)
4619 {
4620         return i802_set_bss(priv, -1, -1, value);
4621 }
4622
4623
4624 static int i802_set_sta_vlan(void *priv, const u8 *addr,
4625                              const char *ifname, int vlan_id)
4626 {
4627         struct i802_bss *bss = priv;
4628         struct wpa_driver_nl80211_data *drv = bss->drv;
4629         struct nl_msg *msg;
4630         int ret = -ENOBUFS;
4631
4632         msg = nlmsg_alloc();
4633         if (!msg)
4634                 return -ENOMEM;
4635
4636         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
4637                     0, NL80211_CMD_SET_STATION, 0);
4638
4639         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
4640                     if_nametoindex(bss->ifname));
4641         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
4642         NLA_PUT_U32(msg, NL80211_ATTR_STA_VLAN,
4643                     if_nametoindex(ifname));
4644
4645         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
4646         if (ret < 0) {
4647                 wpa_printf(MSG_ERROR, "nl80211: NL80211_ATTR_STA_VLAN (addr="
4648                            MACSTR " ifname=%s vlan_id=%d) failed: %d (%s)",
4649                            MAC2STR(addr), ifname, vlan_id, ret,
4650                            strerror(-ret));
4651         }
4652  nla_put_failure:
4653         return ret;
4654 }
4655
4656
4657 static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val)
4658 {
4659         struct i802_bss *bss = priv;
4660         struct wpa_driver_nl80211_data *drv = bss->drv;
4661         char name[IFNAMSIZ + 1];
4662
4663         os_snprintf(name, sizeof(name), "%s.sta%d", bss->ifname, aid);
4664         wpa_printf(MSG_DEBUG, "nl80211: Set WDS STA addr=" MACSTR
4665                    " aid=%d val=%d name=%s", MAC2STR(addr), aid, val, name);
4666         if (val) {
4667                 if (nl80211_create_iface(drv, name, NL80211_IFTYPE_AP_VLAN,
4668                                          NULL, 1) < 0)
4669                         return -1;
4670                 linux_set_iface_flags(drv->ioctl_sock, name, 1);
4671                 return i802_set_sta_vlan(priv, addr, name, 0);
4672         } else {
4673                 i802_set_sta_vlan(priv, addr, bss->ifname, 0);
4674                 return wpa_driver_nl80211_if_remove(priv, WPA_IF_AP_VLAN,
4675                                                     name);
4676         }
4677 }
4678
4679
4680 static void handle_eapol(int sock, void *eloop_ctx, void *sock_ctx)
4681 {
4682         struct wpa_driver_nl80211_data *drv = eloop_ctx;
4683         struct sockaddr_ll lladdr;
4684         unsigned char buf[3000];
4685         int len;
4686         socklen_t fromlen = sizeof(lladdr);
4687
4688         len = recvfrom(sock, buf, sizeof(buf), 0,
4689                        (struct sockaddr *)&lladdr, &fromlen);
4690         if (len < 0) {
4691                 perror("recv");
4692                 return;
4693         }
4694
4695         if (have_ifidx(drv, lladdr.sll_ifindex))
4696                 drv_event_eapol_rx(drv->ctx, lladdr.sll_addr, buf, len);
4697 }
4698
4699
4700 static int i802_get_inact_sec(void *priv, const u8 *addr)
4701 {
4702         struct hostap_sta_driver_data data;
4703         int ret;
4704
4705         data.inactive_msec = (unsigned long) -1;
4706         ret = i802_read_sta_data(priv, &data, addr);
4707         if (ret || data.inactive_msec == (unsigned long) -1)
4708                 return -1;
4709         return data.inactive_msec / 1000;
4710 }
4711
4712
4713 static int i802_sta_clear_stats(void *priv, const u8 *addr)
4714 {
4715 #if 0
4716         /* TODO */
4717 #endif
4718         return 0;
4719 }
4720
4721
4722 static int i802_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
4723                            int reason)
4724 {
4725         struct i802_bss *bss = priv;
4726         struct ieee80211_mgmt mgmt;
4727
4728         memset(&mgmt, 0, sizeof(mgmt));
4729         mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
4730                                           WLAN_FC_STYPE_DEAUTH);
4731         memcpy(mgmt.da, addr, ETH_ALEN);
4732         memcpy(mgmt.sa, own_addr, ETH_ALEN);
4733         memcpy(mgmt.bssid, own_addr, ETH_ALEN);
4734         mgmt.u.deauth.reason_code = host_to_le16(reason);
4735         return wpa_driver_nl80211_send_mlme(bss, (u8 *) &mgmt,
4736                                             IEEE80211_HDRLEN +
4737                                             sizeof(mgmt.u.deauth));
4738 }
4739
4740
4741 static int i802_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
4742                              int reason)
4743 {
4744         struct i802_bss *bss = priv;
4745         struct ieee80211_mgmt mgmt;
4746
4747         memset(&mgmt, 0, sizeof(mgmt));
4748         mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
4749                                           WLAN_FC_STYPE_DISASSOC);
4750         memcpy(mgmt.da, addr, ETH_ALEN);
4751         memcpy(mgmt.sa, own_addr, ETH_ALEN);
4752         memcpy(mgmt.bssid, own_addr, ETH_ALEN);
4753         mgmt.u.disassoc.reason_code = host_to_le16(reason);
4754         return wpa_driver_nl80211_send_mlme(bss, (u8 *) &mgmt,
4755                                             IEEE80211_HDRLEN +
4756                                             sizeof(mgmt.u.disassoc));
4757 }
4758
4759
4760 static int i802_check_bridge(struct wpa_driver_nl80211_data *drv,
4761                              const char *brname, const char *ifname)
4762 {
4763         int ifindex;
4764         char in_br[IFNAMSIZ];
4765
4766         os_strlcpy(drv->brname, brname, IFNAMSIZ);
4767         ifindex = if_nametoindex(brname);
4768         if (ifindex == 0) {
4769                 /*
4770                  * Bridge was configured, but the bridge device does
4771                  * not exist. Try to add it now.
4772                  */
4773                 if (linux_br_add(drv->ioctl_sock, brname) < 0) {
4774                         wpa_printf(MSG_ERROR, "nl80211: Failed to add the "
4775                                    "bridge interface %s: %s",
4776                                    brname, strerror(errno));
4777                         return -1;
4778                 }
4779                 drv->added_bridge = 1;
4780                 add_ifidx(drv, if_nametoindex(brname));
4781         }
4782
4783         if (linux_br_get(in_br, ifname) == 0) {
4784                 if (os_strcmp(in_br, brname) == 0)
4785                         return 0; /* already in the bridge */
4786
4787                 wpa_printf(MSG_DEBUG, "nl80211: Removing interface %s from "
4788                            "bridge %s", ifname, in_br);
4789                 if (linux_br_del_if(drv->ioctl_sock, in_br, ifname) < 0) {
4790                         wpa_printf(MSG_ERROR, "nl80211: Failed to "
4791                                    "remove interface %s from bridge "
4792                                    "%s: %s",
4793                                    ifname, brname, strerror(errno));
4794                         return -1;
4795                 }
4796         }
4797
4798         wpa_printf(MSG_DEBUG, "nl80211: Adding interface %s into bridge %s",
4799                    ifname, brname);
4800         if (linux_br_add_if(drv->ioctl_sock, brname, ifname) < 0) {
4801                 wpa_printf(MSG_ERROR, "nl80211: Failed to add interface %s "
4802                            "into bridge %s: %s",
4803                            ifname, brname, strerror(errno));
4804                 return -1;
4805         }
4806         drv->added_if_into_bridge = 1;
4807
4808         return 0;
4809 }
4810
4811
4812 static void *i802_init(struct hostapd_data *hapd,
4813                        struct wpa_init_params *params)
4814 {
4815         struct wpa_driver_nl80211_data *drv;
4816         struct i802_bss *bss;
4817         size_t i;
4818         char brname[IFNAMSIZ];
4819         int ifindex, br_ifindex;
4820         int br_added = 0;
4821
4822         bss = wpa_driver_nl80211_init(hapd, params->ifname);
4823         if (bss == NULL)
4824                 return NULL;
4825
4826         drv = bss->drv;
4827         if (linux_br_get(brname, params->ifname) == 0) {
4828                 wpa_printf(MSG_DEBUG, "nl80211: Interface %s is in bridge %s",
4829                            params->ifname, brname);
4830                 br_ifindex = if_nametoindex(brname);
4831         } else {
4832                 brname[0] = '\0';
4833                 br_ifindex = 0;
4834         }
4835
4836         drv->num_if_indices = sizeof(drv->default_if_indices) / sizeof(int);
4837         drv->if_indices = drv->default_if_indices;
4838         for (i = 0; i < params->num_bridge; i++) {
4839                 if (params->bridge[i]) {
4840                         ifindex = if_nametoindex(params->bridge[i]);
4841                         if (ifindex)
4842                                 add_ifidx(drv, ifindex);
4843                         if (ifindex == br_ifindex)
4844                                 br_added = 1;
4845                 }
4846         }
4847         if (!br_added && br_ifindex &&
4848             (params->num_bridge == 0 || !params->bridge[0]))
4849                 add_ifidx(drv, br_ifindex);
4850
4851         /* start listening for EAPOL on the default AP interface */
4852         add_ifidx(drv, drv->ifindex);
4853
4854         if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 0))
4855                 goto failed;
4856
4857         if (params->bssid) {
4858                 if (linux_set_ifhwaddr(drv->ioctl_sock, bss->ifname,
4859                                        params->bssid))
4860                         goto failed;
4861         }
4862
4863         if (wpa_driver_nl80211_set_mode(bss, IEEE80211_MODE_AP)) {
4864                 wpa_printf(MSG_ERROR, "nl80211: Failed to set interface %s "
4865                            "into AP mode", bss->ifname);
4866                 goto failed;
4867         }
4868
4869         if (params->num_bridge && params->bridge[0] &&
4870             i802_check_bridge(drv, params->bridge[0], params->ifname) < 0)
4871                 goto failed;
4872
4873         if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 1))
4874                 goto failed;
4875
4876         drv->eapol_sock = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_PAE));
4877         if (drv->eapol_sock < 0) {
4878                 perror("socket(PF_PACKET, SOCK_DGRAM, ETH_P_PAE)");
4879                 goto failed;
4880         }
4881
4882         if (eloop_register_read_sock(drv->eapol_sock, handle_eapol, drv, NULL))
4883         {
4884                 printf("Could not register read socket for eapol\n");
4885                 goto failed;
4886         }
4887
4888         if (linux_get_ifhwaddr(drv->ioctl_sock, bss->ifname, params->own_addr))
4889                 goto failed;
4890
4891         return bss;
4892
4893 failed:
4894         nl80211_remove_monitor_interface(drv);
4895         if (drv->ioctl_sock >= 0)
4896                 close(drv->ioctl_sock);
4897
4898         genl_family_put(drv->nl80211);
4899         nl_cache_free(drv->nl_cache);
4900         nl_handle_destroy(drv->nl_handle);
4901         nl_cb_put(drv->nl_cb);
4902
4903         os_free(drv);
4904         return NULL;
4905 }
4906
4907
4908 static void i802_deinit(void *priv)
4909 {
4910         wpa_driver_nl80211_deinit(priv);
4911 }
4912
4913 #endif /* HOSTAPD */
4914
4915
4916 static enum nl80211_iftype wpa_driver_nl80211_if_type(
4917         enum wpa_driver_if_type type)
4918 {
4919         switch (type) {
4920         case WPA_IF_STATION:
4921                 return NL80211_IFTYPE_STATION;
4922         case WPA_IF_AP_VLAN:
4923                 return NL80211_IFTYPE_AP_VLAN;
4924         case WPA_IF_AP_BSS:
4925                 return NL80211_IFTYPE_AP;
4926         }
4927         return -1;
4928 }
4929
4930
4931 static int wpa_driver_nl80211_if_add(void *priv, enum wpa_driver_if_type type,
4932                                      const char *ifname, const u8 *addr,
4933                                      void *bss_ctx, void **drv_priv,
4934                                      char *force_ifname, u8 *if_addr)
4935 {
4936         struct i802_bss *bss = priv;
4937         struct wpa_driver_nl80211_data *drv = bss->drv;
4938         int ifidx;
4939 #ifdef HOSTAPD
4940         struct i802_bss *new_bss = NULL;
4941
4942         if (type == WPA_IF_AP_BSS) {
4943                 new_bss = os_zalloc(sizeof(*new_bss));
4944                 if (new_bss == NULL)
4945                         return -1;
4946         }
4947 #endif /* HOSTAPD */
4948
4949         if (addr)
4950                 os_memcpy(if_addr, addr, ETH_ALEN);
4951         ifidx = nl80211_create_iface(drv, ifname,
4952                                      wpa_driver_nl80211_if_type(type), addr,
4953                                      0);
4954         if (ifidx < 0) {
4955 #ifdef HOSTAPD
4956                 os_free(new_bss);
4957 #endif /* HOSTAPD */
4958                 return -1;
4959         }
4960
4961         if (!addr &&
4962             linux_get_ifhwaddr(drv->ioctl_sock, bss->ifname, if_addr) < 0)
4963                 return -1;
4964
4965 #ifdef HOSTAPD
4966         if (type == WPA_IF_AP_BSS) {
4967                 if (linux_set_iface_flags(drv->ioctl_sock, ifname, 1)) {
4968                         nl80211_remove_iface(drv, ifidx);
4969                         os_free(new_bss);
4970                         return -1;
4971                 }
4972                 os_strlcpy(new_bss->ifname, ifname, IFNAMSIZ);
4973                 new_bss->ifindex = ifidx;
4974                 new_bss->drv = drv;
4975                 new_bss->next = drv->first_bss.next;
4976                 drv->first_bss.next = new_bss;
4977                 if (drv_priv)
4978                         *drv_priv = new_bss;
4979         }
4980 #endif /* HOSTAPD */
4981
4982         return 0;
4983 }
4984
4985
4986 static int wpa_driver_nl80211_if_remove(void *priv,
4987                                         enum wpa_driver_if_type type,
4988                                         const char *ifname)
4989 {
4990         struct i802_bss *bss = priv;
4991         struct wpa_driver_nl80211_data *drv = bss->drv;
4992         int ifindex = if_nametoindex(ifname);
4993
4994         wpa_printf(MSG_DEBUG, "nl80211: %s(type=%d ifname=%s) ifindex=%d",
4995                    __func__, type, ifname, ifindex);
4996         if (ifindex <= 0)
4997                 return -1;
4998         nl80211_remove_iface(drv, ifindex);
4999
5000 #ifdef HOSTAPD
5001         if (type != WPA_IF_AP_BSS)
5002                 return 0;
5003
5004         if (bss != &drv->first_bss) {
5005                 struct i802_bss *tbss = &drv->first_bss;
5006
5007                 while (tbss) {
5008                         if (tbss->next != bss)
5009                                 continue;
5010
5011                         tbss->next = bss->next;
5012                         os_free(bss);
5013                         break;
5014                 }
5015         }
5016 #endif /* HOSTAPD */
5017
5018         return 0;
5019 }
5020
5021
5022 static int cookie_handler(struct nl_msg *msg, void *arg)
5023 {
5024         struct nlattr *tb[NL80211_ATTR_MAX + 1];
5025         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
5026         u64 *cookie = arg;
5027         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
5028                   genlmsg_attrlen(gnlh, 0), NULL);
5029         if (tb[NL80211_ATTR_COOKIE])
5030                 *cookie = nla_get_u64(tb[NL80211_ATTR_COOKIE]);
5031         return NL_SKIP;
5032 }
5033
5034
5035 static int wpa_driver_nl80211_send_action(void *priv, unsigned int freq,
5036                                           const u8 *dst, const u8 *src,
5037                                           const u8 *bssid,
5038                                           const u8 *data, size_t data_len)
5039 {
5040         struct i802_bss *bss = priv;
5041         struct wpa_driver_nl80211_data *drv = bss->drv;
5042         int ret = -1;
5043         struct nl_msg *msg;
5044         u8 *buf;
5045         struct ieee80211_hdr *hdr;
5046         u64 cookie;
5047
5048         wpa_printf(MSG_DEBUG, "nl80211: Send Action frame (ifindex=%d)",
5049                    drv->ifindex);
5050
5051         buf = os_zalloc(24 + data_len);
5052         if (buf == NULL)
5053                 return ret;
5054         os_memcpy(buf + 24, data, data_len);
5055         hdr = (struct ieee80211_hdr *) buf;
5056         hdr->frame_control =
5057                 IEEE80211_FC(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_ACTION);
5058         os_memcpy(hdr->addr1, dst, ETH_ALEN);
5059         os_memcpy(hdr->addr2, src, ETH_ALEN);
5060         os_memcpy(hdr->addr3, bssid, ETH_ALEN);
5061
5062         if (drv->nlmode == NL80211_IFTYPE_AP) {
5063                 ret = wpa_driver_nl80211_send_mlme(priv, buf, 24 + data_len);
5064                 os_free(buf);
5065                 return ret;
5066         }
5067
5068         msg = nlmsg_alloc();
5069         if (!msg) {
5070                 os_free(buf);
5071                 return -1;
5072         }
5073
5074         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
5075                     NL80211_CMD_ACTION, 0);
5076
5077         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
5078         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
5079         NLA_PUT(msg, NL80211_ATTR_FRAME, 24 + data_len, buf);
5080         os_free(buf);
5081         buf = NULL;
5082
5083         cookie = 0;
5084         ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie);
5085         msg = NULL;
5086         if (ret) {
5087                 wpa_printf(MSG_DEBUG, "nl80211: Action command failed: ret=%d "
5088                            "(%s)", ret, strerror(-ret));
5089                 goto nla_put_failure;
5090         }
5091         wpa_printf(MSG_DEBUG, "nl80211: Action TX command accepted; "
5092                    "cookie 0x%llx", (long long unsigned int) cookie);
5093         drv->send_action_cookie = cookie;
5094         ret = 0;
5095
5096 nla_put_failure:
5097         os_free(buf);
5098         nlmsg_free(msg);
5099         return ret;
5100 }
5101
5102
5103 static int wpa_driver_nl80211_remain_on_channel(void *priv, unsigned int freq,
5104                                                 unsigned int duration)
5105 {
5106         struct i802_bss *bss = priv;
5107         struct wpa_driver_nl80211_data *drv = bss->drv;
5108         struct nl_msg *msg;
5109         int ret;
5110         u64 cookie;
5111
5112         msg = nlmsg_alloc();
5113         if (!msg)
5114                 return -1;
5115
5116         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
5117                     NL80211_CMD_REMAIN_ON_CHANNEL, 0);
5118
5119         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
5120         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
5121         NLA_PUT_U32(msg, NL80211_ATTR_DURATION, duration);
5122
5123         cookie = 0;
5124         ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie);
5125         if (ret == 0) {
5126                 wpa_printf(MSG_DEBUG, "nl80211: Remain-on-channel cookie "
5127                            "0x%llx for freq=%u MHz duration=%u",
5128                            (long long unsigned int) cookie, freq, duration);
5129                 drv->remain_on_chan_cookie = cookie;
5130                 return 0;
5131         }
5132         wpa_printf(MSG_DEBUG, "nl80211: Failed to request remain-on-channel "
5133                    "(freq=%d duration=%u): %d (%s)",
5134                    freq, duration, ret, strerror(-ret));
5135 nla_put_failure:
5136         return -1;
5137 }
5138
5139
5140 static int wpa_driver_nl80211_cancel_remain_on_channel(void *priv)
5141 {
5142         struct i802_bss *bss = priv;
5143         struct wpa_driver_nl80211_data *drv = bss->drv;
5144         struct nl_msg *msg;
5145         int ret;
5146
5147         if (!drv->pending_remain_on_chan) {
5148                 wpa_printf(MSG_DEBUG, "nl80211: No pending remain-on-channel "
5149                            "to cancel");
5150                 return -1;
5151         }
5152
5153         wpa_printf(MSG_DEBUG, "nl80211: Cancel remain-on-channel with cookie "
5154                    "0x%llx",
5155                    (long long unsigned int) drv->remain_on_chan_cookie);
5156
5157         msg = nlmsg_alloc();
5158         if (!msg)
5159                 return -1;
5160
5161         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
5162                     NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 0);
5163
5164         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
5165         NLA_PUT_U64(msg, NL80211_ATTR_COOKIE, drv->remain_on_chan_cookie);
5166
5167         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
5168         if (ret == 0)
5169                 return 0;
5170         wpa_printf(MSG_DEBUG, "nl80211: Failed to cancel remain-on-channel: "
5171                    "%d (%s)", ret, strerror(-ret));
5172 nla_put_failure:
5173         return -1;
5174 }
5175
5176
5177 static void wpa_driver_nl80211_probe_req_report_timeout(void *eloop_ctx,
5178                                                         void *timeout_ctx)
5179 {
5180         struct wpa_driver_nl80211_data *drv = eloop_ctx;
5181         if (drv->monitor_ifidx < 0)
5182                 return; /* monitor interface already removed */
5183
5184         if (drv->nlmode != NL80211_IFTYPE_STATION)
5185                 return; /* not in station mode anymore */
5186
5187         if (drv->probe_req_report)
5188                 return; /* reporting enabled */
5189
5190         wpa_printf(MSG_DEBUG, "nl80211: Remove monitor interface due to no "
5191                    "Probe Request reporting needed anymore");
5192         nl80211_remove_monitor_interface(drv);
5193 }
5194
5195
5196 static int wpa_driver_nl80211_probe_req_report(void *priv, int report)
5197 {
5198         struct i802_bss *bss = priv;
5199         struct wpa_driver_nl80211_data *drv = bss->drv;
5200
5201         if (drv->nlmode != NL80211_IFTYPE_STATION) {
5202                 wpa_printf(MSG_DEBUG, "nl80211: probe_req_report control only "
5203                            "allowed in station mode (iftype=%d)",
5204                            drv->nlmode);
5205                 return -1;
5206         }
5207         drv->probe_req_report = report;
5208
5209         if (report) {
5210                 eloop_cancel_timeout(
5211                         wpa_driver_nl80211_probe_req_report_timeout,
5212                         drv, NULL);
5213                 if (drv->monitor_ifidx < 0 &&
5214                     nl80211_create_monitor_interface(drv))
5215                         return -1;
5216         } else {
5217                 /*
5218                  * It takes a while to remove the monitor interface, so try to
5219                  * avoid doing this if it is needed again shortly. Instead,
5220                  * schedule the interface to be removed later if no need for it
5221                  * is seen.
5222                  */
5223                 wpa_printf(MSG_DEBUG, "nl80211: Scheduling monitor interface "
5224                            "to be removed after 10 seconds of no use");
5225                 eloop_register_timeout(
5226                         10, 0, wpa_driver_nl80211_probe_req_report_timeout,
5227                         drv, NULL);
5228         }
5229
5230         return 0;
5231 }
5232
5233
5234 static int nl80211_disable_11b_rates(struct wpa_driver_nl80211_data *drv,
5235                                      int ifindex, int disabled)
5236 {
5237         struct nl_msg *msg;
5238         struct nlattr *bands, *band;
5239         int ret;
5240
5241         msg = nlmsg_alloc();
5242         if (!msg)
5243                 return -1;
5244
5245         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
5246                     NL80211_CMD_SET_TX_BITRATE_MASK, 0);
5247         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
5248
5249         bands = nla_nest_start(msg, NL80211_ATTR_TX_RATES);
5250         if (!bands)
5251                 goto nla_put_failure;
5252
5253         /*
5254          * Disable 2 GHz rates 1, 2, 5.5, 11 Mbps by masking out everything
5255          * else apart from 6, 9, 12, 18, 24, 36, 48, 54 Mbps from non-MCS
5256          * rates. All 5 GHz rates are left enabled.
5257          */
5258         band = nla_nest_start(msg, NL80211_BAND_2GHZ);
5259         if (!band)
5260                 goto nla_put_failure;
5261         NLA_PUT(msg, NL80211_TXRATE_LEGACY, 8,
5262                 "\x0c\x12\x18\x24\x30\x48\x60\x6c");
5263         nla_nest_end(msg, band);
5264
5265         nla_nest_end(msg, bands);
5266
5267         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
5268         msg = NULL;
5269         if (ret) {
5270                 wpa_printf(MSG_DEBUG, "nl80211: Set TX rates failed: ret=%d "
5271                            "(%s)", ret, strerror(-ret));
5272         }
5273
5274         return ret;
5275
5276 nla_put_failure:
5277         nlmsg_free(msg);
5278         return -1;
5279 }
5280
5281
5282 static int wpa_driver_nl80211_disable_11b_rates(void *priv, int disabled)
5283 {
5284         struct i802_bss *bss = priv;
5285         struct wpa_driver_nl80211_data *drv = bss->drv;
5286         drv->disable_11b_rates = disabled;
5287         return nl80211_disable_11b_rates(drv, drv->ifindex, disabled);
5288 }
5289
5290
5291 static int wpa_driver_nl80211_deinit_ap(void *priv)
5292 {
5293         struct i802_bss *bss = priv;
5294         struct wpa_driver_nl80211_data *drv = bss->drv;
5295         if (drv->nlmode != NL80211_IFTYPE_AP)
5296                 return -1;
5297         wpa_driver_nl80211_del_beacon(drv);
5298         return wpa_driver_nl80211_set_mode(priv, IEEE80211_MODE_INFRA);
5299 }
5300
5301
5302 static void wpa_driver_nl80211_resume(void *priv)
5303 {
5304         struct i802_bss *bss = priv;
5305         struct wpa_driver_nl80211_data *drv = bss->drv;
5306         if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 1)) {
5307                 wpa_printf(MSG_DEBUG, "nl80211: Failed to set interface up on "
5308                            "resume event");
5309         }
5310 }
5311
5312
5313 static int nl80211_send_ft_action(void *priv, u8 action, const u8 *target_ap,
5314                                   const u8 *ies, size_t ies_len)
5315 {
5316         struct i802_bss *bss = priv;
5317         struct wpa_driver_nl80211_data *drv = bss->drv;
5318         int ret;
5319         u8 *data, *pos;
5320         size_t data_len;
5321         u8 own_addr[ETH_ALEN];
5322
5323         if (linux_get_ifhwaddr(drv->ioctl_sock, bss->ifname, own_addr) < 0)
5324                 return -1;
5325
5326         if (action != 1) {
5327                 wpa_printf(MSG_ERROR, "nl80211: Unsupported send_ft_action "
5328                            "action %d", action);
5329                 return -1;
5330         }
5331
5332         /*
5333          * Action frame payload:
5334          * Category[1] = 6 (Fast BSS Transition)
5335          * Action[1] = 1 (Fast BSS Transition Request)
5336          * STA Address
5337          * Target AP Address
5338          * FT IEs
5339          */
5340
5341         data_len = 2 + 2 * ETH_ALEN + ies_len;
5342         data = os_malloc(data_len);
5343         if (data == NULL)
5344                 return -1;
5345         pos = data;
5346         *pos++ = 0x06; /* FT Action category */
5347         *pos++ = action;
5348         os_memcpy(pos, own_addr, ETH_ALEN);
5349         pos += ETH_ALEN;
5350         os_memcpy(pos, target_ap, ETH_ALEN);
5351         pos += ETH_ALEN;
5352         os_memcpy(pos, ies, ies_len);
5353
5354         ret = wpa_driver_nl80211_send_action(bss, drv->assoc_freq, drv->bssid,
5355                                              own_addr, drv->bssid,
5356                                              data, data_len);
5357         os_free(data);
5358
5359         return ret;
5360 }
5361
5362
5363 static int nl80211_signal_monitor(void *priv, int threshold, int hysteresis)
5364 {
5365         struct i802_bss *bss = priv;
5366         struct wpa_driver_nl80211_data *drv = bss->drv;
5367         struct nl_msg *msg, *cqm = NULL;
5368
5369         wpa_printf(MSG_DEBUG, "nl80211: Signal monitor threshold=%d "
5370                    "hysteresis=%d", threshold, hysteresis);
5371
5372         msg = nlmsg_alloc();
5373         if (!msg)
5374                 return -1;
5375
5376         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
5377                     0, NL80211_CMD_SET_CQM, 0);
5378
5379         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss->ifindex);
5380
5381         cqm = nlmsg_alloc();
5382         if (cqm == NULL)
5383                 return -1;
5384
5385         NLA_PUT_U32(cqm, NL80211_ATTR_CQM_RSSI_THOLD, threshold);
5386         NLA_PUT_U32(cqm, NL80211_ATTR_CQM_RSSI_HYST, hysteresis);
5387         nla_put_nested(msg, NL80211_ATTR_CQM, cqm);
5388
5389         if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0)
5390                 return 0;
5391         msg = NULL;
5392
5393 nla_put_failure:
5394         if (cqm)
5395                 nlmsg_free(cqm);
5396         nlmsg_free(msg);
5397         return -1;
5398 }
5399
5400
5401 static int nl80211_send_frame(void *priv, const u8 *data, size_t data_len,
5402                               int encrypt)
5403 {
5404         struct i802_bss *bss = priv;
5405         struct wpa_driver_nl80211_data *drv = bss->drv;
5406         return wpa_driver_nl80211_send_frame(drv, data, data_len, encrypt);
5407 }
5408
5409
5410 const struct wpa_driver_ops wpa_driver_nl80211_ops = {
5411         .name = "nl80211",
5412         .desc = "Linux nl80211/cfg80211",
5413         .get_bssid = wpa_driver_nl80211_get_bssid,
5414         .get_ssid = wpa_driver_nl80211_get_ssid,
5415         .set_key = wpa_driver_nl80211_set_key,
5416         .scan2 = wpa_driver_nl80211_scan,
5417         .get_scan_results2 = wpa_driver_nl80211_get_scan_results,
5418         .deauthenticate = wpa_driver_nl80211_deauthenticate,
5419         .disassociate = wpa_driver_nl80211_disassociate,
5420         .authenticate = wpa_driver_nl80211_authenticate,
5421         .associate = wpa_driver_nl80211_associate,
5422         .init = wpa_driver_nl80211_init,
5423         .deinit = wpa_driver_nl80211_deinit,
5424         .get_capa = wpa_driver_nl80211_get_capa,
5425         .set_operstate = wpa_driver_nl80211_set_operstate,
5426         .set_supp_port = wpa_driver_nl80211_set_supp_port,
5427         .set_country = wpa_driver_nl80211_set_country,
5428         .set_beacon = wpa_driver_nl80211_set_beacon,
5429         .if_add = wpa_driver_nl80211_if_add,
5430         .if_remove = wpa_driver_nl80211_if_remove,
5431         .send_mlme = wpa_driver_nl80211_send_mlme,
5432         .get_hw_feature_data = wpa_driver_nl80211_get_hw_feature_data,
5433         .sta_add = wpa_driver_nl80211_sta_add,
5434         .sta_remove = wpa_driver_nl80211_sta_remove,
5435         .hapd_send_eapol = wpa_driver_nl80211_hapd_send_eapol,
5436         .sta_set_flags = wpa_driver_nl80211_sta_set_flags,
5437 #ifdef HOSTAPD
5438         .hapd_init = i802_init,
5439         .hapd_deinit = i802_deinit,
5440         .get_seqnum = i802_get_seqnum,
5441         .flush = i802_flush,
5442         .read_sta_data = i802_read_sta_data,
5443         .sta_deauth = i802_sta_deauth,
5444         .sta_disassoc = i802_sta_disassoc,
5445         .get_inact_sec = i802_get_inact_sec,
5446         .sta_clear_stats = i802_sta_clear_stats,
5447         .set_rts = i802_set_rts,
5448         .set_frag = i802_set_frag,
5449         .set_rate_sets = i802_set_rate_sets,
5450         .set_cts_protect = i802_set_cts_protect,
5451         .set_preamble = i802_set_preamble,
5452         .set_short_slot_time = i802_set_short_slot_time,
5453         .set_tx_queue_params = i802_set_tx_queue_params,
5454         .set_sta_vlan = i802_set_sta_vlan,
5455         .set_wds_sta = i802_set_wds_sta,
5456 #endif /* HOSTAPD */
5457         .set_freq = i802_set_freq,
5458         .send_action = wpa_driver_nl80211_send_action,
5459         .remain_on_channel = wpa_driver_nl80211_remain_on_channel,
5460         .cancel_remain_on_channel =
5461         wpa_driver_nl80211_cancel_remain_on_channel,
5462         .probe_req_report = wpa_driver_nl80211_probe_req_report,
5463         .disable_11b_rates = wpa_driver_nl80211_disable_11b_rates,
5464         .deinit_ap = wpa_driver_nl80211_deinit_ap,
5465         .resume = wpa_driver_nl80211_resume,
5466         .send_ft_action = nl80211_send_ft_action,
5467         .signal_monitor = nl80211_signal_monitor,
5468         .send_frame = nl80211_send_frame,
5469 };