driver_nl80211.c 102 KB

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