Move hostapd driver_ops to use similar set_key with wpa_supplicant
[wpasupplicant] / hostapd / driver_nl80211.c
1 /*
2  * hostapd / Kernel driver communication via nl80211
3  * Copyright (c) 2002-2007, 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  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  *
12  * Alternatively, this software may be distributed under the terms of BSD
13  * license.
14  *
15  * See README and COPYING for more details.
16  */
17
18 #include "includes.h"
19
20 #include <sys/ioctl.h>
21 #include <netlink/genl/genl.h>
22 #include <netlink/genl/family.h>
23 #include <netlink/genl/ctrl.h>
24 #include <netlink/msg.h>
25 #include <netlink/attr.h>
26 #include "nl80211_copy.h"
27 #include <net/if.h>
28 #include <netpacket/packet.h>
29 #include "wireless_copy.h"
30 #include <linux/filter.h>
31 #include <net/if_arp.h>
32
33 #include "hostapd.h"
34 #include "config.h"
35 #include "driver.h"
36 #include "eloop.h"
37 #include "hw_features.h"
38 #include "mlme.h"
39 #include "radiotap.h"
40 #include "radiotap_iter.h"
41 #include "ieee802_11_defs.h"
42 #include "ieee802_11_common.h"
43
44 #ifdef CONFIG_LIBNL20
45 /* libnl 2.0 compatibility code */
46 #define nl_handle_alloc_cb nl_socket_alloc_cb
47 #define nl_handle_destroy nl_socket_free
48 #endif /* CONFIG_LIBNL20 */
49
50 static const u8 rfc1042_header[6] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
51
52 enum ieee80211_msg_type {
53         ieee80211_msg_normal = 0,
54         ieee80211_msg_tx_callback_ack = 1,
55         ieee80211_msg_tx_callback_fail = 2,
56 };
57
58 struct i802_bss {
59         struct i802_bss *next;
60         char iface[IFNAMSIZ + 1];
61         int dtim_period;
62         unsigned int beacon_set:1;
63 };
64
65 struct i802_driver_data {
66         struct hostapd_data *hapd;
67
68         char iface[IFNAMSIZ + 1];
69         int bridge;
70         int ioctl_sock; /* socket for ioctl() use */
71         int wext_sock; /* socket for wireless events */
72         int eapol_sock; /* socket for EAPOL frames */
73         int monitor_sock; /* socket for monitor */
74         int monitor_ifidx;
75
76         int default_if_indices[16];
77         int *if_indices;
78         int num_if_indices;
79
80         int we_version;
81         struct nl_handle *nl_handle;
82         struct nl_cache *nl_cache;
83         struct nl_cb *nl_cb;
84         struct genl_family *nl80211;
85         int beacon_int;
86         struct i802_bss bss;
87         unsigned int ieee802_1x_active:1;
88         unsigned int ht_40mhz_scan:1;
89
90         int last_freq;
91         int last_freq_ht;
92         struct hostapd_neighbor_bss *neighbors;
93         size_t num_neighbors;
94 };
95
96
97 static int i802_sta_deauth(void *priv, const u8 *addr, int reason);
98 static int i802_sta_disassoc(void *priv, const u8 *addr, int reason);
99
100
101 static struct i802_bss * get_bss(struct i802_driver_data *drv,
102                                  const char *iface)
103 {
104         struct i802_bss *bss = &drv->bss;
105         while (bss) {
106                 if (os_strncmp(iface, bss->iface, IFNAMSIZ) == 0)
107                         return bss;
108                 bss = bss->next;
109         }
110         wpa_printf(MSG_DEBUG, "nl80211: get_bss(%s) failed", iface);
111         return NULL;
112 }
113
114
115 static void add_ifidx(struct i802_driver_data *drv, int ifidx)
116 {
117         int i;
118         int *old;
119
120         for (i = 0; i < drv->num_if_indices; i++) {
121                 if (drv->if_indices[i] == 0) {
122                         drv->if_indices[i] = ifidx;
123                         return;
124                 }
125         }
126
127         if (drv->if_indices != drv->default_if_indices)
128                 old = drv->if_indices;
129         else
130                 old = NULL;
131
132         drv->if_indices = realloc(old,
133                                   sizeof(int) * (drv->num_if_indices + 1));
134         if (!drv->if_indices) {
135                 if (!old)
136                         drv->if_indices = drv->default_if_indices;
137                 else
138                         drv->if_indices = old;
139                 wpa_printf(MSG_ERROR, "Failed to reallocate memory for "
140                            "interfaces");
141                 wpa_printf(MSG_ERROR, "Ignoring EAPOL on interface %d", ifidx);
142                 return;
143         }
144         drv->if_indices[drv->num_if_indices] = ifidx;
145         drv->num_if_indices++;
146 }
147
148
149 static void del_ifidx(struct i802_driver_data *drv, int ifidx)
150 {
151         int i;
152
153         for (i = 0; i < drv->num_if_indices; i++) {
154                 if (drv->if_indices[i] == ifidx) {
155                         drv->if_indices[i] = 0;
156                         break;
157                 }
158         }
159 }
160
161
162 static int have_ifidx(struct i802_driver_data *drv, int ifidx)
163 {
164         int i;
165
166         if (ifidx == drv->bridge)
167                 return 1;
168
169         for (i = 0; i < drv->num_if_indices; i++)
170                 if (drv->if_indices[i] == ifidx)
171                         return 1;
172
173         return 0;
174 }
175
176
177 /* nl80211 code */
178 static int ack_handler(struct nl_msg *msg, void *arg)
179 {
180         int *err = arg;
181         *err = 0;
182         return NL_STOP;
183 }
184
185 static int finish_handler(struct nl_msg *msg, void *arg)
186 {
187         int *ret = arg;
188         *ret = 0;
189         return NL_SKIP;
190 }
191
192 static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err,
193                          void *arg)
194 {
195         int *ret = arg;
196         *ret = err->error;
197         return NL_SKIP;
198 }
199
200 static int send_and_recv_msgs(struct i802_driver_data *drv,
201                               struct nl_msg *msg,
202                               int (*valid_handler)(struct nl_msg *, void *),
203                               void *valid_data)
204 {
205         struct nl_cb *cb;
206         int err = -ENOMEM;
207
208         cb = nl_cb_clone(drv->nl_cb);
209         if (!cb)
210                 goto out;
211
212         err = nl_send_auto_complete(drv->nl_handle, msg);
213         if (err < 0)
214                 goto out;
215
216         err = 1;
217
218         nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
219         nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err);
220         nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, &err);
221
222         if (valid_handler)
223                 nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM,
224                           valid_handler, valid_data);
225
226         while (err > 0)
227                 nl_recvmsgs(drv->nl_handle, cb);
228  out:
229         nl_cb_put(cb);
230         nlmsg_free(msg);
231         return err;
232 }
233
234 static int hostapd_set_iface_flags(struct i802_driver_data *drv,
235                                    const char *ifname, int dev_up)
236 {
237         struct ifreq ifr;
238
239         if (drv->ioctl_sock < 0)
240                 return -1;
241
242         memset(&ifr, 0, sizeof(ifr));
243         os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
244
245         if (ioctl(drv->ioctl_sock, SIOCGIFFLAGS, &ifr) != 0) {
246                 perror("ioctl[SIOCGIFFLAGS]");
247                 wpa_printf(MSG_DEBUG, "Could not read interface flags (%s)",
248                            drv->iface);
249                 return -1;
250         }
251
252         if (dev_up)
253                 ifr.ifr_flags |= IFF_UP;
254         else
255                 ifr.ifr_flags &= ~IFF_UP;
256
257         if (ioctl(drv->ioctl_sock, SIOCSIFFLAGS, &ifr) != 0) {
258                 perror("ioctl[SIOCSIFFLAGS]");
259                 return -1;
260         }
261
262         return 0;
263 }
264
265
266 static int nl_set_encr(int ifindex, struct i802_driver_data *drv,
267                        wpa_alg alg, const u8 *addr, int idx, const u8 *key,
268                        size_t key_len, int txkey)
269 {
270         struct nl_msg *msg;
271         int ret;
272
273         msg = nlmsg_alloc();
274         if (!msg)
275                 return -ENOMEM;
276
277         if (alg == WPA_ALG_NONE) {
278                 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
279                             0, NL80211_CMD_DEL_KEY, 0);
280         } else {
281                 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
282                             0, NL80211_CMD_NEW_KEY, 0);
283                 NLA_PUT(msg, NL80211_ATTR_KEY_DATA, key_len, key);
284                 switch (alg) {
285                 case WPA_ALG_WEP:
286                         if (key_len == 5)
287                                 NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
288                                             0x000FAC01);
289                         else
290                                 NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
291                                             0x000FAC05);
292                         break;
293                 case WPA_ALG_TKIP:
294                         NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER, 0x000FAC02);
295                         break;
296                 case WPA_ALG_CCMP:
297                         NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER, 0x000FAC04);
298                         break;
299                 case WPA_ALG_IGTK:
300                         NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER, 0x000FAC06);
301                         break;
302                 default:
303                         wpa_printf(MSG_ERROR, "%s: Unsupported encryption "
304                                    "algorithm %d", __func__, alg);
305                         nlmsg_free(msg);
306                         return -1;
307                 }
308         }
309
310         if (addr)
311                 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
312         NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, idx);
313         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
314
315         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
316         if (ret == -ENOENT)
317                 ret = 0;
318
319         /*
320          * If we failed or don't need to set the default TX key (below),
321          * we're done here.
322          */
323         if (ret || !txkey || addr)
324                 return ret;
325
326         msg = nlmsg_alloc();
327         if (!msg)
328                 return -ENOMEM;
329
330         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
331                     0, NL80211_CMD_SET_KEY, 0);
332         NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, idx);
333         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
334         if (alg == WPA_ALG_IGTK)
335                 NLA_PUT_FLAG(msg, NL80211_ATTR_KEY_DEFAULT_MGMT);
336         else
337                 NLA_PUT_FLAG(msg, NL80211_ATTR_KEY_DEFAULT);
338
339         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
340         if (ret == -ENOENT)
341                 ret = 0;
342         return ret;
343  nla_put_failure:
344         return -ENOBUFS;
345 }
346
347
348 static int i802_set_key(const char *iface, void *priv, wpa_alg alg,
349                         const u8 *addr, int key_idx, int set_tx, const u8 *seq,
350                         size_t seq_len, const u8 *key, size_t key_len)
351 {
352         struct i802_driver_data *drv = priv;
353         int ret;
354
355         ret = nl_set_encr(if_nametoindex(iface), drv, alg, addr, key_idx, key,
356                           key_len, set_tx);
357         if (ret < 0)
358                 return ret;
359
360         return ret;
361 }
362
363
364 static inline int min_int(int a, int b)
365 {
366         if (a < b)
367                 return a;
368         return b;
369 }
370
371
372 static int get_key_handler(struct nl_msg *msg, void *arg)
373 {
374         struct nlattr *tb[NL80211_ATTR_MAX + 1];
375         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
376
377         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
378                   genlmsg_attrlen(gnlh, 0), NULL);
379
380         /*
381          * TODO: validate the key index and mac address!
382          * Otherwise, there's a race condition as soon as
383          * the kernel starts sending key notifications.
384          */
385
386         if (tb[NL80211_ATTR_KEY_SEQ])
387                 memcpy(arg, nla_data(tb[NL80211_ATTR_KEY_SEQ]),
388                        min_int(nla_len(tb[NL80211_ATTR_KEY_SEQ]), 6));
389         return NL_SKIP;
390 }
391
392
393 static int i802_get_seqnum(const char *iface, void *priv, const u8 *addr,
394                            int idx, u8 *seq)
395 {
396         struct i802_driver_data *drv = priv;
397         struct nl_msg *msg;
398
399         msg = nlmsg_alloc();
400         if (!msg)
401                 return -ENOMEM;
402
403         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
404                     0, NL80211_CMD_GET_KEY, 0);
405
406         if (addr)
407                 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
408         NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, idx);
409         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(iface));
410
411         memset(seq, 0, 6);
412
413         return send_and_recv_msgs(drv, msg, get_key_handler, seq);
414  nla_put_failure:
415         return -ENOBUFS;
416 }
417
418
419 static int i802_set_rate_sets(void *priv, int *supp_rates, int *basic_rates,
420                               int mode)
421 {
422         struct i802_driver_data *drv = priv;
423         struct nl_msg *msg;
424         u8 rates[NL80211_MAX_SUPP_RATES];
425         u8 rates_len = 0;
426         int i;
427
428         msg = nlmsg_alloc();
429         if (!msg)
430                 return -ENOMEM;
431
432         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
433                     NL80211_CMD_SET_BSS, 0);
434
435         for (i = 0; i < NL80211_MAX_SUPP_RATES && basic_rates[i] >= 0; i++)
436                 rates[rates_len++] = basic_rates[i] / 5;
437
438         NLA_PUT(msg, NL80211_ATTR_BSS_BASIC_RATES, rates_len, rates);
439
440         /* TODO: multi-BSS support */
441         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->iface));
442
443         return send_and_recv_msgs(drv, msg, NULL, NULL);
444  nla_put_failure:
445         return -ENOBUFS;
446 }
447
448
449 static int i802_send_frame(void *priv, const void *data, size_t len,
450                            int encrypt, int flags)
451 {
452         __u8 rtap_hdr[] = {
453                 0x00, 0x00, /* radiotap version */
454                 0x0e, 0x00, /* radiotap length */
455                 0x02, 0xc0, 0x00, 0x00, /* bmap: flags, tx and rx flags */
456                 IEEE80211_RADIOTAP_F_FRAG, /* F_FRAG (fragment if required) */
457                 0x00,       /* padding */
458                 0x00, 0x00, /* RX and TX flags to indicate that */
459                 0x00, 0x00, /* this is the injected frame directly */
460         };
461         struct i802_driver_data *drv = priv;
462         struct iovec iov[2] = {
463                 {
464                         .iov_base = &rtap_hdr,
465                         .iov_len = sizeof(rtap_hdr),
466                 },
467                 {
468                         .iov_base = (void*)data,
469                         .iov_len = len,
470                 }
471         };
472         struct msghdr msg = {
473                 .msg_name = NULL,
474                 .msg_namelen = 0,
475                 .msg_iov = iov,
476                 .msg_iovlen = 2,
477                 .msg_control = NULL,
478                 .msg_controllen = 0,
479                 .msg_flags = 0,
480         };
481
482         if (encrypt)
483                 rtap_hdr[8] |= IEEE80211_RADIOTAP_F_WEP;
484
485         return sendmsg(drv->monitor_sock, &msg, flags);
486 }
487
488 static int i802_send_mgmt_frame(void *priv, const void *data, size_t len,
489                                 int flags)
490 {
491         struct ieee80211_mgmt *mgmt;
492         int do_not_encrypt = 0;
493         u16 fc;
494
495         mgmt = (struct ieee80211_mgmt *) data;
496         fc = le_to_host16(mgmt->frame_control);
497
498         if (WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
499             WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_AUTH) {
500                 /*
501                  * Only one of the authentication frame types is encrypted.
502                  * In order for static WEP encryption to work properly (i.e.,
503                  * to not encrypt the frame), we need to tell mac80211 about
504                  * the frames that must not be encrypted.
505                  */
506                 u16 auth_alg = le_to_host16(mgmt->u.auth.auth_alg);
507                 u16 auth_trans = le_to_host16(mgmt->u.auth.auth_transaction);
508                 if (auth_alg == WLAN_AUTH_OPEN ||
509                     (auth_alg == WLAN_AUTH_SHARED_KEY && auth_trans != 3))
510                         do_not_encrypt = 1;
511         }
512
513         return i802_send_frame(priv, data, len, !do_not_encrypt, flags);
514 }
515
516 /* Set kernel driver on given frequency (MHz) */
517 static int i802_set_freq(void *priv, struct hostapd_freq_params *freq)
518 {
519         struct i802_driver_data *drv = priv;
520         struct nl_msg *msg;
521
522         msg = nlmsg_alloc();
523         if (!msg)
524                 return -1;
525
526         drv->last_freq = freq->freq;
527         drv->last_freq_ht = freq->ht_enabled;
528
529         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
530                     NL80211_CMD_SET_WIPHY, 0);
531
532         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->iface));
533         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq->freq);
534         if (freq->ht_enabled) {
535                 switch (freq->sec_channel_offset) {
536                 case -1:
537                         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
538                                     NL80211_CHAN_HT40MINUS);
539                         break;
540                 case 1:
541                         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
542                                     NL80211_CHAN_HT40PLUS);
543                         break;
544                 default:
545                         NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
546                                     NL80211_CHAN_HT20);
547                         break;
548                 }
549         }
550
551         if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0)
552                 return 0;
553  nla_put_failure:
554         return -1;
555 }
556
557
558 static int i802_set_rts(void *priv, int rts)
559 {
560         struct i802_driver_data *drv = priv;
561         struct iwreq iwr;
562
563         memset(&iwr, 0, sizeof(iwr));
564         os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
565         iwr.u.rts.value = rts;
566         iwr.u.rts.fixed = 1;
567
568         if (ioctl(drv->ioctl_sock, SIOCSIWRTS, &iwr) < 0) {
569                 perror("ioctl[SIOCSIWRTS]");
570                 return -1;
571         }
572
573         return 0;
574 }
575
576
577 static int i802_get_rts(void *priv, int *rts)
578 {
579         struct i802_driver_data *drv = priv;
580         struct iwreq iwr;
581
582         memset(&iwr, 0, sizeof(iwr));
583         os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
584
585         if (ioctl(drv->ioctl_sock, SIOCGIWRTS, &iwr) < 0) {
586                 perror("ioctl[SIOCGIWRTS]");
587                 return -1;
588         }
589
590         *rts = iwr.u.rts.value;
591
592         return 0;
593 }
594
595
596 static int i802_set_frag(void *priv, int frag)
597 {
598         struct i802_driver_data *drv = priv;
599         struct iwreq iwr;
600
601         memset(&iwr, 0, sizeof(iwr));
602         os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
603         iwr.u.frag.value = frag;
604         iwr.u.frag.fixed = 1;
605
606         if (ioctl(drv->ioctl_sock, SIOCSIWFRAG, &iwr) < 0) {
607                 perror("ioctl[SIOCSIWFRAG]");
608                 return -1;
609         }
610
611         return 0;
612 }
613
614
615 static int i802_get_frag(void *priv, int *frag)
616 {
617         struct i802_driver_data *drv = priv;
618         struct iwreq iwr;
619
620         memset(&iwr, 0, sizeof(iwr));
621         os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
622
623         if (ioctl(drv->ioctl_sock, SIOCGIWFRAG, &iwr) < 0) {
624                 perror("ioctl[SIOCGIWFRAG]");
625                 return -1;
626         }
627
628         *frag = iwr.u.frag.value;
629
630         return 0;
631 }
632
633
634 static int i802_set_retry(void *priv, int short_retry, int long_retry)
635 {
636         struct i802_driver_data *drv = priv;
637         struct iwreq iwr;
638
639         memset(&iwr, 0, sizeof(iwr));
640         os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
641
642         iwr.u.retry.value = short_retry;
643         iwr.u.retry.flags = IW_RETRY_LIMIT | IW_RETRY_MIN;
644         if (ioctl(drv->ioctl_sock, SIOCSIWRETRY, &iwr) < 0) {
645                 perror("ioctl[SIOCSIWRETRY(short)]");
646                 return -1;
647         }
648
649         iwr.u.retry.value = long_retry;
650         iwr.u.retry.flags = IW_RETRY_LIMIT | IW_RETRY_MAX;
651         if (ioctl(drv->ioctl_sock, SIOCSIWRETRY, &iwr) < 0) {
652                 perror("ioctl[SIOCSIWRETRY(long)]");
653                 return -1;
654         }
655
656         return 0;
657 }
658
659
660 static int i802_get_retry(void *priv, int *short_retry, int *long_retry)
661 {
662         struct i802_driver_data *drv = priv;
663         struct iwreq iwr;
664
665         memset(&iwr, 0, sizeof(iwr));
666         os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
667
668         iwr.u.retry.flags = IW_RETRY_LIMIT | IW_RETRY_MIN;
669         if (ioctl(drv->ioctl_sock, SIOCGIWRETRY, &iwr) < 0) {
670                 perror("ioctl[SIOCGIWFRAG(short)]");
671                 return -1;
672         }
673         *short_retry = iwr.u.retry.value;
674
675         iwr.u.retry.flags = IW_RETRY_LIMIT | IW_RETRY_MAX;
676         if (ioctl(drv->ioctl_sock, SIOCGIWRETRY, &iwr) < 0) {
677                 perror("ioctl[SIOCGIWFRAG(long)]");
678                 return -1;
679         }
680         *long_retry = iwr.u.retry.value;
681
682         return 0;
683 }
684
685
686 static int i802_flush(void *priv)
687 {
688         struct i802_driver_data *drv = priv;
689         struct nl_msg *msg;
690
691         msg = nlmsg_alloc();
692         if (!msg)
693                 return -1;
694
695         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
696                     0, NL80211_CMD_DEL_STATION, 0);
697
698         /*
699          * XXX: FIX! this needs to flush all VLANs too
700          */
701         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
702                     if_nametoindex(drv->iface));
703
704         return send_and_recv_msgs(drv, msg, NULL, NULL);
705  nla_put_failure:
706         return -ENOBUFS;
707 }
708
709
710 static int get_sta_handler(struct nl_msg *msg, void *arg)
711 {
712         struct nlattr *tb[NL80211_ATTR_MAX + 1];
713         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
714         struct hostap_sta_driver_data *data = arg;
715         struct nlattr *stats[NL80211_STA_INFO_MAX + 1];
716         static struct nla_policy stats_policy[NL80211_STA_INFO_MAX + 1] = {
717                 [NL80211_STA_INFO_INACTIVE_TIME] = { .type = NLA_U32 },
718                 [NL80211_STA_INFO_RX_BYTES] = { .type = NLA_U32 },
719                 [NL80211_STA_INFO_TX_BYTES] = { .type = NLA_U32 },
720                 [NL80211_STA_INFO_RX_PACKETS] = { .type = NLA_U32 },
721                 [NL80211_STA_INFO_TX_PACKETS] = { .type = NLA_U32 },
722         };
723
724         nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
725                   genlmsg_attrlen(gnlh, 0), NULL);
726
727         /*
728          * TODO: validate the interface and mac address!
729          * Otherwise, there's a race condition as soon as
730          * the kernel starts sending station notifications.
731          */
732
733         if (!tb[NL80211_ATTR_STA_INFO]) {
734                 wpa_printf(MSG_DEBUG, "sta stats missing!");
735                 return NL_SKIP;
736         }
737         if (nla_parse_nested(stats, NL80211_STA_INFO_MAX,
738                              tb[NL80211_ATTR_STA_INFO],
739                              stats_policy)) {
740                 wpa_printf(MSG_DEBUG, "failed to parse nested attributes!");
741                 return NL_SKIP;
742         }
743
744         if (stats[NL80211_STA_INFO_INACTIVE_TIME])
745                 data->inactive_msec =
746                         nla_get_u32(stats[NL80211_STA_INFO_INACTIVE_TIME]);
747         if (stats[NL80211_STA_INFO_RX_BYTES])
748                 data->rx_bytes = nla_get_u32(stats[NL80211_STA_INFO_RX_BYTES]);
749         if (stats[NL80211_STA_INFO_TX_BYTES])
750                 data->tx_bytes = nla_get_u32(stats[NL80211_STA_INFO_TX_BYTES]);
751         if (stats[NL80211_STA_INFO_RX_PACKETS])
752                 data->rx_packets =
753                         nla_get_u32(stats[NL80211_STA_INFO_RX_PACKETS]);
754         if (stats[NL80211_STA_INFO_TX_PACKETS])
755                 data->tx_packets =
756                         nla_get_u32(stats[NL80211_STA_INFO_TX_PACKETS]);
757
758         return NL_SKIP;
759 }
760
761 static int i802_read_sta_data(void *priv, struct hostap_sta_driver_data *data,
762                               const u8 *addr)
763 {
764         struct i802_driver_data *drv = priv;
765         struct nl_msg *msg;
766
767         os_memset(data, 0, sizeof(*data));
768         msg = nlmsg_alloc();
769         if (!msg)
770                 return -ENOMEM;
771
772         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
773                     0, NL80211_CMD_GET_STATION, 0);
774
775         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
776         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->iface));
777
778         return send_and_recv_msgs(drv, msg, get_sta_handler, data);
779  nla_put_failure:
780         return -ENOBUFS;
781 }
782
783
784 static int i802_send_eapol(void *priv, const u8 *addr, const u8 *data,
785                            size_t data_len, int encrypt, const u8 *own_addr)
786 {
787         struct i802_driver_data *drv = priv;
788         struct ieee80211_hdr *hdr;
789         size_t len;
790         u8 *pos;
791         int res;
792 #if 0 /* FIX */
793         int qos = sta->flags & WLAN_STA_WME;
794 #else
795         int qos = 0;
796 #endif
797
798         len = sizeof(*hdr) + (qos ? 2 : 0) + sizeof(rfc1042_header) + 2 +
799                 data_len;
800         hdr = os_zalloc(len);
801         if (hdr == NULL) {
802                 printf("malloc() failed for i802_send_data(len=%lu)\n",
803                        (unsigned long) len);
804                 return -1;
805         }
806
807         hdr->frame_control =
808                 IEEE80211_FC(WLAN_FC_TYPE_DATA, WLAN_FC_STYPE_DATA);
809         hdr->frame_control |= host_to_le16(WLAN_FC_FROMDS);
810         if (encrypt)
811                 hdr->frame_control |= host_to_le16(WLAN_FC_ISWEP);
812 #if 0 /* To be enabled if qos determination is added above */
813         if (qos) {
814                 hdr->frame_control |=
815                         host_to_le16(WLAN_FC_STYPE_QOS_DATA << 4);
816         }
817 #endif
818
819         memcpy(hdr->IEEE80211_DA_FROMDS, addr, ETH_ALEN);
820         memcpy(hdr->IEEE80211_BSSID_FROMDS, own_addr, ETH_ALEN);
821         memcpy(hdr->IEEE80211_SA_FROMDS, own_addr, ETH_ALEN);
822         pos = (u8 *) (hdr + 1);
823
824 #if 0 /* To be enabled if qos determination is added above */
825         if (qos) {
826                 /* add an empty QoS header if needed */
827                 pos[0] = 0;
828                 pos[1] = 0;
829                 pos += 2;
830         }
831 #endif
832
833         memcpy(pos, rfc1042_header, sizeof(rfc1042_header));
834         pos += sizeof(rfc1042_header);
835         WPA_PUT_BE16(pos, ETH_P_PAE);
836         pos += 2;
837         memcpy(pos, data, data_len);
838
839         res = i802_send_frame(drv, (u8 *) hdr, len, encrypt, 0);
840         free(hdr);
841
842         if (res < 0) {
843                 perror("i802_send_eapol: send");
844                 printf("i802_send_eapol - packet len: %lu - failed\n",
845                        (unsigned long) len);
846         }
847
848         return res;
849 }
850
851
852 static int i802_sta_add(const char *ifname, void *priv,
853                         struct hostapd_sta_add_params *params)
854 {
855         struct i802_driver_data *drv = priv;
856         struct nl_msg *msg;
857         int ret = -ENOBUFS;
858
859         msg = nlmsg_alloc();
860         if (!msg)
861                 return -ENOMEM;
862
863         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
864                     0, NL80211_CMD_NEW_STATION, 0);
865
866         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
867                     if_nametoindex(drv->iface));
868         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, params->addr);
869         NLA_PUT_U16(msg, NL80211_ATTR_STA_AID, params->aid);
870         NLA_PUT(msg, NL80211_ATTR_STA_SUPPORTED_RATES, params->supp_rates_len,
871                 params->supp_rates);
872         NLA_PUT_U16(msg, NL80211_ATTR_STA_LISTEN_INTERVAL,
873                     params->listen_interval);
874
875 #ifdef CONFIG_IEEE80211N
876         if (params->ht_capabilities) {
877                 NLA_PUT(msg, NL80211_ATTR_HT_CAPABILITY,
878                         params->ht_capabilities->length,
879                         &params->ht_capabilities->data);
880         }
881 #endif /* CONFIG_IEEE80211N */
882
883         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
884         if (ret)
885                 wpa_printf(MSG_DEBUG, "nl80211: NL80211_CMD_NEW_STATION "
886                            "result: %d (%s)", ret, strerror(-ret));
887         if (ret == -EEXIST)
888                 ret = 0;
889  nla_put_failure:
890         return ret;
891 }
892
893
894 static int i802_sta_remove(void *priv, const u8 *addr)
895 {
896         struct i802_driver_data *drv = priv;
897         struct nl_msg *msg;
898         int ret;
899
900         msg = nlmsg_alloc();
901         if (!msg)
902                 return -ENOMEM;
903
904         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
905                     0, NL80211_CMD_DEL_STATION, 0);
906
907         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
908                     if_nametoindex(drv->iface));
909         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
910
911         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
912         if (ret == -ENOENT)
913                 return 0;
914         return ret;
915  nla_put_failure:
916         return -ENOBUFS;
917 }
918
919
920 static int i802_sta_set_flags(void *priv, const u8 *addr,
921                               int total_flags, int flags_or, int flags_and)
922 {
923         struct i802_driver_data *drv = priv;
924         struct nl_msg *msg, *flags = NULL;
925
926         msg = nlmsg_alloc();
927         if (!msg)
928                 return -ENOMEM;
929
930         flags = nlmsg_alloc();
931         if (!flags) {
932                 nlmsg_free(msg);
933                 return -ENOMEM;
934         }
935
936         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
937                     0, NL80211_CMD_SET_STATION, 0);
938
939         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
940                     if_nametoindex(drv->iface));
941         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
942
943         if (total_flags & WLAN_STA_AUTHORIZED || !drv->ieee802_1x_active)
944                 NLA_PUT_FLAG(flags, NL80211_STA_FLAG_AUTHORIZED);
945
946         if (total_flags & WLAN_STA_WMM)
947                 NLA_PUT_FLAG(flags, NL80211_STA_FLAG_WME);
948
949         if (total_flags & WLAN_STA_SHORT_PREAMBLE)
950                 NLA_PUT_FLAG(flags, NL80211_STA_FLAG_SHORT_PREAMBLE);
951
952         if (total_flags & WLAN_STA_MFP)
953                 NLA_PUT_FLAG(flags, NL80211_STA_FLAG_MFP);
954
955         if (nla_put_nested(msg, NL80211_ATTR_STA_FLAGS, flags))
956                 goto nla_put_failure;
957
958         nlmsg_free(flags);
959
960         return send_and_recv_msgs(drv, msg, NULL, NULL);
961  nla_put_failure:
962         nlmsg_free(flags);
963         return -ENOBUFS;
964 }
965
966
967 static int i802_set_tx_queue_params(void *priv, int queue, int aifs,
968                                     int cw_min, int cw_max, int burst_time)
969 {
970         struct i802_driver_data *drv = priv;
971         struct nl_msg *msg;
972         struct nlattr *txq, *params;
973
974         msg = nlmsg_alloc();
975         if (!msg)
976                 return -1;
977
978         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
979                     0, NL80211_CMD_SET_WIPHY, 0);
980
981         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->iface));
982
983         txq = nla_nest_start(msg, NL80211_ATTR_WIPHY_TXQ_PARAMS);
984         if (!txq)
985                 goto nla_put_failure;
986
987         /* We are only sending parameters for a single TXQ at a time */
988         params = nla_nest_start(msg, 1);
989         if (!params)
990                 goto nla_put_failure;
991
992         NLA_PUT_U8(msg, NL80211_TXQ_ATTR_QUEUE, queue);
993         /* Burst time is configured in units of 0.1 msec and TXOP parameter in
994          * 32 usec, so need to convert the value here. */
995         NLA_PUT_U16(msg, NL80211_TXQ_ATTR_TXOP, (burst_time * 100 + 16) / 32);
996         NLA_PUT_U16(msg, NL80211_TXQ_ATTR_CWMIN, cw_min);
997         NLA_PUT_U16(msg, NL80211_TXQ_ATTR_CWMAX, cw_max);
998         NLA_PUT_U8(msg, NL80211_TXQ_ATTR_AIFS, aifs);
999
1000         nla_nest_end(msg, params);
1001
1002         nla_nest_end(msg, txq);
1003
1004         if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0)
1005                 return 0;
1006  nla_put_failure:
1007         return -1;
1008 }
1009
1010
1011 static void nl80211_remove_iface(struct i802_driver_data *drv, int ifidx)
1012 {
1013         struct nl_msg *msg;
1014
1015         /* stop listening for EAPOL on this interface */
1016         del_ifidx(drv, ifidx);
1017
1018         msg = nlmsg_alloc();
1019         if (!msg)
1020                 goto nla_put_failure;
1021
1022         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1023                     0, NL80211_CMD_DEL_INTERFACE, 0);
1024         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifidx);
1025
1026         if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0)
1027                 return;
1028  nla_put_failure:
1029         printf("Failed to remove interface.\n");
1030 }
1031
1032
1033 static int nl80211_create_iface(struct i802_driver_data *drv,
1034                                 const char *ifname,
1035                                 enum nl80211_iftype iftype,
1036                                 const u8 *addr)
1037 {
1038         struct nl_msg *msg, *flags = NULL;
1039         int ifidx;
1040         struct ifreq ifreq;
1041         struct iwreq iwr;
1042         int ret = -ENOBUFS;
1043
1044         msg = nlmsg_alloc();
1045         if (!msg)
1046                 return -1;
1047
1048         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1049                     0, NL80211_CMD_NEW_INTERFACE, 0);
1050         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->iface));
1051         NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, ifname);
1052         NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, iftype);
1053
1054         if (iftype == NL80211_IFTYPE_MONITOR) {
1055                 int err;
1056
1057                 flags = nlmsg_alloc();
1058                 if (!flags)
1059                         goto nla_put_failure;
1060
1061                 NLA_PUT_FLAG(flags, NL80211_MNTR_FLAG_COOK_FRAMES);
1062
1063                 err = nla_put_nested(msg, NL80211_ATTR_MNTR_FLAGS, flags);
1064
1065                 nlmsg_free(flags);
1066
1067                 if (err)
1068                         goto nla_put_failure;
1069         }
1070
1071         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
1072         if (ret) {
1073  nla_put_failure:
1074                 printf("Failed to create interface %s.\n", ifname);
1075                 return ret;
1076         }
1077
1078         ifidx = if_nametoindex(ifname);
1079
1080         if (ifidx <= 0)
1081                 return -1;
1082
1083         /* start listening for EAPOL on this interface */
1084         add_ifidx(drv, ifidx);
1085
1086         if (addr) {
1087                 switch (iftype) {
1088                 case NL80211_IFTYPE_AP:
1089                         os_strlcpy(ifreq.ifr_name, ifname, IFNAMSIZ);
1090                         memcpy(ifreq.ifr_hwaddr.sa_data, addr, ETH_ALEN);
1091                         ifreq.ifr_hwaddr.sa_family = ARPHRD_ETHER;
1092
1093                         if (ioctl(drv->ioctl_sock, SIOCSIFHWADDR, &ifreq)) {
1094                                 nl80211_remove_iface(drv, ifidx);
1095                                 return -1;
1096                         }
1097                         break;
1098                 case NL80211_IFTYPE_WDS:
1099                         memset(&iwr, 0, sizeof(iwr));
1100                         os_strlcpy(iwr.ifr_name, ifname, IFNAMSIZ);
1101                         iwr.u.addr.sa_family = ARPHRD_ETHER;
1102                         memcpy(iwr.u.addr.sa_data, addr, ETH_ALEN);
1103                         if (ioctl(drv->ioctl_sock, SIOCSIWAP, &iwr))
1104                                 return -1;
1105                         break;
1106                 default:
1107                         /* nothing */
1108                         break;
1109                 }
1110         }
1111
1112         return ifidx;
1113 }
1114
1115
1116 static int i802_bss_add(void *priv, const char *ifname, const u8 *bssid)
1117 {
1118         struct i802_driver_data *drv = priv;
1119         int ifidx;
1120         struct i802_bss *bss;
1121
1122         bss = os_zalloc(sizeof(*bss));
1123         if (bss == NULL)
1124                 return -1;
1125         os_strlcpy(bss->iface, ifname, IFNAMSIZ);
1126
1127         ifidx = nl80211_create_iface(priv, ifname, NL80211_IFTYPE_AP, bssid);
1128         if (ifidx < 0) {
1129                 os_free(bss);
1130                 return -1;
1131         }
1132         if (hostapd_set_iface_flags(priv, ifname, 1)) {
1133                 nl80211_remove_iface(priv, ifidx);
1134                 os_free(bss);
1135                 return -1;
1136         }
1137         bss->next = drv->bss.next;
1138         drv->bss.next = bss;
1139         return 0;
1140 }
1141
1142
1143 static int i802_bss_remove(void *priv, const char *ifname)
1144 {
1145         struct i802_driver_data *drv = priv;
1146         struct i802_bss *bss, *prev;
1147         nl80211_remove_iface(priv, if_nametoindex(ifname));
1148         prev = &drv->bss;
1149         bss = drv->bss.next;
1150         while (bss) {
1151                 if (os_strncmp(ifname, bss->iface, IFNAMSIZ) == 0) {
1152                         prev->next = bss->next;
1153                         os_free(bss);
1154                         break;
1155                 }
1156                 prev = bss;
1157                 bss = bss->next;
1158         }
1159         return 0;
1160 }
1161
1162
1163 static int i802_set_beacon(const char *iface, void *priv,
1164                            u8 *head, size_t head_len,
1165                            u8 *tail, size_t tail_len)
1166 {
1167         struct i802_driver_data *drv = priv;
1168         struct nl_msg *msg;
1169         u8 cmd = NL80211_CMD_NEW_BEACON;
1170         int ret;
1171         struct i802_bss *bss;
1172
1173         bss = get_bss(drv, iface);
1174         if (bss == NULL)
1175                 return -ENOENT;
1176
1177         msg = nlmsg_alloc();
1178         if (!msg)
1179                 return -ENOMEM;
1180
1181         wpa_printf(MSG_DEBUG, "nl80211: Set beacon (iface=%s beacon_set=%d)",
1182                    iface, bss->beacon_set);
1183         if (bss->beacon_set)
1184                 cmd = NL80211_CMD_SET_BEACON;
1185
1186         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1187                     0, cmd, 0);
1188         NLA_PUT(msg, NL80211_ATTR_BEACON_HEAD, head_len, head);
1189         NLA_PUT(msg, NL80211_ATTR_BEACON_TAIL, tail_len, tail);
1190         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(iface));
1191         NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL, drv->beacon_int);
1192
1193         if (!bss->dtim_period)
1194                 bss->dtim_period = 2;
1195         NLA_PUT_U32(msg, NL80211_ATTR_DTIM_PERIOD, bss->dtim_period);
1196
1197         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
1198         if (!ret)
1199                 bss->beacon_set = 1;
1200         return ret;
1201  nla_put_failure:
1202         return -ENOBUFS;
1203 }
1204
1205
1206 static int i802_del_beacon(struct i802_driver_data *drv)
1207 {
1208         struct nl_msg *msg;
1209
1210         msg = nlmsg_alloc();
1211         if (!msg)
1212                 return -ENOMEM;
1213
1214         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1215                     0, NL80211_CMD_DEL_BEACON, 0);
1216         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->iface));
1217
1218         return send_and_recv_msgs(drv, msg, NULL, NULL);
1219  nla_put_failure:
1220         return -ENOBUFS;
1221 }
1222
1223
1224 static int i802_set_ieee8021x(const char *ifname, void *priv, int enabled)
1225 {
1226         struct i802_driver_data *drv = priv;
1227
1228         /*
1229          * FIXME: This needs to be per interface (BSS)
1230          */
1231         drv->ieee802_1x_active = enabled;
1232         return 0;
1233 }
1234
1235
1236 static int i802_set_privacy(const char *ifname, void *priv, int enabled)
1237 {
1238         struct i802_driver_data *drv = priv;
1239         struct iwreq iwr;
1240
1241         memset(&iwr, 0, sizeof(iwr));
1242
1243         os_strlcpy(iwr.ifr_name, ifname, IFNAMSIZ);
1244         iwr.u.param.flags = IW_AUTH_PRIVACY_INVOKED;
1245         iwr.u.param.value = enabled;
1246
1247         ioctl(drv->ioctl_sock, SIOCSIWAUTH, &iwr);
1248
1249         /* ignore errors, the kernel/driver might not care */
1250         return 0;
1251 }
1252
1253
1254 static int i802_set_internal_bridge(void *priv, int value)
1255 {
1256         return -1;
1257 }
1258
1259
1260 static int i802_set_beacon_int(void *priv, int value)
1261 {
1262         struct i802_driver_data *drv = priv;
1263         struct nl_msg *msg;
1264
1265         drv->beacon_int = value;
1266
1267         if (!drv->bss.beacon_set)
1268                 return 0;
1269
1270         msg = nlmsg_alloc();
1271         if (!msg)
1272                 return -ENOMEM;
1273
1274         wpa_printf(MSG_DEBUG, "nl80211: Set beacon interval %d "
1275                    "(beacon_set=%d)", value, drv->bss.beacon_set);
1276         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1277                     0, NL80211_CMD_SET_BEACON, 0);
1278         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->iface));
1279
1280         NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL, value);
1281
1282         return send_and_recv_msgs(drv, msg, NULL, NULL);
1283  nla_put_failure:
1284         return -ENOBUFS;
1285 }
1286
1287
1288 static int i802_set_dtim_period(const char *iface, void *priv, int value)
1289 {
1290         struct i802_driver_data *drv = priv;
1291         struct nl_msg *msg;
1292         int ret = -ENOBUFS;
1293         struct i802_bss *bss;
1294
1295         bss = get_bss(drv, iface);
1296         if (bss == NULL)
1297                 return -ENOENT;
1298
1299         msg = nlmsg_alloc();
1300         if (!msg)
1301                 return -ENOMEM;
1302
1303         wpa_printf(MSG_DEBUG, "nl80211: Set beacon DTIM period %d (iface=%s "
1304                    "beacon_set=%d)", value, iface, bss->beacon_set);
1305         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1306                     0, NL80211_CMD_SET_BEACON, 0);
1307         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(iface));
1308
1309         bss->dtim_period = value;
1310         NLA_PUT_U32(msg, NL80211_ATTR_DTIM_PERIOD, bss->dtim_period);
1311
1312         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
1313         if (ret)
1314                 wpa_printf(MSG_DEBUG, "nl80211: NL80211_CMD_SET_BEACON(%s) "
1315                            "result: %d (%s)", iface, ret, strerror(-ret));
1316
1317  nla_put_failure:
1318         return ret;
1319 }
1320
1321
1322 static int i802_set_bss(void *priv, int cts, int preamble, int slot)
1323 {
1324         struct i802_driver_data *drv = priv;
1325         struct nl_msg *msg;
1326
1327         msg = nlmsg_alloc();
1328         if (!msg)
1329                 return -ENOMEM;
1330
1331         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
1332                     NL80211_CMD_SET_BSS, 0);
1333
1334         if (cts >= 0)
1335                 NLA_PUT_U8(msg, NL80211_ATTR_BSS_CTS_PROT, cts);
1336         if (preamble >= 0)
1337                 NLA_PUT_U8(msg, NL80211_ATTR_BSS_SHORT_PREAMBLE, preamble);
1338         if (slot >= 0)
1339                 NLA_PUT_U8(msg, NL80211_ATTR_BSS_SHORT_SLOT_TIME, slot);
1340
1341         /* TODO: multi-BSS support */
1342         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->iface));
1343
1344         return send_and_recv_msgs(drv, msg, NULL, NULL);
1345  nla_put_failure:
1346         return -ENOBUFS;
1347 }
1348
1349
1350 static int i802_set_cts_protect(void *priv, int value)
1351 {
1352         return i802_set_bss(priv, value, -1, -1);
1353 }
1354
1355
1356 static int i802_set_preamble(void *priv, int value)
1357 {
1358         return i802_set_bss(priv, -1, value, -1);
1359 }
1360
1361
1362 static int i802_set_short_slot_time(void *priv, int value)
1363 {
1364         return i802_set_bss(priv, -1, -1, value);
1365 }
1366
1367
1368 static enum nl80211_iftype i802_if_type(enum hostapd_driver_if_type type)
1369 {
1370         switch (type) {
1371         case HOSTAPD_IF_VLAN:
1372                 return NL80211_IFTYPE_AP_VLAN;
1373         case HOSTAPD_IF_WDS:
1374                 return NL80211_IFTYPE_WDS;
1375         }
1376         return -1;
1377 }
1378
1379
1380 static int i802_if_add(const char *iface, void *priv,
1381                        enum hostapd_driver_if_type type, char *ifname,
1382                        const u8 *addr)
1383 {
1384         if (nl80211_create_iface(priv, ifname, i802_if_type(type), addr) < 0)
1385                 return -1;
1386         return 0;
1387 }
1388
1389
1390 static int i802_if_update(void *priv, enum hostapd_driver_if_type type,
1391                           char *ifname, const u8 *addr)
1392 {
1393         /* unused at the moment */
1394         return -1;
1395 }
1396
1397
1398 static int i802_if_remove(void *priv, enum hostapd_driver_if_type type,
1399                           const char *ifname, const u8 *addr)
1400 {
1401         nl80211_remove_iface(priv, if_nametoindex(ifname));
1402         return 0;
1403 }
1404
1405
1406 struct phy_info_arg {
1407         u16 *num_modes;
1408         struct hostapd_hw_modes *modes;
1409 };
1410
1411 static int phy_info_handler(struct nl_msg *msg, void *arg)
1412 {
1413         struct nlattr *tb_msg[NL80211_ATTR_MAX + 1];
1414         struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
1415         struct phy_info_arg *phy_info = arg;
1416
1417         struct nlattr *tb_band[NL80211_BAND_ATTR_MAX + 1];
1418
1419         struct nlattr *tb_freq[NL80211_FREQUENCY_ATTR_MAX + 1];
1420         static struct nla_policy freq_policy[NL80211_FREQUENCY_ATTR_MAX + 1] = {
1421                 [NL80211_FREQUENCY_ATTR_FREQ] = { .type = NLA_U32 },
1422                 [NL80211_FREQUENCY_ATTR_DISABLED] = { .type = NLA_FLAG },
1423                 [NL80211_FREQUENCY_ATTR_PASSIVE_SCAN] = { .type = NLA_FLAG },
1424                 [NL80211_FREQUENCY_ATTR_NO_IBSS] = { .type = NLA_FLAG },
1425                 [NL80211_FREQUENCY_ATTR_RADAR] = { .type = NLA_FLAG },
1426                 [NL80211_FREQUENCY_ATTR_MAX_TX_POWER] = { .type = NLA_U32 },
1427         };
1428
1429         struct nlattr *tb_rate[NL80211_BITRATE_ATTR_MAX + 1];
1430         static struct nla_policy rate_policy[NL80211_BITRATE_ATTR_MAX + 1] = {
1431                 [NL80211_BITRATE_ATTR_RATE] = { .type = NLA_U32 },
1432                 [NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE] = { .type = NLA_FLAG },
1433         };
1434
1435         struct nlattr *nl_band;
1436         struct nlattr *nl_freq;
1437         struct nlattr *nl_rate;
1438         int rem_band, rem_freq, rem_rate;
1439         struct hostapd_hw_modes *mode;
1440         int idx, mode_is_set;
1441
1442         nla_parse(tb_msg, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
1443                   genlmsg_attrlen(gnlh, 0), NULL);
1444
1445         if (!tb_msg[NL80211_ATTR_WIPHY_BANDS])
1446                 return NL_SKIP;
1447
1448         nla_for_each_nested(nl_band, tb_msg[NL80211_ATTR_WIPHY_BANDS], rem_band) {
1449                 mode = realloc(phy_info->modes, (*phy_info->num_modes + 1) * sizeof(*mode));
1450                 if (!mode)
1451                         return NL_SKIP;
1452                 phy_info->modes = mode;
1453
1454                 mode_is_set = 0;
1455
1456                 mode = &phy_info->modes[*(phy_info->num_modes)];
1457                 memset(mode, 0, sizeof(*mode));
1458                 *(phy_info->num_modes) += 1;
1459
1460                 nla_parse(tb_band, NL80211_BAND_ATTR_MAX, nla_data(nl_band),
1461                           nla_len(nl_band), NULL);
1462
1463                 if (tb_band[NL80211_BAND_ATTR_HT_CAPA]) {
1464                         mode->ht_capab = nla_get_u16(
1465                                 tb_band[NL80211_BAND_ATTR_HT_CAPA]);
1466                 }
1467
1468                 nla_for_each_nested(nl_freq, tb_band[NL80211_BAND_ATTR_FREQS], rem_freq) {
1469                         nla_parse(tb_freq, NL80211_FREQUENCY_ATTR_MAX, nla_data(nl_freq),
1470                                   nla_len(nl_freq), freq_policy);
1471                         if (!tb_freq[NL80211_FREQUENCY_ATTR_FREQ])
1472                                 continue;
1473                         mode->num_channels++;
1474                 }
1475
1476                 mode->channels = calloc(mode->num_channels, sizeof(struct hostapd_channel_data));
1477                 if (!mode->channels)
1478                         return NL_SKIP;
1479
1480                 idx = 0;
1481
1482                 nla_for_each_nested(nl_freq, tb_band[NL80211_BAND_ATTR_FREQS], rem_freq) {
1483                         nla_parse(tb_freq, NL80211_FREQUENCY_ATTR_MAX, nla_data(nl_freq),
1484                                   nla_len(nl_freq), freq_policy);
1485                         if (!tb_freq[NL80211_FREQUENCY_ATTR_FREQ])
1486                                 continue;
1487
1488                         mode->channels[idx].freq = nla_get_u32(tb_freq[NL80211_FREQUENCY_ATTR_FREQ]);
1489                         mode->channels[idx].flag = 0;
1490
1491                         if (!mode_is_set) {
1492                                 /* crude heuristic */
1493                                 if (mode->channels[idx].freq < 4000)
1494                                         mode->mode = HOSTAPD_MODE_IEEE80211B;
1495                                 else
1496                                         mode->mode = HOSTAPD_MODE_IEEE80211A;
1497                                 mode_is_set = 1;
1498                         }
1499
1500                         /* crude heuristic */
1501                         if (mode->channels[idx].freq < 4000)
1502                                 if (mode->channels[idx].freq == 2848)
1503                                         mode->channels[idx].chan = 14;
1504                                 else
1505                                         mode->channels[idx].chan = (mode->channels[idx].freq - 2407) / 5;
1506                         else
1507                                 mode->channels[idx].chan = mode->channels[idx].freq/5 - 1000;
1508
1509                         if (tb_freq[NL80211_FREQUENCY_ATTR_DISABLED])
1510                                 mode->channels[idx].flag |=
1511                                         HOSTAPD_CHAN_DISABLED;
1512                         if (tb_freq[NL80211_FREQUENCY_ATTR_PASSIVE_SCAN])
1513                                 mode->channels[idx].flag |=
1514                                         HOSTAPD_CHAN_PASSIVE_SCAN;
1515                         if (tb_freq[NL80211_FREQUENCY_ATTR_NO_IBSS])
1516                                 mode->channels[idx].flag |=
1517                                         HOSTAPD_CHAN_NO_IBSS;
1518                         if (tb_freq[NL80211_FREQUENCY_ATTR_RADAR])
1519                                 mode->channels[idx].flag |=
1520                                         HOSTAPD_CHAN_RADAR;
1521
1522                         if (tb_freq[NL80211_FREQUENCY_ATTR_MAX_TX_POWER] &&
1523                             !tb_freq[NL80211_FREQUENCY_ATTR_DISABLED])
1524                                 mode->channels[idx].max_tx_power =
1525                                         nla_get_u32(tb_freq[NL80211_FREQUENCY_ATTR_MAX_TX_POWER]) / 100;
1526
1527                         idx++;
1528                 }
1529
1530                 nla_for_each_nested(nl_rate, tb_band[NL80211_BAND_ATTR_RATES], rem_rate) {
1531                         nla_parse(tb_rate, NL80211_BITRATE_ATTR_MAX, nla_data(nl_rate),
1532                                   nla_len(nl_rate), rate_policy);
1533                         if (!tb_rate[NL80211_BITRATE_ATTR_RATE])
1534                                 continue;
1535                         mode->num_rates++;
1536                 }
1537
1538                 mode->rates = calloc(mode->num_rates, sizeof(struct hostapd_rate_data));
1539                 if (!mode->rates)
1540                         return NL_SKIP;
1541
1542                 idx = 0;
1543
1544                 nla_for_each_nested(nl_rate, tb_band[NL80211_BAND_ATTR_RATES], rem_rate) {
1545                         nla_parse(tb_rate, NL80211_BITRATE_ATTR_MAX, nla_data(nl_rate),
1546                                   nla_len(nl_rate), rate_policy);
1547                         if (!tb_rate[NL80211_BITRATE_ATTR_RATE])
1548                                 continue;
1549                         mode->rates[idx].rate = nla_get_u32(tb_rate[NL80211_BITRATE_ATTR_RATE]);
1550
1551                         /* crude heuristic */
1552                         if (mode->mode == HOSTAPD_MODE_IEEE80211B &&
1553                             mode->rates[idx].rate > 200)
1554                                 mode->mode = HOSTAPD_MODE_IEEE80211G;
1555
1556                         if (tb_rate[NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE])
1557                                 mode->rates[idx].flags |= HOSTAPD_RATE_PREAMBLE2;
1558
1559                         idx++;
1560                 }
1561         }
1562
1563         return NL_SKIP;
1564 }
1565
1566 static struct hostapd_hw_modes *i802_add_11b(struct hostapd_hw_modes *modes,
1567                                              u16 *num_modes)
1568 {
1569         u16 m;
1570         struct hostapd_hw_modes *mode11g = NULL, *nmodes, *mode;
1571         int i, mode11g_idx = -1;
1572
1573         /* If only 802.11g mode is included, use it to construct matching
1574          * 802.11b mode data. */
1575
1576         for (m = 0; m < *num_modes; m++) {
1577                 if (modes[m].mode == HOSTAPD_MODE_IEEE80211B)
1578                         return modes; /* 802.11b already included */
1579                 if (modes[m].mode == HOSTAPD_MODE_IEEE80211G)
1580                         mode11g_idx = m;
1581         }
1582
1583         if (mode11g_idx < 0)
1584                 return modes; /* 2.4 GHz band not supported at all */
1585
1586         nmodes = os_realloc(modes, (*num_modes + 1) * sizeof(*nmodes));
1587         if (nmodes == NULL)
1588                 return modes; /* Could not add 802.11b mode */
1589
1590         mode = &nmodes[*num_modes];
1591         os_memset(mode, 0, sizeof(*mode));
1592         (*num_modes)++;
1593         modes = nmodes;
1594
1595         mode->mode = HOSTAPD_MODE_IEEE80211B;
1596
1597         mode11g = &modes[mode11g_idx];
1598         mode->num_channels = mode11g->num_channels;
1599         mode->channels = os_malloc(mode11g->num_channels *
1600                                    sizeof(struct hostapd_channel_data));
1601         if (mode->channels == NULL) {
1602                 (*num_modes)--;
1603                 return modes; /* Could not add 802.11b mode */
1604         }
1605         os_memcpy(mode->channels, mode11g->channels,
1606                   mode11g->num_channels * sizeof(struct hostapd_channel_data));
1607
1608         mode->num_rates = 0;
1609         mode->rates = os_malloc(4 * sizeof(struct hostapd_rate_data));
1610         if (mode->rates == NULL) {
1611                 os_free(mode->channels);
1612                 (*num_modes)--;
1613                 return modes; /* Could not add 802.11b mode */
1614         }
1615
1616         for (i = 0; i < mode11g->num_rates; i++) {
1617                 if (mode11g->rates[i].rate > 110 ||
1618                     mode11g->rates[i].flags &
1619                     (HOSTAPD_RATE_ERP | HOSTAPD_RATE_OFDM))
1620                         continue;
1621                 mode->rates[mode->num_rates] = mode11g->rates[i];
1622                 mode->num_rates++;
1623                 if (mode->num_rates == 4)
1624                         break;
1625         }
1626
1627         if (mode->num_rates == 0) {
1628                 os_free(mode->channels);
1629                 os_free(mode->rates);
1630                 (*num_modes)--;
1631                 return modes; /* No 802.11b rates */
1632         }
1633
1634         wpa_printf(MSG_DEBUG, "nl80211: Added 802.11b mode based on 802.11g "
1635                    "information");
1636
1637         return modes;
1638 }
1639
1640 static struct hostapd_hw_modes *i802_get_hw_feature_data(void *priv,
1641                                                          u16 *num_modes,
1642                                                          u16 *flags)
1643 {
1644         struct i802_driver_data *drv = priv;
1645         struct nl_msg *msg;
1646         struct phy_info_arg result = {
1647                 .num_modes = num_modes,
1648                 .modes = NULL,
1649         };
1650
1651         *num_modes = 0;
1652         *flags = 0;
1653
1654         msg = nlmsg_alloc();
1655         if (!msg)
1656                 return NULL;
1657
1658         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1659                     0, NL80211_CMD_GET_WIPHY, 0);
1660
1661         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->iface));
1662
1663         if (send_and_recv_msgs(drv, msg, phy_info_handler, &result) == 0)
1664                 return i802_add_11b(result.modes, num_modes);
1665  nla_put_failure:
1666         return NULL;
1667 }
1668
1669
1670 static int i802_set_sta_vlan(void *priv, const u8 *addr,
1671                              const char *ifname, int vlan_id)
1672 {
1673         struct i802_driver_data *drv = priv;
1674         struct nl_msg *msg;
1675
1676         msg = nlmsg_alloc();
1677         if (!msg)
1678                 return -ENOMEM;
1679
1680         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1681                     0, NL80211_CMD_SET_STATION, 0);
1682
1683         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
1684                     if_nametoindex(drv->iface));
1685         NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
1686         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
1687                     if_nametoindex(ifname));
1688
1689         return send_and_recv_msgs(drv, msg, NULL, NULL);
1690  nla_put_failure:
1691         return -ENOBUFS;
1692 }
1693
1694
1695 static int i802_set_country(void *priv, const char *country)
1696 {
1697         struct i802_driver_data *drv = priv;
1698         struct nl_msg *msg;
1699         char alpha2[3];
1700
1701         msg = nlmsg_alloc();
1702         if (!msg)
1703                 return -ENOMEM;
1704
1705         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1706                     0, NL80211_CMD_REQ_SET_REG, 0);
1707
1708         alpha2[0] = country[0];
1709         alpha2[1] = country[1];
1710         alpha2[2] = '\0';
1711         NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2, alpha2);
1712
1713         return send_and_recv_msgs(drv, msg, NULL, NULL);
1714  nla_put_failure:
1715         return -ENOBUFS;
1716 }
1717
1718
1719 static void handle_tx_callback(struct hostapd_data *hapd, u8 *buf, size_t len,
1720                                int ok)
1721 {
1722         struct ieee80211_hdr *hdr;
1723         u16 fc, type, stype;
1724
1725         hdr = (struct ieee80211_hdr *) buf;
1726         fc = le_to_host16(hdr->frame_control);
1727
1728         type = WLAN_FC_GET_TYPE(fc);
1729         stype = WLAN_FC_GET_STYPE(fc);
1730
1731         switch (type) {
1732         case WLAN_FC_TYPE_MGMT:
1733                 wpa_printf(MSG_DEBUG, "MGMT (TX callback) %s",
1734                            ok ? "ACK" : "fail");
1735                 hostapd_mgmt_tx_cb(hapd, buf, len, stype, ok);
1736                 break;
1737         case WLAN_FC_TYPE_CTRL:
1738                 wpa_printf(MSG_DEBUG, "CTRL (TX callback) %s",
1739                            ok ? "ACK" : "fail");
1740                 break;
1741         case WLAN_FC_TYPE_DATA:
1742                 hostapd_tx_status(hapd, hdr->addr1, buf, len, ok);
1743                 break;
1744         default:
1745                 printf("unknown TX callback frame type %d\n", type);
1746                 break;
1747         }
1748 }
1749
1750
1751 static void handle_frame(struct i802_driver_data *drv,
1752                          struct hostapd_iface *iface, u8 *buf, size_t len,
1753                          struct hostapd_frame_info *hfi,
1754                          enum ieee80211_msg_type msg_type)
1755 {
1756         struct ieee80211_hdr *hdr;
1757         u16 fc, type, stype;
1758         size_t data_len = len;
1759         struct hostapd_data *hapd = NULL;
1760         int broadcast_bssid = 0;
1761         size_t i;
1762         u8 *bssid;
1763
1764         /*
1765          * PS-Poll frames are 16 bytes. All other frames are
1766          * 24 bytes or longer.
1767          */
1768         if (len < 16)
1769                 return;
1770
1771         hdr = (struct ieee80211_hdr *) buf;
1772         fc = le_to_host16(hdr->frame_control);
1773
1774         type = WLAN_FC_GET_TYPE(fc);
1775         stype = WLAN_FC_GET_STYPE(fc);
1776
1777         switch (type) {
1778         case WLAN_FC_TYPE_DATA:
1779                 if (len < 24)
1780                         return;
1781                 switch (fc & (WLAN_FC_FROMDS | WLAN_FC_TODS)) {
1782                 case WLAN_FC_TODS:
1783                         bssid = hdr->addr1;
1784                         break;
1785                 case WLAN_FC_FROMDS:
1786                         bssid = hdr->addr2;
1787                         break;
1788                 default:
1789                         /* discard */
1790                         return;
1791                 }
1792                 break;
1793         case WLAN_FC_TYPE_CTRL:
1794                 /* discard non-ps-poll frames */
1795                 if (stype != WLAN_FC_STYPE_PSPOLL)
1796                         return;
1797                 bssid = hdr->addr1;
1798                 break;
1799         case WLAN_FC_TYPE_MGMT:
1800                 bssid = hdr->addr3;
1801                 break;
1802         default:
1803                 /* discard */
1804                 return;
1805         }
1806
1807         /* find interface frame belongs to */
1808         for (i = 0; i < iface->num_bss; i++) {
1809                 if (memcmp(bssid, iface->bss[i]->own_addr, ETH_ALEN) == 0) {
1810                         hapd = iface->bss[i];
1811                         break;
1812                 }
1813         }
1814
1815         if (hapd == NULL) {
1816                 hapd = iface->bss[0];
1817
1818                 if (bssid[0] != 0xff || bssid[1] != 0xff ||
1819                     bssid[2] != 0xff || bssid[3] != 0xff ||
1820                     bssid[4] != 0xff || bssid[5] != 0xff) {
1821                         /*
1822                          * Unknown BSSID - drop frame if this is not from
1823                          * passive scanning or a beacon (at least ProbeReq
1824                          * frames to other APs may be allowed through RX
1825                          * filtering in the wlan hw/driver)
1826                          */
1827                         if ((type != WLAN_FC_TYPE_MGMT ||
1828                              stype != WLAN_FC_STYPE_BEACON))
1829                                 return;
1830                 } else
1831                         broadcast_bssid = 1;
1832         }
1833
1834         switch (msg_type) {
1835         case ieee80211_msg_normal:
1836                 /* continue processing */
1837                 break;
1838         case ieee80211_msg_tx_callback_ack:
1839                 handle_tx_callback(hapd, buf, data_len, 1);
1840                 return;
1841         case ieee80211_msg_tx_callback_fail:
1842                 handle_tx_callback(hapd, buf, data_len, 0);
1843                 return;
1844         }
1845
1846         switch (type) {
1847         case WLAN_FC_TYPE_MGMT:
1848                 if (stype != WLAN_FC_STYPE_BEACON &&
1849                     stype != WLAN_FC_STYPE_PROBE_REQ)
1850                         wpa_printf(MSG_MSGDUMP, "MGMT");
1851                 if (broadcast_bssid) {
1852                         for (i = 0; i < iface->num_bss; i++)
1853                                 hostapd_mgmt_rx(iface->bss[i], buf, data_len,
1854                                                 stype, hfi);
1855                 } else
1856                         hostapd_mgmt_rx(hapd, buf, data_len, stype, hfi);
1857                 break;
1858         case WLAN_FC_TYPE_CTRL:
1859                 /* can only get here with PS-Poll frames */
1860                 wpa_printf(MSG_DEBUG, "CTRL");
1861                 hostapd_rx_from_unknown_sta(drv->hapd, hdr->addr2);
1862                 break;
1863         case WLAN_FC_TYPE_DATA:
1864                 hostapd_rx_from_unknown_sta(drv->hapd, hdr->addr2);
1865                 break;
1866         }
1867 }
1868
1869
1870 static void handle_eapol(int sock, void *eloop_ctx, void *sock_ctx)
1871 {
1872         struct i802_driver_data *drv = eloop_ctx;
1873         struct hostapd_data *hapd = drv->hapd;
1874         struct sockaddr_ll lladdr;
1875         unsigned char buf[3000];
1876         int len;
1877         socklen_t fromlen = sizeof(lladdr);
1878
1879         len = recvfrom(sock, buf, sizeof(buf), 0,
1880                        (struct sockaddr *)&lladdr, &fromlen);
1881         if (len < 0) {
1882                 perror("recv");
1883                 return;
1884         }
1885
1886         if (have_ifidx(drv, lladdr.sll_ifindex))
1887                 hostapd_eapol_receive(hapd, lladdr.sll_addr, buf, len);
1888 }
1889
1890
1891 static void handle_monitor_read(int sock, void *eloop_ctx, void *sock_ctx)
1892 {
1893         struct i802_driver_data *drv = eloop_ctx;
1894         int len;
1895         unsigned char buf[3000];
1896         struct hostapd_data *hapd = drv->hapd;
1897         struct ieee80211_radiotap_iterator iter;
1898         int ret;
1899         struct hostapd_frame_info hfi;
1900         int injected = 0, failed = 0, msg_type, rxflags = 0;
1901
1902         len = recv(sock, buf, sizeof(buf), 0);
1903         if (len < 0) {
1904                 perror("recv");
1905                 return;
1906         }
1907
1908         if (ieee80211_radiotap_iterator_init(&iter, (void*)buf, len)) {
1909                 printf("received invalid radiotap frame\n");
1910                 return;
1911         }
1912
1913         memset(&hfi, 0, sizeof(hfi));
1914
1915         while (1) {
1916                 ret = ieee80211_radiotap_iterator_next(&iter);
1917                 if (ret == -ENOENT)
1918                         break;
1919                 if (ret) {
1920                         printf("received invalid radiotap frame (%d)\n", ret);
1921                         return;
1922                 }
1923                 switch (iter.this_arg_index) {
1924                 case IEEE80211_RADIOTAP_FLAGS:
1925                         if (*iter.this_arg & IEEE80211_RADIOTAP_F_FCS)
1926                                 len -= 4;
1927                         break;
1928                 case IEEE80211_RADIOTAP_RX_FLAGS:
1929                         rxflags = 1;
1930                         break;
1931                 case IEEE80211_RADIOTAP_TX_FLAGS:
1932                         injected = 1;
1933                         failed = le_to_host16((*(uint16_t *) iter.this_arg)) &
1934                                         IEEE80211_RADIOTAP_F_TX_FAIL;
1935                         break;
1936                 case IEEE80211_RADIOTAP_DATA_RETRIES:
1937                         break;
1938                 case IEEE80211_RADIOTAP_CHANNEL:
1939                         /* TODO convert from freq/flags to channel number
1940                         hfi.channel = XXX;
1941                         hfi.phytype = XXX;
1942                          */
1943                         break;
1944                 case IEEE80211_RADIOTAP_RATE:
1945                         hfi.datarate = *iter.this_arg * 5;
1946                         break;
1947                 case IEEE80211_RADIOTAP_DB_ANTSIGNAL:
1948                         hfi.ssi_signal = *iter.this_arg;
1949                         break;
1950                 }
1951         }
1952
1953         if (rxflags && injected)
1954                 return;
1955
1956         if (!injected)
1957                 msg_type = ieee80211_msg_normal;
1958         else if (failed)
1959                 msg_type = ieee80211_msg_tx_callback_fail;
1960         else
1961                 msg_type = ieee80211_msg_tx_callback_ack;
1962
1963         handle_frame(drv, hapd->iface, buf + iter.max_length,
1964                      len - iter.max_length, &hfi, msg_type);
1965 }
1966
1967
1968 /*
1969  * we post-process the filter code later and rewrite
1970  * this to the offset to the last instruction
1971  */
1972 #define PASS    0xFF
1973 #define FAIL    0xFE
1974
1975 static struct sock_filter msock_filter_insns[] = {
1976         /*
1977          * do a little-endian load of the radiotap length field
1978          */
1979         /* load lower byte into A */
1980         BPF_STMT(BPF_LD  | BPF_B | BPF_ABS, 2),
1981         /* put it into X (== index register) */
1982         BPF_STMT(BPF_MISC| BPF_TAX, 0),
1983         /* load upper byte into A */
1984         BPF_STMT(BPF_LD  | BPF_B | BPF_ABS, 3),
1985         /* left-shift it by 8 */
1986         BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 8),
1987         /* or with X */
1988         BPF_STMT(BPF_ALU | BPF_OR | BPF_X, 0),
1989         /* put result into X */
1990         BPF_STMT(BPF_MISC| BPF_TAX, 0),
1991
1992         /*
1993          * Allow management frames through, this also gives us those
1994          * management frames that we sent ourselves with status
1995          */
1996         /* load the lower byte of the IEEE 802.11 frame control field */
1997         BPF_STMT(BPF_LD  | BPF_B | BPF_IND, 0),
1998         /* mask off frame type and version */
1999         BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xF),
2000         /* accept frame if it's both 0, fall through otherwise */
2001         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, PASS, 0),
2002
2003         /*
2004          * TODO: add a bit to radiotap RX flags that indicates
2005          * that the sending station is not associated, then
2006          * add a filter here that filters on our DA and that flag
2007          * to allow us to deauth frames to that bad station.
2008          *
2009          * Not a regression -- we didn't do it before either.
2010          */
2011
2012 #if 0
2013         /*
2014          * drop non-data frames, WDS frames
2015          */
2016         /* load the lower byte of the frame control field */
2017         BPF_STMT(BPF_LD   | BPF_B | BPF_IND, 0),
2018         /* mask off QoS bit */
2019         BPF_STMT(BPF_ALU  | BPF_AND | BPF_K, 0x0c),
2020         /* drop non-data frames */
2021         BPF_JUMP(BPF_JMP  | BPF_JEQ | BPF_K, 8, 0, FAIL),
2022         /* load the upper byte of the frame control field */
2023         BPF_STMT(BPF_LD   | BPF_B | BPF_IND, 0),
2024         /* mask off toDS/fromDS */
2025         BPF_STMT(BPF_ALU  | BPF_AND | BPF_K, 0x03),
2026         /* drop WDS frames */
2027         BPF_JUMP(BPF_JMP  | BPF_JEQ | BPF_K, 3, FAIL, 0),
2028 #endif
2029
2030         /*
2031          * add header length to index
2032          */
2033         /* load the lower byte of the frame control field */
2034         BPF_STMT(BPF_LD   | BPF_B | BPF_IND, 0),
2035         /* mask off QoS bit */
2036         BPF_STMT(BPF_ALU  | BPF_AND | BPF_K, 0x80),
2037         /* right shift it by 6 to give 0 or 2 */
2038         BPF_STMT(BPF_ALU  | BPF_RSH | BPF_K, 6),
2039         /* add data frame header length */
2040         BPF_STMT(BPF_ALU  | BPF_ADD | BPF_K, 24),
2041         /* add index, was start of 802.11 header */
2042         BPF_STMT(BPF_ALU  | BPF_ADD | BPF_X, 0),
2043         /* move to index, now start of LL header */
2044         BPF_STMT(BPF_MISC | BPF_TAX, 0),
2045
2046         /*
2047          * Accept empty data frames, we use those for
2048          * polling activity.
2049          */
2050         BPF_STMT(BPF_LD  | BPF_W | BPF_LEN, 0),
2051         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, PASS, 0),
2052
2053         /*
2054          * Accept EAPOL frames
2055          */
2056         BPF_STMT(BPF_LD  | BPF_W | BPF_IND, 0),
2057         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0xAAAA0300, 0, FAIL),
2058         BPF_STMT(BPF_LD  | BPF_W | BPF_IND, 4),
2059         BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0000888E, PASS, FAIL),
2060
2061         /* keep these last two statements or change the code below */
2062         /* return 0 == "DROP" */
2063         BPF_STMT(BPF_RET | BPF_K, 0),
2064         /* return ~0 == "keep all" */
2065         BPF_STMT(BPF_RET | BPF_K, ~0),
2066 };
2067
2068 static struct sock_fprog msock_filter = {
2069         .len = sizeof(msock_filter_insns)/sizeof(msock_filter_insns[0]),
2070         .filter = msock_filter_insns,
2071 };
2072
2073
2074 static int add_monitor_filter(int s)
2075 {
2076         int idx;
2077
2078         /* rewrite all PASS/FAIL jump offsets */
2079         for (idx = 0; idx < msock_filter.len; idx++) {
2080                 struct sock_filter *insn = &msock_filter_insns[idx];
2081
2082                 if (BPF_CLASS(insn->code) == BPF_JMP) {
2083                         if (insn->code == (BPF_JMP|BPF_JA)) {
2084                                 if (insn->k == PASS)
2085                                         insn->k = msock_filter.len - idx - 2;
2086                                 else if (insn->k == FAIL)
2087                                         insn->k = msock_filter.len - idx - 3;
2088                         }
2089
2090                         if (insn->jt == PASS)
2091                                 insn->jt = msock_filter.len - idx - 2;
2092                         else if (insn->jt == FAIL)
2093                                 insn->jt = msock_filter.len - idx - 3;
2094
2095                         if (insn->jf == PASS)
2096                                 insn->jf = msock_filter.len - idx - 2;
2097                         else if (insn->jf == FAIL)
2098                                 insn->jf = msock_filter.len - idx - 3;
2099                 }
2100         }
2101
2102         if (setsockopt(s, SOL_SOCKET, SO_ATTACH_FILTER,
2103                        &msock_filter, sizeof(msock_filter))) {
2104                 perror("SO_ATTACH_FILTER");
2105                 return -1;
2106         }
2107
2108         return 0;
2109 }
2110
2111
2112 static int nl80211_create_monitor_interface(struct i802_driver_data *drv)
2113 {
2114         char buf[IFNAMSIZ];
2115         struct sockaddr_ll ll;
2116         int optval;
2117         socklen_t optlen;
2118
2119         snprintf(buf, IFNAMSIZ, "mon.%s", drv->iface);
2120         buf[IFNAMSIZ - 1] = '\0';
2121
2122         drv->monitor_ifidx =
2123                 nl80211_create_iface(drv, buf, NL80211_IFTYPE_MONITOR, NULL);
2124
2125         if (drv->monitor_ifidx < 0)
2126                 return -1;
2127
2128         if (hostapd_set_iface_flags(drv, buf, 1))
2129                 goto error;
2130
2131         memset(&ll, 0, sizeof(ll));
2132         ll.sll_family = AF_PACKET;
2133         ll.sll_ifindex = drv->monitor_ifidx;
2134         drv->monitor_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
2135         if (drv->monitor_sock < 0) {
2136                 perror("socket[PF_PACKET,SOCK_RAW]");
2137                 goto error;
2138         }
2139
2140         if (add_monitor_filter(drv->monitor_sock)) {
2141                 wpa_printf(MSG_INFO, "Failed to set socket filter for monitor "
2142                            "interface; do filtering in user space");
2143                 /* This works, but will cost in performance. */
2144         }
2145
2146         if (bind(drv->monitor_sock, (struct sockaddr *) &ll,
2147                  sizeof(ll)) < 0) {
2148                 perror("monitor socket bind");
2149                 goto error;
2150         }
2151
2152         optlen = sizeof(optval);
2153         optval = 20;
2154         if (setsockopt
2155             (drv->monitor_sock, SOL_SOCKET, SO_PRIORITY, &optval, optlen)) {
2156                 perror("Failed to set socket priority");
2157                 goto error;
2158         }
2159
2160         if (eloop_register_read_sock(drv->monitor_sock, handle_monitor_read,
2161                                      drv, NULL)) {
2162                 printf("Could not register monitor read socket\n");
2163                 goto error;
2164         }
2165
2166         return 0;
2167  error:
2168         nl80211_remove_iface(drv, drv->monitor_ifidx);
2169         return -1;
2170 }
2171
2172
2173 static int nl80211_set_mode(struct i802_driver_data *drv, const char *ifname,
2174                             int mode)
2175 {
2176         struct nl_msg *msg;
2177         int ret = -ENOBUFS;
2178
2179         msg = nlmsg_alloc();
2180         if (!msg)
2181                 return -ENOMEM;
2182
2183         genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
2184                     0, NL80211_CMD_SET_INTERFACE, 0);
2185         NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
2186                     if_nametoindex(ifname));
2187         NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, mode);
2188
2189         ret = send_and_recv_msgs(drv, msg, NULL, NULL);
2190         if (!ret)
2191                 return 0;
2192  nla_put_failure:
2193         wpa_printf(MSG_ERROR, "Failed to set interface %s to master "
2194                    "mode.", ifname);
2195         return ret;
2196 }
2197
2198
2199 #ifdef CONFIG_IEEE80211N
2200 static void i802_add_neighbor(struct i802_driver_data *drv, u8 *bssid,
2201                               int freq, u8 *ie, size_t ie_len)
2202 {
2203         struct ieee802_11_elems elems;
2204         int ht, pri_chan = 0, sec_chan = 0;
2205         struct ieee80211_ht_operation *oper;
2206         struct hostapd_neighbor_bss *nnei;
2207
2208         ieee802_11_parse_elems(ie, ie_len, &elems, 0);
2209         ht = elems.ht_capabilities || elems.ht_operation;
2210         if (elems.ht_operation && elems.ht_operation_len >= sizeof(*oper)) {
2211                 oper = (struct ieee80211_ht_operation *) elems.ht_operation;
2212                 pri_chan = oper->control_chan;
2213                 if (oper->ht_param & HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH) {
2214                         if (oper->ht_param &
2215                             HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE)
2216                                 sec_chan = pri_chan + 4;
2217                         else if (oper->ht_param &
2218                             HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW)
2219                                 sec_chan = pri_chan - 4;
2220                 }
2221         }
2222
2223         wpa_printf(MSG_DEBUG, "nl80211: Neighboring BSS - bssid=" MACSTR
2224                    " freq=%d MHz HT=%d pri_chan=%d sec_chan=%d",
2225                    MAC2STR(bssid), freq, ht, pri_chan, sec_chan);
2226
2227         nnei = os_realloc(drv->neighbors, (drv->num_neighbors + 1) *
2228                           sizeof(struct hostapd_neighbor_bss));
2229         if (nnei == NULL)
2230                 return;
2231         drv->neighbors = nnei;
2232         nnei = &nnei[drv->num_neighbors];
2233         os_memcpy(nnei->bssid, bssid, ETH_ALEN);
2234         nnei->freq = freq;
2235         nnei->ht = !!ht;
2236         nnei->pri_chan = pri_chan;
2237         nnei->sec_chan = sec_chan;
2238         drv->num_neighbors++;
2239 }
2240
2241
2242 static int i802_get_scan_freq(struct iw_event *iwe, int *freq)
2243 {
2244         int divi = 1000000, i;
2245
2246         if (iwe->u.freq.e == 0) {
2247                 /*
2248                  * Some drivers do not report frequency, but a channel.
2249                  * Try to map this to frequency by assuming they are using
2250                  * IEEE 802.11b/g.  But don't overwrite a previously parsed
2251                  * frequency if the driver sends both frequency and channel,
2252                  * since the driver may be sending an A-band channel that we
2253                  * don't handle here.
2254                  */
2255
2256                 if (*freq)
2257                         return 0;
2258
2259                 if (iwe->u.freq.m >= 1 && iwe->u.freq.m <= 13) {
2260                         *freq = 2407 + 5 * iwe->u.freq.m;
2261                         return 0;
2262                 } else if (iwe->u.freq.m == 14) {
2263                         *freq = 2484;
2264                         return 0;
2265                 }
2266         }
2267
2268         if (iwe->u.freq.e > 6) {
2269                 wpa_printf(MSG_DEBUG, "Invalid freq in scan results: "
2270                            "m=%d e=%d", iwe->u.freq.m, iwe->u.freq.e);
2271                 return -1;
2272         }
2273
2274         for (i = 0; i < iwe->u.freq.e; i++)
2275                 divi /= 10;
2276         *freq = iwe->u.freq.m / divi;
2277         return 0;
2278 }
2279
2280
2281 static int i802_parse_scan(struct i802_driver_data *drv, u8 *res_buf,
2282                            size_t len)
2283 {
2284         size_t ap_num = 0;
2285         int first;
2286         struct iw_event iwe_buf, *iwe = &iwe_buf;
2287         char *pos, *end, *custom;
2288         u8 bssid[ETH_ALEN];
2289         int freq = 0;
2290         u8 *ie = NULL;
2291         size_t ie_len = 0;
2292
2293         ap_num = 0;
2294         first = 1;
2295
2296         pos = (char *) res_buf;
2297         end = (char *) res_buf + len;
2298
2299         while (pos + IW_EV_LCP_LEN <= end) {
2300                 /* Event data may be unaligned, so make a local, aligned copy
2301                  * before processing. */
2302                 os_memcpy(&iwe_buf, pos, IW_EV_LCP_LEN);
2303                 if (iwe->len <= IW_EV_LCP_LEN)
2304                         break;
2305
2306                 custom = pos + IW_EV_POINT_LEN;
2307                 if (iwe->cmd == IWEVGENIE) {
2308                         /* WE-19 removed the pointer from struct iw_point */
2309                         char *dpos = (char *) &iwe_buf.u.data.length;
2310                         int dlen = dpos - (char *) &iwe_buf;
2311                         os_memcpy(dpos, pos + IW_EV_LCP_LEN,
2312                                   sizeof(struct iw_event) - dlen);
2313                 } else {
2314                         os_memcpy(&iwe_buf, pos, sizeof(struct iw_event));
2315                         custom += IW_EV_POINT_OFF;
2316                 }
2317
2318                 switch (iwe->cmd) {
2319                 case SIOCGIWAP:
2320                         if (!first)
2321                                 i802_add_neighbor(drv, bssid, freq, ie,
2322                                                   ie_len);
2323                         first = 0;
2324                         os_memcpy(bssid, iwe->u.ap_addr.sa_data, ETH_ALEN);
2325                         freq = 0;
2326                         ie = NULL;
2327                         ie_len = 0;
2328                         break;
2329                 case SIOCGIWFREQ:
2330                         i802_get_scan_freq(iwe, &freq);
2331                         break;
2332                 case IWEVGENIE:
2333                         if (custom + iwe->u.data.length > end) {
2334                                 wpa_printf(MSG_ERROR, "IWEVGENIE overflow");
2335                                 return -1;
2336                         }
2337                         ie = (u8 *) custom;
2338                         ie_len = iwe->u.data.length;
2339                         break;
2340                 }
2341
2342                 pos += iwe->len;
2343         }
2344
2345         if (!first)
2346                 i802_add_neighbor(drv, bssid, freq, ie, ie_len);
2347
2348         return 0;
2349 }
2350
2351
2352 static int i802_get_ht_scan_res(struct i802_driver_data *drv)
2353 {
2354         struct iwreq iwr;
2355         u8 *res_buf;
2356         size_t res_buf_len;
2357         int res;
2358
2359         res_buf_len = IW_SCAN_MAX_DATA;
2360         for (;;) {
2361                 res_buf = os_malloc(res_buf_len);
2362                 if (res_buf == NULL)
2363                         return -1;
2364                 os_memset(&iwr, 0, sizeof(iwr));
2365                 os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
2366                 iwr.u.data.pointer = res_buf;
2367                 iwr.u.data.length = res_buf_len;
2368
2369                 if (ioctl(drv->ioctl_sock, SIOCGIWSCAN, &iwr) == 0)
2370                         break;
2371
2372                 if (errno == E2BIG && res_buf_len < 65535) {
2373                         os_free(res_buf);
2374                         res_buf = NULL;
2375                         res_buf_len *= 2;
2376                         if (res_buf_len > 65535)
2377                                 res_buf_len = 65535; /* 16-bit length field */
2378                         wpa_printf(MSG_DEBUG, "Scan results did not fit - "
2379                                    "trying larger buffer (%lu bytes)",
2380                                    (unsigned long) res_buf_len);
2381                 } else {
2382                         perror("ioctl[SIOCGIWSCAN]");
2383                         os_free(res_buf);
2384                         return -1;
2385                 }
2386         }
2387
2388         if (iwr.u.data.length > res_buf_len) {
2389                 os_free(res_buf);
2390                 return -1;
2391         }
2392
2393         res = i802_parse_scan(drv, res_buf, iwr.u.data.length);
2394         os_free(res_buf);
2395
2396         return res;
2397 }
2398
2399
2400 static int i802_is_event_wireless_scan_complete(char *data, int len)
2401 {
2402         struct iw_event iwe_buf, *iwe = &iwe_buf;
2403         char *pos, *end;
2404
2405         pos = data;
2406         end = data + len;
2407
2408         while (pos + IW_EV_LCP_LEN <= end) {
2409                 /* Event data may be unaligned, so make a local, aligned copy
2410                  * before processing. */
2411                 os_memcpy(&iwe_buf, pos, IW_EV_LCP_LEN);
2412                 if (iwe->cmd == SIOCGIWSCAN)
2413                         return 1;
2414
2415                 pos += iwe->len;
2416         }
2417
2418         return 0;
2419 }
2420
2421
2422 static int i802_is_rtm_scan_complete(int ifindex, struct nlmsghdr *h, int len)
2423 {
2424         struct ifinfomsg *ifi;
2425         int attrlen, _nlmsg_len, rta_len;
2426         struct rtattr *attr;
2427
2428         if (len < (int) sizeof(*ifi))
2429                 return 0;
2430
2431         ifi = NLMSG_DATA(h);
2432
2433         if (ifindex != ifi->ifi_index)
2434                 return 0; /* event for foreign ifindex */
2435
2436         _nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg));
2437
2438         attrlen = h->nlmsg_len - _nlmsg_len;
2439         if (attrlen < 0)
2440                 return 0;
2441
2442         attr = (struct rtattr *) (((char *) ifi) + _nlmsg_len);
2443
2444         rta_len = RTA_ALIGN(sizeof(struct rtattr));
2445         while (RTA_OK(attr, attrlen)) {
2446                 if (attr->rta_type == IFLA_WIRELESS &&
2447                     i802_is_event_wireless_scan_complete(
2448                             ((char *) attr) + rta_len,
2449                             attr->rta_len - rta_len))
2450                         return 1;
2451                 attr = RTA_NEXT(attr, attrlen);
2452         }
2453
2454         return 0;
2455 }
2456
2457
2458 static int i802_is_scan_complete(int s, int ifindex)
2459 {
2460         char buf[1024];
2461         int left;
2462         struct nlmsghdr *h;
2463
2464         left = recv(s, buf, sizeof(buf), MSG_DONTWAIT);
2465         if (left < 0) {
2466                 perror("recv(netlink)");
2467                 return 0;
2468         }
2469
2470         h = (struct nlmsghdr *) buf;
2471         while (left >= (int) sizeof(*h)) {
2472                 int len, plen;
2473
2474                 len = h->nlmsg_len;
2475                 plen = len - sizeof(*h);
2476                 if (len > left || plen < 0) {
2477                         wpa_printf(MSG_DEBUG, "Malformed netlink message: "
2478                                    "len=%d left=%d plen=%d",
2479                                    len, left, plen);
2480                         break;
2481                 }
2482
2483                 switch (h->nlmsg_type) {
2484                 case RTM_NEWLINK:
2485                         if (i802_is_rtm_scan_complete(ifindex, h, plen))
2486                                 return 1;
2487                         break;
2488                 }
2489
2490                 len = NLMSG_ALIGN(len);
2491                 left -= len;
2492                 h = (struct nlmsghdr *) ((char *) h + len);
2493         }
2494
2495         return 0;
2496 }
2497
2498
2499 static int i802_ht_scan(struct i802_driver_data *drv)
2500 {
2501         struct iwreq iwr;
2502         int s, res, ifindex;
2503         struct sockaddr_nl local;
2504         time_t now, end;
2505         fd_set rfds;
2506         struct timeval tv;
2507
2508         wpa_printf(MSG_DEBUG, "nl80211: Scanning overlapping BSSes before "
2509                    "starting HT 20/40 MHz BSS");
2510
2511         /* Request a new scan */
2512         /* TODO: would be enough to scan the selected band */
2513         os_memset(&iwr, 0, sizeof(iwr));
2514         os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
2515         if (ioctl(drv->ioctl_sock, SIOCSIWSCAN, &iwr) < 0) {
2516                 perror("ioctl[SIOCSIWSCAN]");
2517                 return -1;
2518         }
2519
2520         ifindex = if_nametoindex(drv->iface);
2521
2522         /* Wait for scan completion event or timeout */
2523         s = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
2524         if (s < 0) {
2525                 perror("socket(PF_NETLINK,SOCK_RAW,NETLINK_ROUTE)");
2526                 return -1;
2527         }
2528
2529         os_memset(&local, 0, sizeof(local));
2530         local.nl_family = AF_NETLINK;
2531         local.nl_groups = RTMGRP_LINK;
2532         if (bind(s, (struct sockaddr *) &local, sizeof(local)) < 0) {
2533                 perror("bind(netlink)");
2534                 close(s);
2535                 return -1;
2536         }
2537
2538         time(&end);
2539         end += 30; /* Wait at most 30 seconds for scan results */
2540         for (;;) {
2541                 time(&now);
2542                 tv.tv_sec = end > now ? end - now : 0;
2543                 tv.tv_usec = 0;
2544                 FD_ZERO(&rfds);
2545                 FD_SET(s, &rfds);
2546                 res = select(s + 1, &rfds, NULL, NULL, &tv);
2547                 if (res < 0) {
2548                         perror("select");
2549                         /* Assume results are ready after 10 seconds wait */
2550                         os_sleep(10, 0);
2551                         break;
2552                 } else if (res) {
2553                         if (i802_is_scan_complete(s, ifindex)) {
2554                                 wpa_printf(MSG_DEBUG, "nl80211: Scan "
2555                                            "completed");
2556                                 break;
2557                         }
2558                 } else {
2559                         wpa_printf(MSG_DEBUG, "nl80211: Scan timeout");
2560                         /* Assume results are ready to be read now */
2561                         break;
2562                 }
2563         }
2564
2565         close(s);
2566
2567         return i802_get_ht_scan_res(drv);
2568 }
2569 #endif /* CONFIG_IEEE80211N */
2570
2571
2572 static int i802_init_sockets(struct i802_driver_data *drv, const u8 *bssid)
2573 {
2574         struct ifreq ifr;
2575         struct sockaddr_ll addr;
2576
2577         drv->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);
2578         if (drv->ioctl_sock < 0) {
2579                 perror("socket[PF_INET,SOCK_DGRAM]");
2580                 return -1;
2581         }
2582
2583         /* start listening for EAPOL on the default AP interface */
2584         add_ifidx(drv, if_nametoindex(drv->iface));
2585
2586         if (hostapd_set_iface_flags(drv, drv->iface, 0))
2587                 return -1;
2588
2589         if (bssid) {
2590                 os_strlcpy(ifr.ifr_name, drv->iface, IFNAMSIZ);
2591                 memcpy(ifr.ifr_hwaddr.sa_data, bssid, ETH_ALEN);
2592                 ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
2593
2594                 if (ioctl(drv->ioctl_sock, SIOCSIFHWADDR, &ifr)) {
2595                         perror("ioctl(SIOCSIFHWADDR)");
2596                         return -1;
2597                 }
2598         }
2599
2600         /*
2601          * initialise generic netlink and nl80211
2602          */
2603         drv->nl_cb = nl_cb_alloc(NL_CB_DEFAULT);
2604         if (!drv->nl_cb) {
2605                 printf("Failed to allocate netlink callbacks.\n");
2606                 return -1;
2607         }
2608
2609         drv->nl_handle = nl_handle_alloc_cb(drv->nl_cb);
2610         if (!drv->nl_handle) {
2611                 printf("Failed to allocate netlink handle.\n");
2612                 return -1;
2613         }
2614
2615         if (genl_connect(drv->nl_handle)) {
2616                 printf("Failed to connect to generic netlink.\n");
2617                 return -1;
2618         }
2619
2620 #ifdef CONFIG_LIBNL20
2621         if (genl_ctrl_alloc_cache(drv->nl_handle, &drv->nl_cache) < 0) {
2622                 printf("Failed to allocate generic netlink cache.\n");
2623                 return -1;
2624         }
2625 #else /* CONFIG_LIBNL20 */
2626         drv->nl_cache = genl_ctrl_alloc_cache(drv->nl_handle);
2627         if (!drv->nl_cache) {
2628                 printf("Failed to allocate generic netlink cache.\n");
2629                 return -1;
2630         }
2631 #endif /* CONFIG_LIBNL20 */
2632
2633         drv->nl80211 = genl_ctrl_search_by_name(drv->nl_cache, "nl80211");
2634         if (!drv->nl80211) {
2635                 printf("nl80211 not found.\n");
2636                 return -1;
2637         }
2638
2639 #ifdef CONFIG_IEEE80211N
2640         if (drv->ht_40mhz_scan) {
2641                 if (nl80211_set_mode(drv, drv->iface, NL80211_IFTYPE_STATION)
2642                     || hostapd_set_iface_flags(drv, drv->iface, 1) ||
2643                     i802_ht_scan(drv) ||
2644                     hostapd_set_iface_flags(drv, drv->iface, 0)) {
2645                         wpa_printf(MSG_ERROR, "Failed to scan channels for "
2646                                    "HT 40 MHz operations");
2647                         return -1;
2648                 }
2649         }
2650 #endif /* CONFIG_IEEE80211N */
2651
2652         /* Initialise a monitor interface */
2653         if (nl80211_create_monitor_interface(drv))
2654                 return -1;
2655
2656         if (nl80211_set_mode(drv, drv->iface, NL80211_IFTYPE_AP))
2657                 goto fail1;
2658
2659         if (hostapd_set_iface_flags(drv, drv->iface, 1))
2660                 goto fail1;
2661
2662         memset(&addr, 0, sizeof(addr));
2663         addr.sll_family = AF_PACKET;
2664         addr.sll_ifindex = ifr.ifr_ifindex;
2665         wpa_printf(MSG_DEBUG, "Opening raw packet socket for ifindex %d",
2666                    addr.sll_ifindex);
2667
2668         drv->eapol_sock = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_PAE));
2669         if (drv->eapol_sock < 0) {
2670                 perror("socket(PF_PACKET, SOCK_DGRAM, ETH_P_PAE)");
2671                 goto fail1;
2672         }
2673
2674         if (eloop_register_read_sock(drv->eapol_sock, handle_eapol, drv, NULL))
2675         {
2676                 printf("Could not register read socket for eapol\n");
2677                 return -1;
2678         }
2679
2680         memset(&ifr, 0, sizeof(ifr));
2681         os_strlcpy(ifr.ifr_name, drv->iface, sizeof(ifr.ifr_name));
2682         if (ioctl(drv->ioctl_sock, SIOCGIFHWADDR, &ifr) != 0) {
2683                 perror("ioctl(SIOCGIFHWADDR)");
2684                 goto fail1;
2685         }
2686
2687         if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) {
2688                 printf("Invalid HW-addr family 0x%04x\n",
2689                        ifr.ifr_hwaddr.sa_family);
2690                 goto fail1;
2691         }
2692         memcpy(drv->hapd->own_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
2693
2694         return 0;
2695
2696 fail1:
2697         nl80211_remove_iface(drv, drv->monitor_ifidx);
2698         return -1;
2699 }
2700
2701
2702 static int i802_get_inact_sec(void *priv, const u8 *addr)
2703 {
2704         struct hostap_sta_driver_data data;
2705         int ret;
2706
2707         data.inactive_msec = (unsigned long) -1;
2708         ret = i802_read_sta_data(priv, &data, addr);
2709         if (ret || data.inactive_msec == (unsigned long) -1)
2710                 return -1;
2711         return data.inactive_msec / 1000;
2712 }
2713
2714
2715 static int i802_sta_clear_stats(void *priv, const u8 *addr)
2716 {
2717 #if 0
2718         /* TODO */
2719 #endif
2720         return 0;
2721 }
2722
2723
2724 static void
2725 hostapd_wireless_event_wireless_custom(struct i802_driver_data *drv,
2726                                        char *custom)
2727 {
2728         wpa_printf(MSG_DEBUG, "Custom wireless event: '%s'", custom);
2729
2730         if (strncmp(custom, "MLME-MICHAELMICFAILURE.indication", 33) == 0) {
2731                 char *pos;
2732                 u8 addr[ETH_ALEN];
2733                 pos = strstr(custom, "addr=");
2734                 if (pos == NULL) {
2735                         wpa_printf(MSG_DEBUG,
2736                                    "MLME-MICHAELMICFAILURE.indication "
2737                                    "without sender address ignored");
2738                         return;
2739                 }
2740                 pos += 5;
2741                 if (hwaddr_aton(pos, addr) == 0) {
2742                         hostapd_michael_mic_failure(drv->hapd, addr);
2743                 } else {
2744                         wpa_printf(MSG_DEBUG,
2745                                    "MLME-MICHAELMICFAILURE.indication "
2746                                    "with invalid MAC address");
2747                 }
2748         }
2749 }
2750
2751
2752 static void hostapd_wireless_event_wireless(struct i802_driver_data *drv,
2753                                             char *data, int len)
2754 {
2755         struct iw_event iwe_buf, *iwe = &iwe_buf;
2756         char *pos, *end, *custom, *buf;
2757
2758         pos = data;
2759         end = data + len;
2760
2761         while (pos + IW_EV_LCP_LEN <= end) {
2762                 /* Event data may be unaligned, so make a local, aligned copy
2763                  * before processing. */
2764                 memcpy(&iwe_buf, pos, IW_EV_LCP_LEN);
2765                 wpa_printf(MSG_DEBUG, "Wireless event: cmd=0x%x len=%d",
2766                            iwe->cmd, iwe->len);
2767                 if (iwe->len <= IW_EV_LCP_LEN)
2768                         return;
2769
2770                 custom = pos + IW_EV_POINT_LEN;
2771                 if (drv->we_version > 18 &&
2772                     (iwe->cmd == IWEVMICHAELMICFAILURE ||
2773                      iwe->cmd == IWEVCUSTOM)) {
2774                         /* WE-19 removed the pointer from struct iw_point */
2775                         char *dpos = (char *) &iwe_buf.u.data.length;
2776                         int dlen = dpos - (char *) &iwe_buf;
2777                         memcpy(dpos, pos + IW_EV_LCP_LEN,
2778                                sizeof(struct iw_event) - dlen);
2779                 } else {
2780                         memcpy(&iwe_buf, pos, sizeof(struct iw_event));
2781                         custom += IW_EV_POINT_OFF;
2782                 }
2783
2784                 switch (iwe->cmd) {
2785                 case IWEVCUSTOM:
2786                         if (custom + iwe->u.data.length > end)
2787                                 return;
2788                         buf = malloc(iwe->u.data.length + 1);
2789                         if (buf == NULL)
2790                                 return;
2791                         memcpy(buf, custom, iwe->u.data.length);
2792                         buf[iwe->u.data.length] = '\0';
2793                         hostapd_wireless_event_wireless_custom(drv, buf);
2794                         free(buf);
2795                         break;
2796                 }
2797
2798                 pos += iwe->len;
2799         }
2800 }
2801
2802
2803 static void hostapd_wireless_event_rtm_newlink(struct i802_driver_data *drv,
2804                                                struct nlmsghdr *h, int len)
2805 {
2806         struct ifinfomsg *ifi;
2807         int attrlen, nlmsg_len, rta_len;
2808         struct rtattr *attr;
2809
2810         if (len < (int) sizeof(*ifi))
2811                 return;
2812
2813         ifi = NLMSG_DATA(h);
2814
2815         /* TODO: use ifi->ifi_index to filter out wireless events from other
2816          * interfaces */
2817
2818         nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg));
2819
2820         attrlen = h->nlmsg_len - nlmsg_len;
2821         if (attrlen < 0)
2822                 return;
2823
2824         attr = (struct rtattr *) (((char *) ifi) + nlmsg_len);
2825
2826         rta_len = RTA_ALIGN(sizeof(struct rtattr));
2827         while (RTA_OK(attr, attrlen)) {
2828                 if (attr->rta_type == IFLA_WIRELESS) {
2829                         hostapd_wireless_event_wireless(
2830                                 drv, ((char *) attr) + rta_len,
2831                                 attr->rta_len - rta_len);
2832                 }
2833                 attr = RTA_NEXT(attr, attrlen);
2834         }
2835 }
2836
2837
2838 static void hostapd_wireless_event_receive(int sock, void *eloop_ctx,
2839                                            void *sock_ctx)
2840 {
2841         char buf[256];
2842         int left;
2843         struct sockaddr_nl from;
2844         socklen_t fromlen;
2845         struct nlmsghdr *h;
2846         struct i802_driver_data *drv = eloop_ctx;
2847
2848         fromlen = sizeof(from);
2849         left = recvfrom(sock, buf, sizeof(buf), MSG_DONTWAIT,
2850                         (struct sockaddr *) &from, &fromlen);
2851         if (left < 0) {
2852                 if (errno != EINTR && errno != EAGAIN)
2853                         perror("recvfrom(netlink)");
2854                 return;
2855         }
2856
2857         h = (struct nlmsghdr *) buf;
2858         while (left >= (int) sizeof(*h)) {
2859                 int len, plen;
2860
2861                 len = h->nlmsg_len;
2862                 plen = len - sizeof(*h);
2863                 if (len > left || plen < 0) {
2864                         printf("Malformed netlink message: "
2865                                "len=%d left=%d plen=%d\n",
2866                                len, left, plen);
2867                         break;
2868                 }
2869
2870                 switch (h->nlmsg_type) {
2871                 case RTM_NEWLINK:
2872                         hostapd_wireless_event_rtm_newlink(drv, h, plen);
2873                         break;
2874                 }
2875
2876                 len = NLMSG_ALIGN(len);
2877                 left -= len;
2878                 h = (struct nlmsghdr *) ((char *) h + len);
2879         }
2880
2881         if (left > 0) {
2882                 printf("%d extra bytes in the end of netlink message\n", left);
2883         }
2884 }
2885
2886
2887 static int hostap_get_we_version(struct i802_driver_data *drv)
2888 {
2889         struct iw_range *range;
2890         struct iwreq iwr;
2891         int minlen;
2892         size_t buflen;
2893
2894         drv->we_version = 0;
2895
2896         /*
2897          * Use larger buffer than struct iw_range in order to allow the
2898          * structure to grow in the future.
2899          */
2900         buflen = sizeof(struct iw_range) + 500;
2901         range = os_zalloc(buflen);
2902         if (range == NULL)
2903                 return -1;
2904
2905         memset(&iwr, 0, sizeof(iwr));
2906         os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
2907         iwr.u.data.pointer = (caddr_t) range;
2908         iwr.u.data.length = buflen;
2909
2910         minlen = ((char *) &range->enc_capa) - (char *) range +
2911                 sizeof(range->enc_capa);
2912
2913         if (ioctl(drv->ioctl_sock, SIOCGIWRANGE, &iwr) < 0) {
2914                 perror("ioctl[SIOCGIWRANGE]");
2915                 free(range);
2916                 return -1;
2917         } else if (iwr.u.data.length >= minlen &&
2918                    range->we_version_compiled >= 18) {
2919                 wpa_printf(MSG_DEBUG, "SIOCGIWRANGE: WE(compiled)=%d "
2920                            "WE(source)=%d enc_capa=0x%x",
2921                            range->we_version_compiled,
2922                            range->we_version_source,
2923                            range->enc_capa);
2924                 drv->we_version = range->we_version_compiled;
2925         }
2926
2927         free(range);
2928         return 0;
2929 }
2930
2931
2932 static int i802_wireless_event_init(void *priv)
2933 {
2934         struct i802_driver_data *drv = priv;
2935         int s;
2936         struct sockaddr_nl local;
2937
2938         hostap_get_we_version(drv);
2939
2940         drv->wext_sock = -1;
2941
2942         s = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
2943         if (s < 0) {
2944                 perror("socket(PF_NETLINK,SOCK_RAW,NETLINK_ROUTE)");
2945                 return -1;
2946         }
2947
2948         memset(&local, 0, sizeof(local));
2949         local.nl_family = AF_NETLINK;
2950         local.nl_groups = RTMGRP_LINK;
2951         if (bind(s, (struct sockaddr *) &local, sizeof(local)) < 0) {
2952                 perror("bind(netlink)");
2953                 close(s);
2954                 return -1;
2955         }
2956
2957         eloop_register_read_sock(s, hostapd_wireless_event_receive, drv,
2958                                  NULL);
2959         drv->wext_sock = s;
2960
2961         return 0;
2962 }
2963
2964
2965 static void i802_wireless_event_deinit(void *priv)
2966 {
2967         struct i802_driver_data *drv = priv;
2968         if (drv->wext_sock < 0)
2969                 return;
2970         eloop_unregister_read_sock(drv->wext_sock);
2971         close(drv->wext_sock);
2972 }
2973
2974
2975 static int i802_sta_deauth(void *priv, const u8 *addr, int reason)
2976 {
2977         struct i802_driver_data *drv = priv;
2978         struct ieee80211_mgmt mgmt;
2979
2980         memset(&mgmt, 0, sizeof(mgmt));
2981         mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
2982                                           WLAN_FC_STYPE_DEAUTH);
2983         memcpy(mgmt.da, addr, ETH_ALEN);
2984         memcpy(mgmt.sa, drv->hapd->own_addr, ETH_ALEN);
2985         memcpy(mgmt.bssid, drv->hapd->own_addr, ETH_ALEN);
2986         mgmt.u.deauth.reason_code = host_to_le16(reason);
2987         return i802_send_mgmt_frame(drv, &mgmt, IEEE80211_HDRLEN +
2988                                       sizeof(mgmt.u.deauth), 0);
2989 }
2990
2991
2992 static int i802_sta_disassoc(void *priv, const u8 *addr, int reason)
2993 {
2994         struct i802_driver_data *drv = priv;
2995         struct ieee80211_mgmt mgmt;
2996
2997         memset(&mgmt, 0, sizeof(mgmt));
2998         mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
2999                                           WLAN_FC_STYPE_DISASSOC);
3000         memcpy(mgmt.da, addr, ETH_ALEN);
3001         memcpy(mgmt.sa, drv->hapd->own_addr, ETH_ALEN);
3002         memcpy(mgmt.bssid, drv->hapd->own_addr, ETH_ALEN);
3003         mgmt.u.disassoc.reason_code = host_to_le16(reason);
3004         return  i802_send_mgmt_frame(drv, &mgmt, IEEE80211_HDRLEN +
3005                                        sizeof(mgmt.u.disassoc), 0);
3006 }
3007
3008
3009 static const struct hostapd_neighbor_bss *
3010 i802_get_neighbor_bss(void *priv, size_t *num)
3011 {
3012         struct i802_driver_data *drv = priv;
3013         *num = drv->num_neighbors;
3014         return drv->neighbors;
3015 }
3016
3017
3018 static void *i802_init_bssid(struct hostapd_data *hapd, const u8 *bssid)
3019 {
3020         struct i802_driver_data *drv;
3021
3022         drv = os_zalloc(sizeof(struct i802_driver_data));
3023         if (drv == NULL) {
3024                 printf("Could not allocate memory for i802 driver data\n");
3025                 return NULL;
3026         }
3027
3028         drv->hapd = hapd;
3029         memcpy(drv->iface, hapd->conf->iface, sizeof(drv->iface));
3030         memcpy(drv->bss.iface, hapd->conf->iface, sizeof(drv->iface));
3031
3032         drv->num_if_indices = sizeof(drv->default_if_indices) / sizeof(int);
3033         drv->if_indices = drv->default_if_indices;
3034         drv->bridge = if_nametoindex(hapd->conf->bridge);
3035         drv->ht_40mhz_scan = hapd->iconf->secondary_channel != 0;
3036
3037         if (i802_init_sockets(drv, bssid))
3038                 goto failed;
3039
3040         return drv;
3041
3042 failed:
3043         free(drv);
3044         return NULL;
3045 }
3046
3047
3048 static void *i802_init(struct hostapd_data *hapd)
3049 {
3050         return i802_init_bssid(hapd, NULL);
3051 }
3052
3053
3054 static void i802_deinit(void *priv)
3055 {
3056         struct i802_driver_data *drv = priv;
3057         struct i802_bss *bss, *prev;
3058
3059         if (drv->last_freq_ht) {
3060                 /* Clear HT flags from the driver */
3061                 struct hostapd_freq_params freq;
3062                 os_memset(&freq, 0, sizeof(freq));
3063                 freq.freq = drv->last_freq;
3064                 i802_set_freq(priv, &freq);
3065         }
3066
3067         i802_del_beacon(drv);
3068
3069         /* remove monitor interface */
3070         nl80211_remove_iface(drv, drv->monitor_ifidx);
3071
3072         (void) hostapd_set_iface_flags(drv, drv->iface, 0);
3073
3074         if (drv->monitor_sock >= 0) {
3075                 eloop_unregister_read_sock(drv->monitor_sock);
3076                 close(drv->monitor_sock);
3077         }
3078         if (drv->ioctl_sock >= 0)
3079                 close(drv->ioctl_sock);
3080         if (drv->eapol_sock >= 0) {
3081                 eloop_unregister_read_sock(drv->eapol_sock);
3082                 close(drv->eapol_sock);
3083         }
3084
3085         genl_family_put(drv->nl80211);
3086         nl_cache_free(drv->nl_cache);
3087         nl_handle_destroy(drv->nl_handle);
3088         nl_cb_put(drv->nl_cb);
3089
3090         if (drv->if_indices != drv->default_if_indices)
3091                 free(drv->if_indices);
3092
3093         os_free(drv->neighbors);
3094
3095         bss = drv->bss.next;
3096         while (bss) {
3097                 prev = bss;
3098                 bss = bss->next;
3099                 os_free(bss);
3100         }
3101
3102         free(drv);
3103 }
3104
3105
3106 const struct wpa_driver_ops wpa_driver_nl80211_ops = {
3107         .name = "nl80211",
3108         .init = i802_init,
3109         .init_bssid = i802_init_bssid,
3110         .deinit = i802_deinit,
3111         .wireless_event_init = i802_wireless_event_init,
3112         .wireless_event_deinit = i802_wireless_event_deinit,
3113         .set_ieee8021x = i802_set_ieee8021x,
3114         .set_privacy = i802_set_privacy,
3115         .set_key = i802_set_key,
3116         .get_seqnum = i802_get_seqnum,
3117         .flush = i802_flush,
3118         .read_sta_data = i802_read_sta_data,
3119         .send_eapol = i802_send_eapol,
3120         .sta_set_flags = i802_sta_set_flags,
3121         .sta_deauth = i802_sta_deauth,
3122         .sta_disassoc = i802_sta_disassoc,
3123         .sta_remove = i802_sta_remove,
3124         .send_mgmt_frame = i802_send_mgmt_frame,
3125         .sta_add = i802_sta_add,
3126         .get_inact_sec = i802_get_inact_sec,
3127         .sta_clear_stats = i802_sta_clear_stats,
3128         .set_freq = i802_set_freq,
3129         .set_rts = i802_set_rts,
3130         .get_rts = i802_get_rts,
3131         .set_frag = i802_set_frag,
3132         .get_frag = i802_get_frag,
3133         .set_retry = i802_set_retry,
3134         .get_retry = i802_get_retry,
3135         .set_rate_sets = i802_set_rate_sets,
3136         .set_beacon = i802_set_beacon,
3137         .set_internal_bridge = i802_set_internal_bridge,
3138         .set_beacon_int = i802_set_beacon_int,
3139         .set_dtim_period = i802_set_dtim_period,
3140         .set_cts_protect = i802_set_cts_protect,
3141         .set_preamble = i802_set_preamble,
3142         .set_short_slot_time = i802_set_short_slot_time,
3143         .set_tx_queue_params = i802_set_tx_queue_params,
3144         .bss_add = i802_bss_add,
3145         .bss_remove = i802_bss_remove,
3146         .if_add = i802_if_add,
3147         .if_update = i802_if_update,
3148         .if_remove = i802_if_remove,
3149         .get_hw_feature_data = i802_get_hw_feature_data,
3150         .set_sta_vlan = i802_set_sta_vlan,
3151         .set_country = i802_set_country,
3152         .get_neighbor_bss = i802_get_neighbor_bss,
3153 };