driver_nl80211.c 71 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797
  1. /*
  2. * WPA Supplicant - driver interaction with Linux nl80211/cfg80211
  3. * Copyright (c) 2003-2008, Jouni Malinen <j@w1.fi>
  4. *
  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.
  8. *
  9. * Alternatively, this software may be distributed under the terms of BSD
  10. * license.
  11. *
  12. * See README and COPYING for more details.
  13. */
  14. #include "includes.h"
  15. #include <sys/ioctl.h>
  16. #include <net/if_arp.h>
  17. #include <netlink/genl/genl.h>
  18. #include <netlink/genl/family.h>
  19. #include <netlink/genl/ctrl.h>
  20. #include "nl80211_copy.h"
  21. #ifdef CONFIG_CLIENT_MLME
  22. #include <netpacket/packet.h>
  23. #include <linux/if_ether.h>
  24. #include "radiotap.h"
  25. #include "radiotap_iter.h"
  26. #endif /* CONFIG_CLIENT_MLME */
  27. #include "wireless_copy.h"
  28. #include "common.h"
  29. #include "driver.h"
  30. #include "eloop.h"
  31. #include "ieee802_11_defs.h"
  32. #ifndef IFF_LOWER_UP
  33. #define IFF_LOWER_UP 0x10000 /* driver signals L1 up */
  34. #endif
  35. #ifndef IFF_DORMANT
  36. #define IFF_DORMANT 0x20000 /* driver signals dormant */
  37. #endif
  38. #ifndef IF_OPER_DORMANT
  39. #define IF_OPER_DORMANT 5
  40. #endif
  41. #ifndef IF_OPER_UP
  42. #define IF_OPER_UP 6
  43. #endif
  44. struct wpa_driver_nl80211_data {
  45. void *ctx;
  46. int wext_event_sock;
  47. int ioctl_sock;
  48. char ifname[IFNAMSIZ + 1];
  49. int ifindex;
  50. int if_removed;
  51. u8 *assoc_req_ies;
  52. size_t assoc_req_ies_len;
  53. u8 *assoc_resp_ies;
  54. size_t assoc_resp_ies_len;
  55. struct wpa_driver_capa capa;
  56. int has_capability;
  57. int we_version_compiled;
  58. /* for set_auth_alg fallback */
  59. int use_crypt;
  60. int auth_alg_fallback;
  61. int operstate;
  62. char mlmedev[IFNAMSIZ + 1];
  63. int scan_complete_events;
  64. struct nl_handle *nl_handle;
  65. struct nl_cache *nl_cache;
  66. struct nl_cb *nl_cb;
  67. struct genl_family *nl80211;
  68. #ifdef CONFIG_CLIENT_MLME
  69. int monitor_sock; /* socket for monitor */
  70. int monitor_ifidx;
  71. #endif /* CONFIG_CLIENT_MLME */
  72. };
  73. static void wpa_driver_nl80211_scan_timeout(void *eloop_ctx,
  74. void *timeout_ctx);
  75. static int wpa_driver_nl80211_set_mode(void *priv, int mode);
  76. static int wpa_driver_nl80211_flush_pmkid(void *priv);
  77. static int wpa_driver_nl80211_get_range(void *priv);
  78. static int
  79. wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv);
  80. /* nl80211 code */
  81. static int ack_handler(struct nl_msg *msg, void *arg)
  82. {
  83. int *err = arg;
  84. *err = 0;
  85. return NL_STOP;
  86. }
  87. static int finish_handler(struct nl_msg *msg, void *arg)
  88. {
  89. int *ret = arg;
  90. *ret = 0;
  91. return NL_SKIP;
  92. }
  93. static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err,
  94. void *arg)
  95. {
  96. int *ret = arg;
  97. *ret = err->error;
  98. return NL_SKIP;
  99. }
  100. static int send_and_recv_msgs(struct wpa_driver_nl80211_data *drv,
  101. struct nl_msg *msg,
  102. int (*valid_handler)(struct nl_msg *, void *),
  103. void *valid_data)
  104. {
  105. struct nl_cb *cb;
  106. int err = -ENOMEM;
  107. cb = nl_cb_clone(drv->nl_cb);
  108. if (!cb)
  109. goto out;
  110. err = nl_send_auto_complete(drv->nl_handle, msg);
  111. if (err < 0)
  112. goto out;
  113. err = 1;
  114. nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
  115. nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err);
  116. nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, &err);
  117. if (valid_handler)
  118. nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM,
  119. valid_handler, valid_data);
  120. while (err > 0)
  121. nl_recvmsgs(drv->nl_handle, cb);
  122. out:
  123. nl_cb_put(cb);
  124. nlmsg_free(msg);
  125. return err;
  126. }
  127. struct family_data {
  128. const char *group;
  129. int id;
  130. };
  131. static int family_handler(struct nl_msg *msg, void *arg)
  132. {
  133. struct family_data *res = arg;
  134. struct nlattr *tb[CTRL_ATTR_MAX + 1];
  135. struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
  136. struct nlattr *mcgrp;
  137. int i;
  138. nla_parse(tb, CTRL_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
  139. genlmsg_attrlen(gnlh, 0), NULL);
  140. if (!tb[CTRL_ATTR_MCAST_GROUPS])
  141. return NL_SKIP;
  142. nla_for_each_nested(mcgrp, tb[CTRL_ATTR_MCAST_GROUPS], i) {
  143. struct nlattr *tb2[CTRL_ATTR_MCAST_GRP_MAX + 1];
  144. nla_parse(tb2, CTRL_ATTR_MCAST_GRP_MAX, nla_data(mcgrp),
  145. nla_len(mcgrp), NULL);
  146. if (!tb2[CTRL_ATTR_MCAST_GRP_NAME] ||
  147. !tb2[CTRL_ATTR_MCAST_GRP_ID] ||
  148. os_strncmp(nla_data(tb2[CTRL_ATTR_MCAST_GRP_NAME]),
  149. res->group,
  150. nla_len(tb2[CTRL_ATTR_MCAST_GRP_NAME])) != 0)
  151. continue;
  152. res->id = nla_get_u32(tb2[CTRL_ATTR_MCAST_GRP_ID]);
  153. break;
  154. };
  155. return NL_SKIP;
  156. }
  157. static int nl_get_multicast_id(struct wpa_driver_nl80211_data *drv,
  158. const char *family, const char *group)
  159. {
  160. struct nl_msg *msg;
  161. int ret = -1;
  162. struct family_data res = { group, -ENOENT };
  163. msg = nlmsg_alloc();
  164. if (!msg)
  165. return -ENOMEM;
  166. genlmsg_put(msg, 0, 0, genl_ctrl_resolve(drv->nl_handle, "nlctrl"),
  167. 0, 0, CTRL_CMD_GETFAMILY, 0);
  168. NLA_PUT_STRING(msg, CTRL_ATTR_FAMILY_NAME, family);
  169. ret = send_and_recv_msgs(drv, msg, family_handler, &res);
  170. msg = NULL;
  171. if (ret == 0)
  172. ret = res.id;
  173. nla_put_failure:
  174. nlmsg_free(msg);
  175. return ret;
  176. }
  177. static int wpa_driver_nl80211_send_oper_ifla(
  178. struct wpa_driver_nl80211_data *drv,
  179. int linkmode, int operstate)
  180. {
  181. struct {
  182. struct nlmsghdr hdr;
  183. struct ifinfomsg ifinfo;
  184. char opts[16];
  185. } req;
  186. struct rtattr *rta;
  187. static int nl_seq;
  188. ssize_t ret;
  189. os_memset(&req, 0, sizeof(req));
  190. req.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
  191. req.hdr.nlmsg_type = RTM_SETLINK;
  192. req.hdr.nlmsg_flags = NLM_F_REQUEST;
  193. req.hdr.nlmsg_seq = ++nl_seq;
  194. req.hdr.nlmsg_pid = 0;
  195. req.ifinfo.ifi_family = AF_UNSPEC;
  196. req.ifinfo.ifi_type = 0;
  197. req.ifinfo.ifi_index = drv->ifindex;
  198. req.ifinfo.ifi_flags = 0;
  199. req.ifinfo.ifi_change = 0;
  200. if (linkmode != -1) {
  201. rta = (struct rtattr *)
  202. ((char *) &req + NLMSG_ALIGN(req.hdr.nlmsg_len));
  203. rta->rta_type = IFLA_LINKMODE;
  204. rta->rta_len = RTA_LENGTH(sizeof(char));
  205. *((char *) RTA_DATA(rta)) = linkmode;
  206. req.hdr.nlmsg_len = NLMSG_ALIGN(req.hdr.nlmsg_len) +
  207. RTA_LENGTH(sizeof(char));
  208. }
  209. if (operstate != -1) {
  210. rta = (struct rtattr *)
  211. ((char *) &req + NLMSG_ALIGN(req.hdr.nlmsg_len));
  212. rta->rta_type = IFLA_OPERSTATE;
  213. rta->rta_len = RTA_LENGTH(sizeof(char));
  214. *((char *) RTA_DATA(rta)) = operstate;
  215. req.hdr.nlmsg_len = NLMSG_ALIGN(req.hdr.nlmsg_len) +
  216. RTA_LENGTH(sizeof(char));
  217. }
  218. wpa_printf(MSG_DEBUG, "WEXT: Operstate: linkmode=%d, operstate=%d",
  219. linkmode, operstate);
  220. ret = send(drv->wext_event_sock, &req, req.hdr.nlmsg_len, 0);
  221. if (ret < 0) {
  222. wpa_printf(MSG_DEBUG, "WEXT: Sending operstate IFLA failed: "
  223. "%s (assume operstate is not supported)",
  224. strerror(errno));
  225. }
  226. return ret < 0 ? -1 : 0;
  227. }
  228. static int wpa_driver_nl80211_set_auth_param(
  229. struct wpa_driver_nl80211_data *drv, int idx, u32 value)
  230. {
  231. struct iwreq iwr;
  232. int ret = 0;
  233. os_memset(&iwr, 0, sizeof(iwr));
  234. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  235. iwr.u.param.flags = idx & IW_AUTH_INDEX;
  236. iwr.u.param.value = value;
  237. if (ioctl(drv->ioctl_sock, SIOCSIWAUTH, &iwr) < 0) {
  238. if (errno != EOPNOTSUPP) {
  239. wpa_printf(MSG_DEBUG, "WEXT: SIOCSIWAUTH(param %d "
  240. "value 0x%x) failed: %s)",
  241. idx, value, strerror(errno));
  242. }
  243. ret = errno == EOPNOTSUPP ? -2 : -1;
  244. }
  245. return ret;
  246. }
  247. static int wpa_driver_nl80211_get_bssid(void *priv, u8 *bssid)
  248. {
  249. struct wpa_driver_nl80211_data *drv = priv;
  250. struct iwreq iwr;
  251. int ret = 0;
  252. os_memset(&iwr, 0, sizeof(iwr));
  253. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  254. if (ioctl(drv->ioctl_sock, SIOCGIWAP, &iwr) < 0) {
  255. perror("ioctl[SIOCGIWAP]");
  256. ret = -1;
  257. }
  258. os_memcpy(bssid, iwr.u.ap_addr.sa_data, ETH_ALEN);
  259. return ret;
  260. }
  261. static int wpa_driver_nl80211_set_bssid(void *priv, const u8 *bssid)
  262. {
  263. struct wpa_driver_nl80211_data *drv = priv;
  264. struct iwreq iwr;
  265. int ret = 0;
  266. os_memset(&iwr, 0, sizeof(iwr));
  267. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  268. iwr.u.ap_addr.sa_family = ARPHRD_ETHER;
  269. if (bssid)
  270. os_memcpy(iwr.u.ap_addr.sa_data, bssid, ETH_ALEN);
  271. else
  272. os_memset(iwr.u.ap_addr.sa_data, 0, ETH_ALEN);
  273. if (ioctl(drv->ioctl_sock, SIOCSIWAP, &iwr) < 0) {
  274. perror("ioctl[SIOCSIWAP]");
  275. ret = -1;
  276. }
  277. return ret;
  278. }
  279. static int wpa_driver_nl80211_get_ssid(void *priv, u8 *ssid)
  280. {
  281. struct wpa_driver_nl80211_data *drv = priv;
  282. struct iwreq iwr;
  283. int ret = 0;
  284. os_memset(&iwr, 0, sizeof(iwr));
  285. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  286. iwr.u.essid.pointer = (caddr_t) ssid;
  287. iwr.u.essid.length = 32;
  288. if (ioctl(drv->ioctl_sock, SIOCGIWESSID, &iwr) < 0) {
  289. perror("ioctl[SIOCGIWESSID]");
  290. ret = -1;
  291. } else {
  292. ret = iwr.u.essid.length;
  293. if (ret > 32)
  294. ret = 32;
  295. /* Some drivers include nul termination in the SSID, so let's
  296. * remove it here before further processing. WE-21 changes this
  297. * to explicitly require the length _not_ to include nul
  298. * termination. */
  299. if (ret > 0 && ssid[ret - 1] == '\0' &&
  300. drv->we_version_compiled < 21)
  301. ret--;
  302. }
  303. return ret;
  304. }
  305. static int wpa_driver_nl80211_set_ssid(void *priv, const u8 *ssid,
  306. size_t ssid_len)
  307. {
  308. struct wpa_driver_nl80211_data *drv = priv;
  309. struct iwreq iwr;
  310. int ret = 0;
  311. char buf[33];
  312. if (ssid_len > 32)
  313. return -1;
  314. os_memset(&iwr, 0, sizeof(iwr));
  315. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  316. /* flags: 1 = ESSID is active, 0 = not (promiscuous) */
  317. iwr.u.essid.flags = (ssid_len != 0);
  318. os_memset(buf, 0, sizeof(buf));
  319. os_memcpy(buf, ssid, ssid_len);
  320. iwr.u.essid.pointer = (caddr_t) buf;
  321. if (drv->we_version_compiled < 21) {
  322. /* For historic reasons, set SSID length to include one extra
  323. * character, C string nul termination, even though SSID is
  324. * really an octet string that should not be presented as a C
  325. * string. Some Linux drivers decrement the length by one and
  326. * can thus end up missing the last octet of the SSID if the
  327. * length is not incremented here. WE-21 changes this to
  328. * explicitly require the length _not_ to include nul
  329. * termination. */
  330. if (ssid_len)
  331. ssid_len++;
  332. }
  333. iwr.u.essid.length = ssid_len;
  334. if (ioctl(drv->ioctl_sock, SIOCSIWESSID, &iwr) < 0) {
  335. perror("ioctl[SIOCSIWESSID]");
  336. ret = -1;
  337. }
  338. return ret;
  339. }
  340. static int wpa_driver_nl80211_set_freq(void *priv, int freq)
  341. {
  342. struct wpa_driver_nl80211_data *drv = priv;
  343. struct iwreq iwr;
  344. int ret = 0;
  345. os_memset(&iwr, 0, sizeof(iwr));
  346. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  347. iwr.u.freq.m = freq * 100000;
  348. iwr.u.freq.e = 1;
  349. if (ioctl(drv->ioctl_sock, SIOCSIWFREQ, &iwr) < 0) {
  350. perror("ioctl[SIOCSIWFREQ]");
  351. ret = -1;
  352. }
  353. return ret;
  354. }
  355. static void
  356. wpa_driver_nl80211_event_wireless_custom(void *ctx, char *custom)
  357. {
  358. union wpa_event_data data;
  359. wpa_printf(MSG_MSGDUMP, "WEXT: Custom wireless event: '%s'",
  360. custom);
  361. os_memset(&data, 0, sizeof(data));
  362. /* Host AP driver */
  363. if (os_strncmp(custom, "MLME-MICHAELMICFAILURE.indication", 33) == 0) {
  364. data.michael_mic_failure.unicast =
  365. os_strstr(custom, " unicast ") != NULL;
  366. /* TODO: parse parameters(?) */
  367. wpa_supplicant_event(ctx, EVENT_MICHAEL_MIC_FAILURE, &data);
  368. } else if (os_strncmp(custom, "ASSOCINFO(ReqIEs=", 17) == 0) {
  369. char *spos;
  370. int bytes;
  371. spos = custom + 17;
  372. bytes = strspn(spos, "0123456789abcdefABCDEF");
  373. if (!bytes || (bytes & 1))
  374. return;
  375. bytes /= 2;
  376. data.assoc_info.req_ies = os_malloc(bytes);
  377. if (data.assoc_info.req_ies == NULL)
  378. return;
  379. data.assoc_info.req_ies_len = bytes;
  380. hexstr2bin(spos, data.assoc_info.req_ies, bytes);
  381. spos += bytes * 2;
  382. data.assoc_info.resp_ies = NULL;
  383. data.assoc_info.resp_ies_len = 0;
  384. if (os_strncmp(spos, " RespIEs=", 9) == 0) {
  385. spos += 9;
  386. bytes = strspn(spos, "0123456789abcdefABCDEF");
  387. if (!bytes || (bytes & 1))
  388. goto done;
  389. bytes /= 2;
  390. data.assoc_info.resp_ies = os_malloc(bytes);
  391. if (data.assoc_info.resp_ies == NULL)
  392. goto done;
  393. data.assoc_info.resp_ies_len = bytes;
  394. hexstr2bin(spos, data.assoc_info.resp_ies, bytes);
  395. }
  396. wpa_supplicant_event(ctx, EVENT_ASSOCINFO, &data);
  397. done:
  398. os_free(data.assoc_info.resp_ies);
  399. os_free(data.assoc_info.req_ies);
  400. #ifdef CONFIG_PEERKEY
  401. } else if (os_strncmp(custom, "STKSTART.request=", 17) == 0) {
  402. if (hwaddr_aton(custom + 17, data.stkstart.peer)) {
  403. wpa_printf(MSG_DEBUG, "WEXT: unrecognized "
  404. "STKSTART.request '%s'", custom + 17);
  405. return;
  406. }
  407. wpa_supplicant_event(ctx, EVENT_STKSTART, &data);
  408. #endif /* CONFIG_PEERKEY */
  409. }
  410. }
  411. static int wpa_driver_nl80211_event_wireless_michaelmicfailure(
  412. void *ctx, const char *ev, size_t len)
  413. {
  414. const struct iw_michaelmicfailure *mic;
  415. union wpa_event_data data;
  416. if (len < sizeof(*mic))
  417. return -1;
  418. mic = (const struct iw_michaelmicfailure *) ev;
  419. wpa_printf(MSG_DEBUG, "Michael MIC failure wireless event: "
  420. "flags=0x%x src_addr=" MACSTR, mic->flags,
  421. MAC2STR(mic->src_addr.sa_data));
  422. os_memset(&data, 0, sizeof(data));
  423. data.michael_mic_failure.unicast = !(mic->flags & IW_MICFAILURE_GROUP);
  424. wpa_supplicant_event(ctx, EVENT_MICHAEL_MIC_FAILURE, &data);
  425. return 0;
  426. }
  427. static int wpa_driver_nl80211_event_wireless_pmkidcand(
  428. struct wpa_driver_nl80211_data *drv, const char *ev, size_t len)
  429. {
  430. const struct iw_pmkid_cand *cand;
  431. union wpa_event_data data;
  432. const u8 *addr;
  433. if (len < sizeof(*cand))
  434. return -1;
  435. cand = (const struct iw_pmkid_cand *) ev;
  436. addr = (const u8 *) cand->bssid.sa_data;
  437. wpa_printf(MSG_DEBUG, "PMKID candidate wireless event: "
  438. "flags=0x%x index=%d bssid=" MACSTR, cand->flags,
  439. cand->index, MAC2STR(addr));
  440. os_memset(&data, 0, sizeof(data));
  441. os_memcpy(data.pmkid_candidate.bssid, addr, ETH_ALEN);
  442. data.pmkid_candidate.index = cand->index;
  443. data.pmkid_candidate.preauth = cand->flags & IW_PMKID_CAND_PREAUTH;
  444. wpa_supplicant_event(drv->ctx, EVENT_PMKID_CANDIDATE, &data);
  445. return 0;
  446. }
  447. static int wpa_driver_nl80211_event_wireless_assocreqie(
  448. struct wpa_driver_nl80211_data *drv, const char *ev, int len)
  449. {
  450. if (len < 0)
  451. return -1;
  452. wpa_hexdump(MSG_DEBUG, "AssocReq IE wireless event", (const u8 *) ev,
  453. len);
  454. os_free(drv->assoc_req_ies);
  455. drv->assoc_req_ies = os_malloc(len);
  456. if (drv->assoc_req_ies == NULL) {
  457. drv->assoc_req_ies_len = 0;
  458. return -1;
  459. }
  460. os_memcpy(drv->assoc_req_ies, ev, len);
  461. drv->assoc_req_ies_len = len;
  462. return 0;
  463. }
  464. static int wpa_driver_nl80211_event_wireless_assocrespie(
  465. struct wpa_driver_nl80211_data *drv, const char *ev, int len)
  466. {
  467. if (len < 0)
  468. return -1;
  469. wpa_hexdump(MSG_DEBUG, "AssocResp IE wireless event", (const u8 *) ev,
  470. len);
  471. os_free(drv->assoc_resp_ies);
  472. drv->assoc_resp_ies = os_malloc(len);
  473. if (drv->assoc_resp_ies == NULL) {
  474. drv->assoc_resp_ies_len = 0;
  475. return -1;
  476. }
  477. os_memcpy(drv->assoc_resp_ies, ev, len);
  478. drv->assoc_resp_ies_len = len;
  479. return 0;
  480. }
  481. static void wpa_driver_nl80211_event_assoc_ies(struct wpa_driver_nl80211_data *drv)
  482. {
  483. union wpa_event_data data;
  484. if (drv->assoc_req_ies == NULL && drv->assoc_resp_ies == NULL)
  485. return;
  486. os_memset(&data, 0, sizeof(data));
  487. if (drv->assoc_req_ies) {
  488. data.assoc_info.req_ies = drv->assoc_req_ies;
  489. drv->assoc_req_ies = NULL;
  490. data.assoc_info.req_ies_len = drv->assoc_req_ies_len;
  491. }
  492. if (drv->assoc_resp_ies) {
  493. data.assoc_info.resp_ies = drv->assoc_resp_ies;
  494. drv->assoc_resp_ies = NULL;
  495. data.assoc_info.resp_ies_len = drv->assoc_resp_ies_len;
  496. }
  497. wpa_supplicant_event(drv->ctx, EVENT_ASSOCINFO, &data);
  498. os_free(data.assoc_info.req_ies);
  499. os_free(data.assoc_info.resp_ies);
  500. }
  501. static void wpa_driver_nl80211_event_wireless(struct wpa_driver_nl80211_data *drv,
  502. void *ctx, char *data, int len)
  503. {
  504. struct iw_event iwe_buf, *iwe = &iwe_buf;
  505. char *pos, *end, *custom, *buf;
  506. pos = data;
  507. end = data + len;
  508. while (pos + IW_EV_LCP_LEN <= end) {
  509. /* Event data may be unaligned, so make a local, aligned copy
  510. * before processing. */
  511. os_memcpy(&iwe_buf, pos, IW_EV_LCP_LEN);
  512. wpa_printf(MSG_DEBUG, "Wireless event: cmd=0x%x len=%d",
  513. iwe->cmd, iwe->len);
  514. if (iwe->len <= IW_EV_LCP_LEN)
  515. return;
  516. custom = pos + IW_EV_POINT_LEN;
  517. if (drv->we_version_compiled > 18 &&
  518. (iwe->cmd == IWEVMICHAELMICFAILURE ||
  519. iwe->cmd == IWEVCUSTOM ||
  520. iwe->cmd == IWEVASSOCREQIE ||
  521. iwe->cmd == IWEVASSOCRESPIE ||
  522. iwe->cmd == IWEVPMKIDCAND)) {
  523. /* WE-19 removed the pointer from struct iw_point */
  524. char *dpos = (char *) &iwe_buf.u.data.length;
  525. int dlen = dpos - (char *) &iwe_buf;
  526. os_memcpy(dpos, pos + IW_EV_LCP_LEN,
  527. sizeof(struct iw_event) - dlen);
  528. } else {
  529. os_memcpy(&iwe_buf, pos, sizeof(struct iw_event));
  530. custom += IW_EV_POINT_OFF;
  531. }
  532. switch (iwe->cmd) {
  533. case SIOCGIWAP:
  534. wpa_printf(MSG_DEBUG, "Wireless event: new AP: "
  535. MACSTR,
  536. MAC2STR((u8 *) iwe->u.ap_addr.sa_data));
  537. if (is_zero_ether_addr(
  538. (const u8 *) iwe->u.ap_addr.sa_data) ||
  539. os_memcmp(iwe->u.ap_addr.sa_data,
  540. "\x44\x44\x44\x44\x44\x44", ETH_ALEN) ==
  541. 0) {
  542. os_free(drv->assoc_req_ies);
  543. drv->assoc_req_ies = NULL;
  544. os_free(drv->assoc_resp_ies);
  545. drv->assoc_resp_ies = NULL;
  546. wpa_supplicant_event(ctx, EVENT_DISASSOC,
  547. NULL);
  548. } else {
  549. wpa_driver_nl80211_event_assoc_ies(drv);
  550. wpa_supplicant_event(ctx, EVENT_ASSOC, NULL);
  551. }
  552. break;
  553. case IWEVMICHAELMICFAILURE:
  554. wpa_driver_nl80211_event_wireless_michaelmicfailure(
  555. ctx, custom, iwe->u.data.length);
  556. break;
  557. case IWEVCUSTOM:
  558. if (custom + iwe->u.data.length > end)
  559. return;
  560. buf = os_malloc(iwe->u.data.length + 1);
  561. if (buf == NULL)
  562. return;
  563. os_memcpy(buf, custom, iwe->u.data.length);
  564. buf[iwe->u.data.length] = '\0';
  565. wpa_driver_nl80211_event_wireless_custom(ctx, buf);
  566. os_free(buf);
  567. break;
  568. case IWEVASSOCREQIE:
  569. wpa_driver_nl80211_event_wireless_assocreqie(
  570. drv, custom, iwe->u.data.length);
  571. break;
  572. case IWEVASSOCRESPIE:
  573. wpa_driver_nl80211_event_wireless_assocrespie(
  574. drv, custom, iwe->u.data.length);
  575. break;
  576. case IWEVPMKIDCAND:
  577. wpa_driver_nl80211_event_wireless_pmkidcand(
  578. drv, custom, iwe->u.data.length);
  579. break;
  580. }
  581. pos += iwe->len;
  582. }
  583. }
  584. static void wpa_driver_nl80211_event_link(struct wpa_driver_nl80211_data *drv,
  585. void *ctx, char *buf, size_t len,
  586. int del)
  587. {
  588. union wpa_event_data event;
  589. os_memset(&event, 0, sizeof(event));
  590. if (len > sizeof(event.interface_status.ifname))
  591. len = sizeof(event.interface_status.ifname) - 1;
  592. os_memcpy(event.interface_status.ifname, buf, len);
  593. event.interface_status.ievent = del ? EVENT_INTERFACE_REMOVED :
  594. EVENT_INTERFACE_ADDED;
  595. wpa_printf(MSG_DEBUG, "RTM_%sLINK, IFLA_IFNAME: Interface '%s' %s",
  596. del ? "DEL" : "NEW",
  597. event.interface_status.ifname,
  598. del ? "removed" : "added");
  599. if (os_strcmp(drv->ifname, event.interface_status.ifname) == 0) {
  600. if (del)
  601. drv->if_removed = 1;
  602. else
  603. drv->if_removed = 0;
  604. }
  605. wpa_supplicant_event(ctx, EVENT_INTERFACE_STATUS, &event);
  606. }
  607. static int wpa_driver_nl80211_own_ifname(struct wpa_driver_nl80211_data *drv,
  608. struct nlmsghdr *h)
  609. {
  610. struct ifinfomsg *ifi;
  611. int attrlen, _nlmsg_len, rta_len;
  612. struct rtattr *attr;
  613. ifi = NLMSG_DATA(h);
  614. _nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg));
  615. attrlen = h->nlmsg_len - _nlmsg_len;
  616. if (attrlen < 0)
  617. return 0;
  618. attr = (struct rtattr *) (((char *) ifi) + _nlmsg_len);
  619. rta_len = RTA_ALIGN(sizeof(struct rtattr));
  620. while (RTA_OK(attr, attrlen)) {
  621. if (attr->rta_type == IFLA_IFNAME) {
  622. if (os_strcmp(((char *) attr) + rta_len, drv->ifname)
  623. == 0)
  624. return 1;
  625. else
  626. break;
  627. }
  628. attr = RTA_NEXT(attr, attrlen);
  629. }
  630. return 0;
  631. }
  632. static int wpa_driver_nl80211_own_ifindex(struct wpa_driver_nl80211_data *drv,
  633. int ifindex, struct nlmsghdr *h)
  634. {
  635. if (drv->ifindex == ifindex)
  636. return 1;
  637. if (drv->if_removed && wpa_driver_nl80211_own_ifname(drv, h)) {
  638. drv->ifindex = if_nametoindex(drv->ifname);
  639. wpa_printf(MSG_DEBUG, "nl80211: Update ifindex for a removed "
  640. "interface");
  641. wpa_driver_nl80211_finish_drv_init(drv);
  642. return 1;
  643. }
  644. return 0;
  645. }
  646. static void wpa_driver_nl80211_event_rtm_newlink(struct wpa_driver_nl80211_data *drv,
  647. void *ctx, struct nlmsghdr *h,
  648. size_t len)
  649. {
  650. struct ifinfomsg *ifi;
  651. int attrlen, _nlmsg_len, rta_len;
  652. struct rtattr * attr;
  653. if (len < sizeof(*ifi))
  654. return;
  655. ifi = NLMSG_DATA(h);
  656. if (!wpa_driver_nl80211_own_ifindex(drv, ifi->ifi_index, h)) {
  657. wpa_printf(MSG_DEBUG, "Ignore event for foreign ifindex %d",
  658. ifi->ifi_index);
  659. return;
  660. }
  661. wpa_printf(MSG_DEBUG, "RTM_NEWLINK: operstate=%d ifi_flags=0x%x "
  662. "(%s%s%s%s)",
  663. drv->operstate, ifi->ifi_flags,
  664. (ifi->ifi_flags & IFF_UP) ? "[UP]" : "",
  665. (ifi->ifi_flags & IFF_RUNNING) ? "[RUNNING]" : "",
  666. (ifi->ifi_flags & IFF_LOWER_UP) ? "[LOWER_UP]" : "",
  667. (ifi->ifi_flags & IFF_DORMANT) ? "[DORMANT]" : "");
  668. /*
  669. * Some drivers send the association event before the operup event--in
  670. * this case, lifting operstate in wpa_driver_nl80211_set_operstate()
  671. * fails. This will hit us when wpa_supplicant does not need to do
  672. * IEEE 802.1X authentication
  673. */
  674. if (drv->operstate == 1 &&
  675. (ifi->ifi_flags & (IFF_LOWER_UP | IFF_DORMANT)) == IFF_LOWER_UP &&
  676. !(ifi->ifi_flags & IFF_RUNNING))
  677. wpa_driver_nl80211_send_oper_ifla(drv, -1, IF_OPER_UP);
  678. _nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg));
  679. attrlen = h->nlmsg_len - _nlmsg_len;
  680. if (attrlen < 0)
  681. return;
  682. attr = (struct rtattr *) (((char *) ifi) + _nlmsg_len);
  683. rta_len = RTA_ALIGN(sizeof(struct rtattr));
  684. while (RTA_OK(attr, attrlen)) {
  685. if (attr->rta_type == IFLA_WIRELESS) {
  686. wpa_driver_nl80211_event_wireless(
  687. drv, ctx, ((char *) attr) + rta_len,
  688. attr->rta_len - rta_len);
  689. } else if (attr->rta_type == IFLA_IFNAME) {
  690. wpa_driver_nl80211_event_link(
  691. drv, ctx,
  692. ((char *) attr) + rta_len,
  693. attr->rta_len - rta_len, 0);
  694. }
  695. attr = RTA_NEXT(attr, attrlen);
  696. }
  697. }
  698. static void wpa_driver_nl80211_event_rtm_dellink(struct wpa_driver_nl80211_data *drv,
  699. void *ctx, struct nlmsghdr *h,
  700. size_t len)
  701. {
  702. struct ifinfomsg *ifi;
  703. int attrlen, _nlmsg_len, rta_len;
  704. struct rtattr * attr;
  705. if (len < sizeof(*ifi))
  706. return;
  707. ifi = NLMSG_DATA(h);
  708. _nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg));
  709. attrlen = h->nlmsg_len - _nlmsg_len;
  710. if (attrlen < 0)
  711. return;
  712. attr = (struct rtattr *) (((char *) ifi) + _nlmsg_len);
  713. rta_len = RTA_ALIGN(sizeof(struct rtattr));
  714. while (RTA_OK(attr, attrlen)) {
  715. if (attr->rta_type == IFLA_IFNAME) {
  716. wpa_driver_nl80211_event_link(
  717. drv, ctx,
  718. ((char *) attr) + rta_len,
  719. attr->rta_len - rta_len, 1);
  720. }
  721. attr = RTA_NEXT(attr, attrlen);
  722. }
  723. }
  724. static void wpa_driver_nl80211_event_receive_wext(int sock, void *eloop_ctx,
  725. void *sock_ctx)
  726. {
  727. char buf[8192];
  728. int left;
  729. struct sockaddr_nl from;
  730. socklen_t fromlen;
  731. struct nlmsghdr *h;
  732. int max_events = 10;
  733. try_again:
  734. fromlen = sizeof(from);
  735. left = recvfrom(sock, buf, sizeof(buf), MSG_DONTWAIT,
  736. (struct sockaddr *) &from, &fromlen);
  737. if (left < 0) {
  738. if (errno != EINTR && errno != EAGAIN)
  739. perror("recvfrom(netlink)");
  740. return;
  741. }
  742. h = (struct nlmsghdr *) buf;
  743. while (left >= (int) sizeof(*h)) {
  744. int len, plen;
  745. len = h->nlmsg_len;
  746. plen = len - sizeof(*h);
  747. if (len > left || plen < 0) {
  748. wpa_printf(MSG_DEBUG, "Malformed netlink message: "
  749. "len=%d left=%d plen=%d",
  750. len, left, plen);
  751. break;
  752. }
  753. switch (h->nlmsg_type) {
  754. case RTM_NEWLINK:
  755. wpa_driver_nl80211_event_rtm_newlink(eloop_ctx, sock_ctx,
  756. h, plen);
  757. break;
  758. case RTM_DELLINK:
  759. wpa_driver_nl80211_event_rtm_dellink(eloop_ctx, sock_ctx,
  760. h, plen);
  761. break;
  762. }
  763. len = NLMSG_ALIGN(len);
  764. left -= len;
  765. h = (struct nlmsghdr *) ((char *) h + len);
  766. }
  767. if (left > 0) {
  768. wpa_printf(MSG_DEBUG, "%d extra bytes in the end of netlink "
  769. "message", left);
  770. }
  771. if (--max_events > 0) {
  772. /*
  773. * Try to receive all events in one eloop call in order to
  774. * limit race condition on cases where AssocInfo event, Assoc
  775. * event, and EAPOL frames are received more or less at the
  776. * same time. We want to process the event messages first
  777. * before starting EAPOL processing.
  778. */
  779. goto try_again;
  780. }
  781. }
  782. static int no_seq_check(struct nl_msg *msg, void *arg)
  783. {
  784. return NL_OK;
  785. }
  786. static int process_event(struct nl_msg *msg, void *arg)
  787. {
  788. struct wpa_driver_nl80211_data *drv = arg;
  789. struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
  790. struct nlattr *tb[NL80211_ATTR_MAX + 1];
  791. nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
  792. genlmsg_attrlen(gnlh, 0), NULL);
  793. if (tb[NL80211_ATTR_IFINDEX]) {
  794. int ifindex = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
  795. if (ifindex != drv->ifindex) {
  796. wpa_printf(MSG_DEBUG, "nl80211: Ignored event (cmd=%d)"
  797. " for foreign interface (ifindex %d)",
  798. gnlh->cmd, ifindex);
  799. return NL_SKIP;
  800. }
  801. }
  802. switch (gnlh->cmd) {
  803. case NL80211_CMD_NEW_SCAN_RESULTS:
  804. wpa_printf(MSG_DEBUG, "nl80211: New scan results available");
  805. drv->scan_complete_events = 1;
  806. eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv,
  807. drv->ctx);
  808. wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS, NULL);
  809. break;
  810. case NL80211_CMD_SCAN_ABORTED:
  811. wpa_printf(MSG_DEBUG, "nl80211: Scan aborted");
  812. /*
  813. * Need to indicate that scan results are available in order
  814. * not to make wpa_supplicant stop its scanning.
  815. */
  816. eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv,
  817. drv->ctx);
  818. wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS, NULL);
  819. break;
  820. default:
  821. wpa_printf(MSG_DEBUG, "nl0211: Ignored unknown event (cmd=%d)",
  822. gnlh->cmd);
  823. break;
  824. }
  825. return NL_SKIP;
  826. }
  827. static void wpa_driver_nl80211_event_receive(int sock, void *eloop_ctx,
  828. void *sock_ctx)
  829. {
  830. struct nl_cb *cb;
  831. struct wpa_driver_nl80211_data *drv = eloop_ctx;
  832. wpa_printf(MSG_DEBUG, "nl80211: Event message available");
  833. cb = nl_cb_clone(drv->nl_cb);
  834. if (!cb)
  835. return;
  836. nl_cb_set(cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, no_seq_check, NULL);
  837. nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, process_event, drv);
  838. nl_recvmsgs(drv->nl_handle, cb);
  839. nl_cb_put(cb);
  840. }
  841. static int wpa_driver_nl80211_get_ifflags_ifname(struct wpa_driver_nl80211_data *drv,
  842. const char *ifname, int *flags)
  843. {
  844. struct ifreq ifr;
  845. os_memset(&ifr, 0, sizeof(ifr));
  846. os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
  847. if (ioctl(drv->ioctl_sock, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
  848. perror("ioctl[SIOCGIFFLAGS]");
  849. return -1;
  850. }
  851. *flags = ifr.ifr_flags & 0xffff;
  852. return 0;
  853. }
  854. /**
  855. * wpa_driver_nl80211_get_ifflags - Get interface flags (SIOCGIFFLAGS)
  856. * @drv: driver_nl80211 private data
  857. * @flags: Pointer to returned flags value
  858. * Returns: 0 on success, -1 on failure
  859. */
  860. static int wpa_driver_nl80211_get_ifflags(struct wpa_driver_nl80211_data *drv,
  861. int *flags)
  862. {
  863. return wpa_driver_nl80211_get_ifflags_ifname(drv, drv->ifname, flags);
  864. }
  865. static int wpa_driver_nl80211_set_ifflags_ifname(
  866. struct wpa_driver_nl80211_data *drv,
  867. const char *ifname, int flags)
  868. {
  869. struct ifreq ifr;
  870. os_memset(&ifr, 0, sizeof(ifr));
  871. os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
  872. ifr.ifr_flags = flags & 0xffff;
  873. if (ioctl(drv->ioctl_sock, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
  874. perror("SIOCSIFFLAGS");
  875. return -1;
  876. }
  877. return 0;
  878. }
  879. /**
  880. * wpa_driver_nl80211_set_ifflags - Set interface flags (SIOCSIFFLAGS)
  881. * @drv: driver_nl80211 private data
  882. * @flags: New value for flags
  883. * Returns: 0 on success, -1 on failure
  884. */
  885. static int wpa_driver_nl80211_set_ifflags(struct wpa_driver_nl80211_data *drv,
  886. int flags)
  887. {
  888. return wpa_driver_nl80211_set_ifflags_ifname(drv, drv->ifname, flags);
  889. }
  890. /**
  891. * wpa_driver_nl80211_set_country - ask nl80211 to set the regulatory domain
  892. * @priv: driver_nl80211 private data
  893. * @alpha2_arg: country to which to switch to
  894. * Returns: 0 on success, -1 on failure
  895. *
  896. * This asks nl80211 to set the regulatory domain for given
  897. * country ISO / IEC alpha2.
  898. */
  899. static int wpa_driver_nl80211_set_country(void *priv, const char *alpha2_arg)
  900. {
  901. struct wpa_driver_nl80211_data *drv = priv;
  902. char alpha2[3];
  903. struct nl_msg *msg;
  904. msg = nlmsg_alloc();
  905. if (!msg)
  906. goto nla_put_failure;
  907. alpha2[0] = alpha2_arg[0];
  908. alpha2[1] = alpha2_arg[1];
  909. alpha2[2] = '\0';
  910. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
  911. 0, NL80211_CMD_REQ_SET_REG, 0);
  912. NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2, alpha2);
  913. if (send_and_recv_msgs(drv, msg, NULL, NULL))
  914. return -EINVAL;
  915. return 0;
  916. nla_put_failure:
  917. return -EINVAL;
  918. }
  919. #ifdef CONFIG_CLIENT_MLME
  920. static int nl80211_set_vif(struct wpa_driver_nl80211_data *drv,
  921. int drop_unencrypted, int userspace_mlme)
  922. {
  923. #ifdef NL80211_CMD_SET_VIF
  924. struct nl_msg *msg;
  925. int ret = -1;
  926. msg = nlmsg_alloc();
  927. if (!msg)
  928. return -ENOMEM;
  929. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
  930. NL80211_CMD_SET_VIF, 0);
  931. if (drop_unencrypted >= 0)
  932. NLA_PUT_U8(msg, NL80211_ATTR_VIF_DROP_UNENCRYPTED,
  933. drop_unencrypted);
  934. if (userspace_mlme >= 0)
  935. NLA_PUT_U8(msg, NL80211_ATTR_VIF_USERSPACE_MLME,
  936. userspace_mlme);
  937. ret = 0;
  938. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
  939. ret = send_and_recv_msgs(drv, msg, NULL, NULL);
  940. return ret;
  941. nla_put_failure:
  942. return -ENOBUFS;
  943. #else /* NL80211_CMD_SET_VIF */
  944. return -1;
  945. #endif /* NL80211_CMD_SET_VIF */
  946. }
  947. static int wpa_driver_nl80211_set_userspace_mlme(
  948. struct wpa_driver_nl80211_data *drv, int enabled)
  949. {
  950. return nl80211_set_vif(drv, -1, enabled);
  951. }
  952. static void nl80211_remove_iface(struct wpa_driver_nl80211_data *drv,
  953. int ifidx)
  954. {
  955. struct nl_msg *msg;
  956. msg = nlmsg_alloc();
  957. if (!msg)
  958. goto nla_put_failure;
  959. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
  960. 0, NL80211_CMD_DEL_INTERFACE, 0);
  961. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifidx);
  962. if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0)
  963. return;
  964. nla_put_failure:
  965. wpa_printf(MSG_ERROR, "nl80211: Failed to remove interface.");
  966. }
  967. static int nl80211_create_iface(struct wpa_driver_nl80211_data *drv,
  968. const char *ifname, enum nl80211_iftype iftype)
  969. {
  970. struct nl_msg *msg, *flags = NULL;
  971. int ifidx, err;
  972. int ret = -ENOBUFS;
  973. msg = nlmsg_alloc();
  974. if (!msg)
  975. return -1;
  976. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
  977. 0, NL80211_CMD_NEW_INTERFACE, 0);
  978. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->ifname));
  979. NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, ifname);
  980. NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, iftype);
  981. if (iftype == NL80211_IFTYPE_MONITOR) {
  982. flags = nlmsg_alloc();
  983. if (!flags)
  984. goto nla_put_failure;
  985. NLA_PUT_FLAG(flags, NL80211_MNTR_FLAG_COOK_FRAMES);
  986. err = nla_put_nested(msg, NL80211_ATTR_MNTR_FLAGS, flags);
  987. nlmsg_free(flags);
  988. if (err)
  989. goto nla_put_failure;
  990. }
  991. ret = send_and_recv_msgs(drv, msg, NULL, NULL);
  992. if (ret) {
  993. nla_put_failure:
  994. wpa_printf(MSG_ERROR, "nl80211: Failed to create interface %d",
  995. ret);
  996. return ret;
  997. }
  998. ifidx = if_nametoindex(ifname);
  999. if (ifidx <= 0)
  1000. return -1;
  1001. return ifidx;
  1002. }
  1003. static void handle_monitor_read(int sock, void *eloop_ctx, void *sock_ctx)
  1004. {
  1005. struct wpa_driver_nl80211_data *drv = eloop_ctx;
  1006. int len;
  1007. unsigned char buf[3000];
  1008. struct ieee80211_radiotap_iterator iter;
  1009. int ret;
  1010. int injected = 0, failed = 0, rxflags = 0;
  1011. struct ieee80211_rx_status rx_status;
  1012. len = recv(sock, buf, sizeof(buf), 0);
  1013. if (len < 0) {
  1014. perror("recv");
  1015. return;
  1016. }
  1017. if (ieee80211_radiotap_iterator_init(&iter, (void *) buf, len)) {
  1018. wpa_printf(MSG_DEBUG, "nl80211: received invalid radiotap "
  1019. "frame");
  1020. return;
  1021. }
  1022. os_memset(&rx_status, 0, sizeof(rx_status));
  1023. while (1) {
  1024. ret = ieee80211_radiotap_iterator_next(&iter);
  1025. if (ret == -ENOENT)
  1026. break;
  1027. if (ret) {
  1028. wpa_printf(MSG_DEBUG, "nl80211: received invalid "
  1029. "radiotap frame (%d)", ret);
  1030. return;
  1031. }
  1032. switch (iter.this_arg_index) {
  1033. case IEEE80211_RADIOTAP_FLAGS:
  1034. if (*iter.this_arg & IEEE80211_RADIOTAP_F_FCS)
  1035. len -= 4;
  1036. break;
  1037. case IEEE80211_RADIOTAP_RX_FLAGS:
  1038. rxflags = 1;
  1039. break;
  1040. case IEEE80211_RADIOTAP_TX_FLAGS:
  1041. injected = 1;
  1042. failed = le_to_host16((*(u16 *) iter.this_arg)) &
  1043. IEEE80211_RADIOTAP_F_TX_FAIL;
  1044. break;
  1045. case IEEE80211_RADIOTAP_DATA_RETRIES:
  1046. break;
  1047. case IEEE80211_RADIOTAP_CHANNEL:
  1048. /* TODO convert from freq/flags to channel number
  1049. * rx_status.channel = XXX;
  1050. */
  1051. break;
  1052. case IEEE80211_RADIOTAP_RATE:
  1053. break;
  1054. case IEEE80211_RADIOTAP_DB_ANTSIGNAL:
  1055. rx_status.ssi = *iter.this_arg;
  1056. break;
  1057. }
  1058. }
  1059. if (rxflags && injected)
  1060. return;
  1061. if (!injected) {
  1062. wpa_supplicant_sta_rx(drv->ctx, buf + iter.max_length,
  1063. len - iter.max_length, &rx_status);
  1064. } else if (failed) {
  1065. /* TX failure callback */
  1066. } else {
  1067. /* TX success (ACK) callback */
  1068. }
  1069. }
  1070. static int wpa_driver_nl80211_create_monitor_interface(
  1071. struct wpa_driver_nl80211_data *drv)
  1072. {
  1073. char buf[IFNAMSIZ];
  1074. struct sockaddr_ll ll;
  1075. int optval, flags;
  1076. socklen_t optlen;
  1077. os_snprintf(buf, IFNAMSIZ, "mon.%s", drv->ifname);
  1078. buf[IFNAMSIZ - 1] = '\0';
  1079. drv->monitor_ifidx =
  1080. nl80211_create_iface(drv, buf, NL80211_IFTYPE_MONITOR);
  1081. if (drv->monitor_ifidx < 0)
  1082. return -1;
  1083. if (wpa_driver_nl80211_get_ifflags_ifname(drv, buf, &flags) != 0 ||
  1084. wpa_driver_nl80211_set_ifflags_ifname(drv, buf, flags | IFF_UP) !=
  1085. 0) {
  1086. wpa_printf(MSG_ERROR, "nl80211: Could not set interface '%s' "
  1087. "UP", buf);
  1088. goto error;
  1089. }
  1090. os_memset(&ll, 0, sizeof(ll));
  1091. ll.sll_family = AF_PACKET;
  1092. ll.sll_ifindex = drv->monitor_ifidx;
  1093. drv->monitor_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
  1094. if (drv->monitor_sock < 0) {
  1095. perror("socket[PF_PACKET,SOCK_RAW]");
  1096. goto error;
  1097. }
  1098. if (bind(drv->monitor_sock, (struct sockaddr *) &ll,
  1099. sizeof(ll)) < 0) {
  1100. perror("monitor socket bind");
  1101. goto error;
  1102. }
  1103. optlen = sizeof(optval);
  1104. optval = 20;
  1105. if (setsockopt
  1106. (drv->monitor_sock, SOL_SOCKET, SO_PRIORITY, &optval, optlen)) {
  1107. perror("Failed to set socket priority");
  1108. goto error;
  1109. }
  1110. if (eloop_register_read_sock(drv->monitor_sock, handle_monitor_read,
  1111. drv, NULL)) {
  1112. wpa_printf(MSG_ERROR, "nl80211: Could not register monitor "
  1113. "read socket");
  1114. goto error;
  1115. }
  1116. return 0;
  1117. error:
  1118. nl80211_remove_iface(drv, drv->monitor_ifidx);
  1119. return -1;
  1120. }
  1121. #endif /* CONFIG_CLIENT_MLME */
  1122. struct wiphy_info_data {
  1123. int max_scan_ssids;
  1124. };
  1125. static int wiphy_info_handler(struct nl_msg *msg, void *arg)
  1126. {
  1127. struct nlattr *tb[NL80211_ATTR_MAX + 1];
  1128. struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
  1129. struct wiphy_info_data *info = arg;
  1130. nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
  1131. genlmsg_attrlen(gnlh, 0), NULL);
  1132. if (tb[NL80211_ATTR_MAX_NUM_SCAN_SSIDS])
  1133. info->max_scan_ssids =
  1134. nla_get_u8(tb[NL80211_ATTR_MAX_NUM_SCAN_SSIDS]);
  1135. return NL_SKIP;
  1136. }
  1137. static int wpa_driver_nl80211_get_info(struct wpa_driver_nl80211_data *drv,
  1138. struct wiphy_info_data *info)
  1139. {
  1140. struct nl_msg *msg;
  1141. os_memset(info, 0, sizeof(*info));
  1142. msg = nlmsg_alloc();
  1143. if (!msg)
  1144. return -1;
  1145. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
  1146. 0, NL80211_CMD_GET_WIPHY, 0);
  1147. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
  1148. if (send_and_recv_msgs(drv, msg, wiphy_info_handler, info) == 0)
  1149. return 0;
  1150. msg = NULL;
  1151. nla_put_failure:
  1152. nlmsg_free(msg);
  1153. return -1;
  1154. }
  1155. static void wpa_driver_nl80211_capa(struct wpa_driver_nl80211_data *drv)
  1156. {
  1157. struct wiphy_info_data info;
  1158. if (wpa_driver_nl80211_get_info(drv, &info))
  1159. return;
  1160. drv->has_capability = 1;
  1161. drv->capa.max_scan_ssids = info.max_scan_ssids;
  1162. }
  1163. /**
  1164. * wpa_driver_nl80211_init - Initialize nl80211 driver interface
  1165. * @ctx: context to be used when calling wpa_supplicant functions,
  1166. * e.g., wpa_supplicant_event()
  1167. * @ifname: interface name, e.g., wlan0
  1168. * Returns: Pointer to private data, %NULL on failure
  1169. */
  1170. static void * wpa_driver_nl80211_init(void *ctx, const char *ifname)
  1171. {
  1172. int s, ret;
  1173. struct sockaddr_nl local;
  1174. struct wpa_driver_nl80211_data *drv;
  1175. drv = os_zalloc(sizeof(*drv));
  1176. if (drv == NULL)
  1177. return NULL;
  1178. drv->ctx = ctx;
  1179. os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
  1180. drv->nl_cb = nl_cb_alloc(NL_CB_DEFAULT);
  1181. if (drv->nl_cb == NULL) {
  1182. wpa_printf(MSG_ERROR, "nl80211: Failed to allocate netlink "
  1183. "callbacks");
  1184. goto err1;
  1185. }
  1186. drv->nl_handle = nl_handle_alloc_cb(drv->nl_cb);
  1187. if (drv->nl_handle == NULL) {
  1188. wpa_printf(MSG_ERROR, "nl80211: Failed to allocate netlink "
  1189. "callbacks");
  1190. goto err2;
  1191. }
  1192. if (genl_connect(drv->nl_handle)) {
  1193. wpa_printf(MSG_ERROR, "nl80211: Failed to connect to generic "
  1194. "netlink");
  1195. goto err3;
  1196. }
  1197. drv->nl_cache = genl_ctrl_alloc_cache(drv->nl_handle);
  1198. if (drv->nl_cache == NULL) {
  1199. wpa_printf(MSG_ERROR, "nl80211: Failed to allocate generic "
  1200. "netlink cache");
  1201. goto err3;
  1202. }
  1203. drv->nl80211 = genl_ctrl_search_by_name(drv->nl_cache, "nl80211");
  1204. if (drv->nl80211 == NULL) {
  1205. wpa_printf(MSG_ERROR, "nl80211: 'nl80211' generic netlink not "
  1206. "found");
  1207. goto err4;
  1208. }
  1209. ret = nl_get_multicast_id(drv, "nl80211", "scan");
  1210. if (ret >= 0)
  1211. ret = nl_socket_add_membership(drv->nl_handle, ret);
  1212. if (ret < 0) {
  1213. wpa_printf(MSG_ERROR, "nl80211: Could not add multicast "
  1214. "membership for scan events: %d (%s)",
  1215. ret, strerror(-ret));
  1216. goto err4;
  1217. }
  1218. eloop_register_read_sock(nl_socket_get_fd(drv->nl_handle),
  1219. wpa_driver_nl80211_event_receive, drv, ctx);
  1220. drv->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);
  1221. if (drv->ioctl_sock < 0) {
  1222. perror("socket(PF_INET,SOCK_DGRAM)");
  1223. goto err5;
  1224. }
  1225. s = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
  1226. if (s < 0) {
  1227. perror("socket(PF_NETLINK,SOCK_RAW,NETLINK_ROUTE)");
  1228. goto err6;
  1229. }
  1230. os_memset(&local, 0, sizeof(local));
  1231. local.nl_family = AF_NETLINK;
  1232. local.nl_groups = RTMGRP_LINK;
  1233. if (bind(s, (struct sockaddr *) &local, sizeof(local)) < 0) {
  1234. perror("bind(netlink)");
  1235. close(s);
  1236. goto err6;
  1237. }
  1238. eloop_register_read_sock(s, wpa_driver_nl80211_event_receive_wext, drv,
  1239. ctx);
  1240. drv->wext_event_sock = s;
  1241. if (wpa_driver_nl80211_finish_drv_init(drv))
  1242. goto err7;
  1243. return drv;
  1244. err7:
  1245. eloop_unregister_read_sock(drv->wext_event_sock);
  1246. close(drv->wext_event_sock);
  1247. err6:
  1248. close(drv->ioctl_sock);
  1249. err5:
  1250. genl_family_put(drv->nl80211);
  1251. err4:
  1252. nl_cache_free(drv->nl_cache);
  1253. err3:
  1254. nl_handle_destroy(drv->nl_handle);
  1255. err2:
  1256. nl_cb_put(drv->nl_cb);
  1257. err1:
  1258. os_free(drv);
  1259. return NULL;
  1260. }
  1261. static int
  1262. wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv)
  1263. {
  1264. int flags;
  1265. if (wpa_driver_nl80211_get_ifflags(drv, &flags) != 0) {
  1266. wpa_printf(MSG_ERROR, "Could not get interface '%s' flags",
  1267. drv->ifname);
  1268. return -1;
  1269. }
  1270. if (!(flags & IFF_UP)) {
  1271. if (wpa_driver_nl80211_set_ifflags(drv, flags | IFF_UP) != 0) {
  1272. wpa_printf(MSG_ERROR, "Could not set interface '%s' "
  1273. "UP", drv->ifname);
  1274. return -1;
  1275. }
  1276. }
  1277. /*
  1278. * Make sure that the driver does not have any obsolete PMKID entries.
  1279. */
  1280. wpa_driver_nl80211_flush_pmkid(drv);
  1281. if (wpa_driver_nl80211_set_mode(drv, 0) < 0) {
  1282. printf("Could not configure driver to use managed mode\n");
  1283. }
  1284. wpa_driver_nl80211_get_range(drv);
  1285. drv->ifindex = if_nametoindex(drv->ifname);
  1286. wpa_driver_nl80211_capa(drv);
  1287. wpa_driver_nl80211_send_oper_ifla(drv, 1, IF_OPER_DORMANT);
  1288. return 0;
  1289. }
  1290. /**
  1291. * wpa_driver_nl80211_deinit - Deinitialize nl80211 driver interface
  1292. * @priv: Pointer to private nl80211 data from wpa_driver_nl80211_init()
  1293. *
  1294. * Shut down driver interface and processing of driver events. Free
  1295. * private data buffer if one was allocated in wpa_driver_nl80211_init().
  1296. */
  1297. static void wpa_driver_nl80211_deinit(void *priv)
  1298. {
  1299. struct wpa_driver_nl80211_data *drv = priv;
  1300. int flags;
  1301. #ifdef CONFIG_CLIENT_MLME
  1302. if (drv->monitor_sock >= 0) {
  1303. eloop_unregister_read_sock(drv->monitor_sock);
  1304. close(drv->monitor_sock);
  1305. }
  1306. if (drv->monitor_ifidx > 0)
  1307. nl80211_remove_iface(drv, drv->monitor_ifidx);
  1308. if (drv->capa.flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
  1309. wpa_driver_nl80211_set_userspace_mlme(drv, 0);
  1310. #endif /* CONFIG_CLIENT_MLME */
  1311. eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx);
  1312. /*
  1313. * Clear possibly configured driver parameters in order to make it
  1314. * easier to use the driver after wpa_supplicant has been terminated.
  1315. */
  1316. (void) wpa_driver_nl80211_set_bssid(drv,
  1317. (u8 *) "\x00\x00\x00\x00\x00\x00");
  1318. wpa_driver_nl80211_send_oper_ifla(priv, 0, IF_OPER_UP);
  1319. eloop_unregister_read_sock(drv->wext_event_sock);
  1320. if (wpa_driver_nl80211_get_ifflags(drv, &flags) == 0)
  1321. (void) wpa_driver_nl80211_set_ifflags(drv, flags & ~IFF_UP);
  1322. close(drv->wext_event_sock);
  1323. close(drv->ioctl_sock);
  1324. os_free(drv->assoc_req_ies);
  1325. os_free(drv->assoc_resp_ies);
  1326. eloop_unregister_read_sock(nl_socket_get_fd(drv->nl_handle));
  1327. genl_family_put(drv->nl80211);
  1328. nl_cache_free(drv->nl_cache);
  1329. nl_handle_destroy(drv->nl_handle);
  1330. nl_cb_put(drv->nl_cb);
  1331. os_free(drv);
  1332. }
  1333. /**
  1334. * wpa_driver_nl80211_scan_timeout - Scan timeout to report scan completion
  1335. * @eloop_ctx: Unused
  1336. * @timeout_ctx: ctx argument given to wpa_driver_nl80211_init()
  1337. *
  1338. * This function can be used as registered timeout when starting a scan to
  1339. * generate a scan completed event if the driver does not report this.
  1340. */
  1341. static void wpa_driver_nl80211_scan_timeout(void *eloop_ctx, void *timeout_ctx)
  1342. {
  1343. wpa_printf(MSG_DEBUG, "Scan timeout - try to get results");
  1344. wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL);
  1345. }
  1346. /**
  1347. * wpa_driver_nl80211_scan - Request the driver to initiate scan
  1348. * @priv: Pointer to private wext data from wpa_driver_nl80211_init()
  1349. * @params: Scan parameters
  1350. * Returns: 0 on success, -1 on failure
  1351. */
  1352. static int wpa_driver_nl80211_scan(void *priv,
  1353. struct wpa_driver_scan_params *params)
  1354. {
  1355. struct wpa_driver_nl80211_data *drv = priv;
  1356. int ret = 0, timeout;
  1357. struct nl_msg *msg, *ssids;
  1358. size_t i;
  1359. msg = nlmsg_alloc();
  1360. ssids = nlmsg_alloc();
  1361. if (!msg || !ssids) {
  1362. nlmsg_free(msg);
  1363. nlmsg_free(ssids);
  1364. return -1;
  1365. }
  1366. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
  1367. NL80211_CMD_TRIGGER_SCAN, 0);
  1368. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
  1369. for (i = 0; i < params->num_ssids; i++) {
  1370. NLA_PUT(ssids, i + 1, params->ssids[i].ssid_len,
  1371. params->ssids[i].ssid);
  1372. }
  1373. if (params->num_ssids)
  1374. nla_put_nested(msg, NL80211_ATTR_SCAN_SSIDS, ssids);
  1375. if (params->extra_ies) {
  1376. NLA_PUT(msg, NL80211_ATTR_IE, params->extra_ies_len,
  1377. params->extra_ies);
  1378. }
  1379. ret = send_and_recv_msgs(drv, msg, NULL, NULL);
  1380. msg = NULL;
  1381. if (ret) {
  1382. wpa_printf(MSG_DEBUG, "nl80211: Scan trigger failed: ret=%d "
  1383. "(%s)", ret, strerror(-ret));
  1384. goto nla_put_failure;
  1385. }
  1386. /* Not all drivers generate "scan completed" wireless event, so try to
  1387. * read results after a timeout. */
  1388. timeout = 10;
  1389. if (drv->scan_complete_events) {
  1390. /*
  1391. * The driver seems to deliver events to notify when scan is
  1392. * complete, so use longer timeout to avoid race conditions
  1393. * with scanning and following association request.
  1394. */
  1395. timeout = 30;
  1396. }
  1397. wpa_printf(MSG_DEBUG, "Scan requested (ret=%d) - scan timeout %d "
  1398. "seconds", ret, timeout);
  1399. eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx);
  1400. eloop_register_timeout(timeout, 0, wpa_driver_nl80211_scan_timeout,
  1401. drv, drv->ctx);
  1402. nla_put_failure:
  1403. nlmsg_free(ssids);
  1404. nlmsg_free(msg);
  1405. return ret;
  1406. }
  1407. static int bss_info_handler(struct nl_msg *msg, void *arg)
  1408. {
  1409. struct nlattr *tb[NL80211_ATTR_MAX + 1];
  1410. struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
  1411. struct nlattr *bss[NL80211_BSS_MAX + 1];
  1412. static struct nla_policy bss_policy[NL80211_BSS_MAX + 1] = {
  1413. [NL80211_BSS_BSSID] = { .type = NLA_UNSPEC },
  1414. [NL80211_BSS_FREQUENCY] = { .type = NLA_U32 },
  1415. [NL80211_BSS_TSF] = { .type = NLA_U64 },
  1416. [NL80211_BSS_BEACON_INTERVAL] = { .type = NLA_U16 },
  1417. [NL80211_BSS_CAPABILITY] = { .type = NLA_U16 },
  1418. [NL80211_BSS_INFORMATION_ELEMENTS] = { .type = NLA_UNSPEC },
  1419. [NL80211_BSS_SIGNAL_MBM] = { .type = NLA_U32 },
  1420. [NL80211_BSS_SIGNAL_UNSPEC] = { .type = NLA_U8 },
  1421. };
  1422. struct wpa_scan_results *res = arg;
  1423. struct wpa_scan_res **tmp;
  1424. struct wpa_scan_res *r;
  1425. const u8 *ie;
  1426. size_t ie_len;
  1427. nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
  1428. genlmsg_attrlen(gnlh, 0), NULL);
  1429. if (!tb[NL80211_ATTR_BSS])
  1430. return NL_SKIP;
  1431. if (nla_parse_nested(bss, NL80211_BSS_MAX, tb[NL80211_ATTR_BSS],
  1432. bss_policy))
  1433. return NL_SKIP;
  1434. if (bss[NL80211_BSS_INFORMATION_ELEMENTS]) {
  1435. ie = nla_data(bss[NL80211_BSS_INFORMATION_ELEMENTS]);
  1436. ie_len = nla_len(bss[NL80211_BSS_INFORMATION_ELEMENTS]);
  1437. } else {
  1438. ie = NULL;
  1439. ie_len = 0;
  1440. }
  1441. r = os_zalloc(sizeof(*r) + ie_len);
  1442. if (r == NULL)
  1443. return NL_SKIP;
  1444. if (bss[NL80211_BSS_BSSID])
  1445. os_memcpy(r->bssid, nla_data(bss[NL80211_BSS_BSSID]),
  1446. ETH_ALEN);
  1447. if (bss[NL80211_BSS_FREQUENCY])
  1448. r->freq = nla_get_u32(bss[NL80211_BSS_FREQUENCY]);
  1449. if (bss[NL80211_BSS_BEACON_INTERVAL])
  1450. r->beacon_int = nla_get_u16(bss[NL80211_BSS_BEACON_INTERVAL]);
  1451. if (bss[NL80211_BSS_CAPABILITY])
  1452. r->caps = nla_get_u16(bss[NL80211_BSS_CAPABILITY]);
  1453. r->flags |= WPA_SCAN_NOISE_INVALID;
  1454. if (bss[NL80211_BSS_SIGNAL_MBM]) {
  1455. r->level = nla_get_u32(bss[NL80211_BSS_SIGNAL_MBM]);
  1456. r->level /= 100; /* mBm to dBm */
  1457. r->flags |= WPA_SCAN_LEVEL_DBM | WPA_SCAN_QUAL_INVALID;
  1458. } else if (bss[NL80211_BSS_SIGNAL_UNSPEC]) {
  1459. r->level = nla_get_u8(bss[NL80211_BSS_SIGNAL_UNSPEC]);
  1460. r->flags |= WPA_SCAN_LEVEL_INVALID;
  1461. } else
  1462. r->flags |= WPA_SCAN_LEVEL_INVALID | WPA_SCAN_QUAL_INVALID;
  1463. if (bss[NL80211_BSS_TSF])
  1464. r->tsf = nla_get_u64(bss[NL80211_BSS_TSF]);
  1465. r->ie_len = ie_len;
  1466. if (ie)
  1467. os_memcpy(r + 1, ie, ie_len);
  1468. tmp = os_realloc(res->res,
  1469. (res->num + 1) * sizeof(struct wpa_scan_res *));
  1470. if (tmp == NULL) {
  1471. os_free(r);
  1472. return NL_SKIP;
  1473. }
  1474. tmp[res->num++] = r;
  1475. res->res = tmp;
  1476. return NL_SKIP;
  1477. }
  1478. /**
  1479. * wpa_driver_nl80211_get_scan_results - Fetch the latest scan results
  1480. * @priv: Pointer to private wext data from wpa_driver_nl80211_init()
  1481. * Returns: Scan results on success, -1 on failure
  1482. */
  1483. static struct wpa_scan_results *
  1484. wpa_driver_nl80211_get_scan_results(void *priv)
  1485. {
  1486. struct wpa_driver_nl80211_data *drv = priv;
  1487. struct nl_msg *msg;
  1488. struct wpa_scan_results *res;
  1489. int ret;
  1490. res = os_zalloc(sizeof(*res));
  1491. if (res == NULL)
  1492. return 0;
  1493. msg = nlmsg_alloc();
  1494. if (!msg)
  1495. goto nla_put_failure;
  1496. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, NLM_F_DUMP,
  1497. NL80211_CMD_GET_SCAN, 0);
  1498. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
  1499. ret = send_and_recv_msgs(drv, msg, bss_info_handler, res);
  1500. msg = NULL;
  1501. if (ret == 0) {
  1502. wpa_printf(MSG_DEBUG, "Received scan results (%lu BSSes)",
  1503. (unsigned long) res->num);
  1504. return res;
  1505. }
  1506. wpa_printf(MSG_DEBUG, "nl80211: Scan result fetch failed: ret=%d "
  1507. "(%s)", ret, strerror(-ret));
  1508. nla_put_failure:
  1509. nlmsg_free(msg);
  1510. wpa_scan_results_free(res);
  1511. return NULL;
  1512. }
  1513. static int wpa_driver_nl80211_get_range(void *priv)
  1514. {
  1515. struct wpa_driver_nl80211_data *drv = priv;
  1516. struct iw_range *range;
  1517. struct iwreq iwr;
  1518. int minlen;
  1519. size_t buflen;
  1520. /*
  1521. * Use larger buffer than struct iw_range in order to allow the
  1522. * structure to grow in the future.
  1523. */
  1524. buflen = sizeof(struct iw_range) + 500;
  1525. range = os_zalloc(buflen);
  1526. if (range == NULL)
  1527. return -1;
  1528. os_memset(&iwr, 0, sizeof(iwr));
  1529. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  1530. iwr.u.data.pointer = (caddr_t) range;
  1531. iwr.u.data.length = buflen;
  1532. minlen = ((char *) &range->enc_capa) - (char *) range +
  1533. sizeof(range->enc_capa);
  1534. if (ioctl(drv->ioctl_sock, SIOCGIWRANGE, &iwr) < 0) {
  1535. perror("ioctl[SIOCGIWRANGE]");
  1536. os_free(range);
  1537. return -1;
  1538. } else if (iwr.u.data.length >= minlen &&
  1539. range->we_version_compiled >= 18) {
  1540. wpa_printf(MSG_DEBUG, "SIOCGIWRANGE: WE(compiled)=%d "
  1541. "WE(source)=%d enc_capa=0x%x",
  1542. range->we_version_compiled,
  1543. range->we_version_source,
  1544. range->enc_capa);
  1545. drv->has_capability = 1;
  1546. drv->we_version_compiled = range->we_version_compiled;
  1547. if (range->enc_capa & IW_ENC_CAPA_WPA) {
  1548. drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA |
  1549. WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK;
  1550. }
  1551. if (range->enc_capa & IW_ENC_CAPA_WPA2) {
  1552. drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
  1553. WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK;
  1554. }
  1555. drv->capa.enc |= WPA_DRIVER_CAPA_ENC_WEP40 |
  1556. WPA_DRIVER_CAPA_ENC_WEP104;
  1557. if (range->enc_capa & IW_ENC_CAPA_CIPHER_TKIP)
  1558. drv->capa.enc |= WPA_DRIVER_CAPA_ENC_TKIP;
  1559. if (range->enc_capa & IW_ENC_CAPA_CIPHER_CCMP)
  1560. drv->capa.enc |= WPA_DRIVER_CAPA_ENC_CCMP;
  1561. wpa_printf(MSG_DEBUG, " capabilities: key_mgmt 0x%x enc 0x%x",
  1562. drv->capa.key_mgmt, drv->capa.enc);
  1563. } else {
  1564. wpa_printf(MSG_DEBUG, "SIOCGIWRANGE: too old (short) data - "
  1565. "assuming WPA is not supported");
  1566. }
  1567. os_free(range);
  1568. return 0;
  1569. }
  1570. static int wpa_driver_nl80211_set_wpa(void *priv, int enabled)
  1571. {
  1572. struct wpa_driver_nl80211_data *drv = priv;
  1573. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  1574. return wpa_driver_nl80211_set_auth_param(drv, IW_AUTH_WPA_ENABLED,
  1575. enabled);
  1576. }
  1577. static int wpa_driver_nl80211_set_key(void *priv, wpa_alg alg,
  1578. const u8 *addr, int key_idx,
  1579. int set_tx, const u8 *seq,
  1580. size_t seq_len,
  1581. const u8 *key, size_t key_len)
  1582. {
  1583. struct wpa_driver_nl80211_data *drv = priv;
  1584. int err;
  1585. struct nl_msg *msg;
  1586. wpa_printf(MSG_DEBUG, "%s: alg=%d addr=%p key_idx=%d set_tx=%d "
  1587. "seq_len=%lu key_len=%lu",
  1588. __func__, alg, addr, key_idx, set_tx,
  1589. (unsigned long) seq_len, (unsigned long) key_len);
  1590. msg = nlmsg_alloc();
  1591. if (msg == NULL)
  1592. return -1;
  1593. if (alg == WPA_ALG_NONE) {
  1594. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
  1595. NL80211_CMD_DEL_KEY, 0);
  1596. } else {
  1597. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
  1598. NL80211_CMD_NEW_KEY, 0);
  1599. NLA_PUT(msg, NL80211_ATTR_KEY_DATA, key_len, key);
  1600. switch (alg) {
  1601. case WPA_ALG_WEP:
  1602. if (key_len == 5)
  1603. NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
  1604. 0x000FAC01);
  1605. else
  1606. NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER,
  1607. 0x000FAC05);
  1608. break;
  1609. case WPA_ALG_TKIP:
  1610. NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER, 0x000FAC02);
  1611. break;
  1612. case WPA_ALG_CCMP:
  1613. NLA_PUT_U32(msg, NL80211_ATTR_KEY_CIPHER, 0x000FAC04);
  1614. break;
  1615. default:
  1616. nlmsg_free(msg);
  1617. return -1;
  1618. }
  1619. }
  1620. if (addr && os_memcmp(addr, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) != 0)
  1621. {
  1622. wpa_printf(MSG_DEBUG, " addr=" MACSTR, MAC2STR(addr));
  1623. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
  1624. }
  1625. NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_idx);
  1626. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
  1627. err = send_and_recv_msgs(drv, msg, NULL, NULL);
  1628. if (err) {
  1629. wpa_printf(MSG_DEBUG, "nl80211: set_key failed; err=%d", err);
  1630. return -1;
  1631. }
  1632. if (set_tx && alg != WPA_ALG_NONE) {
  1633. msg = nlmsg_alloc();
  1634. if (msg == NULL)
  1635. return -1;
  1636. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
  1637. 0, NL80211_CMD_SET_KEY, 0);
  1638. NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_idx);
  1639. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
  1640. NLA_PUT_FLAG(msg, NL80211_ATTR_KEY_DEFAULT);
  1641. err = send_and_recv_msgs(drv, msg, NULL, NULL);
  1642. if (err) {
  1643. wpa_printf(MSG_DEBUG, "nl80211: set default key "
  1644. "failed; err=%d", err);
  1645. return -1;
  1646. }
  1647. }
  1648. return 0;
  1649. nla_put_failure:
  1650. return -ENOBUFS;
  1651. }
  1652. static int wpa_driver_nl80211_set_countermeasures(void *priv,
  1653. int enabled)
  1654. {
  1655. struct wpa_driver_nl80211_data *drv = priv;
  1656. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  1657. return wpa_driver_nl80211_set_auth_param(drv,
  1658. IW_AUTH_TKIP_COUNTERMEASURES,
  1659. enabled);
  1660. }
  1661. static int wpa_driver_nl80211_set_drop_unencrypted(void *priv,
  1662. int enabled)
  1663. {
  1664. struct wpa_driver_nl80211_data *drv = priv;
  1665. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  1666. drv->use_crypt = enabled;
  1667. return wpa_driver_nl80211_set_auth_param(drv, IW_AUTH_DROP_UNENCRYPTED,
  1668. enabled);
  1669. }
  1670. static int wpa_driver_nl80211_mlme(struct wpa_driver_nl80211_data *drv,
  1671. const u8 *addr, int cmd, int reason_code)
  1672. {
  1673. struct iwreq iwr;
  1674. struct iw_mlme mlme;
  1675. int ret = 0;
  1676. os_memset(&iwr, 0, sizeof(iwr));
  1677. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  1678. os_memset(&mlme, 0, sizeof(mlme));
  1679. mlme.cmd = cmd;
  1680. mlme.reason_code = reason_code;
  1681. mlme.addr.sa_family = ARPHRD_ETHER;
  1682. os_memcpy(mlme.addr.sa_data, addr, ETH_ALEN);
  1683. iwr.u.data.pointer = (caddr_t) &mlme;
  1684. iwr.u.data.length = sizeof(mlme);
  1685. if (ioctl(drv->ioctl_sock, SIOCSIWMLME, &iwr) < 0) {
  1686. perror("ioctl[SIOCSIWMLME]");
  1687. ret = -1;
  1688. }
  1689. return ret;
  1690. }
  1691. static int wpa_driver_nl80211_deauthenticate(void *priv, const u8 *addr,
  1692. int reason_code)
  1693. {
  1694. struct wpa_driver_nl80211_data *drv = priv;
  1695. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  1696. return wpa_driver_nl80211_mlme(drv, addr, IW_MLME_DEAUTH, reason_code);
  1697. }
  1698. static int wpa_driver_nl80211_disassociate(void *priv, const u8 *addr,
  1699. int reason_code)
  1700. {
  1701. struct wpa_driver_nl80211_data *drv = priv;
  1702. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  1703. return wpa_driver_nl80211_mlme(drv, addr, IW_MLME_DISASSOC,
  1704. reason_code);
  1705. }
  1706. static int wpa_driver_nl80211_set_gen_ie(void *priv, const u8 *ie,
  1707. size_t ie_len)
  1708. {
  1709. struct wpa_driver_nl80211_data *drv = priv;
  1710. struct iwreq iwr;
  1711. int ret = 0;
  1712. os_memset(&iwr, 0, sizeof(iwr));
  1713. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  1714. iwr.u.data.pointer = (caddr_t) ie;
  1715. iwr.u.data.length = ie_len;
  1716. if (ioctl(drv->ioctl_sock, SIOCSIWGENIE, &iwr) < 0) {
  1717. perror("ioctl[SIOCSIWGENIE]");
  1718. ret = -1;
  1719. }
  1720. return ret;
  1721. }
  1722. static int wpa_driver_nl80211_cipher2wext(int cipher)
  1723. {
  1724. switch (cipher) {
  1725. case CIPHER_NONE:
  1726. return IW_AUTH_CIPHER_NONE;
  1727. case CIPHER_WEP40:
  1728. return IW_AUTH_CIPHER_WEP40;
  1729. case CIPHER_TKIP:
  1730. return IW_AUTH_CIPHER_TKIP;
  1731. case CIPHER_CCMP:
  1732. return IW_AUTH_CIPHER_CCMP;
  1733. case CIPHER_WEP104:
  1734. return IW_AUTH_CIPHER_WEP104;
  1735. default:
  1736. return 0;
  1737. }
  1738. }
  1739. static int wpa_driver_nl80211_keymgmt2wext(int keymgmt)
  1740. {
  1741. switch (keymgmt) {
  1742. case KEY_MGMT_802_1X:
  1743. case KEY_MGMT_802_1X_NO_WPA:
  1744. return IW_AUTH_KEY_MGMT_802_1X;
  1745. case KEY_MGMT_PSK:
  1746. return IW_AUTH_KEY_MGMT_PSK;
  1747. default:
  1748. return 0;
  1749. }
  1750. }
  1751. static int
  1752. wpa_driver_nl80211_auth_alg_fallback(struct wpa_driver_nl80211_data *drv,
  1753. struct wpa_driver_associate_params *params)
  1754. {
  1755. struct iwreq iwr;
  1756. int ret = 0;
  1757. wpa_printf(MSG_DEBUG, "WEXT: Driver did not support "
  1758. "SIOCSIWAUTH for AUTH_ALG, trying SIOCSIWENCODE");
  1759. os_memset(&iwr, 0, sizeof(iwr));
  1760. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  1761. /* Just changing mode, not actual keys */
  1762. iwr.u.encoding.flags = 0;
  1763. iwr.u.encoding.pointer = (caddr_t) NULL;
  1764. iwr.u.encoding.length = 0;
  1765. /*
  1766. * Note: IW_ENCODE_{OPEN,RESTRICTED} can be interpreted to mean two
  1767. * different things. Here they are used to indicate Open System vs.
  1768. * Shared Key authentication algorithm. However, some drivers may use
  1769. * them to select between open/restricted WEP encrypted (open = allow
  1770. * both unencrypted and encrypted frames; restricted = only allow
  1771. * encrypted frames).
  1772. */
  1773. if (!drv->use_crypt) {
  1774. iwr.u.encoding.flags |= IW_ENCODE_DISABLED;
  1775. } else {
  1776. if (params->auth_alg & AUTH_ALG_OPEN_SYSTEM)
  1777. iwr.u.encoding.flags |= IW_ENCODE_OPEN;
  1778. if (params->auth_alg & AUTH_ALG_SHARED_KEY)
  1779. iwr.u.encoding.flags |= IW_ENCODE_RESTRICTED;
  1780. }
  1781. if (ioctl(drv->ioctl_sock, SIOCSIWENCODE, &iwr) < 0) {
  1782. perror("ioctl[SIOCSIWENCODE]");
  1783. ret = -1;
  1784. }
  1785. return ret;
  1786. }
  1787. static int wpa_driver_nl80211_associate(
  1788. void *priv, struct wpa_driver_associate_params *params)
  1789. {
  1790. struct wpa_driver_nl80211_data *drv = priv;
  1791. int ret = 0;
  1792. int allow_unencrypted_eapol;
  1793. int value;
  1794. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  1795. /*
  1796. * If the driver did not support SIOCSIWAUTH, fallback to
  1797. * SIOCSIWENCODE here.
  1798. */
  1799. if (drv->auth_alg_fallback &&
  1800. wpa_driver_nl80211_auth_alg_fallback(drv, params) < 0)
  1801. ret = -1;
  1802. if (!params->bssid &&
  1803. wpa_driver_nl80211_set_bssid(drv, NULL) < 0)
  1804. ret = -1;
  1805. /* TODO: should consider getting wpa version and cipher/key_mgmt suites
  1806. * from configuration, not from here, where only the selected suite is
  1807. * available */
  1808. if (wpa_driver_nl80211_set_gen_ie(drv, params->wpa_ie, params->wpa_ie_len)
  1809. < 0)
  1810. ret = -1;
  1811. if (params->wpa_ie == NULL || params->wpa_ie_len == 0)
  1812. value = IW_AUTH_WPA_VERSION_DISABLED;
  1813. else if (params->wpa_ie[0] == WLAN_EID_RSN)
  1814. value = IW_AUTH_WPA_VERSION_WPA2;
  1815. else
  1816. value = IW_AUTH_WPA_VERSION_WPA;
  1817. if (wpa_driver_nl80211_set_auth_param(drv,
  1818. IW_AUTH_WPA_VERSION, value) < 0)
  1819. ret = -1;
  1820. value = wpa_driver_nl80211_cipher2wext(params->pairwise_suite);
  1821. if (wpa_driver_nl80211_set_auth_param(drv,
  1822. IW_AUTH_CIPHER_PAIRWISE, value) < 0)
  1823. ret = -1;
  1824. value = wpa_driver_nl80211_cipher2wext(params->group_suite);
  1825. if (wpa_driver_nl80211_set_auth_param(drv,
  1826. IW_AUTH_CIPHER_GROUP, value) < 0)
  1827. ret = -1;
  1828. value = wpa_driver_nl80211_keymgmt2wext(params->key_mgmt_suite);
  1829. if (wpa_driver_nl80211_set_auth_param(drv,
  1830. IW_AUTH_KEY_MGMT, value) < 0)
  1831. ret = -1;
  1832. value = params->key_mgmt_suite != KEY_MGMT_NONE ||
  1833. params->pairwise_suite != CIPHER_NONE ||
  1834. params->group_suite != CIPHER_NONE ||
  1835. params->wpa_ie_len;
  1836. if (wpa_driver_nl80211_set_auth_param(drv,
  1837. IW_AUTH_PRIVACY_INVOKED, value) < 0)
  1838. ret = -1;
  1839. /* Allow unencrypted EAPOL messages even if pairwise keys are set when
  1840. * not using WPA. IEEE 802.1X specifies that these frames are not
  1841. * encrypted, but WPA encrypts them when pairwise keys are in use. */
  1842. if (params->key_mgmt_suite == KEY_MGMT_802_1X ||
  1843. params->key_mgmt_suite == KEY_MGMT_PSK)
  1844. allow_unencrypted_eapol = 0;
  1845. else
  1846. allow_unencrypted_eapol = 1;
  1847. if (wpa_driver_nl80211_set_auth_param(drv,
  1848. IW_AUTH_RX_UNENCRYPTED_EAPOL,
  1849. allow_unencrypted_eapol) < 0)
  1850. ret = -1;
  1851. if (params->freq && wpa_driver_nl80211_set_freq(drv, params->freq) < 0)
  1852. ret = -1;
  1853. if (wpa_driver_nl80211_set_ssid(drv, params->ssid, params->ssid_len) < 0)
  1854. ret = -1;
  1855. if (params->bssid &&
  1856. wpa_driver_nl80211_set_bssid(drv, params->bssid) < 0)
  1857. ret = -1;
  1858. return ret;
  1859. }
  1860. static int wpa_driver_nl80211_set_auth_alg(void *priv, int auth_alg)
  1861. {
  1862. struct wpa_driver_nl80211_data *drv = priv;
  1863. int algs = 0, res;
  1864. if (auth_alg & AUTH_ALG_OPEN_SYSTEM)
  1865. algs |= IW_AUTH_ALG_OPEN_SYSTEM;
  1866. if (auth_alg & AUTH_ALG_SHARED_KEY)
  1867. algs |= IW_AUTH_ALG_SHARED_KEY;
  1868. if (auth_alg & AUTH_ALG_LEAP)
  1869. algs |= IW_AUTH_ALG_LEAP;
  1870. if (algs == 0) {
  1871. /* at least one algorithm should be set */
  1872. algs = IW_AUTH_ALG_OPEN_SYSTEM;
  1873. }
  1874. res = wpa_driver_nl80211_set_auth_param(drv, IW_AUTH_80211_AUTH_ALG,
  1875. algs);
  1876. drv->auth_alg_fallback = res == -2;
  1877. return res;
  1878. }
  1879. /**
  1880. * wpa_driver_nl80211_set_mode - Set wireless mode (infra/adhoc), SIOCSIWMODE
  1881. * @priv: Pointer to private wext data from wpa_driver_nl80211_init()
  1882. * @mode: 0 = infra/BSS (associate with an AP), 1 = adhoc/IBSS
  1883. * Returns: 0 on success, -1 on failure
  1884. */
  1885. static int wpa_driver_nl80211_set_mode(void *priv, int mode)
  1886. {
  1887. struct wpa_driver_nl80211_data *drv = priv;
  1888. int ret = -1, flags;
  1889. struct nl_msg *msg;
  1890. msg = nlmsg_alloc();
  1891. if (!msg)
  1892. return -1;
  1893. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
  1894. 0, NL80211_CMD_SET_INTERFACE, 0);
  1895. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
  1896. NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE,
  1897. mode ? NL80211_IFTYPE_ADHOC : NL80211_IFTYPE_STATION);
  1898. ret = send_and_recv_msgs(drv, msg, NULL, NULL);
  1899. if (!ret)
  1900. return 0;
  1901. else
  1902. goto try_again;
  1903. nla_put_failure:
  1904. wpa_printf(MSG_ERROR, "nl80211: Failed to set interface mode");
  1905. return -1;
  1906. try_again:
  1907. /* mac80211 doesn't allow mode changes while the device is up, so
  1908. * take the device down, try to set the mode again, and bring the
  1909. * device back up.
  1910. */
  1911. if (wpa_driver_nl80211_get_ifflags(drv, &flags) == 0) {
  1912. (void) wpa_driver_nl80211_set_ifflags(drv, flags & ~IFF_UP);
  1913. /* Try to set the mode again while the interface is down */
  1914. msg = nlmsg_alloc();
  1915. if (!msg)
  1916. return -1;
  1917. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
  1918. 0, NL80211_CMD_SET_INTERFACE, 0);
  1919. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
  1920. NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE,
  1921. mode ? NL80211_IFTYPE_ADHOC :
  1922. NL80211_IFTYPE_STATION);
  1923. ret = send_and_recv_msgs(drv, msg, NULL, NULL);
  1924. if (ret) {
  1925. wpa_printf(MSG_ERROR, "Failed to set interface %s "
  1926. "mode", drv->ifname);
  1927. }
  1928. /* Ignore return value of get_ifflags to ensure that the device
  1929. * is always up like it was before this function was called.
  1930. */
  1931. (void) wpa_driver_nl80211_get_ifflags(drv, &flags);
  1932. (void) wpa_driver_nl80211_set_ifflags(drv, flags | IFF_UP);
  1933. }
  1934. return ret;
  1935. }
  1936. static int wpa_driver_nl80211_pmksa(struct wpa_driver_nl80211_data *drv,
  1937. u32 cmd, const u8 *bssid, const u8 *pmkid)
  1938. {
  1939. struct iwreq iwr;
  1940. struct iw_pmksa pmksa;
  1941. int ret = 0;
  1942. os_memset(&iwr, 0, sizeof(iwr));
  1943. os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
  1944. os_memset(&pmksa, 0, sizeof(pmksa));
  1945. pmksa.cmd = cmd;
  1946. pmksa.bssid.sa_family = ARPHRD_ETHER;
  1947. if (bssid)
  1948. os_memcpy(pmksa.bssid.sa_data, bssid, ETH_ALEN);
  1949. if (pmkid)
  1950. os_memcpy(pmksa.pmkid, pmkid, IW_PMKID_LEN);
  1951. iwr.u.data.pointer = (caddr_t) &pmksa;
  1952. iwr.u.data.length = sizeof(pmksa);
  1953. if (ioctl(drv->ioctl_sock, SIOCSIWPMKSA, &iwr) < 0) {
  1954. if (errno != EOPNOTSUPP)
  1955. perror("ioctl[SIOCSIWPMKSA]");
  1956. ret = -1;
  1957. }
  1958. return ret;
  1959. }
  1960. static int wpa_driver_nl80211_add_pmkid(void *priv, const u8 *bssid,
  1961. const u8 *pmkid)
  1962. {
  1963. struct wpa_driver_nl80211_data *drv = priv;
  1964. return wpa_driver_nl80211_pmksa(drv, IW_PMKSA_ADD, bssid, pmkid);
  1965. }
  1966. static int wpa_driver_nl80211_remove_pmkid(void *priv, const u8 *bssid,
  1967. const u8 *pmkid)
  1968. {
  1969. struct wpa_driver_nl80211_data *drv = priv;
  1970. return wpa_driver_nl80211_pmksa(drv, IW_PMKSA_REMOVE, bssid, pmkid);
  1971. }
  1972. static int wpa_driver_nl80211_flush_pmkid(void *priv)
  1973. {
  1974. struct wpa_driver_nl80211_data *drv = priv;
  1975. return wpa_driver_nl80211_pmksa(drv, IW_PMKSA_FLUSH, NULL, NULL);
  1976. }
  1977. static int wpa_driver_nl80211_get_capa(void *priv,
  1978. struct wpa_driver_capa *capa)
  1979. {
  1980. struct wpa_driver_nl80211_data *drv = priv;
  1981. if (!drv->has_capability)
  1982. return -1;
  1983. os_memcpy(capa, &drv->capa, sizeof(*capa));
  1984. return 0;
  1985. }
  1986. static int wpa_driver_nl80211_set_operstate(void *priv, int state)
  1987. {
  1988. struct wpa_driver_nl80211_data *drv = priv;
  1989. wpa_printf(MSG_DEBUG, "%s: operstate %d->%d (%s)",
  1990. __func__, drv->operstate, state, state ? "UP" : "DORMANT");
  1991. drv->operstate = state;
  1992. return wpa_driver_nl80211_send_oper_ifla(
  1993. drv, -1, state ? IF_OPER_UP : IF_OPER_DORMANT);
  1994. }
  1995. #ifdef CONFIG_CLIENT_MLME
  1996. static int wpa_driver_nl80211_open_mlme(struct wpa_driver_nl80211_data *drv)
  1997. {
  1998. if (wpa_driver_nl80211_set_userspace_mlme(drv, 1) < 0) {
  1999. wpa_printf(MSG_ERROR, "nl80211: Failed to enable userspace "
  2000. "MLME");
  2001. return -1;
  2002. }
  2003. if (wpa_driver_nl80211_create_monitor_interface(drv)) {
  2004. wpa_printf(MSG_ERROR, "nl80211: Failed to create monitor "
  2005. "interface");
  2006. return -1;
  2007. }
  2008. return 0;
  2009. }
  2010. #endif /* CONFIG_CLIENT_MLME */
  2011. static int wpa_driver_nl80211_set_param(void *priv, const char *param)
  2012. {
  2013. #ifdef CONFIG_CLIENT_MLME
  2014. struct wpa_driver_nl80211_data *drv = priv;
  2015. if (param == NULL)
  2016. return 0;
  2017. wpa_printf(MSG_DEBUG, "%s: param='%s'", __func__, param);
  2018. if (os_strstr(param, "use_mlme=1")) {
  2019. wpa_printf(MSG_DEBUG, "nl80211: Using user space MLME");
  2020. drv->capa.flags |= WPA_DRIVER_FLAGS_USER_SPACE_MLME;
  2021. if (wpa_driver_nl80211_open_mlme(drv))
  2022. return -1;
  2023. }
  2024. #endif /* CONFIG_CLIENT_MLME */
  2025. return 0;
  2026. }
  2027. #ifdef CONFIG_CLIENT_MLME
  2028. struct phy_info_arg {
  2029. u16 *num_modes;
  2030. struct wpa_hw_modes *modes;
  2031. };
  2032. static int phy_info_handler(struct nl_msg *msg, void *arg)
  2033. {
  2034. struct nlattr *tb_msg[NL80211_ATTR_MAX + 1];
  2035. struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
  2036. struct phy_info_arg *phy_info = arg;
  2037. struct nlattr *tb_band[NL80211_BAND_ATTR_MAX + 1];
  2038. struct nlattr *tb_freq[NL80211_FREQUENCY_ATTR_MAX + 1];
  2039. static struct nla_policy freq_policy[NL80211_FREQUENCY_ATTR_MAX + 1]
  2040. = {
  2041. [NL80211_FREQUENCY_ATTR_FREQ] = { .type = NLA_U32 },
  2042. [NL80211_FREQUENCY_ATTR_DISABLED] = { .type = NLA_FLAG },
  2043. [NL80211_FREQUENCY_ATTR_PASSIVE_SCAN] = { .type = NLA_FLAG },
  2044. [NL80211_FREQUENCY_ATTR_NO_IBSS] = { .type = NLA_FLAG },
  2045. [NL80211_FREQUENCY_ATTR_RADAR] = { .type = NLA_FLAG },
  2046. };
  2047. struct nlattr *tb_rate[NL80211_BITRATE_ATTR_MAX + 1];
  2048. static struct nla_policy rate_policy[NL80211_BITRATE_ATTR_MAX + 1] = {
  2049. [NL80211_BITRATE_ATTR_RATE] = { .type = NLA_U32 },
  2050. [NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE] =
  2051. { .type = NLA_FLAG },
  2052. };
  2053. struct nlattr *nl_band;
  2054. struct nlattr *nl_freq;
  2055. struct nlattr *nl_rate;
  2056. int rem_band, rem_freq, rem_rate;
  2057. struct wpa_hw_modes *mode;
  2058. int idx, mode_is_set;
  2059. nla_parse(tb_msg, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
  2060. genlmsg_attrlen(gnlh, 0), NULL);
  2061. if (!tb_msg[NL80211_ATTR_WIPHY_BANDS])
  2062. return NL_SKIP;
  2063. nla_for_each_nested(nl_band, tb_msg[NL80211_ATTR_WIPHY_BANDS],
  2064. rem_band) {
  2065. mode = os_realloc(phy_info->modes,
  2066. (*phy_info->num_modes + 1) * sizeof(*mode));
  2067. if (!mode)
  2068. return NL_SKIP;
  2069. phy_info->modes = mode;
  2070. mode_is_set = 0;
  2071. mode = &phy_info->modes[*(phy_info->num_modes)];
  2072. os_memset(mode, 0, sizeof(*mode));
  2073. *(phy_info->num_modes) += 1;
  2074. nla_parse(tb_band, NL80211_BAND_ATTR_MAX, nla_data(nl_band),
  2075. nla_len(nl_band), NULL);
  2076. nla_for_each_nested(nl_freq, tb_band[NL80211_BAND_ATTR_FREQS],
  2077. rem_freq) {
  2078. nla_parse(tb_freq, NL80211_FREQUENCY_ATTR_MAX,
  2079. nla_data(nl_freq), nla_len(nl_freq),
  2080. freq_policy);
  2081. if (!tb_freq[NL80211_FREQUENCY_ATTR_FREQ])
  2082. continue;
  2083. mode->num_channels++;
  2084. }
  2085. mode->channels = os_zalloc(mode->num_channels *
  2086. sizeof(struct wpa_channel_data));
  2087. if (!mode->channels)
  2088. return NL_SKIP;
  2089. idx = 0;
  2090. nla_for_each_nested(nl_freq, tb_band[NL80211_BAND_ATTR_FREQS],
  2091. rem_freq) {
  2092. nla_parse(tb_freq, NL80211_FREQUENCY_ATTR_MAX,
  2093. nla_data(nl_freq), nla_len(nl_freq),
  2094. freq_policy);
  2095. if (!tb_freq[NL80211_FREQUENCY_ATTR_FREQ])
  2096. continue;
  2097. mode->channels[idx].freq = nla_get_u32(
  2098. tb_freq[NL80211_FREQUENCY_ATTR_FREQ]);
  2099. mode->channels[idx].flag |= WPA_CHAN_W_SCAN |
  2100. WPA_CHAN_W_ACTIVE_SCAN |
  2101. WPA_CHAN_W_IBSS;
  2102. if (!mode_is_set) {
  2103. /* crude heuristic */
  2104. if (mode->channels[idx].freq < 4000)
  2105. mode->mode = WPA_MODE_IEEE80211B;
  2106. else
  2107. mode->mode = WPA_MODE_IEEE80211A;
  2108. mode_is_set = 1;
  2109. }
  2110. /* crude heuristic */
  2111. if (mode->channels[idx].freq < 4000) {
  2112. if (mode->channels[idx].freq == 2848)
  2113. mode->channels[idx].chan = 14;
  2114. else
  2115. mode->channels[idx].chan =
  2116. (mode->channels[idx].freq -
  2117. 2407) / 5;
  2118. } else
  2119. mode->channels[idx].chan =
  2120. mode->channels[idx].freq / 5 - 1000;
  2121. if (tb_freq[NL80211_FREQUENCY_ATTR_DISABLED])
  2122. mode->channels[idx].flag &= ~WPA_CHAN_W_SCAN;
  2123. if (tb_freq[NL80211_FREQUENCY_ATTR_PASSIVE_SCAN])
  2124. mode->channels[idx].flag &=
  2125. ~WPA_CHAN_W_ACTIVE_SCAN;
  2126. if (tb_freq[NL80211_FREQUENCY_ATTR_NO_IBSS])
  2127. mode->channels[idx].flag &= ~WPA_CHAN_W_IBSS;
  2128. idx++;
  2129. }
  2130. nla_for_each_nested(nl_rate, tb_band[NL80211_BAND_ATTR_RATES],
  2131. rem_rate) {
  2132. nla_parse(tb_rate, NL80211_BITRATE_ATTR_MAX,
  2133. nla_data(nl_rate), nla_len(nl_rate),
  2134. rate_policy);
  2135. if (!tb_rate[NL80211_BITRATE_ATTR_RATE])
  2136. continue;
  2137. mode->num_rates++;
  2138. }
  2139. mode->rates = os_zalloc(mode->num_rates *
  2140. sizeof(struct wpa_rate_data));
  2141. if (!mode->rates)
  2142. return NL_SKIP;
  2143. idx = 0;
  2144. nla_for_each_nested(nl_rate, tb_band[NL80211_BAND_ATTR_RATES],
  2145. rem_rate) {
  2146. nla_parse(tb_rate, NL80211_BITRATE_ATTR_MAX,
  2147. nla_data(nl_rate), nla_len(nl_rate),
  2148. rate_policy);
  2149. if (!tb_rate[NL80211_BITRATE_ATTR_RATE])
  2150. continue;
  2151. mode->rates[idx].rate = nla_get_u32(
  2152. tb_rate[NL80211_BITRATE_ATTR_RATE]);
  2153. /* crude heuristic */
  2154. if (mode->mode == WPA_MODE_IEEE80211B &&
  2155. mode->rates[idx].rate > 200)
  2156. mode->mode = WPA_MODE_IEEE80211G;
  2157. if (tb_rate[NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE])
  2158. mode->rates[idx].flags |= WPA_RATE_PREAMBLE2;
  2159. idx++;
  2160. }
  2161. }
  2162. return NL_SKIP;
  2163. }
  2164. static struct wpa_hw_modes *
  2165. wpa_driver_nl80211_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags)
  2166. {
  2167. struct wpa_driver_nl80211_data *drv = priv;
  2168. struct nl_msg *msg;
  2169. struct phy_info_arg result = {
  2170. .num_modes = num_modes,
  2171. .modes = NULL,
  2172. };
  2173. *num_modes = 0;
  2174. *flags = 0;
  2175. msg = nlmsg_alloc();
  2176. if (!msg)
  2177. return NULL;
  2178. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
  2179. 0, NL80211_CMD_GET_WIPHY, 0);
  2180. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
  2181. if (send_and_recv_msgs(drv, msg, phy_info_handler, &result) == 0)
  2182. return result.modes;
  2183. nla_put_failure:
  2184. return NULL;
  2185. }
  2186. static int wpa_driver_nl80211_set_channel(void *priv, wpa_hw_mode phymode,
  2187. int chan, int freq)
  2188. {
  2189. return wpa_driver_nl80211_set_freq(priv, freq);
  2190. }
  2191. static int wpa_driver_nl80211_send_mlme(void *priv, const u8 *data,
  2192. size_t data_len)
  2193. {
  2194. struct wpa_driver_nl80211_data *drv = priv;
  2195. __u8 rtap_hdr[] = {
  2196. 0x00, 0x00, /* radiotap version */
  2197. 0x0e, 0x00, /* radiotap length */
  2198. 0x02, 0xc0, 0x00, 0x00, /* bmap: flags, tx and rx flags */
  2199. 0x0c, /* F_WEP | F_FRAG (encrypt/fragment if required) */
  2200. 0x00, /* padding */
  2201. 0x00, 0x00, /* RX and TX flags to indicate that */
  2202. 0x00, 0x00, /* this is the injected frame directly */
  2203. };
  2204. struct iovec iov[2] = {
  2205. {
  2206. .iov_base = &rtap_hdr,
  2207. .iov_len = sizeof(rtap_hdr),
  2208. },
  2209. {
  2210. .iov_base = (void *) data,
  2211. .iov_len = data_len,
  2212. }
  2213. };
  2214. struct msghdr msg = {
  2215. .msg_name = NULL,
  2216. .msg_namelen = 0,
  2217. .msg_iov = iov,
  2218. .msg_iovlen = 2,
  2219. .msg_control = NULL,
  2220. .msg_controllen = 0,
  2221. .msg_flags = 0,
  2222. };
  2223. if (sendmsg(drv->monitor_sock, &msg, 0) < 0) {
  2224. perror("send[MLME]");
  2225. return -1;
  2226. }
  2227. return 0;
  2228. }
  2229. static int wpa_driver_nl80211_mlme_add_sta(void *priv, const u8 *addr,
  2230. const u8 *supp_rates,
  2231. size_t supp_rates_len)
  2232. {
  2233. struct wpa_driver_nl80211_data *drv = priv;
  2234. struct nl_msg *msg;
  2235. int ret = -1;
  2236. msg = nlmsg_alloc();
  2237. if (!msg)
  2238. return -ENOMEM;
  2239. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
  2240. 0, NL80211_CMD_NEW_STATION, 0);
  2241. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
  2242. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
  2243. /* TODO: Get proper Association ID and listen interval */
  2244. NLA_PUT_U16(msg, NL80211_ATTR_STA_AID, 1);
  2245. NLA_PUT(msg, NL80211_ATTR_STA_SUPPORTED_RATES, supp_rates_len,
  2246. supp_rates);
  2247. NLA_PUT_U16(msg, NL80211_ATTR_STA_LISTEN_INTERVAL, 1);
  2248. ret = send_and_recv_msgs(drv, msg, NULL, NULL);
  2249. /* ignore EEXIST, this happens if a STA associates while associated */
  2250. if (ret == -EEXIST || ret >= 0)
  2251. ret = 0;
  2252. nla_put_failure:
  2253. return ret;
  2254. }
  2255. static int wpa_driver_nl80211_mlme_remove_sta(void *priv, const u8 *addr)
  2256. {
  2257. struct wpa_driver_nl80211_data *drv = priv;
  2258. struct nl_msg *msg;
  2259. int ret = -1;
  2260. msg = nlmsg_alloc();
  2261. if (!msg)
  2262. return -ENOMEM;
  2263. genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
  2264. 0, NL80211_CMD_DEL_STATION, 0);
  2265. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex);
  2266. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
  2267. ret = 0;
  2268. ret = send_and_recv_msgs(drv, msg, NULL, NULL);
  2269. return ret;
  2270. nla_put_failure:
  2271. return -ENOBUFS;
  2272. }
  2273. #endif /* CONFIG_CLIENT_MLME */
  2274. const struct wpa_driver_ops wpa_driver_nl80211_ops = {
  2275. .name = "nl80211",
  2276. .desc = "Linux nl80211/cfg80211",
  2277. .get_bssid = wpa_driver_nl80211_get_bssid,
  2278. .get_ssid = wpa_driver_nl80211_get_ssid,
  2279. .set_wpa = wpa_driver_nl80211_set_wpa,
  2280. .set_key = wpa_driver_nl80211_set_key,
  2281. .set_countermeasures = wpa_driver_nl80211_set_countermeasures,
  2282. .set_drop_unencrypted = wpa_driver_nl80211_set_drop_unencrypted,
  2283. .scan2 = wpa_driver_nl80211_scan,
  2284. .get_scan_results2 = wpa_driver_nl80211_get_scan_results,
  2285. .deauthenticate = wpa_driver_nl80211_deauthenticate,
  2286. .disassociate = wpa_driver_nl80211_disassociate,
  2287. .set_mode = wpa_driver_nl80211_set_mode,
  2288. .associate = wpa_driver_nl80211_associate,
  2289. .set_auth_alg = wpa_driver_nl80211_set_auth_alg,
  2290. .init = wpa_driver_nl80211_init,
  2291. .deinit = wpa_driver_nl80211_deinit,
  2292. .set_param = wpa_driver_nl80211_set_param,
  2293. .add_pmkid = wpa_driver_nl80211_add_pmkid,
  2294. .remove_pmkid = wpa_driver_nl80211_remove_pmkid,
  2295. .flush_pmkid = wpa_driver_nl80211_flush_pmkid,
  2296. .get_capa = wpa_driver_nl80211_get_capa,
  2297. .set_operstate = wpa_driver_nl80211_set_operstate,
  2298. .set_country = wpa_driver_nl80211_set_country,
  2299. #ifdef CONFIG_CLIENT_MLME
  2300. .get_hw_feature_data = wpa_driver_nl80211_get_hw_feature_data,
  2301. .set_channel = wpa_driver_nl80211_set_channel,
  2302. .set_ssid = wpa_driver_nl80211_set_ssid,
  2303. .set_bssid = wpa_driver_nl80211_set_bssid,
  2304. .send_mlme = wpa_driver_nl80211_send_mlme,
  2305. .mlme_add_sta = wpa_driver_nl80211_mlme_add_sta,
  2306. .mlme_remove_sta = wpa_driver_nl80211_mlme_remove_sta,
  2307. #endif /* CONFIG_CLIENT_MLME */
  2308. };