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