mlme.c 121 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305
  1. /*
  2. * BSS client mode implementation
  3. * Copyright 2003, Jouni Malinen <jkmaline@cc.hut.fi>
  4. * Copyright 2004, Instant802 Networks, Inc.
  5. * Copyright 2005, Devicescape Software, Inc.
  6. * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
  7. * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
  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. /* TODO:
  14. * order BSS list by RSSI(?) ("quality of AP")
  15. * scan result table filtering (by capability (privacy, IBSS/BSS, WPA/RSN IE,
  16. * SSID)
  17. */
  18. #include <linux/delay.h>
  19. #include <linux/if_ether.h>
  20. #include <linux/skbuff.h>
  21. #include <linux/netdevice.h>
  22. #include <linux/if_arp.h>
  23. #include <linux/wireless.h>
  24. #include <linux/random.h>
  25. #include <linux/etherdevice.h>
  26. #include <linux/rtnetlink.h>
  27. #include <net/iw_handler.h>
  28. #include <asm/types.h>
  29. #include <net/mac80211.h>
  30. #include "ieee80211_i.h"
  31. #include "rate.h"
  32. #include "led.h"
  33. #include "mesh.h"
  34. #define IEEE80211_AUTH_TIMEOUT (HZ / 5)
  35. #define IEEE80211_AUTH_MAX_TRIES 3
  36. #define IEEE80211_ASSOC_TIMEOUT (HZ / 5)
  37. #define IEEE80211_ASSOC_MAX_TRIES 3
  38. #define IEEE80211_MONITORING_INTERVAL (2 * HZ)
  39. #define IEEE80211_MESH_HOUSEKEEPING_INTERVAL (60 * HZ)
  40. #define IEEE80211_PROBE_INTERVAL (60 * HZ)
  41. #define IEEE80211_RETRY_AUTH_INTERVAL (1 * HZ)
  42. #define IEEE80211_SCAN_INTERVAL (2 * HZ)
  43. #define IEEE80211_SCAN_INTERVAL_SLOW (15 * HZ)
  44. #define IEEE80211_IBSS_JOIN_TIMEOUT (20 * HZ)
  45. #define IEEE80211_PROBE_DELAY (HZ / 33)
  46. #define IEEE80211_CHANNEL_TIME (HZ / 33)
  47. #define IEEE80211_PASSIVE_CHANNEL_TIME (HZ / 5)
  48. #define IEEE80211_SCAN_RESULT_EXPIRE (10 * HZ)
  49. #define IEEE80211_IBSS_MERGE_INTERVAL (30 * HZ)
  50. #define IEEE80211_IBSS_INACTIVITY_LIMIT (60 * HZ)
  51. #define IEEE80211_MESH_PEER_INACTIVITY_LIMIT (1800 * HZ)
  52. #define IEEE80211_IBSS_MAX_STA_ENTRIES 128
  53. #define ERP_INFO_USE_PROTECTION BIT(1)
  54. /* mgmt header + 1 byte action code */
  55. #define IEEE80211_MIN_ACTION_SIZE (24 + 1)
  56. #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
  57. #define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
  58. #define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0
  59. #define IEEE80211_DELBA_PARAM_TID_MASK 0xF000
  60. #define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
  61. /* next values represent the buffer size for A-MPDU frame.
  62. * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2) */
  63. #define IEEE80211_MIN_AMPDU_BUF 0x8
  64. #define IEEE80211_MAX_AMPDU_BUF 0x40
  65. static void ieee80211_send_probe_req(struct net_device *dev, u8 *dst,
  66. u8 *ssid, size_t ssid_len);
  67. static struct ieee80211_sta_bss *
  68. ieee80211_rx_bss_get(struct net_device *dev, u8 *bssid, int freq,
  69. u8 *ssid, u8 ssid_len);
  70. static void ieee80211_rx_bss_put(struct net_device *dev,
  71. struct ieee80211_sta_bss *bss);
  72. static int ieee80211_sta_find_ibss(struct net_device *dev,
  73. struct ieee80211_if_sta *ifsta);
  74. static int ieee80211_sta_wep_configured(struct net_device *dev);
  75. static int ieee80211_sta_start_scan(struct net_device *dev,
  76. u8 *ssid, size_t ssid_len);
  77. static int ieee80211_sta_config_auth(struct net_device *dev,
  78. struct ieee80211_if_sta *ifsta);
  79. static void sta_rx_agg_session_timer_expired(unsigned long data);
  80. void ieee802_11_parse_elems(u8 *start, size_t len,
  81. struct ieee802_11_elems *elems)
  82. {
  83. size_t left = len;
  84. u8 *pos = start;
  85. memset(elems, 0, sizeof(*elems));
  86. while (left >= 2) {
  87. u8 id, elen;
  88. id = *pos++;
  89. elen = *pos++;
  90. left -= 2;
  91. if (elen > left)
  92. return;
  93. switch (id) {
  94. case WLAN_EID_SSID:
  95. elems->ssid = pos;
  96. elems->ssid_len = elen;
  97. break;
  98. case WLAN_EID_SUPP_RATES:
  99. elems->supp_rates = pos;
  100. elems->supp_rates_len = elen;
  101. break;
  102. case WLAN_EID_FH_PARAMS:
  103. elems->fh_params = pos;
  104. elems->fh_params_len = elen;
  105. break;
  106. case WLAN_EID_DS_PARAMS:
  107. elems->ds_params = pos;
  108. elems->ds_params_len = elen;
  109. break;
  110. case WLAN_EID_CF_PARAMS:
  111. elems->cf_params = pos;
  112. elems->cf_params_len = elen;
  113. break;
  114. case WLAN_EID_TIM:
  115. elems->tim = pos;
  116. elems->tim_len = elen;
  117. break;
  118. case WLAN_EID_IBSS_PARAMS:
  119. elems->ibss_params = pos;
  120. elems->ibss_params_len = elen;
  121. break;
  122. case WLAN_EID_CHALLENGE:
  123. elems->challenge = pos;
  124. elems->challenge_len = elen;
  125. break;
  126. case WLAN_EID_WPA:
  127. if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 &&
  128. pos[2] == 0xf2) {
  129. /* Microsoft OUI (00:50:F2) */
  130. if (pos[3] == 1) {
  131. /* OUI Type 1 - WPA IE */
  132. elems->wpa = pos;
  133. elems->wpa_len = elen;
  134. } else if (elen >= 5 && pos[3] == 2) {
  135. if (pos[4] == 0) {
  136. elems->wmm_info = pos;
  137. elems->wmm_info_len = elen;
  138. } else if (pos[4] == 1) {
  139. elems->wmm_param = pos;
  140. elems->wmm_param_len = elen;
  141. }
  142. }
  143. }
  144. break;
  145. case WLAN_EID_RSN:
  146. elems->rsn = pos;
  147. elems->rsn_len = elen;
  148. break;
  149. case WLAN_EID_ERP_INFO:
  150. elems->erp_info = pos;
  151. elems->erp_info_len = elen;
  152. break;
  153. case WLAN_EID_EXT_SUPP_RATES:
  154. elems->ext_supp_rates = pos;
  155. elems->ext_supp_rates_len = elen;
  156. break;
  157. case WLAN_EID_HT_CAPABILITY:
  158. elems->ht_cap_elem = pos;
  159. elems->ht_cap_elem_len = elen;
  160. break;
  161. case WLAN_EID_HT_EXTRA_INFO:
  162. elems->ht_info_elem = pos;
  163. elems->ht_info_elem_len = elen;
  164. break;
  165. case WLAN_EID_MESH_ID:
  166. elems->mesh_id = pos;
  167. elems->mesh_id_len = elen;
  168. break;
  169. case WLAN_EID_MESH_CONFIG:
  170. elems->mesh_config = pos;
  171. elems->mesh_config_len = elen;
  172. break;
  173. case WLAN_EID_PEER_LINK:
  174. elems->peer_link = pos;
  175. elems->peer_link_len = elen;
  176. break;
  177. case WLAN_EID_PREQ:
  178. elems->preq = pos;
  179. elems->preq_len = elen;
  180. break;
  181. case WLAN_EID_PREP:
  182. elems->prep = pos;
  183. elems->prep_len = elen;
  184. break;
  185. case WLAN_EID_PERR:
  186. elems->perr = pos;
  187. elems->perr_len = elen;
  188. break;
  189. default:
  190. break;
  191. }
  192. left -= elen;
  193. pos += elen;
  194. }
  195. }
  196. static int ecw2cw(int ecw)
  197. {
  198. return (1 << ecw) - 1;
  199. }
  200. static void ieee80211_sta_def_wmm_params(struct net_device *dev,
  201. struct ieee80211_sta_bss *bss,
  202. int ibss)
  203. {
  204. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  205. struct ieee80211_local *local = sdata->local;
  206. int i, have_higher_than_11mbit = 0;
  207. /* cf. IEEE 802.11 9.2.12 */
  208. for (i = 0; i < bss->supp_rates_len; i++)
  209. if ((bss->supp_rates[i] & 0x7f) * 5 > 110)
  210. have_higher_than_11mbit = 1;
  211. if (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ &&
  212. have_higher_than_11mbit)
  213. sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE;
  214. else
  215. sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE;
  216. if (local->ops->conf_tx) {
  217. struct ieee80211_tx_queue_params qparam;
  218. memset(&qparam, 0, sizeof(qparam));
  219. qparam.aifs = 2;
  220. if (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ &&
  221. !(sdata->flags & IEEE80211_SDATA_OPERATING_GMODE))
  222. qparam.cw_min = 31;
  223. else
  224. qparam.cw_min = 15;
  225. qparam.cw_max = 1023;
  226. qparam.txop = 0;
  227. for (i = 0; i < local_to_hw(local)->queues; i++)
  228. local->ops->conf_tx(local_to_hw(local), i, &qparam);
  229. }
  230. }
  231. static void ieee80211_sta_wmm_params(struct net_device *dev,
  232. struct ieee80211_if_sta *ifsta,
  233. u8 *wmm_param, size_t wmm_param_len)
  234. {
  235. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  236. struct ieee80211_tx_queue_params params;
  237. size_t left;
  238. int count;
  239. u8 *pos;
  240. if (wmm_param_len < 8 || wmm_param[5] /* version */ != 1)
  241. return;
  242. count = wmm_param[6] & 0x0f;
  243. if (count == ifsta->wmm_last_param_set)
  244. return;
  245. ifsta->wmm_last_param_set = count;
  246. pos = wmm_param + 8;
  247. left = wmm_param_len - 8;
  248. memset(&params, 0, sizeof(params));
  249. if (!local->ops->conf_tx)
  250. return;
  251. local->wmm_acm = 0;
  252. for (; left >= 4; left -= 4, pos += 4) {
  253. int aci = (pos[0] >> 5) & 0x03;
  254. int acm = (pos[0] >> 4) & 0x01;
  255. int queue;
  256. switch (aci) {
  257. case 1:
  258. queue = 3;
  259. if (acm)
  260. local->wmm_acm |= BIT(0) | BIT(3);
  261. break;
  262. case 2:
  263. queue = 1;
  264. if (acm)
  265. local->wmm_acm |= BIT(4) | BIT(5);
  266. break;
  267. case 3:
  268. queue = 0;
  269. if (acm)
  270. local->wmm_acm |= BIT(6) | BIT(7);
  271. break;
  272. case 0:
  273. default:
  274. queue = 2;
  275. if (acm)
  276. local->wmm_acm |= BIT(1) | BIT(2);
  277. break;
  278. }
  279. params.aifs = pos[0] & 0x0f;
  280. params.cw_max = ecw2cw((pos[1] & 0xf0) >> 4);
  281. params.cw_min = ecw2cw(pos[1] & 0x0f);
  282. params.txop = pos[2] | (pos[3] << 8);
  283. #ifdef CONFIG_MAC80211_DEBUG
  284. printk(KERN_DEBUG "%s: WMM queue=%d aci=%d acm=%d aifs=%d "
  285. "cWmin=%d cWmax=%d txop=%d\n",
  286. dev->name, queue, aci, acm, params.aifs, params.cw_min,
  287. params.cw_max, params.txop);
  288. #endif
  289. /* TODO: handle ACM (block TX, fallback to next lowest allowed
  290. * AC for now) */
  291. if (local->ops->conf_tx(local_to_hw(local), queue, &params)) {
  292. printk(KERN_DEBUG "%s: failed to set TX queue "
  293. "parameters for queue %d\n", dev->name, queue);
  294. }
  295. }
  296. }
  297. static u32 ieee80211_handle_protect_preamb(struct ieee80211_sub_if_data *sdata,
  298. bool use_protection,
  299. bool use_short_preamble)
  300. {
  301. struct ieee80211_bss_conf *bss_conf = &sdata->bss_conf;
  302. struct ieee80211_if_sta *ifsta = &sdata->u.sta;
  303. DECLARE_MAC_BUF(mac);
  304. u32 changed = 0;
  305. if (use_protection != bss_conf->use_cts_prot) {
  306. if (net_ratelimit()) {
  307. printk(KERN_DEBUG "%s: CTS protection %s (BSSID="
  308. "%s)\n",
  309. sdata->dev->name,
  310. use_protection ? "enabled" : "disabled",
  311. print_mac(mac, ifsta->bssid));
  312. }
  313. bss_conf->use_cts_prot = use_protection;
  314. changed |= BSS_CHANGED_ERP_CTS_PROT;
  315. }
  316. if (use_short_preamble != bss_conf->use_short_preamble) {
  317. if (net_ratelimit()) {
  318. printk(KERN_DEBUG "%s: switched to %s barker preamble"
  319. " (BSSID=%s)\n",
  320. sdata->dev->name,
  321. use_short_preamble ? "short" : "long",
  322. print_mac(mac, ifsta->bssid));
  323. }
  324. bss_conf->use_short_preamble = use_short_preamble;
  325. changed |= BSS_CHANGED_ERP_PREAMBLE;
  326. }
  327. return changed;
  328. }
  329. static u32 ieee80211_handle_erp_ie(struct ieee80211_sub_if_data *sdata,
  330. u8 erp_value)
  331. {
  332. bool use_protection = (erp_value & WLAN_ERP_USE_PROTECTION) != 0;
  333. bool use_short_preamble = (erp_value & WLAN_ERP_BARKER_PREAMBLE) == 0;
  334. return ieee80211_handle_protect_preamb(sdata,
  335. use_protection, use_short_preamble);
  336. }
  337. static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata,
  338. struct ieee80211_sta_bss *bss)
  339. {
  340. u32 changed = 0;
  341. if (bss->has_erp_value)
  342. changed |= ieee80211_handle_erp_ie(sdata, bss->erp_value);
  343. else {
  344. u16 capab = bss->capability;
  345. changed |= ieee80211_handle_protect_preamb(sdata, false,
  346. (capab & WLAN_CAPABILITY_SHORT_PREAMBLE) != 0);
  347. }
  348. return changed;
  349. }
  350. int ieee80211_ht_cap_ie_to_ht_info(struct ieee80211_ht_cap *ht_cap_ie,
  351. struct ieee80211_ht_info *ht_info)
  352. {
  353. if (ht_info == NULL)
  354. return -EINVAL;
  355. memset(ht_info, 0, sizeof(*ht_info));
  356. if (ht_cap_ie) {
  357. u8 ampdu_info = ht_cap_ie->ampdu_params_info;
  358. ht_info->ht_supported = 1;
  359. ht_info->cap = le16_to_cpu(ht_cap_ie->cap_info);
  360. ht_info->ampdu_factor =
  361. ampdu_info & IEEE80211_HT_CAP_AMPDU_FACTOR;
  362. ht_info->ampdu_density =
  363. (ampdu_info & IEEE80211_HT_CAP_AMPDU_DENSITY) >> 2;
  364. memcpy(ht_info->supp_mcs_set, ht_cap_ie->supp_mcs_set, 16);
  365. } else
  366. ht_info->ht_supported = 0;
  367. return 0;
  368. }
  369. int ieee80211_ht_addt_info_ie_to_ht_bss_info(
  370. struct ieee80211_ht_addt_info *ht_add_info_ie,
  371. struct ieee80211_ht_bss_info *bss_info)
  372. {
  373. if (bss_info == NULL)
  374. return -EINVAL;
  375. memset(bss_info, 0, sizeof(*bss_info));
  376. if (ht_add_info_ie) {
  377. u16 op_mode;
  378. op_mode = le16_to_cpu(ht_add_info_ie->operation_mode);
  379. bss_info->primary_channel = ht_add_info_ie->control_chan;
  380. bss_info->bss_cap = ht_add_info_ie->ht_param;
  381. bss_info->bss_op_mode = (u8)(op_mode & 0xff);
  382. }
  383. return 0;
  384. }
  385. static void ieee80211_sta_send_associnfo(struct net_device *dev,
  386. struct ieee80211_if_sta *ifsta)
  387. {
  388. char *buf;
  389. size_t len;
  390. int i;
  391. union iwreq_data wrqu;
  392. if (!ifsta->assocreq_ies && !ifsta->assocresp_ies)
  393. return;
  394. buf = kmalloc(50 + 2 * (ifsta->assocreq_ies_len +
  395. ifsta->assocresp_ies_len), GFP_KERNEL);
  396. if (!buf)
  397. return;
  398. len = sprintf(buf, "ASSOCINFO(");
  399. if (ifsta->assocreq_ies) {
  400. len += sprintf(buf + len, "ReqIEs=");
  401. for (i = 0; i < ifsta->assocreq_ies_len; i++) {
  402. len += sprintf(buf + len, "%02x",
  403. ifsta->assocreq_ies[i]);
  404. }
  405. }
  406. if (ifsta->assocresp_ies) {
  407. if (ifsta->assocreq_ies)
  408. len += sprintf(buf + len, " ");
  409. len += sprintf(buf + len, "RespIEs=");
  410. for (i = 0; i < ifsta->assocresp_ies_len; i++) {
  411. len += sprintf(buf + len, "%02x",
  412. ifsta->assocresp_ies[i]);
  413. }
  414. }
  415. len += sprintf(buf + len, ")");
  416. if (len > IW_CUSTOM_MAX) {
  417. len = sprintf(buf, "ASSOCRESPIE=");
  418. for (i = 0; i < ifsta->assocresp_ies_len; i++) {
  419. len += sprintf(buf + len, "%02x",
  420. ifsta->assocresp_ies[i]);
  421. }
  422. }
  423. memset(&wrqu, 0, sizeof(wrqu));
  424. wrqu.data.length = len;
  425. wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
  426. kfree(buf);
  427. }
  428. static void ieee80211_set_associated(struct net_device *dev,
  429. struct ieee80211_if_sta *ifsta,
  430. bool assoc)
  431. {
  432. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  433. struct ieee80211_local *local = sdata->local;
  434. struct ieee80211_conf *conf = &local_to_hw(local)->conf;
  435. union iwreq_data wrqu;
  436. u32 changed = BSS_CHANGED_ASSOC;
  437. if (assoc) {
  438. struct ieee80211_sta_bss *bss;
  439. ifsta->flags |= IEEE80211_STA_ASSOCIATED;
  440. if (sdata->vif.type != IEEE80211_IF_TYPE_STA)
  441. return;
  442. bss = ieee80211_rx_bss_get(dev, ifsta->bssid,
  443. conf->channel->center_freq,
  444. ifsta->ssid, ifsta->ssid_len);
  445. if (bss) {
  446. /* set timing information */
  447. sdata->bss_conf.beacon_int = bss->beacon_int;
  448. sdata->bss_conf.timestamp = bss->timestamp;
  449. changed |= ieee80211_handle_bss_capability(sdata, bss);
  450. ieee80211_rx_bss_put(dev, bss);
  451. }
  452. if (conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) {
  453. changed |= BSS_CHANGED_HT;
  454. sdata->bss_conf.assoc_ht = 1;
  455. sdata->bss_conf.ht_conf = &conf->ht_conf;
  456. sdata->bss_conf.ht_bss_conf = &conf->ht_bss_conf;
  457. }
  458. netif_carrier_on(dev);
  459. ifsta->flags |= IEEE80211_STA_PREV_BSSID_SET;
  460. memcpy(ifsta->prev_bssid, sdata->u.sta.bssid, ETH_ALEN);
  461. memcpy(wrqu.ap_addr.sa_data, sdata->u.sta.bssid, ETH_ALEN);
  462. ieee80211_sta_send_associnfo(dev, ifsta);
  463. } else {
  464. ieee80211_sta_tear_down_BA_sessions(dev, ifsta->bssid);
  465. ifsta->flags &= ~IEEE80211_STA_ASSOCIATED;
  466. netif_carrier_off(dev);
  467. ieee80211_reset_erp_info(dev);
  468. sdata->bss_conf.assoc_ht = 0;
  469. sdata->bss_conf.ht_conf = NULL;
  470. sdata->bss_conf.ht_bss_conf = NULL;
  471. memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
  472. }
  473. ifsta->last_probe = jiffies;
  474. ieee80211_led_assoc(local, assoc);
  475. sdata->bss_conf.assoc = assoc;
  476. ieee80211_bss_info_change_notify(sdata, changed);
  477. wrqu.ap_addr.sa_family = ARPHRD_ETHER;
  478. wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
  479. }
  480. static void ieee80211_set_disassoc(struct net_device *dev,
  481. struct ieee80211_if_sta *ifsta, int deauth)
  482. {
  483. if (deauth)
  484. ifsta->auth_tries = 0;
  485. ifsta->assoc_tries = 0;
  486. ieee80211_set_associated(dev, ifsta, 0);
  487. }
  488. void ieee80211_sta_tx(struct net_device *dev, struct sk_buff *skb,
  489. int encrypt)
  490. {
  491. struct ieee80211_sub_if_data *sdata;
  492. struct ieee80211_tx_packet_data *pkt_data;
  493. sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  494. skb->dev = sdata->local->mdev;
  495. skb_set_mac_header(skb, 0);
  496. skb_set_network_header(skb, 0);
  497. skb_set_transport_header(skb, 0);
  498. pkt_data = (struct ieee80211_tx_packet_data *) skb->cb;
  499. memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data));
  500. pkt_data->ifindex = sdata->dev->ifindex;
  501. if (!encrypt)
  502. pkt_data->flags |= IEEE80211_TXPD_DO_NOT_ENCRYPT;
  503. dev_queue_xmit(skb);
  504. }
  505. static void ieee80211_send_auth(struct net_device *dev,
  506. struct ieee80211_if_sta *ifsta,
  507. int transaction, u8 *extra, size_t extra_len,
  508. int encrypt)
  509. {
  510. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  511. struct sk_buff *skb;
  512. struct ieee80211_mgmt *mgmt;
  513. skb = dev_alloc_skb(local->hw.extra_tx_headroom +
  514. sizeof(*mgmt) + 6 + extra_len);
  515. if (!skb) {
  516. printk(KERN_DEBUG "%s: failed to allocate buffer for auth "
  517. "frame\n", dev->name);
  518. return;
  519. }
  520. skb_reserve(skb, local->hw.extra_tx_headroom);
  521. mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24 + 6);
  522. memset(mgmt, 0, 24 + 6);
  523. mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
  524. IEEE80211_STYPE_AUTH);
  525. if (encrypt)
  526. mgmt->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
  527. memcpy(mgmt->da, ifsta->bssid, ETH_ALEN);
  528. memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
  529. memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
  530. mgmt->u.auth.auth_alg = cpu_to_le16(ifsta->auth_alg);
  531. mgmt->u.auth.auth_transaction = cpu_to_le16(transaction);
  532. ifsta->auth_transaction = transaction + 1;
  533. mgmt->u.auth.status_code = cpu_to_le16(0);
  534. if (extra)
  535. memcpy(skb_put(skb, extra_len), extra, extra_len);
  536. ieee80211_sta_tx(dev, skb, encrypt);
  537. }
  538. static void ieee80211_authenticate(struct net_device *dev,
  539. struct ieee80211_if_sta *ifsta)
  540. {
  541. DECLARE_MAC_BUF(mac);
  542. ifsta->auth_tries++;
  543. if (ifsta->auth_tries > IEEE80211_AUTH_MAX_TRIES) {
  544. printk(KERN_DEBUG "%s: authentication with AP %s"
  545. " timed out\n",
  546. dev->name, print_mac(mac, ifsta->bssid));
  547. ifsta->state = IEEE80211_DISABLED;
  548. return;
  549. }
  550. ifsta->state = IEEE80211_AUTHENTICATE;
  551. printk(KERN_DEBUG "%s: authenticate with AP %s\n",
  552. dev->name, print_mac(mac, ifsta->bssid));
  553. ieee80211_send_auth(dev, ifsta, 1, NULL, 0, 0);
  554. mod_timer(&ifsta->timer, jiffies + IEEE80211_AUTH_TIMEOUT);
  555. }
  556. static void ieee80211_send_assoc(struct net_device *dev,
  557. struct ieee80211_if_sta *ifsta)
  558. {
  559. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  560. struct sk_buff *skb;
  561. struct ieee80211_mgmt *mgmt;
  562. u8 *pos, *ies;
  563. int i, len;
  564. u16 capab;
  565. struct ieee80211_sta_bss *bss;
  566. int wmm = 0;
  567. struct ieee80211_supported_band *sband;
  568. skb = dev_alloc_skb(local->hw.extra_tx_headroom +
  569. sizeof(*mgmt) + 200 + ifsta->extra_ie_len +
  570. ifsta->ssid_len);
  571. if (!skb) {
  572. printk(KERN_DEBUG "%s: failed to allocate buffer for assoc "
  573. "frame\n", dev->name);
  574. return;
  575. }
  576. skb_reserve(skb, local->hw.extra_tx_headroom);
  577. sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
  578. capab = ifsta->capab;
  579. if (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ) {
  580. if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE))
  581. capab |= WLAN_CAPABILITY_SHORT_SLOT_TIME;
  582. if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE))
  583. capab |= WLAN_CAPABILITY_SHORT_PREAMBLE;
  584. }
  585. bss = ieee80211_rx_bss_get(dev, ifsta->bssid,
  586. local->hw.conf.channel->center_freq,
  587. ifsta->ssid, ifsta->ssid_len);
  588. if (bss) {
  589. if (bss->capability & WLAN_CAPABILITY_PRIVACY)
  590. capab |= WLAN_CAPABILITY_PRIVACY;
  591. if (bss->wmm_ie)
  592. wmm = 1;
  593. ieee80211_rx_bss_put(dev, bss);
  594. }
  595. mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
  596. memset(mgmt, 0, 24);
  597. memcpy(mgmt->da, ifsta->bssid, ETH_ALEN);
  598. memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
  599. memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
  600. if (ifsta->flags & IEEE80211_STA_PREV_BSSID_SET) {
  601. skb_put(skb, 10);
  602. mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
  603. IEEE80211_STYPE_REASSOC_REQ);
  604. mgmt->u.reassoc_req.capab_info = cpu_to_le16(capab);
  605. mgmt->u.reassoc_req.listen_interval = cpu_to_le16(1);
  606. memcpy(mgmt->u.reassoc_req.current_ap, ifsta->prev_bssid,
  607. ETH_ALEN);
  608. } else {
  609. skb_put(skb, 4);
  610. mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
  611. IEEE80211_STYPE_ASSOC_REQ);
  612. mgmt->u.assoc_req.capab_info = cpu_to_le16(capab);
  613. mgmt->u.assoc_req.listen_interval = cpu_to_le16(1);
  614. }
  615. /* SSID */
  616. ies = pos = skb_put(skb, 2 + ifsta->ssid_len);
  617. *pos++ = WLAN_EID_SSID;
  618. *pos++ = ifsta->ssid_len;
  619. memcpy(pos, ifsta->ssid, ifsta->ssid_len);
  620. len = sband->n_bitrates;
  621. if (len > 8)
  622. len = 8;
  623. pos = skb_put(skb, len + 2);
  624. *pos++ = WLAN_EID_SUPP_RATES;
  625. *pos++ = len;
  626. for (i = 0; i < len; i++) {
  627. int rate = sband->bitrates[i].bitrate;
  628. *pos++ = (u8) (rate / 5);
  629. }
  630. if (sband->n_bitrates > len) {
  631. pos = skb_put(skb, sband->n_bitrates - len + 2);
  632. *pos++ = WLAN_EID_EXT_SUPP_RATES;
  633. *pos++ = sband->n_bitrates - len;
  634. for (i = len; i < sband->n_bitrates; i++) {
  635. int rate = sband->bitrates[i].bitrate;
  636. *pos++ = (u8) (rate / 5);
  637. }
  638. }
  639. if (ifsta->extra_ie) {
  640. pos = skb_put(skb, ifsta->extra_ie_len);
  641. memcpy(pos, ifsta->extra_ie, ifsta->extra_ie_len);
  642. }
  643. if (wmm && (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) {
  644. pos = skb_put(skb, 9);
  645. *pos++ = WLAN_EID_VENDOR_SPECIFIC;
  646. *pos++ = 7; /* len */
  647. *pos++ = 0x00; /* Microsoft OUI 00:50:F2 */
  648. *pos++ = 0x50;
  649. *pos++ = 0xf2;
  650. *pos++ = 2; /* WME */
  651. *pos++ = 0; /* WME info */
  652. *pos++ = 1; /* WME ver */
  653. *pos++ = 0;
  654. }
  655. /* wmm support is a must to HT */
  656. if (wmm && sband->ht_info.ht_supported) {
  657. __le16 tmp = cpu_to_le16(sband->ht_info.cap);
  658. pos = skb_put(skb, sizeof(struct ieee80211_ht_cap)+2);
  659. *pos++ = WLAN_EID_HT_CAPABILITY;
  660. *pos++ = sizeof(struct ieee80211_ht_cap);
  661. memset(pos, 0, sizeof(struct ieee80211_ht_cap));
  662. memcpy(pos, &tmp, sizeof(u16));
  663. pos += sizeof(u16);
  664. /* TODO: needs a define here for << 2 */
  665. *pos++ = sband->ht_info.ampdu_factor |
  666. (sband->ht_info.ampdu_density << 2);
  667. memcpy(pos, sband->ht_info.supp_mcs_set, 16);
  668. }
  669. kfree(ifsta->assocreq_ies);
  670. ifsta->assocreq_ies_len = (skb->data + skb->len) - ies;
  671. ifsta->assocreq_ies = kmalloc(ifsta->assocreq_ies_len, GFP_KERNEL);
  672. if (ifsta->assocreq_ies)
  673. memcpy(ifsta->assocreq_ies, ies, ifsta->assocreq_ies_len);
  674. ieee80211_sta_tx(dev, skb, 0);
  675. }
  676. static void ieee80211_send_deauth(struct net_device *dev,
  677. struct ieee80211_if_sta *ifsta, u16 reason)
  678. {
  679. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  680. struct sk_buff *skb;
  681. struct ieee80211_mgmt *mgmt;
  682. skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*mgmt));
  683. if (!skb) {
  684. printk(KERN_DEBUG "%s: failed to allocate buffer for deauth "
  685. "frame\n", dev->name);
  686. return;
  687. }
  688. skb_reserve(skb, local->hw.extra_tx_headroom);
  689. mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
  690. memset(mgmt, 0, 24);
  691. memcpy(mgmt->da, ifsta->bssid, ETH_ALEN);
  692. memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
  693. memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
  694. mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
  695. IEEE80211_STYPE_DEAUTH);
  696. skb_put(skb, 2);
  697. mgmt->u.deauth.reason_code = cpu_to_le16(reason);
  698. ieee80211_sta_tx(dev, skb, 0);
  699. }
  700. static void ieee80211_send_disassoc(struct net_device *dev,
  701. struct ieee80211_if_sta *ifsta, u16 reason)
  702. {
  703. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  704. struct sk_buff *skb;
  705. struct ieee80211_mgmt *mgmt;
  706. skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*mgmt));
  707. if (!skb) {
  708. printk(KERN_DEBUG "%s: failed to allocate buffer for disassoc "
  709. "frame\n", dev->name);
  710. return;
  711. }
  712. skb_reserve(skb, local->hw.extra_tx_headroom);
  713. mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
  714. memset(mgmt, 0, 24);
  715. memcpy(mgmt->da, ifsta->bssid, ETH_ALEN);
  716. memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
  717. memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
  718. mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
  719. IEEE80211_STYPE_DISASSOC);
  720. skb_put(skb, 2);
  721. mgmt->u.disassoc.reason_code = cpu_to_le16(reason);
  722. ieee80211_sta_tx(dev, skb, 0);
  723. }
  724. static int ieee80211_privacy_mismatch(struct net_device *dev,
  725. struct ieee80211_if_sta *ifsta)
  726. {
  727. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  728. struct ieee80211_sta_bss *bss;
  729. int bss_privacy;
  730. int wep_privacy;
  731. int privacy_invoked;
  732. if (!ifsta || (ifsta->flags & IEEE80211_STA_MIXED_CELL))
  733. return 0;
  734. bss = ieee80211_rx_bss_get(dev, ifsta->bssid,
  735. local->hw.conf.channel->center_freq,
  736. ifsta->ssid, ifsta->ssid_len);
  737. if (!bss)
  738. return 0;
  739. bss_privacy = !!(bss->capability & WLAN_CAPABILITY_PRIVACY);
  740. wep_privacy = !!ieee80211_sta_wep_configured(dev);
  741. privacy_invoked = !!(ifsta->flags & IEEE80211_STA_PRIVACY_INVOKED);
  742. ieee80211_rx_bss_put(dev, bss);
  743. if ((bss_privacy == wep_privacy) || (bss_privacy == privacy_invoked))
  744. return 0;
  745. return 1;
  746. }
  747. static void ieee80211_associate(struct net_device *dev,
  748. struct ieee80211_if_sta *ifsta)
  749. {
  750. DECLARE_MAC_BUF(mac);
  751. ifsta->assoc_tries++;
  752. if (ifsta->assoc_tries > IEEE80211_ASSOC_MAX_TRIES) {
  753. printk(KERN_DEBUG "%s: association with AP %s"
  754. " timed out\n",
  755. dev->name, print_mac(mac, ifsta->bssid));
  756. ifsta->state = IEEE80211_DISABLED;
  757. return;
  758. }
  759. ifsta->state = IEEE80211_ASSOCIATE;
  760. printk(KERN_DEBUG "%s: associate with AP %s\n",
  761. dev->name, print_mac(mac, ifsta->bssid));
  762. if (ieee80211_privacy_mismatch(dev, ifsta)) {
  763. printk(KERN_DEBUG "%s: mismatch in privacy configuration and "
  764. "mixed-cell disabled - abort association\n", dev->name);
  765. ifsta->state = IEEE80211_DISABLED;
  766. return;
  767. }
  768. ieee80211_send_assoc(dev, ifsta);
  769. mod_timer(&ifsta->timer, jiffies + IEEE80211_ASSOC_TIMEOUT);
  770. }
  771. static void ieee80211_associated(struct net_device *dev,
  772. struct ieee80211_if_sta *ifsta)
  773. {
  774. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  775. struct sta_info *sta;
  776. int disassoc;
  777. DECLARE_MAC_BUF(mac);
  778. /* TODO: start monitoring current AP signal quality and number of
  779. * missed beacons. Scan other channels every now and then and search
  780. * for better APs. */
  781. /* TODO: remove expired BSSes */
  782. ifsta->state = IEEE80211_ASSOCIATED;
  783. rcu_read_lock();
  784. sta = sta_info_get(local, ifsta->bssid);
  785. if (!sta) {
  786. printk(KERN_DEBUG "%s: No STA entry for own AP %s\n",
  787. dev->name, print_mac(mac, ifsta->bssid));
  788. disassoc = 1;
  789. } else {
  790. disassoc = 0;
  791. if (time_after(jiffies,
  792. sta->last_rx + IEEE80211_MONITORING_INTERVAL)) {
  793. if (ifsta->flags & IEEE80211_STA_PROBEREQ_POLL) {
  794. printk(KERN_DEBUG "%s: No ProbeResp from "
  795. "current AP %s - assume out of "
  796. "range\n",
  797. dev->name, print_mac(mac, ifsta->bssid));
  798. disassoc = 1;
  799. sta_info_unlink(&sta);
  800. } else
  801. ieee80211_send_probe_req(dev, ifsta->bssid,
  802. local->scan_ssid,
  803. local->scan_ssid_len);
  804. ifsta->flags ^= IEEE80211_STA_PROBEREQ_POLL;
  805. } else {
  806. ifsta->flags &= ~IEEE80211_STA_PROBEREQ_POLL;
  807. if (time_after(jiffies, ifsta->last_probe +
  808. IEEE80211_PROBE_INTERVAL)) {
  809. ifsta->last_probe = jiffies;
  810. ieee80211_send_probe_req(dev, ifsta->bssid,
  811. ifsta->ssid,
  812. ifsta->ssid_len);
  813. }
  814. }
  815. }
  816. rcu_read_unlock();
  817. if (disassoc && sta)
  818. sta_info_destroy(sta);
  819. if (disassoc) {
  820. ifsta->state = IEEE80211_DISABLED;
  821. ieee80211_set_associated(dev, ifsta, 0);
  822. } else {
  823. mod_timer(&ifsta->timer, jiffies +
  824. IEEE80211_MONITORING_INTERVAL);
  825. }
  826. }
  827. static void ieee80211_send_probe_req(struct net_device *dev, u8 *dst,
  828. u8 *ssid, size_t ssid_len)
  829. {
  830. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  831. struct ieee80211_supported_band *sband;
  832. struct sk_buff *skb;
  833. struct ieee80211_mgmt *mgmt;
  834. u8 *pos, *supp_rates, *esupp_rates = NULL;
  835. int i;
  836. skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*mgmt) + 200);
  837. if (!skb) {
  838. printk(KERN_DEBUG "%s: failed to allocate buffer for probe "
  839. "request\n", dev->name);
  840. return;
  841. }
  842. skb_reserve(skb, local->hw.extra_tx_headroom);
  843. mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
  844. memset(mgmt, 0, 24);
  845. mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
  846. IEEE80211_STYPE_PROBE_REQ);
  847. memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
  848. if (dst) {
  849. memcpy(mgmt->da, dst, ETH_ALEN);
  850. memcpy(mgmt->bssid, dst, ETH_ALEN);
  851. } else {
  852. memset(mgmt->da, 0xff, ETH_ALEN);
  853. memset(mgmt->bssid, 0xff, ETH_ALEN);
  854. }
  855. pos = skb_put(skb, 2 + ssid_len);
  856. *pos++ = WLAN_EID_SSID;
  857. *pos++ = ssid_len;
  858. memcpy(pos, ssid, ssid_len);
  859. supp_rates = skb_put(skb, 2);
  860. supp_rates[0] = WLAN_EID_SUPP_RATES;
  861. supp_rates[1] = 0;
  862. sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
  863. for (i = 0; i < sband->n_bitrates; i++) {
  864. struct ieee80211_rate *rate = &sband->bitrates[i];
  865. if (esupp_rates) {
  866. pos = skb_put(skb, 1);
  867. esupp_rates[1]++;
  868. } else if (supp_rates[1] == 8) {
  869. esupp_rates = skb_put(skb, 3);
  870. esupp_rates[0] = WLAN_EID_EXT_SUPP_RATES;
  871. esupp_rates[1] = 1;
  872. pos = &esupp_rates[2];
  873. } else {
  874. pos = skb_put(skb, 1);
  875. supp_rates[1]++;
  876. }
  877. *pos = rate->bitrate / 5;
  878. }
  879. ieee80211_sta_tx(dev, skb, 0);
  880. }
  881. static int ieee80211_sta_wep_configured(struct net_device *dev)
  882. {
  883. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  884. if (!sdata || !sdata->default_key ||
  885. sdata->default_key->conf.alg != ALG_WEP)
  886. return 0;
  887. return 1;
  888. }
  889. static void ieee80211_auth_completed(struct net_device *dev,
  890. struct ieee80211_if_sta *ifsta)
  891. {
  892. printk(KERN_DEBUG "%s: authenticated\n", dev->name);
  893. ifsta->flags |= IEEE80211_STA_AUTHENTICATED;
  894. ieee80211_associate(dev, ifsta);
  895. }
  896. static void ieee80211_auth_challenge(struct net_device *dev,
  897. struct ieee80211_if_sta *ifsta,
  898. struct ieee80211_mgmt *mgmt,
  899. size_t len)
  900. {
  901. u8 *pos;
  902. struct ieee802_11_elems elems;
  903. printk(KERN_DEBUG "%s: replying to auth challenge\n", dev->name);
  904. pos = mgmt->u.auth.variable;
  905. ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
  906. if (!elems.challenge) {
  907. printk(KERN_DEBUG "%s: no challenge IE in shared key auth "
  908. "frame\n", dev->name);
  909. return;
  910. }
  911. ieee80211_send_auth(dev, ifsta, 3, elems.challenge - 2,
  912. elems.challenge_len + 2, 1);
  913. }
  914. static void ieee80211_send_addba_resp(struct net_device *dev, u8 *da, u16 tid,
  915. u8 dialog_token, u16 status, u16 policy,
  916. u16 buf_size, u16 timeout)
  917. {
  918. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  919. struct ieee80211_if_sta *ifsta = &sdata->u.sta;
  920. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  921. struct sk_buff *skb;
  922. struct ieee80211_mgmt *mgmt;
  923. u16 capab;
  924. skb = dev_alloc_skb(sizeof(*mgmt) + local->hw.extra_tx_headroom);
  925. if (!skb) {
  926. printk(KERN_DEBUG "%s: failed to allocate buffer "
  927. "for addba resp frame\n", dev->name);
  928. return;
  929. }
  930. skb_reserve(skb, local->hw.extra_tx_headroom);
  931. mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
  932. memset(mgmt, 0, 24);
  933. memcpy(mgmt->da, da, ETH_ALEN);
  934. memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
  935. if (sdata->vif.type == IEEE80211_IF_TYPE_AP)
  936. memcpy(mgmt->bssid, dev->dev_addr, ETH_ALEN);
  937. else
  938. memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
  939. mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
  940. IEEE80211_STYPE_ACTION);
  941. skb_put(skb, 1 + sizeof(mgmt->u.action.u.addba_resp));
  942. mgmt->u.action.category = WLAN_CATEGORY_BACK;
  943. mgmt->u.action.u.addba_resp.action_code = WLAN_ACTION_ADDBA_RESP;
  944. mgmt->u.action.u.addba_resp.dialog_token = dialog_token;
  945. capab = (u16)(policy << 1); /* bit 1 aggregation policy */
  946. capab |= (u16)(tid << 2); /* bit 5:2 TID number */
  947. capab |= (u16)(buf_size << 6); /* bit 15:6 max size of aggregation */
  948. mgmt->u.action.u.addba_resp.capab = cpu_to_le16(capab);
  949. mgmt->u.action.u.addba_resp.timeout = cpu_to_le16(timeout);
  950. mgmt->u.action.u.addba_resp.status = cpu_to_le16(status);
  951. ieee80211_sta_tx(dev, skb, 0);
  952. return;
  953. }
  954. void ieee80211_send_addba_request(struct net_device *dev, const u8 *da,
  955. u16 tid, u8 dialog_token, u16 start_seq_num,
  956. u16 agg_size, u16 timeout)
  957. {
  958. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  959. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  960. struct ieee80211_if_sta *ifsta = &sdata->u.sta;
  961. struct sk_buff *skb;
  962. struct ieee80211_mgmt *mgmt;
  963. u16 capab;
  964. skb = dev_alloc_skb(sizeof(*mgmt) + local->hw.extra_tx_headroom);
  965. if (!skb) {
  966. printk(KERN_ERR "%s: failed to allocate buffer "
  967. "for addba request frame\n", dev->name);
  968. return;
  969. }
  970. skb_reserve(skb, local->hw.extra_tx_headroom);
  971. mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
  972. memset(mgmt, 0, 24);
  973. memcpy(mgmt->da, da, ETH_ALEN);
  974. memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
  975. if (sdata->vif.type == IEEE80211_IF_TYPE_AP)
  976. memcpy(mgmt->bssid, dev->dev_addr, ETH_ALEN);
  977. else
  978. memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
  979. mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
  980. IEEE80211_STYPE_ACTION);
  981. skb_put(skb, 1 + sizeof(mgmt->u.action.u.addba_req));
  982. mgmt->u.action.category = WLAN_CATEGORY_BACK;
  983. mgmt->u.action.u.addba_req.action_code = WLAN_ACTION_ADDBA_REQ;
  984. mgmt->u.action.u.addba_req.dialog_token = dialog_token;
  985. capab = (u16)(1 << 1); /* bit 1 aggregation policy */
  986. capab |= (u16)(tid << 2); /* bit 5:2 TID number */
  987. capab |= (u16)(agg_size << 6); /* bit 15:6 max size of aggergation */
  988. mgmt->u.action.u.addba_req.capab = cpu_to_le16(capab);
  989. mgmt->u.action.u.addba_req.timeout = cpu_to_le16(timeout);
  990. mgmt->u.action.u.addba_req.start_seq_num =
  991. cpu_to_le16(start_seq_num << 4);
  992. ieee80211_sta_tx(dev, skb, 0);
  993. }
  994. static void ieee80211_sta_process_addba_request(struct net_device *dev,
  995. struct ieee80211_mgmt *mgmt,
  996. size_t len)
  997. {
  998. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  999. struct ieee80211_hw *hw = &local->hw;
  1000. struct ieee80211_conf *conf = &hw->conf;
  1001. struct sta_info *sta;
  1002. struct tid_ampdu_rx *tid_agg_rx;
  1003. u16 capab, tid, timeout, ba_policy, buf_size, start_seq_num, status;
  1004. u8 dialog_token;
  1005. int ret = -EOPNOTSUPP;
  1006. DECLARE_MAC_BUF(mac);
  1007. rcu_read_lock();
  1008. sta = sta_info_get(local, mgmt->sa);
  1009. if (!sta) {
  1010. rcu_read_unlock();
  1011. return;
  1012. }
  1013. /* extract session parameters from addba request frame */
  1014. dialog_token = mgmt->u.action.u.addba_req.dialog_token;
  1015. timeout = le16_to_cpu(mgmt->u.action.u.addba_req.timeout);
  1016. start_seq_num =
  1017. le16_to_cpu(mgmt->u.action.u.addba_req.start_seq_num) >> 4;
  1018. capab = le16_to_cpu(mgmt->u.action.u.addba_req.capab);
  1019. ba_policy = (capab & IEEE80211_ADDBA_PARAM_POLICY_MASK) >> 1;
  1020. tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
  1021. buf_size = (capab & IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK) >> 6;
  1022. status = WLAN_STATUS_REQUEST_DECLINED;
  1023. /* sanity check for incoming parameters:
  1024. * check if configuration can support the BA policy
  1025. * and if buffer size does not exceeds max value */
  1026. if (((ba_policy != 1)
  1027. && (!(conf->ht_conf.cap & IEEE80211_HT_CAP_DELAY_BA)))
  1028. || (buf_size > IEEE80211_MAX_AMPDU_BUF)) {
  1029. status = WLAN_STATUS_INVALID_QOS_PARAM;
  1030. #ifdef CONFIG_MAC80211_HT_DEBUG
  1031. if (net_ratelimit())
  1032. printk(KERN_DEBUG "AddBA Req with bad params from "
  1033. "%s on tid %u. policy %d, buffer size %d\n",
  1034. print_mac(mac, mgmt->sa), tid, ba_policy,
  1035. buf_size);
  1036. #endif /* CONFIG_MAC80211_HT_DEBUG */
  1037. goto end_no_lock;
  1038. }
  1039. /* determine default buffer size */
  1040. if (buf_size == 0) {
  1041. struct ieee80211_supported_band *sband;
  1042. sband = local->hw.wiphy->bands[conf->channel->band];
  1043. buf_size = IEEE80211_MIN_AMPDU_BUF;
  1044. buf_size = buf_size << sband->ht_info.ampdu_factor;
  1045. }
  1046. /* examine state machine */
  1047. spin_lock_bh(&sta->ampdu_mlme.ampdu_rx);
  1048. if (sta->ampdu_mlme.tid_state_rx[tid] != HT_AGG_STATE_IDLE) {
  1049. #ifdef CONFIG_MAC80211_HT_DEBUG
  1050. if (net_ratelimit())
  1051. printk(KERN_DEBUG "unexpected AddBA Req from "
  1052. "%s on tid %u\n",
  1053. print_mac(mac, mgmt->sa), tid);
  1054. #endif /* CONFIG_MAC80211_HT_DEBUG */
  1055. goto end;
  1056. }
  1057. /* prepare A-MPDU MLME for Rx aggregation */
  1058. sta->ampdu_mlme.tid_rx[tid] =
  1059. kmalloc(sizeof(struct tid_ampdu_rx), GFP_ATOMIC);
  1060. if (!sta->ampdu_mlme.tid_rx[tid]) {
  1061. if (net_ratelimit())
  1062. printk(KERN_ERR "allocate rx mlme to tid %d failed\n",
  1063. tid);
  1064. goto end;
  1065. }
  1066. /* rx timer */
  1067. sta->ampdu_mlme.tid_rx[tid]->session_timer.function =
  1068. sta_rx_agg_session_timer_expired;
  1069. sta->ampdu_mlme.tid_rx[tid]->session_timer.data =
  1070. (unsigned long)&sta->timer_to_tid[tid];
  1071. init_timer(&sta->ampdu_mlme.tid_rx[tid]->session_timer);
  1072. tid_agg_rx = sta->ampdu_mlme.tid_rx[tid];
  1073. /* prepare reordering buffer */
  1074. tid_agg_rx->reorder_buf =
  1075. kmalloc(buf_size * sizeof(struct sk_buf *), GFP_ATOMIC);
  1076. if (!tid_agg_rx->reorder_buf) {
  1077. if (net_ratelimit())
  1078. printk(KERN_ERR "can not allocate reordering buffer "
  1079. "to tid %d\n", tid);
  1080. kfree(sta->ampdu_mlme.tid_rx[tid]);
  1081. goto end;
  1082. }
  1083. memset(tid_agg_rx->reorder_buf, 0,
  1084. buf_size * sizeof(struct sk_buf *));
  1085. if (local->ops->ampdu_action)
  1086. ret = local->ops->ampdu_action(hw, IEEE80211_AMPDU_RX_START,
  1087. sta->addr, tid, &start_seq_num);
  1088. #ifdef CONFIG_MAC80211_HT_DEBUG
  1089. printk(KERN_DEBUG "Rx A-MPDU request on tid %d result %d\n", tid, ret);
  1090. #endif /* CONFIG_MAC80211_HT_DEBUG */
  1091. if (ret) {
  1092. kfree(tid_agg_rx->reorder_buf);
  1093. kfree(tid_agg_rx);
  1094. sta->ampdu_mlme.tid_rx[tid] = NULL;
  1095. goto end;
  1096. }
  1097. /* change state and send addba resp */
  1098. sta->ampdu_mlme.tid_state_rx[tid] = HT_AGG_STATE_OPERATIONAL;
  1099. tid_agg_rx->dialog_token = dialog_token;
  1100. tid_agg_rx->ssn = start_seq_num;
  1101. tid_agg_rx->head_seq_num = start_seq_num;
  1102. tid_agg_rx->buf_size = buf_size;
  1103. tid_agg_rx->timeout = timeout;
  1104. tid_agg_rx->stored_mpdu_num = 0;
  1105. status = WLAN_STATUS_SUCCESS;
  1106. end:
  1107. spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx);
  1108. end_no_lock:
  1109. ieee80211_send_addba_resp(sta->sdata->dev, sta->addr, tid,
  1110. dialog_token, status, 1, buf_size, timeout);
  1111. rcu_read_unlock();
  1112. }
  1113. static void ieee80211_sta_process_addba_resp(struct net_device *dev,
  1114. struct ieee80211_mgmt *mgmt,
  1115. size_t len)
  1116. {
  1117. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1118. struct ieee80211_hw *hw = &local->hw;
  1119. struct sta_info *sta;
  1120. u16 capab;
  1121. u16 tid;
  1122. u8 *state;
  1123. rcu_read_lock();
  1124. sta = sta_info_get(local, mgmt->sa);
  1125. if (!sta) {
  1126. rcu_read_unlock();
  1127. return;
  1128. }
  1129. capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab);
  1130. tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
  1131. state = &sta->ampdu_mlme.tid_state_tx[tid];
  1132. spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
  1133. if (!(*state & HT_ADDBA_REQUESTED_MSK)) {
  1134. spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
  1135. printk(KERN_DEBUG "state not HT_ADDBA_REQUESTED_MSK:"
  1136. "%d\n", *state);
  1137. goto addba_resp_exit;
  1138. }
  1139. if (mgmt->u.action.u.addba_resp.dialog_token !=
  1140. sta->ampdu_mlme.tid_tx[tid]->dialog_token) {
  1141. spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
  1142. #ifdef CONFIG_MAC80211_HT_DEBUG
  1143. printk(KERN_DEBUG "wrong addBA response token, tid %d\n", tid);
  1144. #endif /* CONFIG_MAC80211_HT_DEBUG */
  1145. goto addba_resp_exit;
  1146. }
  1147. del_timer_sync(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
  1148. #ifdef CONFIG_MAC80211_HT_DEBUG
  1149. printk(KERN_DEBUG "switched off addBA timer for tid %d \n", tid);
  1150. #endif /* CONFIG_MAC80211_HT_DEBUG */
  1151. if (le16_to_cpu(mgmt->u.action.u.addba_resp.status)
  1152. == WLAN_STATUS_SUCCESS) {
  1153. if (*state & HT_ADDBA_RECEIVED_MSK)
  1154. printk(KERN_DEBUG "double addBA response\n");
  1155. *state |= HT_ADDBA_RECEIVED_MSK;
  1156. sta->ampdu_mlme.addba_req_num[tid] = 0;
  1157. if (*state == HT_AGG_STATE_OPERATIONAL) {
  1158. printk(KERN_DEBUG "Aggregation on for tid %d \n", tid);
  1159. ieee80211_wake_queue(hw, sta->tid_to_tx_q[tid]);
  1160. }
  1161. spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
  1162. printk(KERN_DEBUG "recipient accepted agg: tid %d \n", tid);
  1163. } else {
  1164. printk(KERN_DEBUG "recipient rejected agg: tid %d \n", tid);
  1165. sta->ampdu_mlme.addba_req_num[tid]++;
  1166. /* this will allow the state check in stop_BA_session */
  1167. *state = HT_AGG_STATE_OPERATIONAL;
  1168. spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
  1169. ieee80211_stop_tx_ba_session(hw, sta->addr, tid,
  1170. WLAN_BACK_INITIATOR);
  1171. }
  1172. addba_resp_exit:
  1173. rcu_read_unlock();
  1174. }
  1175. void ieee80211_send_delba(struct net_device *dev, const u8 *da, u16 tid,
  1176. u16 initiator, u16 reason_code)
  1177. {
  1178. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1179. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  1180. struct ieee80211_if_sta *ifsta = &sdata->u.sta;
  1181. struct sk_buff *skb;
  1182. struct ieee80211_mgmt *mgmt;
  1183. u16 params;
  1184. skb = dev_alloc_skb(sizeof(*mgmt) + local->hw.extra_tx_headroom);
  1185. if (!skb) {
  1186. printk(KERN_ERR "%s: failed to allocate buffer "
  1187. "for delba frame\n", dev->name);
  1188. return;
  1189. }
  1190. skb_reserve(skb, local->hw.extra_tx_headroom);
  1191. mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
  1192. memset(mgmt, 0, 24);
  1193. memcpy(mgmt->da, da, ETH_ALEN);
  1194. memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
  1195. if (sdata->vif.type == IEEE80211_IF_TYPE_AP)
  1196. memcpy(mgmt->bssid, dev->dev_addr, ETH_ALEN);
  1197. else
  1198. memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
  1199. mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
  1200. IEEE80211_STYPE_ACTION);
  1201. skb_put(skb, 1 + sizeof(mgmt->u.action.u.delba));
  1202. mgmt->u.action.category = WLAN_CATEGORY_BACK;
  1203. mgmt->u.action.u.delba.action_code = WLAN_ACTION_DELBA;
  1204. params = (u16)(initiator << 11); /* bit 11 initiator */
  1205. params |= (u16)(tid << 12); /* bit 15:12 TID number */
  1206. mgmt->u.action.u.delba.params = cpu_to_le16(params);
  1207. mgmt->u.action.u.delba.reason_code = cpu_to_le16(reason_code);
  1208. ieee80211_sta_tx(dev, skb, 0);
  1209. }
  1210. void ieee80211_sta_stop_rx_ba_session(struct net_device *dev, u8 *ra, u16 tid,
  1211. u16 initiator, u16 reason)
  1212. {
  1213. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1214. struct ieee80211_hw *hw = &local->hw;
  1215. struct sta_info *sta;
  1216. int ret, i;
  1217. DECLARE_MAC_BUF(mac);
  1218. rcu_read_lock();
  1219. sta = sta_info_get(local, ra);
  1220. if (!sta) {
  1221. rcu_read_unlock();
  1222. return;
  1223. }
  1224. /* check if TID is in operational state */
  1225. spin_lock_bh(&sta->ampdu_mlme.ampdu_rx);
  1226. if (sta->ampdu_mlme.tid_state_rx[tid]
  1227. != HT_AGG_STATE_OPERATIONAL) {
  1228. spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx);
  1229. rcu_read_unlock();
  1230. return;
  1231. }
  1232. sta->ampdu_mlme.tid_state_rx[tid] =
  1233. HT_AGG_STATE_REQ_STOP_BA_MSK |
  1234. (initiator << HT_AGG_STATE_INITIATOR_SHIFT);
  1235. spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx);
  1236. /* stop HW Rx aggregation. ampdu_action existence
  1237. * already verified in session init so we add the BUG_ON */
  1238. BUG_ON(!local->ops->ampdu_action);
  1239. #ifdef CONFIG_MAC80211_HT_DEBUG
  1240. printk(KERN_DEBUG "Rx BA session stop requested for %s tid %u\n",
  1241. print_mac(mac, ra), tid);
  1242. #endif /* CONFIG_MAC80211_HT_DEBUG */
  1243. ret = local->ops->ampdu_action(hw, IEEE80211_AMPDU_RX_STOP,
  1244. ra, tid, NULL);
  1245. if (ret)
  1246. printk(KERN_DEBUG "HW problem - can not stop rx "
  1247. "aggergation for tid %d\n", tid);
  1248. /* shutdown timer has not expired */
  1249. if (initiator != WLAN_BACK_TIMER)
  1250. del_timer_sync(&sta->ampdu_mlme.tid_rx[tid]->session_timer);
  1251. /* check if this is a self generated aggregation halt */
  1252. if (initiator == WLAN_BACK_RECIPIENT || initiator == WLAN_BACK_TIMER)
  1253. ieee80211_send_delba(dev, ra, tid, 0, reason);
  1254. /* free the reordering buffer */
  1255. for (i = 0; i < sta->ampdu_mlme.tid_rx[tid]->buf_size; i++) {
  1256. if (sta->ampdu_mlme.tid_rx[tid]->reorder_buf[i]) {
  1257. /* release the reordered frames */
  1258. dev_kfree_skb(sta->ampdu_mlme.tid_rx[tid]->reorder_buf[i]);
  1259. sta->ampdu_mlme.tid_rx[tid]->stored_mpdu_num--;
  1260. sta->ampdu_mlme.tid_rx[tid]->reorder_buf[i] = NULL;
  1261. }
  1262. }
  1263. /* free resources */
  1264. kfree(sta->ampdu_mlme.tid_rx[tid]->reorder_buf);
  1265. kfree(sta->ampdu_mlme.tid_rx[tid]);
  1266. sta->ampdu_mlme.tid_rx[tid] = NULL;
  1267. sta->ampdu_mlme.tid_state_rx[tid] = HT_AGG_STATE_IDLE;
  1268. rcu_read_unlock();
  1269. }
  1270. static void ieee80211_sta_process_delba(struct net_device *dev,
  1271. struct ieee80211_mgmt *mgmt, size_t len)
  1272. {
  1273. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1274. struct sta_info *sta;
  1275. u16 tid, params;
  1276. u16 initiator;
  1277. DECLARE_MAC_BUF(mac);
  1278. rcu_read_lock();
  1279. sta = sta_info_get(local, mgmt->sa);
  1280. if (!sta) {
  1281. rcu_read_unlock();
  1282. return;
  1283. }
  1284. params = le16_to_cpu(mgmt->u.action.u.delba.params);
  1285. tid = (params & IEEE80211_DELBA_PARAM_TID_MASK) >> 12;
  1286. initiator = (params & IEEE80211_DELBA_PARAM_INITIATOR_MASK) >> 11;
  1287. #ifdef CONFIG_MAC80211_HT_DEBUG
  1288. if (net_ratelimit())
  1289. printk(KERN_DEBUG "delba from %s (%s) tid %d reason code %d\n",
  1290. print_mac(mac, mgmt->sa),
  1291. initiator ? "initiator" : "recipient", tid,
  1292. mgmt->u.action.u.delba.reason_code);
  1293. #endif /* CONFIG_MAC80211_HT_DEBUG */
  1294. if (initiator == WLAN_BACK_INITIATOR)
  1295. ieee80211_sta_stop_rx_ba_session(dev, sta->addr, tid,
  1296. WLAN_BACK_INITIATOR, 0);
  1297. else { /* WLAN_BACK_RECIPIENT */
  1298. spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
  1299. sta->ampdu_mlme.tid_state_tx[tid] =
  1300. HT_AGG_STATE_OPERATIONAL;
  1301. spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
  1302. ieee80211_stop_tx_ba_session(&local->hw, sta->addr, tid,
  1303. WLAN_BACK_RECIPIENT);
  1304. }
  1305. rcu_read_unlock();
  1306. }
  1307. /*
  1308. * After sending add Block Ack request we activated a timer until
  1309. * add Block Ack response will arrive from the recipient.
  1310. * If this timer expires sta_addba_resp_timer_expired will be executed.
  1311. */
  1312. void sta_addba_resp_timer_expired(unsigned long data)
  1313. {
  1314. /* not an elegant detour, but there is no choice as the timer passes
  1315. * only one argument, and both sta_info and TID are needed, so init
  1316. * flow in sta_info_create gives the TID as data, while the timer_to_id
  1317. * array gives the sta through container_of */
  1318. u16 tid = *(int *)data;
  1319. struct sta_info *temp_sta = container_of((void *)data,
  1320. struct sta_info, timer_to_tid[tid]);
  1321. struct ieee80211_local *local = temp_sta->local;
  1322. struct ieee80211_hw *hw = &local->hw;
  1323. struct sta_info *sta;
  1324. u8 *state;
  1325. rcu_read_lock();
  1326. sta = sta_info_get(local, temp_sta->addr);
  1327. if (!sta) {
  1328. rcu_read_unlock();
  1329. return;
  1330. }
  1331. state = &sta->ampdu_mlme.tid_state_tx[tid];
  1332. /* check if the TID waits for addBA response */
  1333. spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
  1334. if (!(*state & HT_ADDBA_REQUESTED_MSK)) {
  1335. spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
  1336. *state = HT_AGG_STATE_IDLE;
  1337. printk(KERN_DEBUG "timer expired on tid %d but we are not "
  1338. "expecting addBA response there", tid);
  1339. goto timer_expired_exit;
  1340. }
  1341. printk(KERN_DEBUG "addBA response timer expired on tid %d\n", tid);
  1342. /* go through the state check in stop_BA_session */
  1343. *state = HT_AGG_STATE_OPERATIONAL;
  1344. spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
  1345. ieee80211_stop_tx_ba_session(hw, temp_sta->addr, tid,
  1346. WLAN_BACK_INITIATOR);
  1347. timer_expired_exit:
  1348. rcu_read_unlock();
  1349. }
  1350. /*
  1351. * After accepting the AddBA Request we activated a timer,
  1352. * resetting it after each frame that arrives from the originator.
  1353. * if this timer expires ieee80211_sta_stop_rx_ba_session will be executed.
  1354. */
  1355. static void sta_rx_agg_session_timer_expired(unsigned long data)
  1356. {
  1357. /* not an elegant detour, but there is no choice as the timer passes
  1358. * only one argument, and verious sta_info are needed here, so init
  1359. * flow in sta_info_create gives the TID as data, while the timer_to_id
  1360. * array gives the sta through container_of */
  1361. u8 *ptid = (u8 *)data;
  1362. u8 *timer_to_id = ptid - *ptid;
  1363. struct sta_info *sta = container_of(timer_to_id, struct sta_info,
  1364. timer_to_tid[0]);
  1365. printk(KERN_DEBUG "rx session timer expired on tid %d\n", (u16)*ptid);
  1366. ieee80211_sta_stop_rx_ba_session(sta->sdata->dev, sta->addr,
  1367. (u16)*ptid, WLAN_BACK_TIMER,
  1368. WLAN_REASON_QSTA_TIMEOUT);
  1369. }
  1370. void ieee80211_sta_tear_down_BA_sessions(struct net_device *dev, u8 *addr)
  1371. {
  1372. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1373. int i;
  1374. for (i = 0; i < STA_TID_NUM; i++) {
  1375. ieee80211_stop_tx_ba_session(&local->hw, addr, i,
  1376. WLAN_BACK_INITIATOR);
  1377. ieee80211_sta_stop_rx_ba_session(dev, addr, i,
  1378. WLAN_BACK_RECIPIENT,
  1379. WLAN_REASON_QSTA_LEAVE_QBSS);
  1380. }
  1381. }
  1382. static void ieee80211_rx_mgmt_auth(struct net_device *dev,
  1383. struct ieee80211_if_sta *ifsta,
  1384. struct ieee80211_mgmt *mgmt,
  1385. size_t len)
  1386. {
  1387. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  1388. u16 auth_alg, auth_transaction, status_code;
  1389. DECLARE_MAC_BUF(mac);
  1390. if (ifsta->state != IEEE80211_AUTHENTICATE &&
  1391. sdata->vif.type != IEEE80211_IF_TYPE_IBSS) {
  1392. printk(KERN_DEBUG "%s: authentication frame received from "
  1393. "%s, but not in authenticate state - ignored\n",
  1394. dev->name, print_mac(mac, mgmt->sa));
  1395. return;
  1396. }
  1397. if (len < 24 + 6) {
  1398. printk(KERN_DEBUG "%s: too short (%zd) authentication frame "
  1399. "received from %s - ignored\n",
  1400. dev->name, len, print_mac(mac, mgmt->sa));
  1401. return;
  1402. }
  1403. if (sdata->vif.type != IEEE80211_IF_TYPE_IBSS &&
  1404. memcmp(ifsta->bssid, mgmt->sa, ETH_ALEN) != 0) {
  1405. printk(KERN_DEBUG "%s: authentication frame received from "
  1406. "unknown AP (SA=%s BSSID=%s) - "
  1407. "ignored\n", dev->name, print_mac(mac, mgmt->sa),
  1408. print_mac(mac, mgmt->bssid));
  1409. return;
  1410. }
  1411. if (sdata->vif.type != IEEE80211_IF_TYPE_IBSS &&
  1412. memcmp(ifsta->bssid, mgmt->bssid, ETH_ALEN) != 0) {
  1413. printk(KERN_DEBUG "%s: authentication frame received from "
  1414. "unknown BSSID (SA=%s BSSID=%s) - "
  1415. "ignored\n", dev->name, print_mac(mac, mgmt->sa),
  1416. print_mac(mac, mgmt->bssid));
  1417. return;
  1418. }
  1419. auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
  1420. auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
  1421. status_code = le16_to_cpu(mgmt->u.auth.status_code);
  1422. printk(KERN_DEBUG "%s: RX authentication from %s (alg=%d "
  1423. "transaction=%d status=%d)\n",
  1424. dev->name, print_mac(mac, mgmt->sa), auth_alg,
  1425. auth_transaction, status_code);
  1426. if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS) {
  1427. /* IEEE 802.11 standard does not require authentication in IBSS
  1428. * networks and most implementations do not seem to use it.
  1429. * However, try to reply to authentication attempts if someone
  1430. * has actually implemented this.
  1431. * TODO: Could implement shared key authentication. */
  1432. if (auth_alg != WLAN_AUTH_OPEN || auth_transaction != 1) {
  1433. printk(KERN_DEBUG "%s: unexpected IBSS authentication "
  1434. "frame (alg=%d transaction=%d)\n",
  1435. dev->name, auth_alg, auth_transaction);
  1436. return;
  1437. }
  1438. ieee80211_send_auth(dev, ifsta, 2, NULL, 0, 0);
  1439. }
  1440. if (auth_alg != ifsta->auth_alg ||
  1441. auth_transaction != ifsta->auth_transaction) {
  1442. printk(KERN_DEBUG "%s: unexpected authentication frame "
  1443. "(alg=%d transaction=%d)\n",
  1444. dev->name, auth_alg, auth_transaction);
  1445. return;
  1446. }
  1447. if (status_code != WLAN_STATUS_SUCCESS) {
  1448. printk(KERN_DEBUG "%s: AP denied authentication (auth_alg=%d "
  1449. "code=%d)\n", dev->name, ifsta->auth_alg, status_code);
  1450. if (status_code == WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG) {
  1451. u8 algs[3];
  1452. const int num_algs = ARRAY_SIZE(algs);
  1453. int i, pos;
  1454. algs[0] = algs[1] = algs[2] = 0xff;
  1455. if (ifsta->auth_algs & IEEE80211_AUTH_ALG_OPEN)
  1456. algs[0] = WLAN_AUTH_OPEN;
  1457. if (ifsta->auth_algs & IEEE80211_AUTH_ALG_SHARED_KEY)
  1458. algs[1] = WLAN_AUTH_SHARED_KEY;
  1459. if (ifsta->auth_algs & IEEE80211_AUTH_ALG_LEAP)
  1460. algs[2] = WLAN_AUTH_LEAP;
  1461. if (ifsta->auth_alg == WLAN_AUTH_OPEN)
  1462. pos = 0;
  1463. else if (ifsta->auth_alg == WLAN_AUTH_SHARED_KEY)
  1464. pos = 1;
  1465. else
  1466. pos = 2;
  1467. for (i = 0; i < num_algs; i++) {
  1468. pos++;
  1469. if (pos >= num_algs)
  1470. pos = 0;
  1471. if (algs[pos] == ifsta->auth_alg ||
  1472. algs[pos] == 0xff)
  1473. continue;
  1474. if (algs[pos] == WLAN_AUTH_SHARED_KEY &&
  1475. !ieee80211_sta_wep_configured(dev))
  1476. continue;
  1477. ifsta->auth_alg = algs[pos];
  1478. printk(KERN_DEBUG "%s: set auth_alg=%d for "
  1479. "next try\n",
  1480. dev->name, ifsta->auth_alg);
  1481. break;
  1482. }
  1483. }
  1484. return;
  1485. }
  1486. switch (ifsta->auth_alg) {
  1487. case WLAN_AUTH_OPEN:
  1488. case WLAN_AUTH_LEAP:
  1489. ieee80211_auth_completed(dev, ifsta);
  1490. break;
  1491. case WLAN_AUTH_SHARED_KEY:
  1492. if (ifsta->auth_transaction == 4)
  1493. ieee80211_auth_completed(dev, ifsta);
  1494. else
  1495. ieee80211_auth_challenge(dev, ifsta, mgmt, len);
  1496. break;
  1497. }
  1498. }
  1499. static void ieee80211_rx_mgmt_deauth(struct net_device *dev,
  1500. struct ieee80211_if_sta *ifsta,
  1501. struct ieee80211_mgmt *mgmt,
  1502. size_t len)
  1503. {
  1504. u16 reason_code;
  1505. DECLARE_MAC_BUF(mac);
  1506. if (len < 24 + 2) {
  1507. printk(KERN_DEBUG "%s: too short (%zd) deauthentication frame "
  1508. "received from %s - ignored\n",
  1509. dev->name, len, print_mac(mac, mgmt->sa));
  1510. return;
  1511. }
  1512. if (memcmp(ifsta->bssid, mgmt->sa, ETH_ALEN) != 0) {
  1513. printk(KERN_DEBUG "%s: deauthentication frame received from "
  1514. "unknown AP (SA=%s BSSID=%s) - "
  1515. "ignored\n", dev->name, print_mac(mac, mgmt->sa),
  1516. print_mac(mac, mgmt->bssid));
  1517. return;
  1518. }
  1519. reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
  1520. printk(KERN_DEBUG "%s: RX deauthentication from %s"
  1521. " (reason=%d)\n",
  1522. dev->name, print_mac(mac, mgmt->sa), reason_code);
  1523. if (ifsta->flags & IEEE80211_STA_AUTHENTICATED)
  1524. printk(KERN_DEBUG "%s: deauthenticated\n", dev->name);
  1525. if (ifsta->state == IEEE80211_AUTHENTICATE ||
  1526. ifsta->state == IEEE80211_ASSOCIATE ||
  1527. ifsta->state == IEEE80211_ASSOCIATED) {
  1528. ifsta->state = IEEE80211_AUTHENTICATE;
  1529. mod_timer(&ifsta->timer, jiffies +
  1530. IEEE80211_RETRY_AUTH_INTERVAL);
  1531. }
  1532. ieee80211_set_disassoc(dev, ifsta, 1);
  1533. ifsta->flags &= ~IEEE80211_STA_AUTHENTICATED;
  1534. }
  1535. static void ieee80211_rx_mgmt_disassoc(struct net_device *dev,
  1536. struct ieee80211_if_sta *ifsta,
  1537. struct ieee80211_mgmt *mgmt,
  1538. size_t len)
  1539. {
  1540. u16 reason_code;
  1541. DECLARE_MAC_BUF(mac);
  1542. if (len < 24 + 2) {
  1543. printk(KERN_DEBUG "%s: too short (%zd) disassociation frame "
  1544. "received from %s - ignored\n",
  1545. dev->name, len, print_mac(mac, mgmt->sa));
  1546. return;
  1547. }
  1548. if (memcmp(ifsta->bssid, mgmt->sa, ETH_ALEN) != 0) {
  1549. printk(KERN_DEBUG "%s: disassociation frame received from "
  1550. "unknown AP (SA=%s BSSID=%s) - "
  1551. "ignored\n", dev->name, print_mac(mac, mgmt->sa),
  1552. print_mac(mac, mgmt->bssid));
  1553. return;
  1554. }
  1555. reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
  1556. printk(KERN_DEBUG "%s: RX disassociation from %s"
  1557. " (reason=%d)\n",
  1558. dev->name, print_mac(mac, mgmt->sa), reason_code);
  1559. if (ifsta->flags & IEEE80211_STA_ASSOCIATED)
  1560. printk(KERN_DEBUG "%s: disassociated\n", dev->name);
  1561. if (ifsta->state == IEEE80211_ASSOCIATED) {
  1562. ifsta->state = IEEE80211_ASSOCIATE;
  1563. mod_timer(&ifsta->timer, jiffies +
  1564. IEEE80211_RETRY_AUTH_INTERVAL);
  1565. }
  1566. ieee80211_set_disassoc(dev, ifsta, 0);
  1567. }
  1568. static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
  1569. struct ieee80211_if_sta *ifsta,
  1570. struct ieee80211_mgmt *mgmt,
  1571. size_t len,
  1572. int reassoc)
  1573. {
  1574. struct ieee80211_local *local = sdata->local;
  1575. struct net_device *dev = sdata->dev;
  1576. struct ieee80211_supported_band *sband;
  1577. struct sta_info *sta;
  1578. u64 rates, basic_rates;
  1579. u16 capab_info, status_code, aid;
  1580. struct ieee802_11_elems elems;
  1581. struct ieee80211_bss_conf *bss_conf = &sdata->bss_conf;
  1582. u8 *pos;
  1583. int i, j;
  1584. DECLARE_MAC_BUF(mac);
  1585. bool have_higher_than_11mbit = false;
  1586. /* AssocResp and ReassocResp have identical structure, so process both
  1587. * of them in this function. */
  1588. if (ifsta->state != IEEE80211_ASSOCIATE) {
  1589. printk(KERN_DEBUG "%s: association frame received from "
  1590. "%s, but not in associate state - ignored\n",
  1591. dev->name, print_mac(mac, mgmt->sa));
  1592. return;
  1593. }
  1594. if (len < 24 + 6) {
  1595. printk(KERN_DEBUG "%s: too short (%zd) association frame "
  1596. "received from %s - ignored\n",
  1597. dev->name, len, print_mac(mac, mgmt->sa));
  1598. return;
  1599. }
  1600. if (memcmp(ifsta->bssid, mgmt->sa, ETH_ALEN) != 0) {
  1601. printk(KERN_DEBUG "%s: association frame received from "
  1602. "unknown AP (SA=%s BSSID=%s) - "
  1603. "ignored\n", dev->name, print_mac(mac, mgmt->sa),
  1604. print_mac(mac, mgmt->bssid));
  1605. return;
  1606. }
  1607. capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
  1608. status_code = le16_to_cpu(mgmt->u.assoc_resp.status_code);
  1609. aid = le16_to_cpu(mgmt->u.assoc_resp.aid);
  1610. printk(KERN_DEBUG "%s: RX %sssocResp from %s (capab=0x%x "
  1611. "status=%d aid=%d)\n",
  1612. dev->name, reassoc ? "Rea" : "A", print_mac(mac, mgmt->sa),
  1613. capab_info, status_code, (u16)(aid & ~(BIT(15) | BIT(14))));
  1614. if (status_code != WLAN_STATUS_SUCCESS) {
  1615. printk(KERN_DEBUG "%s: AP denied association (code=%d)\n",
  1616. dev->name, status_code);
  1617. /* if this was a reassociation, ensure we try a "full"
  1618. * association next time. This works around some broken APs
  1619. * which do not correctly reject reassociation requests. */
  1620. ifsta->flags &= ~IEEE80211_STA_PREV_BSSID_SET;
  1621. return;
  1622. }
  1623. if ((aid & (BIT(15) | BIT(14))) != (BIT(15) | BIT(14)))
  1624. printk(KERN_DEBUG "%s: invalid aid value %d; bits 15:14 not "
  1625. "set\n", dev->name, aid);
  1626. aid &= ~(BIT(15) | BIT(14));
  1627. pos = mgmt->u.assoc_resp.variable;
  1628. ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
  1629. if (!elems.supp_rates) {
  1630. printk(KERN_DEBUG "%s: no SuppRates element in AssocResp\n",
  1631. dev->name);
  1632. return;
  1633. }
  1634. printk(KERN_DEBUG "%s: associated\n", dev->name);
  1635. ifsta->aid = aid;
  1636. ifsta->ap_capab = capab_info;
  1637. kfree(ifsta->assocresp_ies);
  1638. ifsta->assocresp_ies_len = len - (pos - (u8 *) mgmt);
  1639. ifsta->assocresp_ies = kmalloc(ifsta->assocresp_ies_len, GFP_KERNEL);
  1640. if (ifsta->assocresp_ies)
  1641. memcpy(ifsta->assocresp_ies, pos, ifsta->assocresp_ies_len);
  1642. rcu_read_lock();
  1643. /* Add STA entry for the AP */
  1644. sta = sta_info_get(local, ifsta->bssid);
  1645. if (!sta) {
  1646. struct ieee80211_sta_bss *bss;
  1647. int err;
  1648. sta = sta_info_alloc(sdata, ifsta->bssid, GFP_ATOMIC);
  1649. if (!sta) {
  1650. printk(KERN_DEBUG "%s: failed to alloc STA entry for"
  1651. " the AP\n", dev->name);
  1652. rcu_read_unlock();
  1653. return;
  1654. }
  1655. bss = ieee80211_rx_bss_get(dev, ifsta->bssid,
  1656. local->hw.conf.channel->center_freq,
  1657. ifsta->ssid, ifsta->ssid_len);
  1658. if (bss) {
  1659. sta->last_rssi = bss->rssi;
  1660. sta->last_signal = bss->signal;
  1661. sta->last_noise = bss->noise;
  1662. ieee80211_rx_bss_put(dev, bss);
  1663. }
  1664. err = sta_info_insert(sta);
  1665. if (err) {
  1666. printk(KERN_DEBUG "%s: failed to insert STA entry for"
  1667. " the AP (error %d)\n", dev->name, err);
  1668. rcu_read_unlock();
  1669. return;
  1670. }
  1671. }
  1672. /*
  1673. * FIXME: Do we really need to update the sta_info's information here?
  1674. * We already know about the AP (we found it in our list) so it
  1675. * should already be filled with the right info, no?
  1676. * As is stands, all this is racy because typically we assume
  1677. * the information that is filled in here (except flags) doesn't
  1678. * change while a STA structure is alive. As such, it should move
  1679. * to between the sta_info_alloc() and sta_info_insert() above.
  1680. */
  1681. sta->flags |= WLAN_STA_AUTH | WLAN_STA_ASSOC | WLAN_STA_ASSOC_AP |
  1682. WLAN_STA_AUTHORIZED;
  1683. rates = 0;
  1684. basic_rates = 0;
  1685. sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
  1686. for (i = 0; i < elems.supp_rates_len; i++) {
  1687. int rate = (elems.supp_rates[i] & 0x7f) * 5;
  1688. if (rate > 110)
  1689. have_higher_than_11mbit = true;
  1690. for (j = 0; j < sband->n_bitrates; j++) {
  1691. if (sband->bitrates[j].bitrate == rate)
  1692. rates |= BIT(j);
  1693. if (elems.supp_rates[i] & 0x80)
  1694. basic_rates |= BIT(j);
  1695. }
  1696. }
  1697. for (i = 0; i < elems.ext_supp_rates_len; i++) {
  1698. int rate = (elems.ext_supp_rates[i] & 0x7f) * 5;
  1699. if (rate > 110)
  1700. have_higher_than_11mbit = true;
  1701. for (j = 0; j < sband->n_bitrates; j++) {
  1702. if (sband->bitrates[j].bitrate == rate)
  1703. rates |= BIT(j);
  1704. if (elems.ext_supp_rates[i] & 0x80)
  1705. basic_rates |= BIT(j);
  1706. }
  1707. }
  1708. sta->supp_rates[local->hw.conf.channel->band] = rates;
  1709. sdata->basic_rates = basic_rates;
  1710. /* cf. IEEE 802.11 9.2.12 */
  1711. if (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ &&
  1712. have_higher_than_11mbit)
  1713. sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE;
  1714. else
  1715. sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE;
  1716. if (elems.ht_cap_elem && elems.ht_info_elem && elems.wmm_param) {
  1717. struct ieee80211_ht_bss_info bss_info;
  1718. ieee80211_ht_cap_ie_to_ht_info(
  1719. (struct ieee80211_ht_cap *)
  1720. elems.ht_cap_elem, &sta->ht_info);
  1721. ieee80211_ht_addt_info_ie_to_ht_bss_info(
  1722. (struct ieee80211_ht_addt_info *)
  1723. elems.ht_info_elem, &bss_info);
  1724. ieee80211_handle_ht(local, 1, &sta->ht_info, &bss_info);
  1725. }
  1726. rate_control_rate_init(sta, local);
  1727. if (elems.wmm_param && (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) {
  1728. sta->flags |= WLAN_STA_WME;
  1729. rcu_read_unlock();
  1730. ieee80211_sta_wmm_params(dev, ifsta, elems.wmm_param,
  1731. elems.wmm_param_len);
  1732. } else
  1733. rcu_read_unlock();
  1734. /* set AID and assoc capability,
  1735. * ieee80211_set_associated() will tell the driver */
  1736. bss_conf->aid = aid;
  1737. bss_conf->assoc_capability = capab_info;
  1738. ieee80211_set_associated(dev, ifsta, 1);
  1739. ieee80211_associated(dev, ifsta);
  1740. }
  1741. /* Caller must hold local->sta_bss_lock */
  1742. static void __ieee80211_rx_bss_hash_add(struct net_device *dev,
  1743. struct ieee80211_sta_bss *bss)
  1744. {
  1745. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1746. u8 hash_idx;
  1747. if (bss_mesh_cfg(bss))
  1748. hash_idx = mesh_id_hash(bss_mesh_id(bss),
  1749. bss_mesh_id_len(bss));
  1750. else
  1751. hash_idx = STA_HASH(bss->bssid);
  1752. bss->hnext = local->sta_bss_hash[hash_idx];
  1753. local->sta_bss_hash[hash_idx] = bss;
  1754. }
  1755. /* Caller must hold local->sta_bss_lock */
  1756. static void __ieee80211_rx_bss_hash_del(struct net_device *dev,
  1757. struct ieee80211_sta_bss *bss)
  1758. {
  1759. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1760. struct ieee80211_sta_bss *b, *prev = NULL;
  1761. b = local->sta_bss_hash[STA_HASH(bss->bssid)];
  1762. while (b) {
  1763. if (b == bss) {
  1764. if (!prev)
  1765. local->sta_bss_hash[STA_HASH(bss->bssid)] =
  1766. bss->hnext;
  1767. else
  1768. prev->hnext = bss->hnext;
  1769. break;
  1770. }
  1771. prev = b;
  1772. b = b->hnext;
  1773. }
  1774. }
  1775. static struct ieee80211_sta_bss *
  1776. ieee80211_rx_bss_add(struct net_device *dev, u8 *bssid, int freq,
  1777. u8 *ssid, u8 ssid_len)
  1778. {
  1779. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1780. struct ieee80211_sta_bss *bss;
  1781. bss = kzalloc(sizeof(*bss), GFP_ATOMIC);
  1782. if (!bss)
  1783. return NULL;
  1784. atomic_inc(&bss->users);
  1785. atomic_inc(&bss->users);
  1786. memcpy(bss->bssid, bssid, ETH_ALEN);
  1787. bss->freq = freq;
  1788. if (ssid && ssid_len <= IEEE80211_MAX_SSID_LEN) {
  1789. memcpy(bss->ssid, ssid, ssid_len);
  1790. bss->ssid_len = ssid_len;
  1791. }
  1792. spin_lock_bh(&local->sta_bss_lock);
  1793. /* TODO: order by RSSI? */
  1794. list_add_tail(&bss->list, &local->sta_bss_list);
  1795. __ieee80211_rx_bss_hash_add(dev, bss);
  1796. spin_unlock_bh(&local->sta_bss_lock);
  1797. return bss;
  1798. }
  1799. static struct ieee80211_sta_bss *
  1800. ieee80211_rx_bss_get(struct net_device *dev, u8 *bssid, int freq,
  1801. u8 *ssid, u8 ssid_len)
  1802. {
  1803. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1804. struct ieee80211_sta_bss *bss;
  1805. spin_lock_bh(&local->sta_bss_lock);
  1806. bss = local->sta_bss_hash[STA_HASH(bssid)];
  1807. while (bss) {
  1808. if (!bss_mesh_cfg(bss) &&
  1809. !memcmp(bss->bssid, bssid, ETH_ALEN) &&
  1810. bss->freq == freq &&
  1811. bss->ssid_len == ssid_len &&
  1812. (ssid_len == 0 || !memcmp(bss->ssid, ssid, ssid_len))) {
  1813. atomic_inc(&bss->users);
  1814. break;
  1815. }
  1816. bss = bss->hnext;
  1817. }
  1818. spin_unlock_bh(&local->sta_bss_lock);
  1819. return bss;
  1820. }
  1821. #ifdef CONFIG_MAC80211_MESH
  1822. static struct ieee80211_sta_bss *
  1823. ieee80211_rx_mesh_bss_get(struct net_device *dev, u8 *mesh_id, int mesh_id_len,
  1824. u8 *mesh_cfg, int freq)
  1825. {
  1826. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1827. struct ieee80211_sta_bss *bss;
  1828. spin_lock_bh(&local->sta_bss_lock);
  1829. bss = local->sta_bss_hash[mesh_id_hash(mesh_id, mesh_id_len)];
  1830. while (bss) {
  1831. if (bss_mesh_cfg(bss) &&
  1832. !memcmp(bss_mesh_cfg(bss), mesh_cfg, MESH_CFG_CMP_LEN) &&
  1833. bss->freq == freq &&
  1834. mesh_id_len == bss->mesh_id_len &&
  1835. (mesh_id_len == 0 || !memcmp(bss->mesh_id, mesh_id,
  1836. mesh_id_len))) {
  1837. atomic_inc(&bss->users);
  1838. break;
  1839. }
  1840. bss = bss->hnext;
  1841. }
  1842. spin_unlock_bh(&local->sta_bss_lock);
  1843. return bss;
  1844. }
  1845. static struct ieee80211_sta_bss *
  1846. ieee80211_rx_mesh_bss_add(struct net_device *dev, u8 *mesh_id, int mesh_id_len,
  1847. u8 *mesh_cfg, int mesh_config_len, int freq)
  1848. {
  1849. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1850. struct ieee80211_sta_bss *bss;
  1851. if (mesh_config_len != MESH_CFG_LEN)
  1852. return NULL;
  1853. bss = kzalloc(sizeof(*bss), GFP_ATOMIC);
  1854. if (!bss)
  1855. return NULL;
  1856. bss->mesh_cfg = kmalloc(MESH_CFG_CMP_LEN, GFP_ATOMIC);
  1857. if (!bss->mesh_cfg) {
  1858. kfree(bss);
  1859. return NULL;
  1860. }
  1861. if (mesh_id_len && mesh_id_len <= IEEE80211_MAX_MESH_ID_LEN) {
  1862. bss->mesh_id = kmalloc(mesh_id_len, GFP_ATOMIC);
  1863. if (!bss->mesh_id) {
  1864. kfree(bss->mesh_cfg);
  1865. kfree(bss);
  1866. return NULL;
  1867. }
  1868. memcpy(bss->mesh_id, mesh_id, mesh_id_len);
  1869. }
  1870. atomic_inc(&bss->users);
  1871. atomic_inc(&bss->users);
  1872. memcpy(bss->mesh_cfg, mesh_cfg, MESH_CFG_CMP_LEN);
  1873. bss->mesh_id_len = mesh_id_len;
  1874. bss->freq = freq;
  1875. spin_lock_bh(&local->sta_bss_lock);
  1876. /* TODO: order by RSSI? */
  1877. list_add_tail(&bss->list, &local->sta_bss_list);
  1878. __ieee80211_rx_bss_hash_add(dev, bss);
  1879. spin_unlock_bh(&local->sta_bss_lock);
  1880. return bss;
  1881. }
  1882. #endif
  1883. static void ieee80211_rx_bss_free(struct ieee80211_sta_bss *bss)
  1884. {
  1885. kfree(bss->wpa_ie);
  1886. kfree(bss->rsn_ie);
  1887. kfree(bss->wmm_ie);
  1888. kfree(bss->ht_ie);
  1889. kfree(bss_mesh_id(bss));
  1890. kfree(bss_mesh_cfg(bss));
  1891. kfree(bss);
  1892. }
  1893. static void ieee80211_rx_bss_put(struct net_device *dev,
  1894. struct ieee80211_sta_bss *bss)
  1895. {
  1896. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1897. local_bh_disable();
  1898. if (!atomic_dec_and_lock(&bss->users, &local->sta_bss_lock)) {
  1899. local_bh_enable();
  1900. return;
  1901. }
  1902. __ieee80211_rx_bss_hash_del(dev, bss);
  1903. list_del(&bss->list);
  1904. spin_unlock_bh(&local->sta_bss_lock);
  1905. ieee80211_rx_bss_free(bss);
  1906. }
  1907. void ieee80211_rx_bss_list_init(struct net_device *dev)
  1908. {
  1909. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1910. spin_lock_init(&local->sta_bss_lock);
  1911. INIT_LIST_HEAD(&local->sta_bss_list);
  1912. }
  1913. void ieee80211_rx_bss_list_deinit(struct net_device *dev)
  1914. {
  1915. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1916. struct ieee80211_sta_bss *bss, *tmp;
  1917. list_for_each_entry_safe(bss, tmp, &local->sta_bss_list, list)
  1918. ieee80211_rx_bss_put(dev, bss);
  1919. }
  1920. static int ieee80211_sta_join_ibss(struct net_device *dev,
  1921. struct ieee80211_if_sta *ifsta,
  1922. struct ieee80211_sta_bss *bss)
  1923. {
  1924. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  1925. int res, rates, i, j;
  1926. struct sk_buff *skb;
  1927. struct ieee80211_mgmt *mgmt;
  1928. struct ieee80211_tx_control control;
  1929. struct rate_selection ratesel;
  1930. u8 *pos;
  1931. struct ieee80211_sub_if_data *sdata;
  1932. struct ieee80211_supported_band *sband;
  1933. sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
  1934. sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  1935. /* Remove possible STA entries from other IBSS networks. */
  1936. sta_info_flush_delayed(sdata);
  1937. if (local->ops->reset_tsf) {
  1938. /* Reset own TSF to allow time synchronization work. */
  1939. local->ops->reset_tsf(local_to_hw(local));
  1940. }
  1941. memcpy(ifsta->bssid, bss->bssid, ETH_ALEN);
  1942. res = ieee80211_if_config(dev);
  1943. if (res)
  1944. return res;
  1945. local->hw.conf.beacon_int = bss->beacon_int >= 10 ? bss->beacon_int : 10;
  1946. sdata->drop_unencrypted = bss->capability &
  1947. WLAN_CAPABILITY_PRIVACY ? 1 : 0;
  1948. res = ieee80211_set_freq(local, bss->freq);
  1949. if (local->oper_channel->flags & IEEE80211_CHAN_NO_IBSS) {
  1950. printk(KERN_DEBUG "%s: IBSS not allowed on frequency "
  1951. "%d MHz\n", dev->name, local->oper_channel->center_freq);
  1952. return -1;
  1953. }
  1954. /* Set beacon template */
  1955. skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400);
  1956. do {
  1957. if (!skb)
  1958. break;
  1959. skb_reserve(skb, local->hw.extra_tx_headroom);
  1960. mgmt = (struct ieee80211_mgmt *)
  1961. skb_put(skb, 24 + sizeof(mgmt->u.beacon));
  1962. memset(mgmt, 0, 24 + sizeof(mgmt->u.beacon));
  1963. mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
  1964. IEEE80211_STYPE_BEACON);
  1965. memset(mgmt->da, 0xff, ETH_ALEN);
  1966. memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
  1967. memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
  1968. mgmt->u.beacon.beacon_int =
  1969. cpu_to_le16(local->hw.conf.beacon_int);
  1970. mgmt->u.beacon.capab_info = cpu_to_le16(bss->capability);
  1971. pos = skb_put(skb, 2 + ifsta->ssid_len);
  1972. *pos++ = WLAN_EID_SSID;
  1973. *pos++ = ifsta->ssid_len;
  1974. memcpy(pos, ifsta->ssid, ifsta->ssid_len);
  1975. rates = bss->supp_rates_len;
  1976. if (rates > 8)
  1977. rates = 8;
  1978. pos = skb_put(skb, 2 + rates);
  1979. *pos++ = WLAN_EID_SUPP_RATES;
  1980. *pos++ = rates;
  1981. memcpy(pos, bss->supp_rates, rates);
  1982. if (bss->band == IEEE80211_BAND_2GHZ) {
  1983. pos = skb_put(skb, 2 + 1);
  1984. *pos++ = WLAN_EID_DS_PARAMS;
  1985. *pos++ = 1;
  1986. *pos++ = ieee80211_frequency_to_channel(bss->freq);
  1987. }
  1988. pos = skb_put(skb, 2 + 2);
  1989. *pos++ = WLAN_EID_IBSS_PARAMS;
  1990. *pos++ = 2;
  1991. /* FIX: set ATIM window based on scan results */
  1992. *pos++ = 0;
  1993. *pos++ = 0;
  1994. if (bss->supp_rates_len > 8) {
  1995. rates = bss->supp_rates_len - 8;
  1996. pos = skb_put(skb, 2 + rates);
  1997. *pos++ = WLAN_EID_EXT_SUPP_RATES;
  1998. *pos++ = rates;
  1999. memcpy(pos, &bss->supp_rates[8], rates);
  2000. }
  2001. memset(&control, 0, sizeof(control));
  2002. rate_control_get_rate(dev, sband, skb, &ratesel);
  2003. if (!ratesel.rate) {
  2004. printk(KERN_DEBUG "%s: Failed to determine TX rate "
  2005. "for IBSS beacon\n", dev->name);
  2006. break;
  2007. }
  2008. control.vif = &sdata->vif;
  2009. control.tx_rate = ratesel.rate;
  2010. if (sdata->bss_conf.use_short_preamble &&
  2011. ratesel.rate->flags & IEEE80211_RATE_SHORT_PREAMBLE)
  2012. control.flags |= IEEE80211_TXCTL_SHORT_PREAMBLE;
  2013. control.antenna_sel_tx = local->hw.conf.antenna_sel_tx;
  2014. control.flags |= IEEE80211_TXCTL_NO_ACK;
  2015. control.retry_limit = 1;
  2016. ifsta->probe_resp = skb_copy(skb, GFP_ATOMIC);
  2017. if (ifsta->probe_resp) {
  2018. mgmt = (struct ieee80211_mgmt *)
  2019. ifsta->probe_resp->data;
  2020. mgmt->frame_control =
  2021. IEEE80211_FC(IEEE80211_FTYPE_MGMT,
  2022. IEEE80211_STYPE_PROBE_RESP);
  2023. } else {
  2024. printk(KERN_DEBUG "%s: Could not allocate ProbeResp "
  2025. "template for IBSS\n", dev->name);
  2026. }
  2027. if (local->ops->beacon_update &&
  2028. local->ops->beacon_update(local_to_hw(local),
  2029. skb, &control) == 0) {
  2030. printk(KERN_DEBUG "%s: Configured IBSS beacon "
  2031. "template\n", dev->name);
  2032. skb = NULL;
  2033. }
  2034. rates = 0;
  2035. sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
  2036. for (i = 0; i < bss->supp_rates_len; i++) {
  2037. int bitrate = (bss->supp_rates[i] & 0x7f) * 5;
  2038. for (j = 0; j < sband->n_bitrates; j++)
  2039. if (sband->bitrates[j].bitrate == bitrate)
  2040. rates |= BIT(j);
  2041. }
  2042. ifsta->supp_rates_bits[local->hw.conf.channel->band] = rates;
  2043. ieee80211_sta_def_wmm_params(dev, bss, 1);
  2044. } while (0);
  2045. if (skb) {
  2046. printk(KERN_DEBUG "%s: Failed to configure IBSS beacon "
  2047. "template\n", dev->name);
  2048. dev_kfree_skb(skb);
  2049. }
  2050. ifsta->state = IEEE80211_IBSS_JOINED;
  2051. mod_timer(&ifsta->timer, jiffies + IEEE80211_IBSS_MERGE_INTERVAL);
  2052. ieee80211_rx_bss_put(dev, bss);
  2053. return res;
  2054. }
  2055. u64 ieee80211_sta_get_rates(struct ieee80211_local *local,
  2056. struct ieee802_11_elems *elems,
  2057. enum ieee80211_band band)
  2058. {
  2059. struct ieee80211_supported_band *sband;
  2060. struct ieee80211_rate *bitrates;
  2061. size_t num_rates;
  2062. u64 supp_rates;
  2063. int i, j;
  2064. sband = local->hw.wiphy->bands[band];
  2065. if (!sband) {
  2066. WARN_ON(1);
  2067. sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
  2068. }
  2069. bitrates = sband->bitrates;
  2070. num_rates = sband->n_bitrates;
  2071. supp_rates = 0;
  2072. for (i = 0; i < elems->supp_rates_len +
  2073. elems->ext_supp_rates_len; i++) {
  2074. u8 rate = 0;
  2075. int own_rate;
  2076. if (i < elems->supp_rates_len)
  2077. rate = elems->supp_rates[i];
  2078. else if (elems->ext_supp_rates)
  2079. rate = elems->ext_supp_rates
  2080. [i - elems->supp_rates_len];
  2081. own_rate = 5 * (rate & 0x7f);
  2082. for (j = 0; j < num_rates; j++)
  2083. if (bitrates[j].bitrate == own_rate)
  2084. supp_rates |= BIT(j);
  2085. }
  2086. return supp_rates;
  2087. }
  2088. static void ieee80211_rx_bss_info(struct net_device *dev,
  2089. struct ieee80211_mgmt *mgmt,
  2090. size_t len,
  2091. struct ieee80211_rx_status *rx_status,
  2092. int beacon)
  2093. {
  2094. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  2095. struct ieee802_11_elems elems;
  2096. size_t baselen;
  2097. int freq, clen;
  2098. struct ieee80211_sta_bss *bss;
  2099. struct sta_info *sta;
  2100. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  2101. u64 beacon_timestamp, rx_timestamp;
  2102. struct ieee80211_channel *channel;
  2103. DECLARE_MAC_BUF(mac);
  2104. DECLARE_MAC_BUF(mac2);
  2105. if (!beacon && memcmp(mgmt->da, dev->dev_addr, ETH_ALEN))
  2106. return; /* ignore ProbeResp to foreign address */
  2107. #if 0
  2108. printk(KERN_DEBUG "%s: RX %s from %s to %s\n",
  2109. dev->name, beacon ? "Beacon" : "Probe Response",
  2110. print_mac(mac, mgmt->sa), print_mac(mac2, mgmt->da));
  2111. #endif
  2112. baselen = (u8 *) mgmt->u.beacon.variable - (u8 *) mgmt;
  2113. if (baselen > len)
  2114. return;
  2115. beacon_timestamp = le64_to_cpu(mgmt->u.beacon.timestamp);
  2116. ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen, &elems);
  2117. if (ieee80211_vif_is_mesh(&sdata->vif) && elems.mesh_id &&
  2118. elems.mesh_config && mesh_matches_local(&elems, dev)) {
  2119. u64 rates = ieee80211_sta_get_rates(local, &elems,
  2120. rx_status->band);
  2121. mesh_neighbour_update(mgmt->sa, rates, dev,
  2122. mesh_peer_accepts_plinks(&elems, dev));
  2123. }
  2124. rcu_read_lock();
  2125. if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS && elems.supp_rates &&
  2126. memcmp(mgmt->bssid, sdata->u.sta.bssid, ETH_ALEN) == 0 &&
  2127. (sta = sta_info_get(local, mgmt->sa))) {
  2128. u64 prev_rates;
  2129. u64 supp_rates = ieee80211_sta_get_rates(local, &elems,
  2130. rx_status->band);
  2131. prev_rates = sta->supp_rates[rx_status->band];
  2132. sta->supp_rates[rx_status->band] &= supp_rates;
  2133. if (sta->supp_rates[rx_status->band] == 0) {
  2134. /* No matching rates - this should not really happen.
  2135. * Make sure that at least one rate is marked
  2136. * supported to avoid issues with TX rate ctrl. */
  2137. sta->supp_rates[rx_status->band] =
  2138. sdata->u.sta.supp_rates_bits[rx_status->band];
  2139. }
  2140. if (sta->supp_rates[rx_status->band] != prev_rates) {
  2141. printk(KERN_DEBUG "%s: updated supp_rates set for "
  2142. "%s based on beacon info (0x%llx & 0x%llx -> "
  2143. "0x%llx)\n",
  2144. dev->name, print_mac(mac, sta->addr),
  2145. (unsigned long long) prev_rates,
  2146. (unsigned long long) supp_rates,
  2147. (unsigned long long) sta->supp_rates[rx_status->band]);
  2148. }
  2149. }
  2150. rcu_read_unlock();
  2151. if (elems.ds_params && elems.ds_params_len == 1)
  2152. freq = ieee80211_channel_to_frequency(elems.ds_params[0]);
  2153. else
  2154. freq = rx_status->freq;
  2155. channel = ieee80211_get_channel(local->hw.wiphy, freq);
  2156. if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
  2157. return;
  2158. #ifdef CONFIG_MAC80211_MESH
  2159. if (elems.mesh_config)
  2160. bss = ieee80211_rx_mesh_bss_get(dev, elems.mesh_id,
  2161. elems.mesh_id_len, elems.mesh_config, freq);
  2162. else
  2163. #endif
  2164. bss = ieee80211_rx_bss_get(dev, mgmt->bssid, freq,
  2165. elems.ssid, elems.ssid_len);
  2166. if (!bss) {
  2167. #ifdef CONFIG_MAC80211_MESH
  2168. if (elems.mesh_config)
  2169. bss = ieee80211_rx_mesh_bss_add(dev, elems.mesh_id,
  2170. elems.mesh_id_len, elems.mesh_config,
  2171. elems.mesh_config_len, freq);
  2172. else
  2173. #endif
  2174. bss = ieee80211_rx_bss_add(dev, mgmt->bssid, freq,
  2175. elems.ssid, elems.ssid_len);
  2176. if (!bss)
  2177. return;
  2178. } else {
  2179. #if 0
  2180. /* TODO: order by RSSI? */
  2181. spin_lock_bh(&local->sta_bss_lock);
  2182. list_move_tail(&bss->list, &local->sta_bss_list);
  2183. spin_unlock_bh(&local->sta_bss_lock);
  2184. #endif
  2185. }
  2186. /* save the ERP value so that it is available at association time */
  2187. if (elems.erp_info && elems.erp_info_len >= 1) {
  2188. bss->erp_value = elems.erp_info[0];
  2189. bss->has_erp_value = 1;
  2190. }
  2191. if (elems.ht_cap_elem &&
  2192. (!bss->ht_ie || bss->ht_ie_len != elems.ht_cap_elem_len ||
  2193. memcmp(bss->ht_ie, elems.ht_cap_elem, elems.ht_cap_elem_len))) {
  2194. kfree(bss->ht_ie);
  2195. bss->ht_ie = kmalloc(elems.ht_cap_elem_len + 2, GFP_ATOMIC);
  2196. if (bss->ht_ie) {
  2197. memcpy(bss->ht_ie, elems.ht_cap_elem - 2,
  2198. elems.ht_cap_elem_len + 2);
  2199. bss->ht_ie_len = elems.ht_cap_elem_len + 2;
  2200. } else
  2201. bss->ht_ie_len = 0;
  2202. } else if (!elems.ht_cap_elem && bss->ht_ie) {
  2203. kfree(bss->ht_ie);
  2204. bss->ht_ie = NULL;
  2205. bss->ht_ie_len = 0;
  2206. }
  2207. bss->beacon_int = le16_to_cpu(mgmt->u.beacon.beacon_int);
  2208. bss->capability = le16_to_cpu(mgmt->u.beacon.capab_info);
  2209. bss->supp_rates_len = 0;
  2210. if (elems.supp_rates) {
  2211. clen = IEEE80211_MAX_SUPP_RATES - bss->supp_rates_len;
  2212. if (clen > elems.supp_rates_len)
  2213. clen = elems.supp_rates_len;
  2214. memcpy(&bss->supp_rates[bss->supp_rates_len], elems.supp_rates,
  2215. clen);
  2216. bss->supp_rates_len += clen;
  2217. }
  2218. if (elems.ext_supp_rates) {
  2219. clen = IEEE80211_MAX_SUPP_RATES - bss->supp_rates_len;
  2220. if (clen > elems.ext_supp_rates_len)
  2221. clen = elems.ext_supp_rates_len;
  2222. memcpy(&bss->supp_rates[bss->supp_rates_len],
  2223. elems.ext_supp_rates, clen);
  2224. bss->supp_rates_len += clen;
  2225. }
  2226. bss->band = rx_status->band;
  2227. bss->timestamp = beacon_timestamp;
  2228. bss->last_update = jiffies;
  2229. bss->rssi = rx_status->ssi;
  2230. bss->signal = rx_status->signal;
  2231. bss->noise = rx_status->noise;
  2232. if (!beacon && !bss->probe_resp)
  2233. bss->probe_resp = true;
  2234. /*
  2235. * In STA mode, the remaining parameters should not be overridden
  2236. * by beacons because they're not necessarily accurate there.
  2237. */
  2238. if (sdata->vif.type != IEEE80211_IF_TYPE_IBSS &&
  2239. bss->probe_resp && beacon) {
  2240. ieee80211_rx_bss_put(dev, bss);
  2241. return;
  2242. }
  2243. if (elems.wpa &&
  2244. (!bss->wpa_ie || bss->wpa_ie_len != elems.wpa_len ||
  2245. memcmp(bss->wpa_ie, elems.wpa, elems.wpa_len))) {
  2246. kfree(bss->wpa_ie);
  2247. bss->wpa_ie = kmalloc(elems.wpa_len + 2, GFP_ATOMIC);
  2248. if (bss->wpa_ie) {
  2249. memcpy(bss->wpa_ie, elems.wpa - 2, elems.wpa_len + 2);
  2250. bss->wpa_ie_len = elems.wpa_len + 2;
  2251. } else
  2252. bss->wpa_ie_len = 0;
  2253. } else if (!elems.wpa && bss->wpa_ie) {
  2254. kfree(bss->wpa_ie);
  2255. bss->wpa_ie = NULL;
  2256. bss->wpa_ie_len = 0;
  2257. }
  2258. if (elems.rsn &&
  2259. (!bss->rsn_ie || bss->rsn_ie_len != elems.rsn_len ||
  2260. memcmp(bss->rsn_ie, elems.rsn, elems.rsn_len))) {
  2261. kfree(bss->rsn_ie);
  2262. bss->rsn_ie = kmalloc(elems.rsn_len + 2, GFP_ATOMIC);
  2263. if (bss->rsn_ie) {
  2264. memcpy(bss->rsn_ie, elems.rsn - 2, elems.rsn_len + 2);
  2265. bss->rsn_ie_len = elems.rsn_len + 2;
  2266. } else
  2267. bss->rsn_ie_len = 0;
  2268. } else if (!elems.rsn && bss->rsn_ie) {
  2269. kfree(bss->rsn_ie);
  2270. bss->rsn_ie = NULL;
  2271. bss->rsn_ie_len = 0;
  2272. }
  2273. /*
  2274. * Cf.
  2275. * http://www.wipo.int/pctdb/en/wo.jsp?wo=2007047181&IA=WO2007047181&DISPLAY=DESC
  2276. *
  2277. * quoting:
  2278. *
  2279. * In particular, "Wi-Fi CERTIFIED for WMM - Support for Multimedia
  2280. * Applications with Quality of Service in Wi-Fi Networks," Wi- Fi
  2281. * Alliance (September 1, 2004) is incorporated by reference herein.
  2282. * The inclusion of the WMM Parameters in probe responses and
  2283. * association responses is mandatory for WMM enabled networks. The
  2284. * inclusion of the WMM Parameters in beacons, however, is optional.
  2285. */
  2286. if (elems.wmm_param &&
  2287. (!bss->wmm_ie || bss->wmm_ie_len != elems.wmm_param_len ||
  2288. memcmp(bss->wmm_ie, elems.wmm_param, elems.wmm_param_len))) {
  2289. kfree(bss->wmm_ie);
  2290. bss->wmm_ie = kmalloc(elems.wmm_param_len + 2, GFP_ATOMIC);
  2291. if (bss->wmm_ie) {
  2292. memcpy(bss->wmm_ie, elems.wmm_param - 2,
  2293. elems.wmm_param_len + 2);
  2294. bss->wmm_ie_len = elems.wmm_param_len + 2;
  2295. } else
  2296. bss->wmm_ie_len = 0;
  2297. } else if (elems.wmm_info &&
  2298. (!bss->wmm_ie || bss->wmm_ie_len != elems.wmm_info_len ||
  2299. memcmp(bss->wmm_ie, elems.wmm_info, elems.wmm_info_len))) {
  2300. /* As for certain AP's Fifth bit is not set in WMM IE in
  2301. * beacon frames.So while parsing the beacon frame the
  2302. * wmm_info structure is used instead of wmm_param.
  2303. * wmm_info structure was never used to set bss->wmm_ie.
  2304. * This code fixes this problem by copying the WME
  2305. * information from wmm_info to bss->wmm_ie and enabling
  2306. * n-band association.
  2307. */
  2308. kfree(bss->wmm_ie);
  2309. bss->wmm_ie = kmalloc(elems.wmm_info_len + 2, GFP_ATOMIC);
  2310. if (bss->wmm_ie) {
  2311. memcpy(bss->wmm_ie, elems.wmm_info - 2,
  2312. elems.wmm_info_len + 2);
  2313. bss->wmm_ie_len = elems.wmm_info_len + 2;
  2314. } else
  2315. bss->wmm_ie_len = 0;
  2316. } else if (!elems.wmm_param && !elems.wmm_info && bss->wmm_ie) {
  2317. kfree(bss->wmm_ie);
  2318. bss->wmm_ie = NULL;
  2319. bss->wmm_ie_len = 0;
  2320. }
  2321. /* check if we need to merge IBSS */
  2322. if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS && beacon &&
  2323. !local->sta_sw_scanning && !local->sta_hw_scanning &&
  2324. bss->capability & WLAN_CAPABILITY_IBSS &&
  2325. bss->freq == local->oper_channel->center_freq &&
  2326. elems.ssid_len == sdata->u.sta.ssid_len &&
  2327. memcmp(elems.ssid, sdata->u.sta.ssid, sdata->u.sta.ssid_len) == 0) {
  2328. if (rx_status->flag & RX_FLAG_TSFT) {
  2329. /* in order for correct IBSS merging we need mactime
  2330. *
  2331. * since mactime is defined as the time the first data
  2332. * symbol of the frame hits the PHY, and the timestamp
  2333. * of the beacon is defined as "the time that the data
  2334. * symbol containing the first bit of the timestamp is
  2335. * transmitted to the PHY plus the transmitting STA’s
  2336. * delays through its local PHY from the MAC-PHY
  2337. * interface to its interface with the WM"
  2338. * (802.11 11.1.2) - equals the time this bit arrives at
  2339. * the receiver - we have to take into account the
  2340. * offset between the two.
  2341. * e.g: at 1 MBit that means mactime is 192 usec earlier
  2342. * (=24 bytes * 8 usecs/byte) than the beacon timestamp.
  2343. */
  2344. int rate = local->hw.wiphy->bands[rx_status->band]->
  2345. bitrates[rx_status->rate_idx].bitrate;
  2346. rx_timestamp = rx_status->mactime + (24 * 8 * 10 / rate);
  2347. } else if (local && local->ops && local->ops->get_tsf)
  2348. /* second best option: get current TSF */
  2349. rx_timestamp = local->ops->get_tsf(local_to_hw(local));
  2350. else
  2351. /* can't merge without knowing the TSF */
  2352. rx_timestamp = -1LLU;
  2353. #ifdef CONFIG_MAC80211_IBSS_DEBUG
  2354. printk(KERN_DEBUG "RX beacon SA=%s BSSID="
  2355. "%s TSF=0x%llx BCN=0x%llx diff=%lld @%lu\n",
  2356. print_mac(mac, mgmt->sa),
  2357. print_mac(mac2, mgmt->bssid),
  2358. (unsigned long long)rx_timestamp,
  2359. (unsigned long long)beacon_timestamp,
  2360. (unsigned long long)(rx_timestamp - beacon_timestamp),
  2361. jiffies);
  2362. #endif /* CONFIG_MAC80211_IBSS_DEBUG */
  2363. if (beacon_timestamp > rx_timestamp) {
  2364. #ifndef CONFIG_MAC80211_IBSS_DEBUG
  2365. if (net_ratelimit())
  2366. #endif
  2367. printk(KERN_DEBUG "%s: beacon TSF higher than "
  2368. "local TSF - IBSS merge with BSSID %s\n",
  2369. dev->name, print_mac(mac, mgmt->bssid));
  2370. ieee80211_sta_join_ibss(dev, &sdata->u.sta, bss);
  2371. ieee80211_ibss_add_sta(dev, NULL,
  2372. mgmt->bssid, mgmt->sa);
  2373. }
  2374. }
  2375. ieee80211_rx_bss_put(dev, bss);
  2376. }
  2377. static void ieee80211_rx_mgmt_probe_resp(struct net_device *dev,
  2378. struct ieee80211_mgmt *mgmt,
  2379. size_t len,
  2380. struct ieee80211_rx_status *rx_status)
  2381. {
  2382. ieee80211_rx_bss_info(dev, mgmt, len, rx_status, 0);
  2383. }
  2384. static void ieee80211_rx_mgmt_beacon(struct net_device *dev,
  2385. struct ieee80211_mgmt *mgmt,
  2386. size_t len,
  2387. struct ieee80211_rx_status *rx_status)
  2388. {
  2389. struct ieee80211_sub_if_data *sdata;
  2390. struct ieee80211_if_sta *ifsta;
  2391. size_t baselen;
  2392. struct ieee802_11_elems elems;
  2393. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  2394. struct ieee80211_conf *conf = &local->hw.conf;
  2395. u32 changed = 0;
  2396. ieee80211_rx_bss_info(dev, mgmt, len, rx_status, 1);
  2397. sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  2398. if (sdata->vif.type != IEEE80211_IF_TYPE_STA)
  2399. return;
  2400. ifsta = &sdata->u.sta;
  2401. if (!(ifsta->flags & IEEE80211_STA_ASSOCIATED) ||
  2402. memcmp(ifsta->bssid, mgmt->bssid, ETH_ALEN) != 0)
  2403. return;
  2404. /* Process beacon from the current BSS */
  2405. baselen = (u8 *) mgmt->u.beacon.variable - (u8 *) mgmt;
  2406. if (baselen > len)
  2407. return;
  2408. ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen, &elems);
  2409. if (elems.wmm_param && (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) {
  2410. ieee80211_sta_wmm_params(dev, ifsta, elems.wmm_param,
  2411. elems.wmm_param_len);
  2412. }
  2413. /* Do not send changes to driver if we are scanning. This removes
  2414. * requirement that driver's bss_info_changed function needs to be
  2415. * atomic. */
  2416. if (local->sta_sw_scanning || local->sta_hw_scanning)
  2417. return;
  2418. if (elems.erp_info && elems.erp_info_len >= 1)
  2419. changed |= ieee80211_handle_erp_ie(sdata, elems.erp_info[0]);
  2420. else {
  2421. u16 capab = le16_to_cpu(mgmt->u.beacon.capab_info);
  2422. changed |= ieee80211_handle_protect_preamb(sdata, false,
  2423. (capab & WLAN_CAPABILITY_SHORT_PREAMBLE) != 0);
  2424. }
  2425. if (elems.ht_cap_elem && elems.ht_info_elem &&
  2426. elems.wmm_param && conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) {
  2427. struct ieee80211_ht_bss_info bss_info;
  2428. ieee80211_ht_addt_info_ie_to_ht_bss_info(
  2429. (struct ieee80211_ht_addt_info *)
  2430. elems.ht_info_elem, &bss_info);
  2431. changed |= ieee80211_handle_ht(local, 1, &conf->ht_conf,
  2432. &bss_info);
  2433. }
  2434. ieee80211_bss_info_change_notify(sdata, changed);
  2435. }
  2436. static void ieee80211_rx_mgmt_probe_req(struct net_device *dev,
  2437. struct ieee80211_if_sta *ifsta,
  2438. struct ieee80211_mgmt *mgmt,
  2439. size_t len,
  2440. struct ieee80211_rx_status *rx_status)
  2441. {
  2442. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  2443. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  2444. int tx_last_beacon;
  2445. struct sk_buff *skb;
  2446. struct ieee80211_mgmt *resp;
  2447. u8 *pos, *end;
  2448. DECLARE_MAC_BUF(mac);
  2449. #ifdef CONFIG_MAC80211_IBSS_DEBUG
  2450. DECLARE_MAC_BUF(mac2);
  2451. DECLARE_MAC_BUF(mac3);
  2452. #endif
  2453. if (sdata->vif.type != IEEE80211_IF_TYPE_IBSS ||
  2454. ifsta->state != IEEE80211_IBSS_JOINED ||
  2455. len < 24 + 2 || !ifsta->probe_resp)
  2456. return;
  2457. if (local->ops->tx_last_beacon)
  2458. tx_last_beacon = local->ops->tx_last_beacon(local_to_hw(local));
  2459. else
  2460. tx_last_beacon = 1;
  2461. #ifdef CONFIG_MAC80211_IBSS_DEBUG
  2462. printk(KERN_DEBUG "%s: RX ProbeReq SA=%s DA=%s BSSID="
  2463. "%s (tx_last_beacon=%d)\n",
  2464. dev->name, print_mac(mac, mgmt->sa), print_mac(mac2, mgmt->da),
  2465. print_mac(mac3, mgmt->bssid), tx_last_beacon);
  2466. #endif /* CONFIG_MAC80211_IBSS_DEBUG */
  2467. if (!tx_last_beacon)
  2468. return;
  2469. if (memcmp(mgmt->bssid, ifsta->bssid, ETH_ALEN) != 0 &&
  2470. memcmp(mgmt->bssid, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) != 0)
  2471. return;
  2472. end = ((u8 *) mgmt) + len;
  2473. pos = mgmt->u.probe_req.variable;
  2474. if (pos[0] != WLAN_EID_SSID ||
  2475. pos + 2 + pos[1] > end) {
  2476. if (net_ratelimit()) {
  2477. printk(KERN_DEBUG "%s: Invalid SSID IE in ProbeReq "
  2478. "from %s\n",
  2479. dev->name, print_mac(mac, mgmt->sa));
  2480. }
  2481. return;
  2482. }
  2483. if (pos[1] != 0 &&
  2484. (pos[1] != ifsta->ssid_len ||
  2485. memcmp(pos + 2, ifsta->ssid, ifsta->ssid_len) != 0)) {
  2486. /* Ignore ProbeReq for foreign SSID */
  2487. return;
  2488. }
  2489. /* Reply with ProbeResp */
  2490. skb = skb_copy(ifsta->probe_resp, GFP_KERNEL);
  2491. if (!skb)
  2492. return;
  2493. resp = (struct ieee80211_mgmt *) skb->data;
  2494. memcpy(resp->da, mgmt->sa, ETH_ALEN);
  2495. #ifdef CONFIG_MAC80211_IBSS_DEBUG
  2496. printk(KERN_DEBUG "%s: Sending ProbeResp to %s\n",
  2497. dev->name, print_mac(mac, resp->da));
  2498. #endif /* CONFIG_MAC80211_IBSS_DEBUG */
  2499. ieee80211_sta_tx(dev, skb, 0);
  2500. }
  2501. static void ieee80211_rx_mgmt_action(struct net_device *dev,
  2502. struct ieee80211_if_sta *ifsta,
  2503. struct ieee80211_mgmt *mgmt,
  2504. size_t len,
  2505. struct ieee80211_rx_status *rx_status)
  2506. {
  2507. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  2508. if (len < IEEE80211_MIN_ACTION_SIZE)
  2509. return;
  2510. switch (mgmt->u.action.category) {
  2511. case WLAN_CATEGORY_BACK:
  2512. switch (mgmt->u.action.u.addba_req.action_code) {
  2513. case WLAN_ACTION_ADDBA_REQ:
  2514. if (len < (IEEE80211_MIN_ACTION_SIZE +
  2515. sizeof(mgmt->u.action.u.addba_req)))
  2516. break;
  2517. ieee80211_sta_process_addba_request(dev, mgmt, len);
  2518. break;
  2519. case WLAN_ACTION_ADDBA_RESP:
  2520. if (len < (IEEE80211_MIN_ACTION_SIZE +
  2521. sizeof(mgmt->u.action.u.addba_resp)))
  2522. break;
  2523. ieee80211_sta_process_addba_resp(dev, mgmt, len);
  2524. break;
  2525. case WLAN_ACTION_DELBA:
  2526. if (len < (IEEE80211_MIN_ACTION_SIZE +
  2527. sizeof(mgmt->u.action.u.delba)))
  2528. break;
  2529. ieee80211_sta_process_delba(dev, mgmt, len);
  2530. break;
  2531. default:
  2532. if (net_ratelimit())
  2533. printk(KERN_DEBUG "%s: Rx unknown A-MPDU action\n",
  2534. dev->name);
  2535. break;
  2536. }
  2537. break;
  2538. case PLINK_CATEGORY:
  2539. if (ieee80211_vif_is_mesh(&sdata->vif))
  2540. mesh_rx_plink_frame(dev, mgmt, len, rx_status);
  2541. break;
  2542. case MESH_PATH_SEL_CATEGORY:
  2543. if (ieee80211_vif_is_mesh(&sdata->vif))
  2544. mesh_rx_path_sel_frame(dev, mgmt, len);
  2545. break;
  2546. default:
  2547. if (net_ratelimit())
  2548. printk(KERN_DEBUG "%s: Rx unknown action frame - "
  2549. "category=%d\n", dev->name, mgmt->u.action.category);
  2550. break;
  2551. }
  2552. }
  2553. void ieee80211_sta_rx_mgmt(struct net_device *dev, struct sk_buff *skb,
  2554. struct ieee80211_rx_status *rx_status)
  2555. {
  2556. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  2557. struct ieee80211_sub_if_data *sdata;
  2558. struct ieee80211_if_sta *ifsta;
  2559. struct ieee80211_mgmt *mgmt;
  2560. u16 fc;
  2561. if (skb->len < 24)
  2562. goto fail;
  2563. sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  2564. ifsta = &sdata->u.sta;
  2565. mgmt = (struct ieee80211_mgmt *) skb->data;
  2566. fc = le16_to_cpu(mgmt->frame_control);
  2567. switch (fc & IEEE80211_FCTL_STYPE) {
  2568. case IEEE80211_STYPE_PROBE_REQ:
  2569. case IEEE80211_STYPE_PROBE_RESP:
  2570. case IEEE80211_STYPE_BEACON:
  2571. case IEEE80211_STYPE_ACTION:
  2572. memcpy(skb->cb, rx_status, sizeof(*rx_status));
  2573. case IEEE80211_STYPE_AUTH:
  2574. case IEEE80211_STYPE_ASSOC_RESP:
  2575. case IEEE80211_STYPE_REASSOC_RESP:
  2576. case IEEE80211_STYPE_DEAUTH:
  2577. case IEEE80211_STYPE_DISASSOC:
  2578. skb_queue_tail(&ifsta->skb_queue, skb);
  2579. queue_work(local->hw.workqueue, &ifsta->work);
  2580. return;
  2581. default:
  2582. printk(KERN_DEBUG "%s: received unknown management frame - "
  2583. "stype=%d\n", dev->name,
  2584. (fc & IEEE80211_FCTL_STYPE) >> 4);
  2585. break;
  2586. }
  2587. fail:
  2588. kfree_skb(skb);
  2589. }
  2590. static void ieee80211_sta_rx_queued_mgmt(struct net_device *dev,
  2591. struct sk_buff *skb)
  2592. {
  2593. struct ieee80211_rx_status *rx_status;
  2594. struct ieee80211_sub_if_data *sdata;
  2595. struct ieee80211_if_sta *ifsta;
  2596. struct ieee80211_mgmt *mgmt;
  2597. u16 fc;
  2598. sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  2599. ifsta = &sdata->u.sta;
  2600. rx_status = (struct ieee80211_rx_status *) skb->cb;
  2601. mgmt = (struct ieee80211_mgmt *) skb->data;
  2602. fc = le16_to_cpu(mgmt->frame_control);
  2603. switch (fc & IEEE80211_FCTL_STYPE) {
  2604. case IEEE80211_STYPE_PROBE_REQ:
  2605. ieee80211_rx_mgmt_probe_req(dev, ifsta, mgmt, skb->len,
  2606. rx_status);
  2607. break;
  2608. case IEEE80211_STYPE_PROBE_RESP:
  2609. ieee80211_rx_mgmt_probe_resp(dev, mgmt, skb->len, rx_status);
  2610. break;
  2611. case IEEE80211_STYPE_BEACON:
  2612. ieee80211_rx_mgmt_beacon(dev, mgmt, skb->len, rx_status);
  2613. break;
  2614. case IEEE80211_STYPE_AUTH:
  2615. ieee80211_rx_mgmt_auth(dev, ifsta, mgmt, skb->len);
  2616. break;
  2617. case IEEE80211_STYPE_ASSOC_RESP:
  2618. ieee80211_rx_mgmt_assoc_resp(sdata, ifsta, mgmt, skb->len, 0);
  2619. break;
  2620. case IEEE80211_STYPE_REASSOC_RESP:
  2621. ieee80211_rx_mgmt_assoc_resp(sdata, ifsta, mgmt, skb->len, 1);
  2622. break;
  2623. case IEEE80211_STYPE_DEAUTH:
  2624. ieee80211_rx_mgmt_deauth(dev, ifsta, mgmt, skb->len);
  2625. break;
  2626. case IEEE80211_STYPE_DISASSOC:
  2627. ieee80211_rx_mgmt_disassoc(dev, ifsta, mgmt, skb->len);
  2628. break;
  2629. case IEEE80211_STYPE_ACTION:
  2630. ieee80211_rx_mgmt_action(dev, ifsta, mgmt, skb->len, rx_status);
  2631. break;
  2632. }
  2633. kfree_skb(skb);
  2634. }
  2635. ieee80211_rx_result
  2636. ieee80211_sta_rx_scan(struct net_device *dev, struct sk_buff *skb,
  2637. struct ieee80211_rx_status *rx_status)
  2638. {
  2639. struct ieee80211_mgmt *mgmt;
  2640. u16 fc;
  2641. if (skb->len < 2)
  2642. return RX_DROP_UNUSABLE;
  2643. mgmt = (struct ieee80211_mgmt *) skb->data;
  2644. fc = le16_to_cpu(mgmt->frame_control);
  2645. if ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL)
  2646. return RX_CONTINUE;
  2647. if (skb->len < 24)
  2648. return RX_DROP_MONITOR;
  2649. if ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) {
  2650. if ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP) {
  2651. ieee80211_rx_mgmt_probe_resp(dev, mgmt,
  2652. skb->len, rx_status);
  2653. dev_kfree_skb(skb);
  2654. return RX_QUEUED;
  2655. } else if ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BEACON) {
  2656. ieee80211_rx_mgmt_beacon(dev, mgmt, skb->len,
  2657. rx_status);
  2658. dev_kfree_skb(skb);
  2659. return RX_QUEUED;
  2660. }
  2661. }
  2662. return RX_CONTINUE;
  2663. }
  2664. static int ieee80211_sta_active_ibss(struct net_device *dev)
  2665. {
  2666. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  2667. int active = 0;
  2668. struct sta_info *sta;
  2669. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  2670. rcu_read_lock();
  2671. list_for_each_entry_rcu(sta, &local->sta_list, list) {
  2672. if (sta->sdata == sdata &&
  2673. time_after(sta->last_rx + IEEE80211_IBSS_MERGE_INTERVAL,
  2674. jiffies)) {
  2675. active++;
  2676. break;
  2677. }
  2678. }
  2679. rcu_read_unlock();
  2680. return active;
  2681. }
  2682. static void ieee80211_sta_expire(struct net_device *dev, unsigned long exp_time)
  2683. {
  2684. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  2685. struct sta_info *sta, *tmp;
  2686. LIST_HEAD(tmp_list);
  2687. DECLARE_MAC_BUF(mac);
  2688. unsigned long flags;
  2689. spin_lock_irqsave(&local->sta_lock, flags);
  2690. list_for_each_entry_safe(sta, tmp, &local->sta_list, list)
  2691. if (time_after(jiffies, sta->last_rx + exp_time)) {
  2692. printk(KERN_DEBUG "%s: expiring inactive STA %s\n",
  2693. dev->name, print_mac(mac, sta->addr));
  2694. __sta_info_unlink(&sta);
  2695. if (sta)
  2696. list_add(&sta->list, &tmp_list);
  2697. }
  2698. spin_unlock_irqrestore(&local->sta_lock, flags);
  2699. list_for_each_entry_safe(sta, tmp, &tmp_list, list)
  2700. sta_info_destroy(sta);
  2701. }
  2702. static void ieee80211_sta_merge_ibss(struct net_device *dev,
  2703. struct ieee80211_if_sta *ifsta)
  2704. {
  2705. mod_timer(&ifsta->timer, jiffies + IEEE80211_IBSS_MERGE_INTERVAL);
  2706. ieee80211_sta_expire(dev, IEEE80211_IBSS_INACTIVITY_LIMIT);
  2707. if (ieee80211_sta_active_ibss(dev))
  2708. return;
  2709. printk(KERN_DEBUG "%s: No active IBSS STAs - trying to scan for other "
  2710. "IBSS networks with same SSID (merge)\n", dev->name);
  2711. ieee80211_sta_req_scan(dev, ifsta->ssid, ifsta->ssid_len);
  2712. }
  2713. #ifdef CONFIG_MAC80211_MESH
  2714. static void ieee80211_mesh_housekeeping(struct net_device *dev,
  2715. struct ieee80211_if_sta *ifsta)
  2716. {
  2717. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  2718. bool free_plinks;
  2719. ieee80211_sta_expire(dev, IEEE80211_MESH_PEER_INACTIVITY_LIMIT);
  2720. mesh_path_expire(dev);
  2721. free_plinks = mesh_plink_availables(sdata);
  2722. if (free_plinks != sdata->u.sta.accepting_plinks)
  2723. ieee80211_if_config_beacon(dev);
  2724. mod_timer(&ifsta->timer, jiffies +
  2725. IEEE80211_MESH_HOUSEKEEPING_INTERVAL);
  2726. }
  2727. void ieee80211_start_mesh(struct net_device *dev)
  2728. {
  2729. struct ieee80211_if_sta *ifsta;
  2730. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  2731. ifsta = &sdata->u.sta;
  2732. ifsta->state = IEEE80211_MESH_UP;
  2733. ieee80211_sta_timer((unsigned long)sdata);
  2734. }
  2735. #endif
  2736. void ieee80211_sta_timer(unsigned long data)
  2737. {
  2738. struct ieee80211_sub_if_data *sdata =
  2739. (struct ieee80211_sub_if_data *) data;
  2740. struct ieee80211_if_sta *ifsta = &sdata->u.sta;
  2741. struct ieee80211_local *local = wdev_priv(&sdata->wdev);
  2742. set_bit(IEEE80211_STA_REQ_RUN, &ifsta->request);
  2743. queue_work(local->hw.workqueue, &ifsta->work);
  2744. }
  2745. void ieee80211_sta_work(struct work_struct *work)
  2746. {
  2747. struct ieee80211_sub_if_data *sdata =
  2748. container_of(work, struct ieee80211_sub_if_data, u.sta.work);
  2749. struct net_device *dev = sdata->dev;
  2750. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  2751. struct ieee80211_if_sta *ifsta;
  2752. struct sk_buff *skb;
  2753. if (!netif_running(dev))
  2754. return;
  2755. if (local->sta_sw_scanning || local->sta_hw_scanning)
  2756. return;
  2757. if (sdata->vif.type != IEEE80211_IF_TYPE_STA &&
  2758. sdata->vif.type != IEEE80211_IF_TYPE_IBSS &&
  2759. sdata->vif.type != IEEE80211_IF_TYPE_MESH_POINT) {
  2760. printk(KERN_DEBUG "%s: ieee80211_sta_work: non-STA interface "
  2761. "(type=%d)\n", dev->name, sdata->vif.type);
  2762. return;
  2763. }
  2764. ifsta = &sdata->u.sta;
  2765. while ((skb = skb_dequeue(&ifsta->skb_queue)))
  2766. ieee80211_sta_rx_queued_mgmt(dev, skb);
  2767. #ifdef CONFIG_MAC80211_MESH
  2768. if (ifsta->preq_queue_len &&
  2769. time_after(jiffies,
  2770. ifsta->last_preq + msecs_to_jiffies(ifsta->mshcfg.dot11MeshHWMPpreqMinInterval)))
  2771. mesh_path_start_discovery(dev);
  2772. #endif
  2773. if (ifsta->state != IEEE80211_AUTHENTICATE &&
  2774. ifsta->state != IEEE80211_ASSOCIATE &&
  2775. test_and_clear_bit(IEEE80211_STA_REQ_SCAN, &ifsta->request)) {
  2776. if (ifsta->scan_ssid_len)
  2777. ieee80211_sta_start_scan(dev, ifsta->scan_ssid, ifsta->scan_ssid_len);
  2778. else
  2779. ieee80211_sta_start_scan(dev, NULL, 0);
  2780. return;
  2781. }
  2782. if (test_and_clear_bit(IEEE80211_STA_REQ_AUTH, &ifsta->request)) {
  2783. if (ieee80211_sta_config_auth(dev, ifsta))
  2784. return;
  2785. clear_bit(IEEE80211_STA_REQ_RUN, &ifsta->request);
  2786. } else if (!test_and_clear_bit(IEEE80211_STA_REQ_RUN, &ifsta->request))
  2787. return;
  2788. switch (ifsta->state) {
  2789. case IEEE80211_DISABLED:
  2790. break;
  2791. case IEEE80211_AUTHENTICATE:
  2792. ieee80211_authenticate(dev, ifsta);
  2793. break;
  2794. case IEEE80211_ASSOCIATE:
  2795. ieee80211_associate(dev, ifsta);
  2796. break;
  2797. case IEEE80211_ASSOCIATED:
  2798. ieee80211_associated(dev, ifsta);
  2799. break;
  2800. case IEEE80211_IBSS_SEARCH:
  2801. ieee80211_sta_find_ibss(dev, ifsta);
  2802. break;
  2803. case IEEE80211_IBSS_JOINED:
  2804. ieee80211_sta_merge_ibss(dev, ifsta);
  2805. break;
  2806. #ifdef CONFIG_MAC80211_MESH
  2807. case IEEE80211_MESH_UP:
  2808. ieee80211_mesh_housekeeping(dev, ifsta);
  2809. break;
  2810. #endif
  2811. default:
  2812. printk(KERN_DEBUG "ieee80211_sta_work: Unknown state %d\n",
  2813. ifsta->state);
  2814. break;
  2815. }
  2816. if (ieee80211_privacy_mismatch(dev, ifsta)) {
  2817. printk(KERN_DEBUG "%s: privacy configuration mismatch and "
  2818. "mixed-cell disabled - disassociate\n", dev->name);
  2819. ieee80211_send_disassoc(dev, ifsta, WLAN_REASON_UNSPECIFIED);
  2820. ieee80211_set_disassoc(dev, ifsta, 0);
  2821. }
  2822. }
  2823. static void ieee80211_sta_reset_auth(struct net_device *dev,
  2824. struct ieee80211_if_sta *ifsta)
  2825. {
  2826. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  2827. if (local->ops->reset_tsf) {
  2828. /* Reset own TSF to allow time synchronization work. */
  2829. local->ops->reset_tsf(local_to_hw(local));
  2830. }
  2831. ifsta->wmm_last_param_set = -1; /* allow any WMM update */
  2832. if (ifsta->auth_algs & IEEE80211_AUTH_ALG_OPEN)
  2833. ifsta->auth_alg = WLAN_AUTH_OPEN;
  2834. else if (ifsta->auth_algs & IEEE80211_AUTH_ALG_SHARED_KEY)
  2835. ifsta->auth_alg = WLAN_AUTH_SHARED_KEY;
  2836. else if (ifsta->auth_algs & IEEE80211_AUTH_ALG_LEAP)
  2837. ifsta->auth_alg = WLAN_AUTH_LEAP;
  2838. else
  2839. ifsta->auth_alg = WLAN_AUTH_OPEN;
  2840. printk(KERN_DEBUG "%s: Initial auth_alg=%d\n", dev->name,
  2841. ifsta->auth_alg);
  2842. ifsta->auth_transaction = -1;
  2843. ifsta->flags &= ~IEEE80211_STA_ASSOCIATED;
  2844. ifsta->auth_tries = ifsta->assoc_tries = 0;
  2845. netif_carrier_off(dev);
  2846. }
  2847. void ieee80211_sta_req_auth(struct net_device *dev,
  2848. struct ieee80211_if_sta *ifsta)
  2849. {
  2850. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  2851. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  2852. if (sdata->vif.type != IEEE80211_IF_TYPE_STA)
  2853. return;
  2854. if ((ifsta->flags & (IEEE80211_STA_BSSID_SET |
  2855. IEEE80211_STA_AUTO_BSSID_SEL)) &&
  2856. (ifsta->flags & (IEEE80211_STA_SSID_SET |
  2857. IEEE80211_STA_AUTO_SSID_SEL))) {
  2858. set_bit(IEEE80211_STA_REQ_AUTH, &ifsta->request);
  2859. queue_work(local->hw.workqueue, &ifsta->work);
  2860. }
  2861. }
  2862. static int ieee80211_sta_match_ssid(struct ieee80211_if_sta *ifsta,
  2863. const char *ssid, int ssid_len)
  2864. {
  2865. int tmp, hidden_ssid;
  2866. if (ssid_len == ifsta->ssid_len &&
  2867. !memcmp(ifsta->ssid, ssid, ssid_len))
  2868. return 1;
  2869. if (ifsta->flags & IEEE80211_STA_AUTO_BSSID_SEL)
  2870. return 0;
  2871. hidden_ssid = 1;
  2872. tmp = ssid_len;
  2873. while (tmp--) {
  2874. if (ssid[tmp] != '\0') {
  2875. hidden_ssid = 0;
  2876. break;
  2877. }
  2878. }
  2879. if (hidden_ssid && ifsta->ssid_len == ssid_len)
  2880. return 1;
  2881. if (ssid_len == 1 && ssid[0] == ' ')
  2882. return 1;
  2883. return 0;
  2884. }
  2885. static int ieee80211_sta_config_auth(struct net_device *dev,
  2886. struct ieee80211_if_sta *ifsta)
  2887. {
  2888. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  2889. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  2890. struct ieee80211_sta_bss *bss, *selected = NULL;
  2891. int top_rssi = 0, freq;
  2892. if (!(ifsta->flags & (IEEE80211_STA_AUTO_SSID_SEL |
  2893. IEEE80211_STA_AUTO_BSSID_SEL | IEEE80211_STA_AUTO_CHANNEL_SEL))) {
  2894. ifsta->state = IEEE80211_AUTHENTICATE;
  2895. ieee80211_sta_reset_auth(dev, ifsta);
  2896. return 0;
  2897. }
  2898. spin_lock_bh(&local->sta_bss_lock);
  2899. freq = local->oper_channel->center_freq;
  2900. list_for_each_entry(bss, &local->sta_bss_list, list) {
  2901. if (!(bss->capability & WLAN_CAPABILITY_ESS))
  2902. continue;
  2903. if (!!(bss->capability & WLAN_CAPABILITY_PRIVACY) ^
  2904. !!sdata->default_key)
  2905. continue;
  2906. if (!(ifsta->flags & IEEE80211_STA_AUTO_CHANNEL_SEL) &&
  2907. bss->freq != freq)
  2908. continue;
  2909. if (!(ifsta->flags & IEEE80211_STA_AUTO_BSSID_SEL) &&
  2910. memcmp(bss->bssid, ifsta->bssid, ETH_ALEN))
  2911. continue;
  2912. if (!(ifsta->flags & IEEE80211_STA_AUTO_SSID_SEL) &&
  2913. !ieee80211_sta_match_ssid(ifsta, bss->ssid, bss->ssid_len))
  2914. continue;
  2915. if (!selected || top_rssi < bss->rssi) {
  2916. selected = bss;
  2917. top_rssi = bss->rssi;
  2918. }
  2919. }
  2920. if (selected)
  2921. atomic_inc(&selected->users);
  2922. spin_unlock_bh(&local->sta_bss_lock);
  2923. if (selected) {
  2924. ieee80211_set_freq(local, selected->freq);
  2925. if (!(ifsta->flags & IEEE80211_STA_SSID_SET))
  2926. ieee80211_sta_set_ssid(dev, selected->ssid,
  2927. selected->ssid_len);
  2928. ieee80211_sta_set_bssid(dev, selected->bssid);
  2929. ieee80211_sta_def_wmm_params(dev, selected, 0);
  2930. ieee80211_rx_bss_put(dev, selected);
  2931. ifsta->state = IEEE80211_AUTHENTICATE;
  2932. ieee80211_sta_reset_auth(dev, ifsta);
  2933. return 0;
  2934. } else {
  2935. if (ifsta->state != IEEE80211_AUTHENTICATE) {
  2936. if (ifsta->flags & IEEE80211_STA_AUTO_SSID_SEL)
  2937. ieee80211_sta_start_scan(dev, NULL, 0);
  2938. else
  2939. ieee80211_sta_start_scan(dev, ifsta->ssid,
  2940. ifsta->ssid_len);
  2941. ifsta->state = IEEE80211_AUTHENTICATE;
  2942. set_bit(IEEE80211_STA_REQ_AUTH, &ifsta->request);
  2943. } else
  2944. ifsta->state = IEEE80211_DISABLED;
  2945. }
  2946. return -1;
  2947. }
  2948. static int ieee80211_sta_create_ibss(struct net_device *dev,
  2949. struct ieee80211_if_sta *ifsta)
  2950. {
  2951. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  2952. struct ieee80211_sta_bss *bss;
  2953. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  2954. struct ieee80211_supported_band *sband;
  2955. u8 bssid[ETH_ALEN], *pos;
  2956. int i;
  2957. DECLARE_MAC_BUF(mac);
  2958. #if 0
  2959. /* Easier testing, use fixed BSSID. */
  2960. memset(bssid, 0xfe, ETH_ALEN);
  2961. #else
  2962. /* Generate random, not broadcast, locally administered BSSID. Mix in
  2963. * own MAC address to make sure that devices that do not have proper
  2964. * random number generator get different BSSID. */
  2965. get_random_bytes(bssid, ETH_ALEN);
  2966. for (i = 0; i < ETH_ALEN; i++)
  2967. bssid[i] ^= dev->dev_addr[i];
  2968. bssid[0] &= ~0x01;
  2969. bssid[0] |= 0x02;
  2970. #endif
  2971. printk(KERN_DEBUG "%s: Creating new IBSS network, BSSID %s\n",
  2972. dev->name, print_mac(mac, bssid));
  2973. bss = ieee80211_rx_bss_add(dev, bssid,
  2974. local->hw.conf.channel->center_freq,
  2975. sdata->u.sta.ssid, sdata->u.sta.ssid_len);
  2976. if (!bss)
  2977. return -ENOMEM;
  2978. bss->band = local->hw.conf.channel->band;
  2979. sband = local->hw.wiphy->bands[bss->band];
  2980. if (local->hw.conf.beacon_int == 0)
  2981. local->hw.conf.beacon_int = 10000;
  2982. bss->beacon_int = local->hw.conf.beacon_int;
  2983. bss->last_update = jiffies;
  2984. bss->capability = WLAN_CAPABILITY_IBSS;
  2985. if (sdata->default_key)
  2986. bss->capability |= WLAN_CAPABILITY_PRIVACY;
  2987. else
  2988. sdata->drop_unencrypted = 0;
  2989. bss->supp_rates_len = sband->n_bitrates;
  2990. pos = bss->supp_rates;
  2991. for (i = 0; i < sband->n_bitrates; i++) {
  2992. int rate = sband->bitrates[i].bitrate;
  2993. *pos++ = (u8) (rate / 5);
  2994. }
  2995. return ieee80211_sta_join_ibss(dev, ifsta, bss);
  2996. }
  2997. static int ieee80211_sta_find_ibss(struct net_device *dev,
  2998. struct ieee80211_if_sta *ifsta)
  2999. {
  3000. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  3001. struct ieee80211_sta_bss *bss;
  3002. int found = 0;
  3003. u8 bssid[ETH_ALEN];
  3004. int active_ibss;
  3005. DECLARE_MAC_BUF(mac);
  3006. DECLARE_MAC_BUF(mac2);
  3007. if (ifsta->ssid_len == 0)
  3008. return -EINVAL;
  3009. active_ibss = ieee80211_sta_active_ibss(dev);
  3010. #ifdef CONFIG_MAC80211_IBSS_DEBUG
  3011. printk(KERN_DEBUG "%s: sta_find_ibss (active_ibss=%d)\n",
  3012. dev->name, active_ibss);
  3013. #endif /* CONFIG_MAC80211_IBSS_DEBUG */
  3014. spin_lock_bh(&local->sta_bss_lock);
  3015. list_for_each_entry(bss, &local->sta_bss_list, list) {
  3016. if (ifsta->ssid_len != bss->ssid_len ||
  3017. memcmp(ifsta->ssid, bss->ssid, bss->ssid_len) != 0
  3018. || !(bss->capability & WLAN_CAPABILITY_IBSS))
  3019. continue;
  3020. #ifdef CONFIG_MAC80211_IBSS_DEBUG
  3021. printk(KERN_DEBUG " bssid=%s found\n",
  3022. print_mac(mac, bss->bssid));
  3023. #endif /* CONFIG_MAC80211_IBSS_DEBUG */
  3024. memcpy(bssid, bss->bssid, ETH_ALEN);
  3025. found = 1;
  3026. if (active_ibss || memcmp(bssid, ifsta->bssid, ETH_ALEN) != 0)
  3027. break;
  3028. }
  3029. spin_unlock_bh(&local->sta_bss_lock);
  3030. #ifdef CONFIG_MAC80211_IBSS_DEBUG
  3031. printk(KERN_DEBUG " sta_find_ibss: selected %s current "
  3032. "%s\n", print_mac(mac, bssid), print_mac(mac2, ifsta->bssid));
  3033. #endif /* CONFIG_MAC80211_IBSS_DEBUG */
  3034. if (found && memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0 &&
  3035. (bss = ieee80211_rx_bss_get(dev, bssid,
  3036. local->hw.conf.channel->center_freq,
  3037. ifsta->ssid, ifsta->ssid_len))) {
  3038. printk(KERN_DEBUG "%s: Selected IBSS BSSID %s"
  3039. " based on configured SSID\n",
  3040. dev->name, print_mac(mac, bssid));
  3041. return ieee80211_sta_join_ibss(dev, ifsta, bss);
  3042. }
  3043. #ifdef CONFIG_MAC80211_IBSS_DEBUG
  3044. printk(KERN_DEBUG " did not try to join ibss\n");
  3045. #endif /* CONFIG_MAC80211_IBSS_DEBUG */
  3046. /* Selected IBSS not found in current scan results - try to scan */
  3047. if (ifsta->state == IEEE80211_IBSS_JOINED &&
  3048. !ieee80211_sta_active_ibss(dev)) {
  3049. mod_timer(&ifsta->timer, jiffies +
  3050. IEEE80211_IBSS_MERGE_INTERVAL);
  3051. } else if (time_after(jiffies, local->last_scan_completed +
  3052. IEEE80211_SCAN_INTERVAL)) {
  3053. printk(KERN_DEBUG "%s: Trigger new scan to find an IBSS to "
  3054. "join\n", dev->name);
  3055. return ieee80211_sta_req_scan(dev, ifsta->ssid,
  3056. ifsta->ssid_len);
  3057. } else if (ifsta->state != IEEE80211_IBSS_JOINED) {
  3058. int interval = IEEE80211_SCAN_INTERVAL;
  3059. if (time_after(jiffies, ifsta->ibss_join_req +
  3060. IEEE80211_IBSS_JOIN_TIMEOUT)) {
  3061. if ((ifsta->flags & IEEE80211_STA_CREATE_IBSS) &&
  3062. (!(local->oper_channel->flags &
  3063. IEEE80211_CHAN_NO_IBSS)))
  3064. return ieee80211_sta_create_ibss(dev, ifsta);
  3065. if (ifsta->flags & IEEE80211_STA_CREATE_IBSS) {
  3066. printk(KERN_DEBUG "%s: IBSS not allowed on"
  3067. " %d MHz\n", dev->name,
  3068. local->hw.conf.channel->center_freq);
  3069. }
  3070. /* No IBSS found - decrease scan interval and continue
  3071. * scanning. */
  3072. interval = IEEE80211_SCAN_INTERVAL_SLOW;
  3073. }
  3074. ifsta->state = IEEE80211_IBSS_SEARCH;
  3075. mod_timer(&ifsta->timer, jiffies + interval);
  3076. return 0;
  3077. }
  3078. return 0;
  3079. }
  3080. int ieee80211_sta_set_ssid(struct net_device *dev, char *ssid, size_t len)
  3081. {
  3082. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  3083. struct ieee80211_if_sta *ifsta;
  3084. if (len > IEEE80211_MAX_SSID_LEN)
  3085. return -EINVAL;
  3086. ifsta = &sdata->u.sta;
  3087. if (ifsta->ssid_len != len || memcmp(ifsta->ssid, ssid, len) != 0)
  3088. ifsta->flags &= ~IEEE80211_STA_PREV_BSSID_SET;
  3089. memcpy(ifsta->ssid, ssid, len);
  3090. memset(ifsta->ssid + len, 0, IEEE80211_MAX_SSID_LEN - len);
  3091. ifsta->ssid_len = len;
  3092. if (len)
  3093. ifsta->flags |= IEEE80211_STA_SSID_SET;
  3094. else
  3095. ifsta->flags &= ~IEEE80211_STA_SSID_SET;
  3096. if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS &&
  3097. !(ifsta->flags & IEEE80211_STA_BSSID_SET)) {
  3098. ifsta->ibss_join_req = jiffies;
  3099. ifsta->state = IEEE80211_IBSS_SEARCH;
  3100. return ieee80211_sta_find_ibss(dev, ifsta);
  3101. }
  3102. return 0;
  3103. }
  3104. int ieee80211_sta_get_ssid(struct net_device *dev, char *ssid, size_t *len)
  3105. {
  3106. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  3107. struct ieee80211_if_sta *ifsta = &sdata->u.sta;
  3108. memcpy(ssid, ifsta->ssid, ifsta->ssid_len);
  3109. *len = ifsta->ssid_len;
  3110. return 0;
  3111. }
  3112. int ieee80211_sta_set_bssid(struct net_device *dev, u8 *bssid)
  3113. {
  3114. struct ieee80211_sub_if_data *sdata;
  3115. struct ieee80211_if_sta *ifsta;
  3116. int res;
  3117. sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  3118. ifsta = &sdata->u.sta;
  3119. if (memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0) {
  3120. memcpy(ifsta->bssid, bssid, ETH_ALEN);
  3121. res = ieee80211_if_config(dev);
  3122. if (res) {
  3123. printk(KERN_DEBUG "%s: Failed to config new BSSID to "
  3124. "the low-level driver\n", dev->name);
  3125. return res;
  3126. }
  3127. }
  3128. if (is_valid_ether_addr(bssid))
  3129. ifsta->flags |= IEEE80211_STA_BSSID_SET;
  3130. else
  3131. ifsta->flags &= ~IEEE80211_STA_BSSID_SET;
  3132. return 0;
  3133. }
  3134. static void ieee80211_send_nullfunc(struct ieee80211_local *local,
  3135. struct ieee80211_sub_if_data *sdata,
  3136. int powersave)
  3137. {
  3138. struct sk_buff *skb;
  3139. struct ieee80211_hdr *nullfunc;
  3140. u16 fc;
  3141. skb = dev_alloc_skb(local->hw.extra_tx_headroom + 24);
  3142. if (!skb) {
  3143. printk(KERN_DEBUG "%s: failed to allocate buffer for nullfunc "
  3144. "frame\n", sdata->dev->name);
  3145. return;
  3146. }
  3147. skb_reserve(skb, local->hw.extra_tx_headroom);
  3148. nullfunc = (struct ieee80211_hdr *) skb_put(skb, 24);
  3149. memset(nullfunc, 0, 24);
  3150. fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC |
  3151. IEEE80211_FCTL_TODS;
  3152. if (powersave)
  3153. fc |= IEEE80211_FCTL_PM;
  3154. nullfunc->frame_control = cpu_to_le16(fc);
  3155. memcpy(nullfunc->addr1, sdata->u.sta.bssid, ETH_ALEN);
  3156. memcpy(nullfunc->addr2, sdata->dev->dev_addr, ETH_ALEN);
  3157. memcpy(nullfunc->addr3, sdata->u.sta.bssid, ETH_ALEN);
  3158. ieee80211_sta_tx(sdata->dev, skb, 0);
  3159. }
  3160. static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)
  3161. {
  3162. if (sdata->vif.type == IEEE80211_IF_TYPE_STA ||
  3163. ieee80211_vif_is_mesh(&sdata->vif))
  3164. ieee80211_sta_timer((unsigned long)sdata);
  3165. }
  3166. void ieee80211_scan_completed(struct ieee80211_hw *hw)
  3167. {
  3168. struct ieee80211_local *local = hw_to_local(hw);
  3169. struct net_device *dev = local->scan_dev;
  3170. struct ieee80211_sub_if_data *sdata;
  3171. union iwreq_data wrqu;
  3172. local->last_scan_completed = jiffies;
  3173. memset(&wrqu, 0, sizeof(wrqu));
  3174. wireless_send_event(dev, SIOCGIWSCAN, &wrqu, NULL);
  3175. if (local->sta_hw_scanning) {
  3176. local->sta_hw_scanning = 0;
  3177. if (ieee80211_hw_config(local))
  3178. printk(KERN_DEBUG "%s: failed to restore operational "
  3179. "channel after scan\n", dev->name);
  3180. /* Restart STA timer for HW scan case */
  3181. rcu_read_lock();
  3182. list_for_each_entry_rcu(sdata, &local->interfaces, list)
  3183. ieee80211_restart_sta_timer(sdata);
  3184. rcu_read_unlock();
  3185. goto done;
  3186. }
  3187. local->sta_sw_scanning = 0;
  3188. if (ieee80211_hw_config(local))
  3189. printk(KERN_DEBUG "%s: failed to restore operational "
  3190. "channel after scan\n", dev->name);
  3191. netif_tx_lock_bh(local->mdev);
  3192. local->filter_flags &= ~FIF_BCN_PRBRESP_PROMISC;
  3193. local->ops->configure_filter(local_to_hw(local),
  3194. FIF_BCN_PRBRESP_PROMISC,
  3195. &local->filter_flags,
  3196. local->mdev->mc_count,
  3197. local->mdev->mc_list);
  3198. netif_tx_unlock_bh(local->mdev);
  3199. rcu_read_lock();
  3200. list_for_each_entry_rcu(sdata, &local->interfaces, list) {
  3201. /* No need to wake the master device. */
  3202. if (sdata->dev == local->mdev)
  3203. continue;
  3204. /* Tell AP we're back */
  3205. if (sdata->vif.type == IEEE80211_IF_TYPE_STA &&
  3206. sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED)
  3207. ieee80211_send_nullfunc(local, sdata, 0);
  3208. ieee80211_restart_sta_timer(sdata);
  3209. netif_wake_queue(sdata->dev);
  3210. }
  3211. rcu_read_unlock();
  3212. done:
  3213. sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  3214. if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS) {
  3215. struct ieee80211_if_sta *ifsta = &sdata->u.sta;
  3216. if (!(ifsta->flags & IEEE80211_STA_BSSID_SET) ||
  3217. (!ifsta->state == IEEE80211_IBSS_JOINED &&
  3218. !ieee80211_sta_active_ibss(dev)))
  3219. ieee80211_sta_find_ibss(dev, ifsta);
  3220. }
  3221. }
  3222. EXPORT_SYMBOL(ieee80211_scan_completed);
  3223. void ieee80211_sta_scan_work(struct work_struct *work)
  3224. {
  3225. struct ieee80211_local *local =
  3226. container_of(work, struct ieee80211_local, scan_work.work);
  3227. struct net_device *dev = local->scan_dev;
  3228. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  3229. struct ieee80211_supported_band *sband;
  3230. struct ieee80211_channel *chan;
  3231. int skip;
  3232. unsigned long next_delay = 0;
  3233. if (!local->sta_sw_scanning)
  3234. return;
  3235. switch (local->scan_state) {
  3236. case SCAN_SET_CHANNEL:
  3237. /*
  3238. * Get current scan band. scan_band may be IEEE80211_NUM_BANDS
  3239. * after we successfully scanned the last channel of the last
  3240. * band (and the last band is supported by the hw)
  3241. */
  3242. if (local->scan_band < IEEE80211_NUM_BANDS)
  3243. sband = local->hw.wiphy->bands[local->scan_band];
  3244. else
  3245. sband = NULL;
  3246. /*
  3247. * If we are at an unsupported band and have more bands
  3248. * left to scan, advance to the next supported one.
  3249. */
  3250. while (!sband && local->scan_band < IEEE80211_NUM_BANDS - 1) {
  3251. local->scan_band++;
  3252. sband = local->hw.wiphy->bands[local->scan_band];
  3253. local->scan_channel_idx = 0;
  3254. }
  3255. /* if no more bands/channels left, complete scan */
  3256. if (!sband || local->scan_channel_idx >= sband->n_channels) {
  3257. ieee80211_scan_completed(local_to_hw(local));
  3258. return;
  3259. }
  3260. skip = 0;
  3261. chan = &sband->channels[local->scan_channel_idx];
  3262. if (chan->flags & IEEE80211_CHAN_DISABLED ||
  3263. (sdata->vif.type == IEEE80211_IF_TYPE_IBSS &&
  3264. chan->flags & IEEE80211_CHAN_NO_IBSS))
  3265. skip = 1;
  3266. if (!skip) {
  3267. local->scan_channel = chan;
  3268. if (ieee80211_hw_config(local)) {
  3269. printk(KERN_DEBUG "%s: failed to set freq to "
  3270. "%d MHz for scan\n", dev->name,
  3271. chan->center_freq);
  3272. skip = 1;
  3273. }
  3274. }
  3275. /* advance state machine to next channel/band */
  3276. local->scan_channel_idx++;
  3277. if (local->scan_channel_idx >= sband->n_channels) {
  3278. /*
  3279. * scan_band may end up == IEEE80211_NUM_BANDS, but
  3280. * we'll catch that case above and complete the scan
  3281. * if that is the case.
  3282. */
  3283. local->scan_band++;
  3284. local->scan_channel_idx = 0;
  3285. }
  3286. if (skip)
  3287. break;
  3288. next_delay = IEEE80211_PROBE_DELAY +
  3289. usecs_to_jiffies(local->hw.channel_change_time);
  3290. local->scan_state = SCAN_SEND_PROBE;
  3291. break;
  3292. case SCAN_SEND_PROBE:
  3293. next_delay = IEEE80211_PASSIVE_CHANNEL_TIME;
  3294. local->scan_state = SCAN_SET_CHANNEL;
  3295. if (local->scan_channel->flags & IEEE80211_CHAN_PASSIVE_SCAN)
  3296. break;
  3297. ieee80211_send_probe_req(dev, NULL, local->scan_ssid,
  3298. local->scan_ssid_len);
  3299. next_delay = IEEE80211_CHANNEL_TIME;
  3300. break;
  3301. }
  3302. if (local->sta_sw_scanning)
  3303. queue_delayed_work(local->hw.workqueue, &local->scan_work,
  3304. next_delay);
  3305. }
  3306. static int ieee80211_sta_start_scan(struct net_device *dev,
  3307. u8 *ssid, size_t ssid_len)
  3308. {
  3309. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  3310. struct ieee80211_sub_if_data *sdata;
  3311. if (ssid_len > IEEE80211_MAX_SSID_LEN)
  3312. return -EINVAL;
  3313. /* MLME-SCAN.request (page 118) page 144 (11.1.3.1)
  3314. * BSSType: INFRASTRUCTURE, INDEPENDENT, ANY_BSS
  3315. * BSSID: MACAddress
  3316. * SSID
  3317. * ScanType: ACTIVE, PASSIVE
  3318. * ProbeDelay: delay (in microseconds) to be used prior to transmitting
  3319. * a Probe frame during active scanning
  3320. * ChannelList
  3321. * MinChannelTime (>= ProbeDelay), in TU
  3322. * MaxChannelTime: (>= MinChannelTime), in TU
  3323. */
  3324. /* MLME-SCAN.confirm
  3325. * BSSDescriptionSet
  3326. * ResultCode: SUCCESS, INVALID_PARAMETERS
  3327. */
  3328. if (local->sta_sw_scanning || local->sta_hw_scanning) {
  3329. if (local->scan_dev == dev)
  3330. return 0;
  3331. return -EBUSY;
  3332. }
  3333. if (local->ops->hw_scan) {
  3334. int rc = local->ops->hw_scan(local_to_hw(local),
  3335. ssid, ssid_len);
  3336. if (!rc) {
  3337. local->sta_hw_scanning = 1;
  3338. local->scan_dev = dev;
  3339. }
  3340. return rc;
  3341. }
  3342. local->sta_sw_scanning = 1;
  3343. rcu_read_lock();
  3344. list_for_each_entry_rcu(sdata, &local->interfaces, list) {
  3345. /* Don't stop the master interface, otherwise we can't transmit
  3346. * probes! */
  3347. if (sdata->dev == local->mdev)
  3348. continue;
  3349. netif_stop_queue(sdata->dev);
  3350. if (sdata->vif.type == IEEE80211_IF_TYPE_STA &&
  3351. (sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED))
  3352. ieee80211_send_nullfunc(local, sdata, 1);
  3353. }
  3354. rcu_read_unlock();
  3355. if (ssid) {
  3356. local->scan_ssid_len = ssid_len;
  3357. memcpy(local->scan_ssid, ssid, ssid_len);
  3358. } else
  3359. local->scan_ssid_len = 0;
  3360. local->scan_state = SCAN_SET_CHANNEL;
  3361. local->scan_channel_idx = 0;
  3362. local->scan_band = IEEE80211_BAND_2GHZ;
  3363. local->scan_dev = dev;
  3364. netif_tx_lock_bh(local->mdev);
  3365. local->filter_flags |= FIF_BCN_PRBRESP_PROMISC;
  3366. local->ops->configure_filter(local_to_hw(local),
  3367. FIF_BCN_PRBRESP_PROMISC,
  3368. &local->filter_flags,
  3369. local->mdev->mc_count,
  3370. local->mdev->mc_list);
  3371. netif_tx_unlock_bh(local->mdev);
  3372. /* TODO: start scan as soon as all nullfunc frames are ACKed */
  3373. queue_delayed_work(local->hw.workqueue, &local->scan_work,
  3374. IEEE80211_CHANNEL_TIME);
  3375. return 0;
  3376. }
  3377. int ieee80211_sta_req_scan(struct net_device *dev, u8 *ssid, size_t ssid_len)
  3378. {
  3379. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  3380. struct ieee80211_if_sta *ifsta = &sdata->u.sta;
  3381. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  3382. if (sdata->vif.type != IEEE80211_IF_TYPE_STA)
  3383. return ieee80211_sta_start_scan(dev, ssid, ssid_len);
  3384. if (local->sta_sw_scanning || local->sta_hw_scanning) {
  3385. if (local->scan_dev == dev)
  3386. return 0;
  3387. return -EBUSY;
  3388. }
  3389. ifsta->scan_ssid_len = ssid_len;
  3390. if (ssid_len)
  3391. memcpy(ifsta->scan_ssid, ssid, ssid_len);
  3392. set_bit(IEEE80211_STA_REQ_SCAN, &ifsta->request);
  3393. queue_work(local->hw.workqueue, &ifsta->work);
  3394. return 0;
  3395. }
  3396. static char *
  3397. ieee80211_sta_scan_result(struct net_device *dev,
  3398. struct ieee80211_sta_bss *bss,
  3399. char *current_ev, char *end_buf)
  3400. {
  3401. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  3402. struct iw_event iwe;
  3403. if (time_after(jiffies,
  3404. bss->last_update + IEEE80211_SCAN_RESULT_EXPIRE))
  3405. return current_ev;
  3406. memset(&iwe, 0, sizeof(iwe));
  3407. iwe.cmd = SIOCGIWAP;
  3408. iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
  3409. memcpy(iwe.u.ap_addr.sa_data, bss->bssid, ETH_ALEN);
  3410. current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
  3411. IW_EV_ADDR_LEN);
  3412. memset(&iwe, 0, sizeof(iwe));
  3413. iwe.cmd = SIOCGIWESSID;
  3414. if (bss_mesh_cfg(bss)) {
  3415. iwe.u.data.length = bss_mesh_id_len(bss);
  3416. iwe.u.data.flags = 1;
  3417. current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
  3418. bss_mesh_id(bss));
  3419. } else {
  3420. iwe.u.data.length = bss->ssid_len;
  3421. iwe.u.data.flags = 1;
  3422. current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
  3423. bss->ssid);
  3424. }
  3425. if (bss->capability & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS)
  3426. || bss_mesh_cfg(bss)) {
  3427. memset(&iwe, 0, sizeof(iwe));
  3428. iwe.cmd = SIOCGIWMODE;
  3429. if (bss_mesh_cfg(bss))
  3430. iwe.u.mode = IW_MODE_MESH;
  3431. else if (bss->capability & WLAN_CAPABILITY_ESS)
  3432. iwe.u.mode = IW_MODE_MASTER;
  3433. else
  3434. iwe.u.mode = IW_MODE_ADHOC;
  3435. current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
  3436. IW_EV_UINT_LEN);
  3437. }
  3438. memset(&iwe, 0, sizeof(iwe));
  3439. iwe.cmd = SIOCGIWFREQ;
  3440. iwe.u.freq.m = bss->freq;
  3441. iwe.u.freq.e = 6;
  3442. current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
  3443. IW_EV_FREQ_LEN);
  3444. memset(&iwe, 0, sizeof(iwe));
  3445. iwe.cmd = SIOCGIWFREQ;
  3446. iwe.u.freq.m = ieee80211_frequency_to_channel(bss->freq);
  3447. iwe.u.freq.e = 0;
  3448. current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
  3449. IW_EV_FREQ_LEN);
  3450. memset(&iwe, 0, sizeof(iwe));
  3451. iwe.cmd = IWEVQUAL;
  3452. iwe.u.qual.qual = bss->signal;
  3453. iwe.u.qual.level = bss->rssi;
  3454. iwe.u.qual.noise = bss->noise;
  3455. iwe.u.qual.updated = local->wstats_flags;
  3456. current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
  3457. IW_EV_QUAL_LEN);
  3458. memset(&iwe, 0, sizeof(iwe));
  3459. iwe.cmd = SIOCGIWENCODE;
  3460. if (bss->capability & WLAN_CAPABILITY_PRIVACY)
  3461. iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
  3462. else
  3463. iwe.u.data.flags = IW_ENCODE_DISABLED;
  3464. iwe.u.data.length = 0;
  3465. current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, "");
  3466. if (bss && bss->wpa_ie) {
  3467. memset(&iwe, 0, sizeof(iwe));
  3468. iwe.cmd = IWEVGENIE;
  3469. iwe.u.data.length = bss->wpa_ie_len;
  3470. current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
  3471. bss->wpa_ie);
  3472. }
  3473. if (bss && bss->rsn_ie) {
  3474. memset(&iwe, 0, sizeof(iwe));
  3475. iwe.cmd = IWEVGENIE;
  3476. iwe.u.data.length = bss->rsn_ie_len;
  3477. current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
  3478. bss->rsn_ie);
  3479. }
  3480. if (bss && bss->supp_rates_len > 0) {
  3481. /* display all supported rates in readable format */
  3482. char *p = current_ev + IW_EV_LCP_LEN;
  3483. int i;
  3484. memset(&iwe, 0, sizeof(iwe));
  3485. iwe.cmd = SIOCGIWRATE;
  3486. /* Those two flags are ignored... */
  3487. iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
  3488. for (i = 0; i < bss->supp_rates_len; i++) {
  3489. iwe.u.bitrate.value = ((bss->supp_rates[i] &
  3490. 0x7f) * 500000);
  3491. p = iwe_stream_add_value(current_ev, p,
  3492. end_buf, &iwe, IW_EV_PARAM_LEN);
  3493. }
  3494. current_ev = p;
  3495. }
  3496. if (bss) {
  3497. char *buf;
  3498. buf = kmalloc(30, GFP_ATOMIC);
  3499. if (buf) {
  3500. memset(&iwe, 0, sizeof(iwe));
  3501. iwe.cmd = IWEVCUSTOM;
  3502. sprintf(buf, "tsf=%016llx", (unsigned long long)(bss->timestamp));
  3503. iwe.u.data.length = strlen(buf);
  3504. current_ev = iwe_stream_add_point(current_ev, end_buf,
  3505. &iwe, buf);
  3506. kfree(buf);
  3507. }
  3508. }
  3509. if (bss_mesh_cfg(bss)) {
  3510. char *buf;
  3511. u8 *cfg = bss_mesh_cfg(bss);
  3512. buf = kmalloc(50, GFP_ATOMIC);
  3513. if (buf) {
  3514. memset(&iwe, 0, sizeof(iwe));
  3515. iwe.cmd = IWEVCUSTOM;
  3516. sprintf(buf, "Mesh network (version %d)", cfg[0]);
  3517. iwe.u.data.length = strlen(buf);
  3518. current_ev = iwe_stream_add_point(current_ev, end_buf,
  3519. &iwe, buf);
  3520. sprintf(buf, "Path Selection Protocol ID: "
  3521. "0x%02X%02X%02X%02X", cfg[1], cfg[2], cfg[3],
  3522. cfg[4]);
  3523. iwe.u.data.length = strlen(buf);
  3524. current_ev = iwe_stream_add_point(current_ev, end_buf,
  3525. &iwe, buf);
  3526. sprintf(buf, "Path Selection Metric ID: "
  3527. "0x%02X%02X%02X%02X", cfg[5], cfg[6], cfg[7],
  3528. cfg[8]);
  3529. iwe.u.data.length = strlen(buf);
  3530. current_ev = iwe_stream_add_point(current_ev, end_buf,
  3531. &iwe, buf);
  3532. sprintf(buf, "Congestion Control Mode ID: "
  3533. "0x%02X%02X%02X%02X", cfg[9], cfg[10],
  3534. cfg[11], cfg[12]);
  3535. iwe.u.data.length = strlen(buf);
  3536. current_ev = iwe_stream_add_point(current_ev, end_buf,
  3537. &iwe, buf);
  3538. sprintf(buf, "Channel Precedence: "
  3539. "0x%02X%02X%02X%02X", cfg[13], cfg[14],
  3540. cfg[15], cfg[16]);
  3541. iwe.u.data.length = strlen(buf);
  3542. current_ev = iwe_stream_add_point(current_ev, end_buf,
  3543. &iwe, buf);
  3544. kfree(buf);
  3545. }
  3546. }
  3547. return current_ev;
  3548. }
  3549. int ieee80211_sta_scan_results(struct net_device *dev, char *buf, size_t len)
  3550. {
  3551. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  3552. char *current_ev = buf;
  3553. char *end_buf = buf + len;
  3554. struct ieee80211_sta_bss *bss;
  3555. spin_lock_bh(&local->sta_bss_lock);
  3556. list_for_each_entry(bss, &local->sta_bss_list, list) {
  3557. if (buf + len - current_ev <= IW_EV_ADDR_LEN) {
  3558. spin_unlock_bh(&local->sta_bss_lock);
  3559. return -E2BIG;
  3560. }
  3561. current_ev = ieee80211_sta_scan_result(dev, bss, current_ev,
  3562. end_buf);
  3563. }
  3564. spin_unlock_bh(&local->sta_bss_lock);
  3565. return current_ev - buf;
  3566. }
  3567. int ieee80211_sta_set_extra_ie(struct net_device *dev, char *ie, size_t len)
  3568. {
  3569. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  3570. struct ieee80211_if_sta *ifsta = &sdata->u.sta;
  3571. kfree(ifsta->extra_ie);
  3572. if (len == 0) {
  3573. ifsta->extra_ie = NULL;
  3574. ifsta->extra_ie_len = 0;
  3575. return 0;
  3576. }
  3577. ifsta->extra_ie = kmalloc(len, GFP_KERNEL);
  3578. if (!ifsta->extra_ie) {
  3579. ifsta->extra_ie_len = 0;
  3580. return -ENOMEM;
  3581. }
  3582. memcpy(ifsta->extra_ie, ie, len);
  3583. ifsta->extra_ie_len = len;
  3584. return 0;
  3585. }
  3586. struct sta_info *ieee80211_ibss_add_sta(struct net_device *dev,
  3587. struct sk_buff *skb, u8 *bssid,
  3588. u8 *addr)
  3589. {
  3590. struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  3591. struct sta_info *sta;
  3592. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  3593. DECLARE_MAC_BUF(mac);
  3594. /* TODO: Could consider removing the least recently used entry and
  3595. * allow new one to be added. */
  3596. if (local->num_sta >= IEEE80211_IBSS_MAX_STA_ENTRIES) {
  3597. if (net_ratelimit()) {
  3598. printk(KERN_DEBUG "%s: No room for a new IBSS STA "
  3599. "entry %s\n", dev->name, print_mac(mac, addr));
  3600. }
  3601. return NULL;
  3602. }
  3603. printk(KERN_DEBUG "%s: Adding new IBSS station %s (dev=%s)\n",
  3604. wiphy_name(local->hw.wiphy), print_mac(mac, addr), dev->name);
  3605. sta = sta_info_alloc(sdata, addr, GFP_ATOMIC);
  3606. if (!sta)
  3607. return NULL;
  3608. sta->flags |= WLAN_STA_AUTHORIZED;
  3609. sta->supp_rates[local->hw.conf.channel->band] =
  3610. sdata->u.sta.supp_rates_bits[local->hw.conf.channel->band];
  3611. rate_control_rate_init(sta, local);
  3612. if (sta_info_insert(sta))
  3613. return NULL;
  3614. return sta;
  3615. }
  3616. int ieee80211_sta_deauthenticate(struct net_device *dev, u16 reason)
  3617. {
  3618. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  3619. struct ieee80211_if_sta *ifsta = &sdata->u.sta;
  3620. printk(KERN_DEBUG "%s: deauthenticate(reason=%d)\n",
  3621. dev->name, reason);
  3622. if (sdata->vif.type != IEEE80211_IF_TYPE_STA &&
  3623. sdata->vif.type != IEEE80211_IF_TYPE_IBSS)
  3624. return -EINVAL;
  3625. ieee80211_send_deauth(dev, ifsta, reason);
  3626. ieee80211_set_disassoc(dev, ifsta, 1);
  3627. return 0;
  3628. }
  3629. int ieee80211_sta_disassociate(struct net_device *dev, u16 reason)
  3630. {
  3631. struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  3632. struct ieee80211_if_sta *ifsta = &sdata->u.sta;
  3633. printk(KERN_DEBUG "%s: disassociate(reason=%d)\n",
  3634. dev->name, reason);
  3635. if (sdata->vif.type != IEEE80211_IF_TYPE_STA)
  3636. return -EINVAL;
  3637. if (!(ifsta->flags & IEEE80211_STA_ASSOCIATED))
  3638. return -1;
  3639. ieee80211_send_disassoc(dev, ifsta, reason);
  3640. ieee80211_set_disassoc(dev, ifsta, 0);
  3641. return 0;
  3642. }
  3643. void ieee80211_notify_mac(struct ieee80211_hw *hw,
  3644. enum ieee80211_notification_types notif_type)
  3645. {
  3646. struct ieee80211_local *local = hw_to_local(hw);
  3647. struct ieee80211_sub_if_data *sdata;
  3648. switch (notif_type) {
  3649. case IEEE80211_NOTIFY_RE_ASSOC:
  3650. rcu_read_lock();
  3651. list_for_each_entry_rcu(sdata, &local->interfaces, list) {
  3652. if (sdata->vif.type == IEEE80211_IF_TYPE_STA) {
  3653. ieee80211_sta_req_auth(sdata->dev,
  3654. &sdata->u.sta);
  3655. }
  3656. }
  3657. rcu_read_unlock();
  3658. break;
  3659. }
  3660. }
  3661. EXPORT_SYMBOL(ieee80211_notify_mac);