2 * WPA Supplicant - driver interaction with Linux nl80211/cfg80211
3 * Copyright (c) 2003-2008, Jouni Malinen <j@w1.fi>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
16 #include <sys/ioctl.h>
17 #include <net/if_arp.h>
18 #include <netlink/genl/genl.h>
19 #include <netlink/genl/family.h>
20 #include <netlink/genl/ctrl.h>
21 #include "nl80211_copy.h"
22 #include "wireless_copy.h"
27 #include "ieee802_11_defs.h"
30 #define IFF_LOWER_UP 0x10000 /* driver signals L1 up */
33 #define IFF_DORMANT 0x20000 /* driver signals dormant */
36 #ifndef IF_OPER_DORMANT
37 #define IF_OPER_DORMANT 5
44 struct wpa_driver_nl80211_data {
48 char ifname[IFNAMSIZ + 1];
51 struct wpa_driver_capa capa;
56 int scan_complete_events;
58 struct nl_handle *nl_handle;
59 struct nl_cache *nl_cache;
61 struct genl_family *nl80211;
70 static void wpa_driver_nl80211_scan_timeout(void *eloop_ctx,
72 static int wpa_driver_nl80211_set_mode(struct wpa_driver_nl80211_data *drv,
74 static int wpa_driver_nl80211_get_range(void *priv);
76 wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv);
80 static int ack_handler(struct nl_msg *msg, void *arg)
87 static int finish_handler(struct nl_msg *msg, void *arg)
94 static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err,
102 static int send_and_recv_msgs(struct wpa_driver_nl80211_data *drv,
104 int (*valid_handler)(struct nl_msg *, void *),
110 cb = nl_cb_clone(drv->nl_cb);
114 err = nl_send_auto_complete(drv->nl_handle, msg);
120 nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
121 nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err);
122 nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, &err);
125 nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM,
126 valid_handler, valid_data);
129 nl_recvmsgs(drv->nl_handle, cb);
143 static int family_handler(struct nl_msg *msg, void *arg)
145 struct family_data *res = arg;
146 struct nlattr *tb[CTRL_ATTR_MAX + 1];
147 struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
148 struct nlattr *mcgrp;
151 nla_parse(tb, CTRL_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
152 genlmsg_attrlen(gnlh, 0), NULL);
153 if (!tb[CTRL_ATTR_MCAST_GROUPS])
156 nla_for_each_nested(mcgrp, tb[CTRL_ATTR_MCAST_GROUPS], i) {
157 struct nlattr *tb2[CTRL_ATTR_MCAST_GRP_MAX + 1];
158 nla_parse(tb2, CTRL_ATTR_MCAST_GRP_MAX, nla_data(mcgrp),
159 nla_len(mcgrp), NULL);
160 if (!tb2[CTRL_ATTR_MCAST_GRP_NAME] ||
161 !tb2[CTRL_ATTR_MCAST_GRP_ID] ||
162 os_strncmp(nla_data(tb2[CTRL_ATTR_MCAST_GRP_NAME]),
164 nla_len(tb2[CTRL_ATTR_MCAST_GRP_NAME])) != 0)
166 res->id = nla_get_u32(tb2[CTRL_ATTR_MCAST_GRP_ID]);
174 static int nl_get_multicast_id(struct wpa_driver_nl80211_data *drv,
175 const char *family, const char *group)
179 struct family_data res = { group, -ENOENT };
184 genlmsg_put(msg, 0, 0, genl_ctrl_resolve(drv->nl_handle, "nlctrl"),
185 0, 0, CTRL_CMD_GETFAMILY, 0);
186 NLA_PUT_STRING(msg, CTRL_ATTR_FAMILY_NAME, family);
188 ret = send_and_recv_msgs(drv, msg, family_handler, &res);
199 static int wpa_driver_nl80211_send_oper_ifla(
200 struct wpa_driver_nl80211_data *drv,
201 int linkmode, int operstate)
205 struct ifinfomsg ifinfo;
212 os_memset(&req, 0, sizeof(req));
214 req.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
215 req.hdr.nlmsg_type = RTM_SETLINK;
216 req.hdr.nlmsg_flags = NLM_F_REQUEST;
217 req.hdr.nlmsg_seq = ++nl_seq;
218 req.hdr.nlmsg_pid = 0;
220 req.ifinfo.ifi_family = AF_UNSPEC;
221 req.ifinfo.ifi_type = 0;
222 req.ifinfo.ifi_index = drv->ifindex;
223 req.ifinfo.ifi_flags = 0;
224 req.ifinfo.ifi_change = 0;
226 if (linkmode != -1) {
227 rta = (struct rtattr *)
228 ((char *) &req + NLMSG_ALIGN(req.hdr.nlmsg_len));
229 rta->rta_type = IFLA_LINKMODE;
230 rta->rta_len = RTA_LENGTH(sizeof(char));
231 *((char *) RTA_DATA(rta)) = linkmode;
232 req.hdr.nlmsg_len = NLMSG_ALIGN(req.hdr.nlmsg_len) +
233 RTA_LENGTH(sizeof(char));
235 if (operstate != -1) {
236 rta = (struct rtattr *)
237 ((char *) &req + NLMSG_ALIGN(req.hdr.nlmsg_len));
238 rta->rta_type = IFLA_OPERSTATE;
239 rta->rta_len = RTA_LENGTH(sizeof(char));
240 *((char *) RTA_DATA(rta)) = operstate;
241 req.hdr.nlmsg_len = NLMSG_ALIGN(req.hdr.nlmsg_len) +
242 RTA_LENGTH(sizeof(char));
245 wpa_printf(MSG_DEBUG, "WEXT: Operstate: linkmode=%d, operstate=%d",
246 linkmode, operstate);
248 ret = send(drv->link_event_sock, &req, req.hdr.nlmsg_len, 0);
250 wpa_printf(MSG_DEBUG, "WEXT: Sending operstate IFLA failed: "
251 "%s (assume operstate is not supported)",
255 return ret < 0 ? -1 : 0;
259 static int wpa_driver_nl80211_set_auth_param(
260 struct wpa_driver_nl80211_data *drv, int idx, u32 value)
265 os_memset(&iwr, 0, sizeof(iwr));
266 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
267 iwr.u.param.flags = idx & IW_AUTH_INDEX;
268 iwr.u.param.value = value;
270 if (ioctl(drv->ioctl_sock, SIOCSIWAUTH, &iwr) < 0) {
271 if (errno != EOPNOTSUPP) {
272 wpa_printf(MSG_DEBUG, "WEXT: SIOCSIWAUTH(param %d "
273 "value 0x%x) failed: %s)",
274 idx, value, strerror(errno));
276 ret = errno == EOPNOTSUPP ? -2 : -1;
283 static int wpa_driver_nl80211_get_bssid(void *priv, u8 *bssid)
285 struct wpa_driver_nl80211_data *drv = priv;
286 if (!drv->associated)
288 os_memcpy(bssid, drv->bssid, ETH_ALEN);
293 static int wpa_driver_nl80211_get_ssid(void *priv, u8 *ssid)
295 struct wpa_driver_nl80211_data *drv = priv;
296 if (!drv->associated)
298 os_memcpy(ssid, drv->ssid, drv->ssid_len);
299 return drv->ssid_len;
303 static void wpa_driver_nl80211_event_link(struct wpa_driver_nl80211_data *drv,
304 void *ctx, char *buf, size_t len,
307 union wpa_event_data event;
309 os_memset(&event, 0, sizeof(event));
310 if (len > sizeof(event.interface_status.ifname))
311 len = sizeof(event.interface_status.ifname) - 1;
312 os_memcpy(event.interface_status.ifname, buf, len);
313 event.interface_status.ievent = del ? EVENT_INTERFACE_REMOVED :
314 EVENT_INTERFACE_ADDED;
316 wpa_printf(MSG_DEBUG, "RTM_%sLINK, IFLA_IFNAME: Interface '%s' %s",
318 event.interface_status.ifname,
319 del ? "removed" : "added");
321 if (os_strcmp(drv->ifname, event.interface_status.ifname) == 0) {
328 wpa_supplicant_event(ctx, EVENT_INTERFACE_STATUS, &event);
332 static int wpa_driver_nl80211_own_ifname(struct wpa_driver_nl80211_data *drv,
335 struct ifinfomsg *ifi;
336 int attrlen, _nlmsg_len, rta_len;
341 _nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg));
343 attrlen = h->nlmsg_len - _nlmsg_len;
347 attr = (struct rtattr *) (((char *) ifi) + _nlmsg_len);
349 rta_len = RTA_ALIGN(sizeof(struct rtattr));
350 while (RTA_OK(attr, attrlen)) {
351 if (attr->rta_type == IFLA_IFNAME) {
352 if (os_strcmp(((char *) attr) + rta_len, drv->ifname)
358 attr = RTA_NEXT(attr, attrlen);
365 static int wpa_driver_nl80211_own_ifindex(struct wpa_driver_nl80211_data *drv,
366 int ifindex, struct nlmsghdr *h)
368 if (drv->ifindex == ifindex)
371 if (drv->if_removed && wpa_driver_nl80211_own_ifname(drv, h)) {
372 drv->ifindex = if_nametoindex(drv->ifname);
373 wpa_printf(MSG_DEBUG, "nl80211: Update ifindex for a removed "
375 wpa_driver_nl80211_finish_drv_init(drv);
383 static void wpa_driver_nl80211_event_rtm_newlink(struct wpa_driver_nl80211_data *drv,
384 void *ctx, struct nlmsghdr *h,
387 struct ifinfomsg *ifi;
388 int attrlen, _nlmsg_len, rta_len;
389 struct rtattr * attr;
391 if (len < sizeof(*ifi))
396 if (!wpa_driver_nl80211_own_ifindex(drv, ifi->ifi_index, h)) {
397 wpa_printf(MSG_DEBUG, "Ignore event for foreign ifindex %d",
402 wpa_printf(MSG_DEBUG, "RTM_NEWLINK: operstate=%d ifi_flags=0x%x "
404 drv->operstate, ifi->ifi_flags,
405 (ifi->ifi_flags & IFF_UP) ? "[UP]" : "",
406 (ifi->ifi_flags & IFF_RUNNING) ? "[RUNNING]" : "",
407 (ifi->ifi_flags & IFF_LOWER_UP) ? "[LOWER_UP]" : "",
408 (ifi->ifi_flags & IFF_DORMANT) ? "[DORMANT]" : "");
410 * Some drivers send the association event before the operup event--in
411 * this case, lifting operstate in wpa_driver_nl80211_set_operstate()
412 * fails. This will hit us when wpa_supplicant does not need to do
413 * IEEE 802.1X authentication
415 if (drv->operstate == 1 &&
416 (ifi->ifi_flags & (IFF_LOWER_UP | IFF_DORMANT)) == IFF_LOWER_UP &&
417 !(ifi->ifi_flags & IFF_RUNNING))
418 wpa_driver_nl80211_send_oper_ifla(drv, -1, IF_OPER_UP);
420 _nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg));
422 attrlen = h->nlmsg_len - _nlmsg_len;
426 attr = (struct rtattr *) (((char *) ifi) + _nlmsg_len);
428 rta_len = RTA_ALIGN(sizeof(struct rtattr));
429 while (RTA_OK(attr, attrlen)) {
430 if (attr->rta_type == IFLA_IFNAME) {
431 wpa_driver_nl80211_event_link(
433 ((char *) attr) + rta_len,
434 attr->rta_len - rta_len, 0);
436 attr = RTA_NEXT(attr, attrlen);
441 static void wpa_driver_nl80211_event_rtm_dellink(struct wpa_driver_nl80211_data *drv,
442 void *ctx, struct nlmsghdr *h,
445 struct ifinfomsg *ifi;
446 int attrlen, _nlmsg_len, rta_len;
447 struct rtattr * attr;
449 if (len < sizeof(*ifi))
454 _nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg));
456 attrlen = h->nlmsg_len - _nlmsg_len;
460 attr = (struct rtattr *) (((char *) ifi) + _nlmsg_len);
462 rta_len = RTA_ALIGN(sizeof(struct rtattr));
463 while (RTA_OK(attr, attrlen)) {
464 if (attr->rta_type == IFLA_IFNAME) {
465 wpa_driver_nl80211_event_link(
467 ((char *) attr) + rta_len,
468 attr->rta_len - rta_len, 1);
470 attr = RTA_NEXT(attr, attrlen);
475 static void wpa_driver_nl80211_event_receive_link(int sock, void *eloop_ctx,
480 struct sockaddr_nl from;
486 fromlen = sizeof(from);
487 left = recvfrom(sock, buf, sizeof(buf), MSG_DONTWAIT,
488 (struct sockaddr *) &from, &fromlen);
490 if (errno != EINTR && errno != EAGAIN)
491 perror("recvfrom(netlink)");
495 h = (struct nlmsghdr *) buf;
496 while (left >= (int) sizeof(*h)) {
500 plen = len - sizeof(*h);
501 if (len > left || plen < 0) {
502 wpa_printf(MSG_DEBUG, "Malformed netlink message: "
503 "len=%d left=%d plen=%d",
508 switch (h->nlmsg_type) {
510 wpa_driver_nl80211_event_rtm_newlink(eloop_ctx, sock_ctx,
514 wpa_driver_nl80211_event_rtm_dellink(eloop_ctx, sock_ctx,
519 len = NLMSG_ALIGN(len);
521 h = (struct nlmsghdr *) ((char *) h + len);
525 wpa_printf(MSG_DEBUG, "%d extra bytes in the end of netlink "
529 if (--max_events > 0) {
531 * Try to receive all events in one eloop call in order to
532 * limit race condition on cases where AssocInfo event, Assoc
533 * event, and EAPOL frames are received more or less at the
534 * same time. We want to process the event messages first
535 * before starting EAPOL processing.
542 static int no_seq_check(struct nl_msg *msg, void *arg)
548 static void mlme_event_auth(struct wpa_driver_nl80211_data *drv,
549 const u8 *frame, size_t len)
551 const struct ieee80211_mgmt *mgmt;
552 union wpa_event_data event;
554 mgmt = (const struct ieee80211_mgmt *) frame;
555 if (len < 24 + sizeof(mgmt->u.auth)) {
556 wpa_printf(MSG_DEBUG, "nl80211: Too short association event "
561 os_memset(&event, 0, sizeof(event));
562 os_memcpy(event.auth.peer, mgmt->sa, ETH_ALEN);
563 event.auth.auth_type = le_to_host16(mgmt->u.auth.auth_alg);
564 event.auth.status_code = le_to_host16(mgmt->u.auth.status_code);
565 if (len > 24 + sizeof(mgmt->u.auth)) {
566 event.auth.ies = mgmt->u.auth.variable;
567 event.auth.ies_len = len - 24 - sizeof(mgmt->u.auth);
570 wpa_supplicant_event(drv->ctx, EVENT_AUTH, &event);
574 static void mlme_event_assoc(struct wpa_driver_nl80211_data *drv,
575 const u8 *frame, size_t len)
577 const struct ieee80211_mgmt *mgmt;
578 union wpa_event_data event;
581 mgmt = (const struct ieee80211_mgmt *) frame;
582 if (len < 24 + sizeof(mgmt->u.assoc_resp)) {
583 wpa_printf(MSG_DEBUG, "nl80211: Too short association event "
588 status = le_to_host16(mgmt->u.assoc_resp.status_code);
589 if (status != WLAN_STATUS_SUCCESS) {
590 wpa_printf(MSG_DEBUG, "nl80211: Association failed: status "
592 /* TODO: notify SME so that things like SA Query and comeback
593 * time can be implemented */
598 os_memcpy(drv->bssid, mgmt->sa, ETH_ALEN);
600 os_memset(&event, 0, sizeof(event));
601 if (len > 24 + sizeof(mgmt->u.assoc_resp)) {
602 event.assoc_info.resp_ies = (u8 *) mgmt->u.assoc_resp.variable;
603 event.assoc_info.resp_ies_len =
604 len - 24 - sizeof(mgmt->u.assoc_req);
607 wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event);
611 static void mlme_event(struct wpa_driver_nl80211_data *drv,
612 enum nl80211_commands cmd, struct nlattr *frame)
615 wpa_printf(MSG_DEBUG, "nl80211: MLME event %d without frame "
620 wpa_printf(MSG_DEBUG, "nl80211: MLME event %d", cmd);
621 wpa_hexdump(MSG_MSGDUMP, "nl80211: MLME event frame",
622 nla_data(frame), nla_len(frame));
625 case NL80211_CMD_AUTHENTICATE:
626 mlme_event_auth(drv, nla_data(frame), nla_len(frame));
628 case NL80211_CMD_ASSOCIATE:
629 mlme_event_assoc(drv, nla_data(frame), nla_len(frame));
631 case NL80211_CMD_DEAUTHENTICATE:
633 wpa_supplicant_event(drv->ctx, EVENT_DEAUTH, NULL);
635 case NL80211_CMD_DISASSOCIATE:
637 wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
645 static int process_event(struct nl_msg *msg, void *arg)
647 struct wpa_driver_nl80211_data *drv = arg;
648 struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
649 struct nlattr *tb[NL80211_ATTR_MAX + 1];
651 nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
652 genlmsg_attrlen(gnlh, 0), NULL);
654 if (tb[NL80211_ATTR_IFINDEX]) {
655 int ifindex = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
656 if (ifindex != drv->ifindex) {
657 wpa_printf(MSG_DEBUG, "nl80211: Ignored event (cmd=%d)"
658 " for foreign interface (ifindex %d)",
665 case NL80211_CMD_NEW_SCAN_RESULTS:
666 wpa_printf(MSG_DEBUG, "nl80211: New scan results available");
667 drv->scan_complete_events = 1;
668 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv,
670 wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS, NULL);
672 case NL80211_CMD_SCAN_ABORTED:
673 wpa_printf(MSG_DEBUG, "nl80211: Scan aborted");
675 * Need to indicate that scan results are available in order
676 * not to make wpa_supplicant stop its scanning.
678 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv,
680 wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS, NULL);
682 case NL80211_CMD_AUTHENTICATE:
683 case NL80211_CMD_ASSOCIATE:
684 case NL80211_CMD_DEAUTHENTICATE:
685 case NL80211_CMD_DISASSOCIATE:
686 mlme_event(drv, gnlh->cmd, tb[NL80211_ATTR_FRAME]);
689 wpa_printf(MSG_DEBUG, "nl80211: Ignored unknown event "
690 "(cmd=%d)", gnlh->cmd);
698 static void wpa_driver_nl80211_event_receive(int sock, void *eloop_ctx,
702 struct wpa_driver_nl80211_data *drv = eloop_ctx;
704 wpa_printf(MSG_DEBUG, "nl80211: Event message available");
706 cb = nl_cb_clone(drv->nl_cb);
709 nl_cb_set(cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, no_seq_check, NULL);
710 nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, process_event, drv);
711 nl_recvmsgs(drv->nl_handle, cb);
716 static int wpa_driver_nl80211_get_ifflags_ifname(struct wpa_driver_nl80211_data *drv,
717 const char *ifname, int *flags)
721 os_memset(&ifr, 0, sizeof(ifr));
722 os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
723 if (ioctl(drv->ioctl_sock, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
724 perror("ioctl[SIOCGIFFLAGS]");
727 *flags = ifr.ifr_flags & 0xffff;
733 * wpa_driver_nl80211_get_ifflags - Get interface flags (SIOCGIFFLAGS)
734 * @drv: driver_nl80211 private data
735 * @flags: Pointer to returned flags value
736 * Returns: 0 on success, -1 on failure
738 static int wpa_driver_nl80211_get_ifflags(struct wpa_driver_nl80211_data *drv,
741 return wpa_driver_nl80211_get_ifflags_ifname(drv, drv->ifname, flags);
745 static int wpa_driver_nl80211_set_ifflags_ifname(
746 struct wpa_driver_nl80211_data *drv,
747 const char *ifname, int flags)
751 os_memset(&ifr, 0, sizeof(ifr));
752 os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
753 ifr.ifr_flags = flags & 0xffff;
754 if (ioctl(drv->ioctl_sock, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
755 perror("SIOCSIFFLAGS");
763 * wpa_driver_nl80211_set_ifflags - Set interface flags (SIOCSIFFLAGS)
764 * @drv: driver_nl80211 private data
765 * @flags: New value for flags
766 * Returns: 0 on success, -1 on failure
768 static int wpa_driver_nl80211_set_ifflags(struct wpa_driver_nl80211_data *drv,
771 return wpa_driver_nl80211_set_ifflags_ifname(drv, drv->ifname, flags);
776 * wpa_driver_nl80211_set_country - ask nl80211 to set the regulatory domain
777 * @priv: driver_nl80211 private data
778 * @alpha2_arg: country to which to switch to
779 * Returns: 0 on success, -1 on failure
781 * This asks nl80211 to set the regulatory domain for given
782 * country ISO / IEC alpha2.
784 static int wpa_driver_nl80211_set_country(void *priv, const char *alpha2_arg)
786 struct wpa_driver_nl80211_data *drv = priv;
792 goto nla_put_failure;
794 alpha2[0] = alpha2_arg[0];
795 alpha2[1] = alpha2_arg[1];
798 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
799 0, NL80211_CMD_REQ_SET_REG, 0);
801 NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2, alpha2);
802 if (send_and_recv_msgs(drv, msg, NULL, NULL))
810 struct wiphy_info_data {
816 static int wiphy_info_handler(struct nl_msg *msg, void *arg)
818 struct nlattr *tb[NL80211_ATTR_MAX + 1];
819 struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
820 struct wiphy_info_data *info = arg;
822 nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
823 genlmsg_attrlen(gnlh, 0), NULL);
825 if (tb[NL80211_ATTR_MAX_NUM_SCAN_SSIDS])
826 info->max_scan_ssids =
827 nla_get_u8(tb[NL80211_ATTR_MAX_NUM_SCAN_SSIDS]);
829 if (tb[NL80211_ATTR_SUPPORTED_IFTYPES]) {
830 struct nlattr *nl_mode;
832 nla_for_each_nested(nl_mode,
833 tb[NL80211_ATTR_SUPPORTED_IFTYPES], i) {
834 if (nl_mode->nla_type == NL80211_IFTYPE_AP) {
835 info->ap_supported = 1;
845 static int wpa_driver_nl80211_get_info(struct wpa_driver_nl80211_data *drv,
846 struct wiphy_info_data *info)
850 os_memset(info, 0, sizeof(*info));
855 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
856 0, NL80211_CMD_GET_WIPHY, 0);
858 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
860 if (send_and_recv_msgs(drv, msg, wiphy_info_handler, info) == 0)
869 static void wpa_driver_nl80211_capa(struct wpa_driver_nl80211_data *drv)
871 struct wiphy_info_data info;
872 if (wpa_driver_nl80211_get_info(drv, &info))
874 drv->has_capability = 1;
875 drv->capa.max_scan_ssids = info.max_scan_ssids;
876 if (info.ap_supported)
877 drv->capa.flags |= WPA_DRIVER_FLAGS_AP;
882 * wpa_driver_nl80211_init - Initialize nl80211 driver interface
883 * @ctx: context to be used when calling wpa_supplicant functions,
884 * e.g., wpa_supplicant_event()
885 * @ifname: interface name, e.g., wlan0
886 * Returns: Pointer to private data, %NULL on failure
888 static void * wpa_driver_nl80211_init(void *ctx, const char *ifname)
891 struct sockaddr_nl local;
892 struct wpa_driver_nl80211_data *drv;
894 drv = os_zalloc(sizeof(*drv));
898 os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
900 drv->nl_cb = nl_cb_alloc(NL_CB_DEFAULT);
901 if (drv->nl_cb == NULL) {
902 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate netlink "
907 drv->nl_handle = nl_handle_alloc_cb(drv->nl_cb);
908 if (drv->nl_handle == NULL) {
909 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate netlink "
914 if (genl_connect(drv->nl_handle)) {
915 wpa_printf(MSG_ERROR, "nl80211: Failed to connect to generic "
920 drv->nl_cache = genl_ctrl_alloc_cache(drv->nl_handle);
921 if (drv->nl_cache == NULL) {
922 wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic "
927 drv->nl80211 = genl_ctrl_search_by_name(drv->nl_cache, "nl80211");
928 if (drv->nl80211 == NULL) {
929 wpa_printf(MSG_ERROR, "nl80211: 'nl80211' generic netlink not "
934 ret = nl_get_multicast_id(drv, "nl80211", "scan");
936 ret = nl_socket_add_membership(drv->nl_handle, ret);
938 wpa_printf(MSG_ERROR, "nl80211: Could not add multicast "
939 "membership for scan events: %d (%s)",
940 ret, strerror(-ret));
944 ret = nl_get_multicast_id(drv, "nl80211", "mlme");
946 ret = nl_socket_add_membership(drv->nl_handle, ret);
948 wpa_printf(MSG_ERROR, "nl80211: Could not add multicast "
949 "membership for mlme events: %d (%s)",
950 ret, strerror(-ret));
953 drv->capa.flags |= WPA_DRIVER_FLAGS_SME;
955 eloop_register_read_sock(nl_socket_get_fd(drv->nl_handle),
956 wpa_driver_nl80211_event_receive, drv, ctx);
958 drv->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);
959 if (drv->ioctl_sock < 0) {
960 perror("socket(PF_INET,SOCK_DGRAM)");
964 s = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
966 perror("socket(PF_NETLINK,SOCK_RAW,NETLINK_ROUTE)");
970 os_memset(&local, 0, sizeof(local));
971 local.nl_family = AF_NETLINK;
972 local.nl_groups = RTMGRP_LINK;
973 if (bind(s, (struct sockaddr *) &local, sizeof(local)) < 0) {
974 perror("bind(netlink)");
979 eloop_register_read_sock(s, wpa_driver_nl80211_event_receive_link, drv,
981 drv->link_event_sock = s;
983 if (wpa_driver_nl80211_finish_drv_init(drv))
989 eloop_unregister_read_sock(drv->link_event_sock);
990 close(drv->link_event_sock);
992 close(drv->ioctl_sock);
994 genl_family_put(drv->nl80211);
996 nl_cache_free(drv->nl_cache);
998 nl_handle_destroy(drv->nl_handle);
1000 nl_cb_put(drv->nl_cb);
1008 wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv)
1012 drv->ifindex = if_nametoindex(drv->ifname);
1014 if (wpa_driver_nl80211_set_mode(drv, 0) < 0) {
1015 wpa_printf(MSG_DEBUG, "nl80211: Could not configure driver to "
1016 "use managed mode");
1019 if (wpa_driver_nl80211_get_ifflags(drv, &flags) != 0) {
1020 wpa_printf(MSG_ERROR, "Could not get interface '%s' flags",
1024 if (!(flags & IFF_UP)) {
1025 if (wpa_driver_nl80211_set_ifflags(drv, flags | IFF_UP) != 0) {
1026 wpa_printf(MSG_ERROR, "Could not set interface '%s' "
1032 wpa_driver_nl80211_get_range(drv);
1034 wpa_driver_nl80211_capa(drv);
1036 wpa_driver_nl80211_send_oper_ifla(drv, 1, IF_OPER_DORMANT);
1043 * wpa_driver_nl80211_deinit - Deinitialize nl80211 driver interface
1044 * @priv: Pointer to private nl80211 data from wpa_driver_nl80211_init()
1046 * Shut down driver interface and processing of driver events. Free
1047 * private data buffer if one was allocated in wpa_driver_nl80211_init().
1049 static void wpa_driver_nl80211_deinit(void *priv)
1051 struct wpa_driver_nl80211_data *drv = priv;
1054 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx);
1056 wpa_driver_nl80211_set_auth_param(drv, IW_AUTH_DROP_UNENCRYPTED, 0);
1058 wpa_driver_nl80211_send_oper_ifla(priv, 0, IF_OPER_UP);
1060 eloop_unregister_read_sock(drv->link_event_sock);
1062 if (wpa_driver_nl80211_get_ifflags(drv, &flags) == 0)
1063 (void) wpa_driver_nl80211_set_ifflags(drv, flags & ~IFF_UP);
1064 wpa_driver_nl80211_set_mode(drv, 0);
1066 close(drv->link_event_sock);
1067 close(drv->ioctl_sock);
1069 eloop_unregister_read_sock(nl_socket_get_fd(drv->nl_handle));
1070 genl_family_put(drv->nl80211);
1071 nl_cache_free(drv->nl_cache);
1072 nl_handle_destroy(drv->nl_handle);
1073 nl_cb_put(drv->nl_cb);
1080 * wpa_driver_nl80211_scan_timeout - Scan timeout to report scan completion
1081 * @eloop_ctx: Unused
1082 * @timeout_ctx: ctx argument given to wpa_driver_nl80211_init()
1084 * This function can be used as registered timeout when starting a scan to
1085 * generate a scan completed event if the driver does not report this.
1087 static void wpa_driver_nl80211_scan_timeout(void *eloop_ctx, void *timeout_ctx)
1089 wpa_printf(MSG_DEBUG, "Scan timeout - try to get results");
1090 wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL);
1095 * wpa_driver_nl80211_scan - Request the driver to initiate scan
1096 * @priv: Pointer to private wext data from wpa_driver_nl80211_init()
1097 * @params: Scan parameters
1098 * Returns: 0 on success, -1 on failure
1100 static int wpa_driver_nl80211_scan(void *priv,
1101 struct wpa_driver_scan_params *params)
1103 struct wpa_driver_nl80211_data *drv = priv;
1104 int ret = 0, timeout;
1105 struct nl_msg *msg, *ssids, *freqs;
1108 msg = nlmsg_alloc();
1109 ssids = nlmsg_alloc();
1110 freqs = nlmsg_alloc();
1111 if (!msg || !ssids || !freqs) {
1118 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
1119 NL80211_CMD_TRIGGER_SCAN, 0);
1121 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1123 for (i = 0; i < params->num_ssids; i++) {
1124 NLA_PUT(ssids, i + 1, params->ssids[i].ssid_len,
1125 params->ssids[i].ssid);
1127 if (params->num_ssids)
1128 nla_put_nested(msg, NL80211_ATTR_SCAN_SSIDS, ssids);
1130 if (params->extra_ies) {
1131 NLA_PUT(msg, NL80211_ATTR_IE, params->extra_ies_len,
1135 if (params->freqs) {
1136 for (i = 0; params->freqs[i]; i++)
1137 NLA_PUT_U32(freqs, i + 1, params->freqs[i]);
1138 nla_put_nested(msg, NL80211_ATTR_SCAN_FREQUENCIES, freqs);
1141 ret = send_and_recv_msgs(drv, msg, NULL, NULL);
1144 wpa_printf(MSG_DEBUG, "nl80211: Scan trigger failed: ret=%d "
1145 "(%s)", ret, strerror(-ret));
1146 goto nla_put_failure;
1149 /* Not all drivers generate "scan completed" wireless event, so try to
1150 * read results after a timeout. */
1152 if (drv->scan_complete_events) {
1154 * The driver seems to deliver events to notify when scan is
1155 * complete, so use longer timeout to avoid race conditions
1156 * with scanning and following association request.
1160 wpa_printf(MSG_DEBUG, "Scan requested (ret=%d) - scan timeout %d "
1161 "seconds", ret, timeout);
1162 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx);
1163 eloop_register_timeout(timeout, 0, wpa_driver_nl80211_scan_timeout,
1174 static int bss_info_handler(struct nl_msg *msg, void *arg)
1176 struct nlattr *tb[NL80211_ATTR_MAX + 1];
1177 struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
1178 struct nlattr *bss[NL80211_BSS_MAX + 1];
1179 static struct nla_policy bss_policy[NL80211_BSS_MAX + 1] = {
1180 [NL80211_BSS_BSSID] = { .type = NLA_UNSPEC },
1181 [NL80211_BSS_FREQUENCY] = { .type = NLA_U32 },
1182 [NL80211_BSS_TSF] = { .type = NLA_U64 },
1183 [NL80211_BSS_BEACON_INTERVAL] = { .type = NLA_U16 },
1184 [NL80211_BSS_CAPABILITY] = { .type = NLA_U16 },
1185 [NL80211_BSS_INFORMATION_ELEMENTS] = { .type = NLA_UNSPEC },
1186 [NL80211_BSS_SIGNAL_MBM] = { .type = NLA_U32 },
1187 [NL80211_BSS_SIGNAL_UNSPEC] = { .type = NLA_U8 },
1189 struct wpa_scan_results *res = arg;
1190 struct wpa_scan_res **tmp;
1191 struct wpa_scan_res *r;
1195 nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
1196 genlmsg_attrlen(gnlh, 0), NULL);
1197 if (!tb[NL80211_ATTR_BSS])
1199 if (nla_parse_nested(bss, NL80211_BSS_MAX, tb[NL80211_ATTR_BSS],
1202 if (bss[NL80211_BSS_INFORMATION_ELEMENTS]) {
1203 ie = nla_data(bss[NL80211_BSS_INFORMATION_ELEMENTS]);
1204 ie_len = nla_len(bss[NL80211_BSS_INFORMATION_ELEMENTS]);
1210 r = os_zalloc(sizeof(*r) + ie_len);
1213 if (bss[NL80211_BSS_BSSID])
1214 os_memcpy(r->bssid, nla_data(bss[NL80211_BSS_BSSID]),
1216 if (bss[NL80211_BSS_FREQUENCY])
1217 r->freq = nla_get_u32(bss[NL80211_BSS_FREQUENCY]);
1218 if (bss[NL80211_BSS_BEACON_INTERVAL])
1219 r->beacon_int = nla_get_u16(bss[NL80211_BSS_BEACON_INTERVAL]);
1220 if (bss[NL80211_BSS_CAPABILITY])
1221 r->caps = nla_get_u16(bss[NL80211_BSS_CAPABILITY]);
1222 r->flags |= WPA_SCAN_NOISE_INVALID;
1223 if (bss[NL80211_BSS_SIGNAL_MBM]) {
1224 r->level = nla_get_u32(bss[NL80211_BSS_SIGNAL_MBM]);
1225 r->level /= 100; /* mBm to dBm */
1226 r->flags |= WPA_SCAN_LEVEL_DBM | WPA_SCAN_QUAL_INVALID;
1227 } else if (bss[NL80211_BSS_SIGNAL_UNSPEC]) {
1228 r->level = nla_get_u8(bss[NL80211_BSS_SIGNAL_UNSPEC]);
1229 r->flags |= WPA_SCAN_LEVEL_INVALID;
1231 r->flags |= WPA_SCAN_LEVEL_INVALID | WPA_SCAN_QUAL_INVALID;
1232 if (bss[NL80211_BSS_TSF])
1233 r->tsf = nla_get_u64(bss[NL80211_BSS_TSF]);
1236 os_memcpy(r + 1, ie, ie_len);
1238 tmp = os_realloc(res->res,
1239 (res->num + 1) * sizeof(struct wpa_scan_res *));
1244 tmp[res->num++] = r;
1252 * wpa_driver_nl80211_get_scan_results - Fetch the latest scan results
1253 * @priv: Pointer to private wext data from wpa_driver_nl80211_init()
1254 * Returns: Scan results on success, -1 on failure
1256 static struct wpa_scan_results *
1257 wpa_driver_nl80211_get_scan_results(void *priv)
1259 struct wpa_driver_nl80211_data *drv = priv;
1261 struct wpa_scan_results *res;
1264 res = os_zalloc(sizeof(*res));
1267 msg = nlmsg_alloc();
1269 goto nla_put_failure;
1271 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, NLM_F_DUMP,
1272 NL80211_CMD_GET_SCAN, 0);
1273 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1275 ret = send_and_recv_msgs(drv, msg, bss_info_handler, res);
1278 wpa_printf(MSG_DEBUG, "Received scan results (%lu BSSes)",
1279 (unsigned long) res->num);
1282 wpa_printf(MSG_DEBUG, "nl80211: Scan result fetch failed: ret=%d "
1283 "(%s)", ret, strerror(-ret));
1286 wpa_scan_results_free(res);
1291 static int wpa_driver_nl80211_get_range(void *priv)
1293 struct wpa_driver_nl80211_data *drv = priv;
1294 struct iw_range *range;
1300 * Use larger buffer than struct iw_range in order to allow the
1301 * structure to grow in the future.
1303 buflen = sizeof(struct iw_range) + 500;
1304 range = os_zalloc(buflen);
1308 os_memset(&iwr, 0, sizeof(iwr));
1309 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
1310 iwr.u.data.pointer = (caddr_t) range;
1311 iwr.u.data.length = buflen;
1313 minlen = ((char *) &range->enc_capa) - (char *) range +
1314 sizeof(range->enc_capa);
1316 if (ioctl(drv->ioctl_sock, SIOCGIWRANGE, &iwr) < 0) {
1317 perror("ioctl[SIOCGIWRANGE]");
1320 } else if (iwr.u.data.length >= minlen &&
1321 range->we_version_compiled >= 18) {
1322 wpa_printf(MSG_DEBUG, "SIOCGIWRANGE: WE(compiled)=%d "
1323 "WE(source)=%d enc_capa=0x%x",
1324 range->we_version_compiled,
1325 range->we_version_source,
1327 drv->has_capability = 1;
1328 if (range->enc_capa & IW_ENC_CAPA_WPA) {
1329 drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA |
1330 WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK;
1332 if (range->enc_capa & IW_ENC_CAPA_WPA2) {
1333 drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
1334 WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK;
1336 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_WEP40 |
1337 WPA_DRIVER_CAPA_ENC_WEP104;
1338 if (range->enc_capa & IW_ENC_CAPA_CIPHER_TKIP)
1339 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_TKIP;
1340 if (range->enc_capa & IW_ENC_CAPA_CIPHER_CCMP)
1341 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_CCMP;
1342 wpa_printf(MSG_DEBUG, " capabilities: key_mgmt 0x%x enc 0x%x",
1343 drv->capa.key_mgmt, drv->capa.enc);
1345 wpa_printf(MSG_DEBUG, "SIOCGIWRANGE: too old (short) data - "
1346 "assuming WPA is not supported");
1354 static int wpa_driver_nl80211_set_key(void *priv, wpa_alg alg,
1355 const u8 *addr, int key_idx,
1356 int set_tx, const u8 *seq,
1358 const u8 *key, size_t key_len)
1360 struct wpa_driver_nl80211_data *drv = priv;
1364 wpa_printf(MSG_DEBUG, "%s: alg=%d addr=%p key_idx=%d set_tx=%d "
1365 "seq_len=%lu key_len=%lu",
1366 __func__, alg, addr, key_idx, set_tx,
1367 (unsigned long) seq_len, (unsigned long) key_len);
1369 msg = nlmsg_alloc();
1373 if (alg == WPA_ALG_NONE) {
1374 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
1375 NL80211_CMD_DEL_KEY, 0);
1377 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
1378 NL80211_CMD_NEW_KEY, 0);
1379 NLA_PUT(msg, NL80211_ATTR_KEY_DATA, key_len, key);
1383 NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
1386 NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
1390 NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER, 0x000FAC02);
1393 NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER, 0x000FAC04);
1401 if (addr && os_memcmp(addr, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) != 0)
1403 wpa_printf(MSG_DEBUG, " addr=" MACSTR, MAC2STR(addr));
1404 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
1406 NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_idx);
1407 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1409 err = send_and_recv_msgs(drv, msg, NULL, NULL);
1411 wpa_printf(MSG_DEBUG, "nl80211: set_key failed; err=%d", err);
1415 if (set_tx && alg != WPA_ALG_NONE) {
1416 msg = nlmsg_alloc();
1420 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1421 0, NL80211_CMD_SET_KEY, 0);
1422 NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_idx);
1423 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1424 NLA_PUT_FLAG(msg, NL80211_ATTR_KEY_DEFAULT);
1426 err = send_and_recv_msgs(drv, msg, NULL, NULL);
1428 wpa_printf(MSG_DEBUG, "nl80211: set default key "
1429 "failed; err=%d", err);
1441 static int wpa_driver_nl80211_mlme(struct wpa_driver_nl80211_data *drv,
1442 const u8 *addr, int cmd, u16 reason_code)
1447 msg = nlmsg_alloc();
1451 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0, cmd, 0);
1453 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1454 NLA_PUT_U16(msg, NL80211_ATTR_REASON_CODE, reason_code);
1455 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
1457 ret = send_and_recv_msgs(drv, msg, NULL, NULL);
1460 wpa_printf(MSG_DEBUG, "nl80211: MLME command failed: ret=%d "
1461 "(%s)", ret, strerror(-ret));
1462 goto nla_put_failure;
1472 static int wpa_driver_nl80211_deauthenticate(void *priv, const u8 *addr,
1475 struct wpa_driver_nl80211_data *drv = priv;
1476 wpa_printf(MSG_DEBUG, "%s", __func__);
1477 return wpa_driver_nl80211_mlme(drv, addr, NL80211_CMD_DEAUTHENTICATE,
1482 static int wpa_driver_nl80211_disassociate(void *priv, const u8 *addr,
1485 struct wpa_driver_nl80211_data *drv = priv;
1486 wpa_printf(MSG_DEBUG, "%s", __func__);
1487 return wpa_driver_nl80211_mlme(drv, addr, NL80211_CMD_DISASSOCIATE,
1492 static int wpa_driver_nl80211_authenticate(
1493 void *priv, struct wpa_driver_auth_params *params)
1495 struct wpa_driver_nl80211_data *drv = priv;
1498 enum nl80211_auth_type type;
1500 drv->associated = 0;
1502 msg = nlmsg_alloc();
1506 wpa_printf(MSG_DEBUG, "nl80211: Authenticate (ifindex=%d)",
1508 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
1509 NL80211_CMD_AUTHENTICATE, 0);
1511 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1512 if (params->bssid) {
1513 wpa_printf(MSG_DEBUG, " * bssid=" MACSTR,
1514 MAC2STR(params->bssid));
1515 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, params->bssid);
1518 wpa_printf(MSG_DEBUG, " * freq=%d", params->freq);
1519 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
1522 wpa_hexdump_ascii(MSG_DEBUG, " * SSID",
1523 params->ssid, params->ssid_len);
1524 NLA_PUT(msg, NL80211_ATTR_SSID, params->ssid_len,
1527 wpa_hexdump(MSG_DEBUG, " * IEs", params->ie, params->ie_len);
1529 NLA_PUT(msg, NL80211_ATTR_IE, params->ie_len, params->ie);
1531 * TODO: if multiple auth_alg options enabled, try them one by one if
1532 * the AP rejects authentication due to unknown auth alg
1534 if (params->auth_alg & AUTH_ALG_OPEN_SYSTEM)
1535 type = NL80211_AUTHTYPE_OPEN_SYSTEM;
1536 else if (params->auth_alg & AUTH_ALG_SHARED_KEY)
1537 type = NL80211_AUTHTYPE_SHARED_KEY;
1538 else if (params->auth_alg & AUTH_ALG_LEAP)
1539 type = NL80211_AUTHTYPE_NETWORK_EAP;
1540 else if (params->auth_alg & AUTH_ALG_FT)
1541 type = NL80211_AUTHTYPE_FT;
1543 goto nla_put_failure;
1544 wpa_printf(MSG_DEBUG, " * Auth Type %d", type);
1545 NLA_PUT_U32(msg, NL80211_ATTR_AUTH_TYPE, type);
1547 ret = send_and_recv_msgs(drv, msg, NULL, NULL);
1550 wpa_printf(MSG_DEBUG, "nl80211: MLME command failed: ret=%d "
1551 "(%s)", ret, strerror(-ret));
1552 goto nla_put_failure;
1555 wpa_printf(MSG_DEBUG, "nl80211: Authentication request send "
1565 static int wpa_driver_nl80211_set_freq2(
1566 struct wpa_driver_nl80211_data *drv,
1567 struct wpa_driver_associate_params *params)
1571 msg = nlmsg_alloc();
1575 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
1576 NL80211_CMD_SET_WIPHY, 0);
1578 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1580 /* TODO: proper channel configuration */
1581 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, 2437);
1583 if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0)
1590 static int wpa_driver_nl80211_ap(struct wpa_driver_nl80211_data *drv,
1591 struct wpa_driver_associate_params *params)
1593 if (wpa_driver_nl80211_set_mode(drv, params->mode) ||
1594 wpa_driver_nl80211_set_freq2(drv, params))
1597 /* TODO: setup monitor interface (and add code somewhere to remove this
1598 * when AP mode is stopped; associate with mode != 2 or drv_deinit) */
1599 /* TODO: setup beacon */
1603 #endif /* CONFIG_AP */
1606 static int wpa_driver_nl80211_associate(
1607 void *priv, struct wpa_driver_associate_params *params)
1609 struct wpa_driver_nl80211_data *drv = priv;
1614 if (params->mode == 2)
1615 return wpa_driver_nl80211_ap(drv, params);
1616 #endif /* CONFIG_AP */
1618 wpa_driver_nl80211_set_auth_param(drv, IW_AUTH_DROP_UNENCRYPTED,
1619 params->drop_unencrypted);
1621 drv->associated = 0;
1623 msg = nlmsg_alloc();
1627 wpa_printf(MSG_DEBUG, "nl80211: Associate (ifindex=%d)",
1629 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
1630 NL80211_CMD_ASSOCIATE, 0);
1632 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1633 if (params->bssid) {
1634 wpa_printf(MSG_DEBUG, " * bssid=" MACSTR,
1635 MAC2STR(params->bssid));
1636 NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, params->bssid);
1639 wpa_printf(MSG_DEBUG, " * freq=%d", params->freq);
1640 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
1643 wpa_hexdump_ascii(MSG_DEBUG, " * SSID",
1644 params->ssid, params->ssid_len);
1645 NLA_PUT(msg, NL80211_ATTR_SSID, params->ssid_len,
1647 if (params->ssid_len > sizeof(drv->ssid))
1648 goto nla_put_failure;
1649 os_memcpy(drv->ssid, params->ssid, params->ssid_len);
1650 drv->ssid_len = params->ssid_len;
1652 wpa_hexdump(MSG_DEBUG, " * IEs", params->wpa_ie, params->wpa_ie_len);
1654 NLA_PUT(msg, NL80211_ATTR_IE, params->wpa_ie_len,
1657 ret = send_and_recv_msgs(drv, msg, NULL, NULL);
1660 wpa_printf(MSG_DEBUG, "nl80211: MLME command failed: ret=%d "
1661 "(%s)", ret, strerror(-ret));
1662 goto nla_put_failure;
1665 wpa_printf(MSG_DEBUG, "nl80211: Association request send "
1675 * wpa_driver_nl80211_set_mode - Set wireless mode (infra/adhoc), SIOCSIWMODE
1676 * @drv: Pointer to private driver data from wpa_driver_nl80211_init()
1677 * @mode: 0 = infra/BSS (associate with an AP), 1 = adhoc/IBSS
1678 * Returns: 0 on success, -1 on failure
1680 static int wpa_driver_nl80211_set_mode(struct wpa_driver_nl80211_data *drv,
1683 int ret = -1, flags;
1689 nlmode = NL80211_IFTYPE_STATION;
1692 nlmode = NL80211_IFTYPE_ADHOC;
1695 nlmode = NL80211_IFTYPE_AP;
1701 msg = nlmsg_alloc();
1705 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1706 0, NL80211_CMD_SET_INTERFACE, 0);
1707 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1708 NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, nlmode);
1710 ret = send_and_recv_msgs(drv, msg, NULL, NULL);
1717 wpa_printf(MSG_ERROR, "nl80211: Failed to set interface mode: %d (%s)",
1718 ret, strerror(-ret));
1722 /* mac80211 doesn't allow mode changes while the device is up, so
1723 * take the device down, try to set the mode again, and bring the
1726 if (wpa_driver_nl80211_get_ifflags(drv, &flags) == 0) {
1727 (void) wpa_driver_nl80211_set_ifflags(drv, flags & ~IFF_UP);
1729 /* Try to set the mode again while the interface is down */
1730 msg = nlmsg_alloc();
1734 genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
1735 0, NL80211_CMD_SET_INTERFACE, 0);
1736 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
1737 NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, nlmode);
1738 ret = send_and_recv_msgs(drv, msg, NULL, NULL);
1740 wpa_printf(MSG_ERROR, "Failed to set interface %s "
1741 "mode(try_again): %d (%s)",
1742 drv->ifname, ret, strerror(-ret));
1745 /* Ignore return value of get_ifflags to ensure that the device
1746 * is always up like it was before this function was called.
1748 (void) wpa_driver_nl80211_get_ifflags(drv, &flags);
1749 (void) wpa_driver_nl80211_set_ifflags(drv, flags | IFF_UP);
1756 static int wpa_driver_nl80211_get_capa(void *priv,
1757 struct wpa_driver_capa *capa)
1759 struct wpa_driver_nl80211_data *drv = priv;
1760 if (!drv->has_capability)
1762 os_memcpy(capa, &drv->capa, sizeof(*capa));
1767 static int wpa_driver_nl80211_set_operstate(void *priv, int state)
1769 struct wpa_driver_nl80211_data *drv = priv;
1771 wpa_printf(MSG_DEBUG, "%s: operstate %d->%d (%s)",
1772 __func__, drv->operstate, state, state ? "UP" : "DORMANT");
1773 drv->operstate = state;
1774 return wpa_driver_nl80211_send_oper_ifla(
1775 drv, -1, state ? IF_OPER_UP : IF_OPER_DORMANT);
1779 const struct wpa_driver_ops wpa_driver_nl80211_ops = {
1781 .desc = "Linux nl80211/cfg80211",
1782 .get_bssid = wpa_driver_nl80211_get_bssid,
1783 .get_ssid = wpa_driver_nl80211_get_ssid,
1784 .set_key = wpa_driver_nl80211_set_key,
1785 .scan2 = wpa_driver_nl80211_scan,
1786 .get_scan_results2 = wpa_driver_nl80211_get_scan_results,
1787 .deauthenticate = wpa_driver_nl80211_deauthenticate,
1788 .disassociate = wpa_driver_nl80211_disassociate,
1789 .authenticate = wpa_driver_nl80211_authenticate,
1790 .associate = wpa_driver_nl80211_associate,
1791 .init = wpa_driver_nl80211_init,
1792 .deinit = wpa_driver_nl80211_deinit,
1793 .get_capa = wpa_driver_nl80211_get_capa,
1794 .set_operstate = wpa_driver_nl80211_set_operstate,
1795 .set_country = wpa_driver_nl80211_set_country,