nl80211.c 113 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929
  1. /*
  2. * This is the new netlink-based wireless configuration interface.
  3. *
  4. * Copyright 2006-2009 Johannes Berg <johannes@sipsolutions.net>
  5. */
  6. #include <linux/if.h>
  7. #include <linux/module.h>
  8. #include <linux/err.h>
  9. #include <linux/list.h>
  10. #include <linux/if_ether.h>
  11. #include <linux/ieee80211.h>
  12. #include <linux/nl80211.h>
  13. #include <linux/rtnetlink.h>
  14. #include <linux/netlink.h>
  15. #include <linux/etherdevice.h>
  16. #include <net/net_namespace.h>
  17. #include <net/genetlink.h>
  18. #include <net/cfg80211.h>
  19. #include <net/sock.h>
  20. #include "core.h"
  21. #include "nl80211.h"
  22. #include "reg.h"
  23. /* the netlink family */
  24. static struct genl_family nl80211_fam = {
  25. .id = GENL_ID_GENERATE, /* don't bother with a hardcoded ID */
  26. .name = "nl80211", /* have users key off the name instead */
  27. .hdrsize = 0, /* no private header */
  28. .version = 1, /* no particular meaning now */
  29. .maxattr = NL80211_ATTR_MAX,
  30. .netnsok = true,
  31. };
  32. /* internal helper: get rdev and dev */
  33. static int get_rdev_dev_by_info_ifindex(struct genl_info *info,
  34. struct cfg80211_registered_device **rdev,
  35. struct net_device **dev)
  36. {
  37. struct nlattr **attrs = info->attrs;
  38. int ifindex;
  39. if (!attrs[NL80211_ATTR_IFINDEX])
  40. return -EINVAL;
  41. ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
  42. *dev = dev_get_by_index(genl_info_net(info), ifindex);
  43. if (!*dev)
  44. return -ENODEV;
  45. *rdev = cfg80211_get_dev_from_ifindex(genl_info_net(info), ifindex);
  46. if (IS_ERR(*rdev)) {
  47. dev_put(*dev);
  48. return PTR_ERR(*rdev);
  49. }
  50. return 0;
  51. }
  52. /* policy for the attributes */
  53. static struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] __read_mostly = {
  54. [NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
  55. [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING,
  56. .len = 20-1 },
  57. [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED },
  58. [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 },
  59. [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 },
  60. [NL80211_ATTR_WIPHY_RETRY_SHORT] = { .type = NLA_U8 },
  61. [NL80211_ATTR_WIPHY_RETRY_LONG] = { .type = NLA_U8 },
  62. [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 },
  63. [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 },
  64. [NL80211_ATTR_IFTYPE] = { .type = NLA_U32 },
  65. [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
  66. [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
  67. [NL80211_ATTR_MAC] = { .type = NLA_BINARY, .len = ETH_ALEN },
  68. [NL80211_ATTR_PREV_BSSID] = { .type = NLA_BINARY, .len = ETH_ALEN },
  69. [NL80211_ATTR_KEY] = { .type = NLA_NESTED, },
  70. [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
  71. .len = WLAN_MAX_KEY_LEN },
  72. [NL80211_ATTR_KEY_IDX] = { .type = NLA_U8 },
  73. [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 },
  74. [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG },
  75. [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 8 },
  76. [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 },
  77. [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 },
  78. [NL80211_ATTR_BEACON_HEAD] = { .type = NLA_BINARY,
  79. .len = IEEE80211_MAX_DATA_LEN },
  80. [NL80211_ATTR_BEACON_TAIL] = { .type = NLA_BINARY,
  81. .len = IEEE80211_MAX_DATA_LEN },
  82. [NL80211_ATTR_STA_AID] = { .type = NLA_U16 },
  83. [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED },
  84. [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 },
  85. [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY,
  86. .len = NL80211_MAX_SUPP_RATES },
  87. [NL80211_ATTR_STA_PLINK_ACTION] = { .type = NLA_U8 },
  88. [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 },
  89. [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ },
  90. [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
  91. .len = IEEE80211_MAX_MESH_ID_LEN },
  92. [NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 },
  93. [NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 },
  94. [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED },
  95. [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 },
  96. [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 },
  97. [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 },
  98. [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY,
  99. .len = NL80211_MAX_SUPP_RATES },
  100. [NL80211_ATTR_MESH_PARAMS] = { .type = NLA_NESTED },
  101. [NL80211_ATTR_HT_CAPABILITY] = { .type = NLA_BINARY,
  102. .len = NL80211_HT_CAPABILITY_LEN },
  103. [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 },
  104. [NL80211_ATTR_IE] = { .type = NLA_BINARY,
  105. .len = IEEE80211_MAX_DATA_LEN },
  106. [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED },
  107. [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED },
  108. [NL80211_ATTR_SSID] = { .type = NLA_BINARY,
  109. .len = IEEE80211_MAX_SSID_LEN },
  110. [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 },
  111. [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 },
  112. [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG },
  113. [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG },
  114. [NL80211_ATTR_USE_MFP] = { .type = NLA_U32 },
  115. [NL80211_ATTR_STA_FLAGS2] = {
  116. .len = sizeof(struct nl80211_sta_flag_update),
  117. },
  118. [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
  119. [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG },
  120. [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 },
  121. [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 },
  122. [NL80211_ATTR_PID] = { .type = NLA_U32 },
  123. };
  124. /* policy for the attributes */
  125. static struct nla_policy
  126. nl80211_key_policy[NL80211_KEY_MAX + 1] __read_mostly = {
  127. [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
  128. [NL80211_KEY_IDX] = { .type = NLA_U8 },
  129. [NL80211_KEY_CIPHER] = { .type = NLA_U32 },
  130. [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 8 },
  131. [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG },
  132. [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG },
  133. };
  134. /* IE validation */
  135. static bool is_valid_ie_attr(const struct nlattr *attr)
  136. {
  137. const u8 *pos;
  138. int len;
  139. if (!attr)
  140. return true;
  141. pos = nla_data(attr);
  142. len = nla_len(attr);
  143. while (len) {
  144. u8 elemlen;
  145. if (len < 2)
  146. return false;
  147. len -= 2;
  148. elemlen = pos[1];
  149. if (elemlen > len)
  150. return false;
  151. len -= elemlen;
  152. pos += 2 + elemlen;
  153. }
  154. return true;
  155. }
  156. /* message building helper */
  157. static inline void *nl80211hdr_put(struct sk_buff *skb, u32 pid, u32 seq,
  158. int flags, u8 cmd)
  159. {
  160. /* since there is no private header just add the generic one */
  161. return genlmsg_put(skb, pid, seq, &nl80211_fam, flags, cmd);
  162. }
  163. static int nl80211_msg_put_channel(struct sk_buff *msg,
  164. struct ieee80211_channel *chan)
  165. {
  166. NLA_PUT_U32(msg, NL80211_FREQUENCY_ATTR_FREQ,
  167. chan->center_freq);
  168. if (chan->flags & IEEE80211_CHAN_DISABLED)
  169. NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_DISABLED);
  170. if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN)
  171. NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_PASSIVE_SCAN);
  172. if (chan->flags & IEEE80211_CHAN_NO_IBSS)
  173. NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_NO_IBSS);
  174. if (chan->flags & IEEE80211_CHAN_RADAR)
  175. NLA_PUT_FLAG(msg, NL80211_FREQUENCY_ATTR_RADAR);
  176. NLA_PUT_U32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
  177. DBM_TO_MBM(chan->max_power));
  178. return 0;
  179. nla_put_failure:
  180. return -ENOBUFS;
  181. }
  182. /* netlink command implementations */
  183. struct key_parse {
  184. struct key_params p;
  185. int idx;
  186. bool def, defmgmt;
  187. };
  188. static int nl80211_parse_key_new(struct nlattr *key, struct key_parse *k)
  189. {
  190. struct nlattr *tb[NL80211_KEY_MAX + 1];
  191. int err = nla_parse_nested(tb, NL80211_KEY_MAX, key,
  192. nl80211_key_policy);
  193. if (err)
  194. return err;
  195. k->def = !!tb[NL80211_KEY_DEFAULT];
  196. k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT];
  197. if (tb[NL80211_KEY_IDX])
  198. k->idx = nla_get_u8(tb[NL80211_KEY_IDX]);
  199. if (tb[NL80211_KEY_DATA]) {
  200. k->p.key = nla_data(tb[NL80211_KEY_DATA]);
  201. k->p.key_len = nla_len(tb[NL80211_KEY_DATA]);
  202. }
  203. if (tb[NL80211_KEY_SEQ]) {
  204. k->p.seq = nla_data(tb[NL80211_KEY_SEQ]);
  205. k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]);
  206. }
  207. if (tb[NL80211_KEY_CIPHER])
  208. k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]);
  209. return 0;
  210. }
  211. static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
  212. {
  213. if (info->attrs[NL80211_ATTR_KEY_DATA]) {
  214. k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
  215. k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
  216. }
  217. if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
  218. k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
  219. k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
  220. }
  221. if (info->attrs[NL80211_ATTR_KEY_IDX])
  222. k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
  223. if (info->attrs[NL80211_ATTR_KEY_CIPHER])
  224. k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
  225. k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT];
  226. k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT];
  227. return 0;
  228. }
  229. static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
  230. {
  231. int err;
  232. memset(k, 0, sizeof(*k));
  233. k->idx = -1;
  234. if (info->attrs[NL80211_ATTR_KEY])
  235. err = nl80211_parse_key_new(info->attrs[NL80211_ATTR_KEY], k);
  236. else
  237. err = nl80211_parse_key_old(info, k);
  238. if (err)
  239. return err;
  240. if (k->def && k->defmgmt)
  241. return -EINVAL;
  242. if (k->idx != -1) {
  243. if (k->defmgmt) {
  244. if (k->idx < 4 || k->idx > 5)
  245. return -EINVAL;
  246. } else if (k->def) {
  247. if (k->idx < 0 || k->idx > 3)
  248. return -EINVAL;
  249. } else {
  250. if (k->idx < 0 || k->idx > 5)
  251. return -EINVAL;
  252. }
  253. }
  254. return 0;
  255. }
  256. static struct cfg80211_cached_keys *
  257. nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
  258. struct nlattr *keys)
  259. {
  260. struct key_parse parse;
  261. struct nlattr *key;
  262. struct cfg80211_cached_keys *result;
  263. int rem, err, def = 0;
  264. result = kzalloc(sizeof(*result), GFP_KERNEL);
  265. if (!result)
  266. return ERR_PTR(-ENOMEM);
  267. result->def = -1;
  268. result->defmgmt = -1;
  269. nla_for_each_nested(key, keys, rem) {
  270. memset(&parse, 0, sizeof(parse));
  271. parse.idx = -1;
  272. err = nl80211_parse_key_new(key, &parse);
  273. if (err)
  274. goto error;
  275. err = -EINVAL;
  276. if (!parse.p.key)
  277. goto error;
  278. if (parse.idx < 0 || parse.idx > 4)
  279. goto error;
  280. if (parse.def) {
  281. if (def)
  282. goto error;
  283. def = 1;
  284. result->def = parse.idx;
  285. } else if (parse.defmgmt)
  286. goto error;
  287. err = cfg80211_validate_key_settings(rdev, &parse.p,
  288. parse.idx, NULL);
  289. if (err)
  290. goto error;
  291. result->params[parse.idx].cipher = parse.p.cipher;
  292. result->params[parse.idx].key_len = parse.p.key_len;
  293. result->params[parse.idx].key = result->data[parse.idx];
  294. memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len);
  295. }
  296. return result;
  297. error:
  298. kfree(result);
  299. return ERR_PTR(err);
  300. }
  301. static int nl80211_key_allowed(struct wireless_dev *wdev)
  302. {
  303. ASSERT_WDEV_LOCK(wdev);
  304. if (!netif_running(wdev->netdev))
  305. return -ENETDOWN;
  306. switch (wdev->iftype) {
  307. case NL80211_IFTYPE_AP:
  308. case NL80211_IFTYPE_AP_VLAN:
  309. break;
  310. case NL80211_IFTYPE_ADHOC:
  311. if (!wdev->current_bss)
  312. return -ENOLINK;
  313. break;
  314. case NL80211_IFTYPE_STATION:
  315. if (wdev->sme_state != CFG80211_SME_CONNECTED)
  316. return -ENOLINK;
  317. break;
  318. default:
  319. return -EINVAL;
  320. }
  321. return 0;
  322. }
  323. static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
  324. struct cfg80211_registered_device *dev)
  325. {
  326. void *hdr;
  327. struct nlattr *nl_bands, *nl_band;
  328. struct nlattr *nl_freqs, *nl_freq;
  329. struct nlattr *nl_rates, *nl_rate;
  330. struct nlattr *nl_modes;
  331. struct nlattr *nl_cmds;
  332. enum ieee80211_band band;
  333. struct ieee80211_channel *chan;
  334. struct ieee80211_rate *rate;
  335. int i;
  336. u16 ifmodes = dev->wiphy.interface_modes;
  337. hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_WIPHY);
  338. if (!hdr)
  339. return -1;
  340. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, dev->wiphy_idx);
  341. NLA_PUT_STRING(msg, NL80211_ATTR_WIPHY_NAME, wiphy_name(&dev->wiphy));
  342. NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
  343. dev->wiphy.retry_short);
  344. NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
  345. dev->wiphy.retry_long);
  346. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
  347. dev->wiphy.frag_threshold);
  348. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
  349. dev->wiphy.rts_threshold);
  350. NLA_PUT_U8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
  351. dev->wiphy.max_scan_ssids);
  352. NLA_PUT_U16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
  353. dev->wiphy.max_scan_ie_len);
  354. NLA_PUT(msg, NL80211_ATTR_CIPHER_SUITES,
  355. sizeof(u32) * dev->wiphy.n_cipher_suites,
  356. dev->wiphy.cipher_suites);
  357. nl_modes = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_IFTYPES);
  358. if (!nl_modes)
  359. goto nla_put_failure;
  360. i = 0;
  361. while (ifmodes) {
  362. if (ifmodes & 1)
  363. NLA_PUT_FLAG(msg, i);
  364. ifmodes >>= 1;
  365. i++;
  366. }
  367. nla_nest_end(msg, nl_modes);
  368. nl_bands = nla_nest_start(msg, NL80211_ATTR_WIPHY_BANDS);
  369. if (!nl_bands)
  370. goto nla_put_failure;
  371. for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
  372. if (!dev->wiphy.bands[band])
  373. continue;
  374. nl_band = nla_nest_start(msg, band);
  375. if (!nl_band)
  376. goto nla_put_failure;
  377. /* add HT info */
  378. if (dev->wiphy.bands[band]->ht_cap.ht_supported) {
  379. NLA_PUT(msg, NL80211_BAND_ATTR_HT_MCS_SET,
  380. sizeof(dev->wiphy.bands[band]->ht_cap.mcs),
  381. &dev->wiphy.bands[band]->ht_cap.mcs);
  382. NLA_PUT_U16(msg, NL80211_BAND_ATTR_HT_CAPA,
  383. dev->wiphy.bands[band]->ht_cap.cap);
  384. NLA_PUT_U8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
  385. dev->wiphy.bands[band]->ht_cap.ampdu_factor);
  386. NLA_PUT_U8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
  387. dev->wiphy.bands[band]->ht_cap.ampdu_density);
  388. }
  389. /* add frequencies */
  390. nl_freqs = nla_nest_start(msg, NL80211_BAND_ATTR_FREQS);
  391. if (!nl_freqs)
  392. goto nla_put_failure;
  393. for (i = 0; i < dev->wiphy.bands[band]->n_channels; i++) {
  394. nl_freq = nla_nest_start(msg, i);
  395. if (!nl_freq)
  396. goto nla_put_failure;
  397. chan = &dev->wiphy.bands[band]->channels[i];
  398. if (nl80211_msg_put_channel(msg, chan))
  399. goto nla_put_failure;
  400. nla_nest_end(msg, nl_freq);
  401. }
  402. nla_nest_end(msg, nl_freqs);
  403. /* add bitrates */
  404. nl_rates = nla_nest_start(msg, NL80211_BAND_ATTR_RATES);
  405. if (!nl_rates)
  406. goto nla_put_failure;
  407. for (i = 0; i < dev->wiphy.bands[band]->n_bitrates; i++) {
  408. nl_rate = nla_nest_start(msg, i);
  409. if (!nl_rate)
  410. goto nla_put_failure;
  411. rate = &dev->wiphy.bands[band]->bitrates[i];
  412. NLA_PUT_U32(msg, NL80211_BITRATE_ATTR_RATE,
  413. rate->bitrate);
  414. if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE)
  415. NLA_PUT_FLAG(msg,
  416. NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE);
  417. nla_nest_end(msg, nl_rate);
  418. }
  419. nla_nest_end(msg, nl_rates);
  420. nla_nest_end(msg, nl_band);
  421. }
  422. nla_nest_end(msg, nl_bands);
  423. nl_cmds = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_COMMANDS);
  424. if (!nl_cmds)
  425. goto nla_put_failure;
  426. i = 0;
  427. #define CMD(op, n) \
  428. do { \
  429. if (dev->ops->op) { \
  430. i++; \
  431. NLA_PUT_U32(msg, i, NL80211_CMD_ ## n); \
  432. } \
  433. } while (0)
  434. CMD(add_virtual_intf, NEW_INTERFACE);
  435. CMD(change_virtual_intf, SET_INTERFACE);
  436. CMD(add_key, NEW_KEY);
  437. CMD(add_beacon, NEW_BEACON);
  438. CMD(add_station, NEW_STATION);
  439. CMD(add_mpath, NEW_MPATH);
  440. CMD(set_mesh_params, SET_MESH_PARAMS);
  441. CMD(change_bss, SET_BSS);
  442. CMD(auth, AUTHENTICATE);
  443. CMD(assoc, ASSOCIATE);
  444. CMD(deauth, DEAUTHENTICATE);
  445. CMD(disassoc, DISASSOCIATE);
  446. CMD(join_ibss, JOIN_IBSS);
  447. if (dev->wiphy.netnsok) {
  448. i++;
  449. NLA_PUT_U32(msg, i, NL80211_CMD_SET_WIPHY_NETNS);
  450. }
  451. #undef CMD
  452. if (dev->ops->connect || dev->ops->auth) {
  453. i++;
  454. NLA_PUT_U32(msg, i, NL80211_CMD_CONNECT);
  455. }
  456. if (dev->ops->disconnect || dev->ops->deauth) {
  457. i++;
  458. NLA_PUT_U32(msg, i, NL80211_CMD_DISCONNECT);
  459. }
  460. nla_nest_end(msg, nl_cmds);
  461. return genlmsg_end(msg, hdr);
  462. nla_put_failure:
  463. genlmsg_cancel(msg, hdr);
  464. return -EMSGSIZE;
  465. }
  466. static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
  467. {
  468. int idx = 0;
  469. int start = cb->args[0];
  470. struct cfg80211_registered_device *dev;
  471. mutex_lock(&cfg80211_mutex);
  472. list_for_each_entry(dev, &cfg80211_rdev_list, list) {
  473. if (!net_eq(wiphy_net(&dev->wiphy), sock_net(skb->sk)))
  474. continue;
  475. if (++idx <= start)
  476. continue;
  477. if (nl80211_send_wiphy(skb, NETLINK_CB(cb->skb).pid,
  478. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  479. dev) < 0) {
  480. idx--;
  481. break;
  482. }
  483. }
  484. mutex_unlock(&cfg80211_mutex);
  485. cb->args[0] = idx;
  486. return skb->len;
  487. }
  488. static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
  489. {
  490. struct sk_buff *msg;
  491. struct cfg80211_registered_device *dev;
  492. dev = cfg80211_get_dev_from_info(info);
  493. if (IS_ERR(dev))
  494. return PTR_ERR(dev);
  495. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  496. if (!msg)
  497. goto out_err;
  498. if (nl80211_send_wiphy(msg, info->snd_pid, info->snd_seq, 0, dev) < 0)
  499. goto out_free;
  500. cfg80211_unlock_rdev(dev);
  501. return genlmsg_reply(msg, info);
  502. out_free:
  503. nlmsg_free(msg);
  504. out_err:
  505. cfg80211_unlock_rdev(dev);
  506. return -ENOBUFS;
  507. }
  508. static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
  509. [NL80211_TXQ_ATTR_QUEUE] = { .type = NLA_U8 },
  510. [NL80211_TXQ_ATTR_TXOP] = { .type = NLA_U16 },
  511. [NL80211_TXQ_ATTR_CWMIN] = { .type = NLA_U16 },
  512. [NL80211_TXQ_ATTR_CWMAX] = { .type = NLA_U16 },
  513. [NL80211_TXQ_ATTR_AIFS] = { .type = NLA_U8 },
  514. };
  515. static int parse_txq_params(struct nlattr *tb[],
  516. struct ieee80211_txq_params *txq_params)
  517. {
  518. if (!tb[NL80211_TXQ_ATTR_QUEUE] || !tb[NL80211_TXQ_ATTR_TXOP] ||
  519. !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
  520. !tb[NL80211_TXQ_ATTR_AIFS])
  521. return -EINVAL;
  522. txq_params->queue = nla_get_u8(tb[NL80211_TXQ_ATTR_QUEUE]);
  523. txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
  524. txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
  525. txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
  526. txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
  527. return 0;
  528. }
  529. static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
  530. {
  531. struct cfg80211_registered_device *rdev;
  532. int result = 0, rem_txq_params = 0;
  533. struct nlattr *nl_txq_params;
  534. u32 changed;
  535. u8 retry_short = 0, retry_long = 0;
  536. u32 frag_threshold = 0, rts_threshold = 0;
  537. rtnl_lock();
  538. mutex_lock(&cfg80211_mutex);
  539. rdev = __cfg80211_rdev_from_info(info);
  540. if (IS_ERR(rdev)) {
  541. mutex_unlock(&cfg80211_mutex);
  542. result = PTR_ERR(rdev);
  543. goto unlock;
  544. }
  545. mutex_lock(&rdev->mtx);
  546. if (info->attrs[NL80211_ATTR_WIPHY_NAME])
  547. result = cfg80211_dev_rename(
  548. rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
  549. mutex_unlock(&cfg80211_mutex);
  550. if (result)
  551. goto bad_res;
  552. if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
  553. struct ieee80211_txq_params txq_params;
  554. struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
  555. if (!rdev->ops->set_txq_params) {
  556. result = -EOPNOTSUPP;
  557. goto bad_res;
  558. }
  559. nla_for_each_nested(nl_txq_params,
  560. info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
  561. rem_txq_params) {
  562. nla_parse(tb, NL80211_TXQ_ATTR_MAX,
  563. nla_data(nl_txq_params),
  564. nla_len(nl_txq_params),
  565. txq_params_policy);
  566. result = parse_txq_params(tb, &txq_params);
  567. if (result)
  568. goto bad_res;
  569. result = rdev->ops->set_txq_params(&rdev->wiphy,
  570. &txq_params);
  571. if (result)
  572. goto bad_res;
  573. }
  574. }
  575. if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
  576. enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
  577. u32 freq;
  578. result = -EINVAL;
  579. if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
  580. channel_type = nla_get_u32(info->attrs[
  581. NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
  582. if (channel_type != NL80211_CHAN_NO_HT &&
  583. channel_type != NL80211_CHAN_HT20 &&
  584. channel_type != NL80211_CHAN_HT40PLUS &&
  585. channel_type != NL80211_CHAN_HT40MINUS)
  586. goto bad_res;
  587. }
  588. freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
  589. mutex_lock(&rdev->devlist_mtx);
  590. result = rdev_set_freq(rdev, freq, channel_type);
  591. mutex_unlock(&rdev->devlist_mtx);
  592. if (result)
  593. goto bad_res;
  594. }
  595. changed = 0;
  596. if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
  597. retry_short = nla_get_u8(
  598. info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
  599. if (retry_short == 0) {
  600. result = -EINVAL;
  601. goto bad_res;
  602. }
  603. changed |= WIPHY_PARAM_RETRY_SHORT;
  604. }
  605. if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
  606. retry_long = nla_get_u8(
  607. info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
  608. if (retry_long == 0) {
  609. result = -EINVAL;
  610. goto bad_res;
  611. }
  612. changed |= WIPHY_PARAM_RETRY_LONG;
  613. }
  614. if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
  615. frag_threshold = nla_get_u32(
  616. info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
  617. if (frag_threshold < 256) {
  618. result = -EINVAL;
  619. goto bad_res;
  620. }
  621. if (frag_threshold != (u32) -1) {
  622. /*
  623. * Fragments (apart from the last one) are required to
  624. * have even length. Make the fragmentation code
  625. * simpler by stripping LSB should someone try to use
  626. * odd threshold value.
  627. */
  628. frag_threshold &= ~0x1;
  629. }
  630. changed |= WIPHY_PARAM_FRAG_THRESHOLD;
  631. }
  632. if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
  633. rts_threshold = nla_get_u32(
  634. info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
  635. changed |= WIPHY_PARAM_RTS_THRESHOLD;
  636. }
  637. if (changed) {
  638. u8 old_retry_short, old_retry_long;
  639. u32 old_frag_threshold, old_rts_threshold;
  640. if (!rdev->ops->set_wiphy_params) {
  641. result = -EOPNOTSUPP;
  642. goto bad_res;
  643. }
  644. old_retry_short = rdev->wiphy.retry_short;
  645. old_retry_long = rdev->wiphy.retry_long;
  646. old_frag_threshold = rdev->wiphy.frag_threshold;
  647. old_rts_threshold = rdev->wiphy.rts_threshold;
  648. if (changed & WIPHY_PARAM_RETRY_SHORT)
  649. rdev->wiphy.retry_short = retry_short;
  650. if (changed & WIPHY_PARAM_RETRY_LONG)
  651. rdev->wiphy.retry_long = retry_long;
  652. if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
  653. rdev->wiphy.frag_threshold = frag_threshold;
  654. if (changed & WIPHY_PARAM_RTS_THRESHOLD)
  655. rdev->wiphy.rts_threshold = rts_threshold;
  656. result = rdev->ops->set_wiphy_params(&rdev->wiphy, changed);
  657. if (result) {
  658. rdev->wiphy.retry_short = old_retry_short;
  659. rdev->wiphy.retry_long = old_retry_long;
  660. rdev->wiphy.frag_threshold = old_frag_threshold;
  661. rdev->wiphy.rts_threshold = old_rts_threshold;
  662. }
  663. }
  664. bad_res:
  665. mutex_unlock(&rdev->mtx);
  666. unlock:
  667. rtnl_unlock();
  668. return result;
  669. }
  670. static int nl80211_send_iface(struct sk_buff *msg, u32 pid, u32 seq, int flags,
  671. struct cfg80211_registered_device *rdev,
  672. struct net_device *dev)
  673. {
  674. void *hdr;
  675. hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_INTERFACE);
  676. if (!hdr)
  677. return -1;
  678. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  679. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  680. NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, dev->name);
  681. NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, dev->ieee80211_ptr->iftype);
  682. return genlmsg_end(msg, hdr);
  683. nla_put_failure:
  684. genlmsg_cancel(msg, hdr);
  685. return -EMSGSIZE;
  686. }
  687. static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb)
  688. {
  689. int wp_idx = 0;
  690. int if_idx = 0;
  691. int wp_start = cb->args[0];
  692. int if_start = cb->args[1];
  693. struct cfg80211_registered_device *dev;
  694. struct wireless_dev *wdev;
  695. mutex_lock(&cfg80211_mutex);
  696. list_for_each_entry(dev, &cfg80211_rdev_list, list) {
  697. if (!net_eq(wiphy_net(&dev->wiphy), sock_net(skb->sk)))
  698. continue;
  699. if (wp_idx < wp_start) {
  700. wp_idx++;
  701. continue;
  702. }
  703. if_idx = 0;
  704. mutex_lock(&dev->devlist_mtx);
  705. list_for_each_entry(wdev, &dev->netdev_list, list) {
  706. if (if_idx < if_start) {
  707. if_idx++;
  708. continue;
  709. }
  710. if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).pid,
  711. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  712. dev, wdev->netdev) < 0) {
  713. mutex_unlock(&dev->devlist_mtx);
  714. goto out;
  715. }
  716. if_idx++;
  717. }
  718. mutex_unlock(&dev->devlist_mtx);
  719. wp_idx++;
  720. }
  721. out:
  722. mutex_unlock(&cfg80211_mutex);
  723. cb->args[0] = wp_idx;
  724. cb->args[1] = if_idx;
  725. return skb->len;
  726. }
  727. static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
  728. {
  729. struct sk_buff *msg;
  730. struct cfg80211_registered_device *dev;
  731. struct net_device *netdev;
  732. int err;
  733. err = get_rdev_dev_by_info_ifindex(info, &dev, &netdev);
  734. if (err)
  735. return err;
  736. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  737. if (!msg)
  738. goto out_err;
  739. if (nl80211_send_iface(msg, info->snd_pid, info->snd_seq, 0,
  740. dev, netdev) < 0)
  741. goto out_free;
  742. dev_put(netdev);
  743. cfg80211_unlock_rdev(dev);
  744. return genlmsg_reply(msg, info);
  745. out_free:
  746. nlmsg_free(msg);
  747. out_err:
  748. dev_put(netdev);
  749. cfg80211_unlock_rdev(dev);
  750. return -ENOBUFS;
  751. }
  752. static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = {
  753. [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG },
  754. [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG },
  755. [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG },
  756. [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG },
  757. [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG },
  758. };
  759. static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
  760. {
  761. struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1];
  762. int flag;
  763. *mntrflags = 0;
  764. if (!nla)
  765. return -EINVAL;
  766. if (nla_parse_nested(flags, NL80211_MNTR_FLAG_MAX,
  767. nla, mntr_flags_policy))
  768. return -EINVAL;
  769. for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++)
  770. if (flags[flag])
  771. *mntrflags |= (1<<flag);
  772. return 0;
  773. }
  774. static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
  775. {
  776. struct cfg80211_registered_device *rdev;
  777. struct vif_params params;
  778. int err;
  779. enum nl80211_iftype otype, ntype;
  780. struct net_device *dev;
  781. u32 _flags, *flags = NULL;
  782. bool change = false;
  783. memset(&params, 0, sizeof(params));
  784. rtnl_lock();
  785. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  786. if (err)
  787. goto unlock_rtnl;
  788. otype = ntype = dev->ieee80211_ptr->iftype;
  789. if (info->attrs[NL80211_ATTR_IFTYPE]) {
  790. ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
  791. if (otype != ntype)
  792. change = true;
  793. if (ntype > NL80211_IFTYPE_MAX) {
  794. err = -EINVAL;
  795. goto unlock;
  796. }
  797. }
  798. if (!rdev->ops->change_virtual_intf ||
  799. !(rdev->wiphy.interface_modes & (1 << ntype))) {
  800. err = -EOPNOTSUPP;
  801. goto unlock;
  802. }
  803. if (info->attrs[NL80211_ATTR_MESH_ID]) {
  804. if (ntype != NL80211_IFTYPE_MESH_POINT) {
  805. err = -EINVAL;
  806. goto unlock;
  807. }
  808. params.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
  809. params.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
  810. change = true;
  811. }
  812. if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
  813. if (ntype != NL80211_IFTYPE_MONITOR) {
  814. err = -EINVAL;
  815. goto unlock;
  816. }
  817. err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
  818. &_flags);
  819. if (err)
  820. goto unlock;
  821. flags = &_flags;
  822. change = true;
  823. }
  824. if (change)
  825. err = rdev->ops->change_virtual_intf(&rdev->wiphy, dev,
  826. ntype, flags, &params);
  827. else
  828. err = 0;
  829. WARN_ON(!err && dev->ieee80211_ptr->iftype != ntype);
  830. if (!err && (ntype != otype)) {
  831. if (otype == NL80211_IFTYPE_ADHOC)
  832. cfg80211_clear_ibss(dev, false);
  833. }
  834. unlock:
  835. dev_put(dev);
  836. cfg80211_unlock_rdev(rdev);
  837. unlock_rtnl:
  838. rtnl_unlock();
  839. return err;
  840. }
  841. static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
  842. {
  843. struct cfg80211_registered_device *rdev;
  844. struct vif_params params;
  845. int err;
  846. enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
  847. u32 flags;
  848. memset(&params, 0, sizeof(params));
  849. if (!info->attrs[NL80211_ATTR_IFNAME])
  850. return -EINVAL;
  851. if (info->attrs[NL80211_ATTR_IFTYPE]) {
  852. type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
  853. if (type > NL80211_IFTYPE_MAX)
  854. return -EINVAL;
  855. }
  856. rtnl_lock();
  857. rdev = cfg80211_get_dev_from_info(info);
  858. if (IS_ERR(rdev)) {
  859. err = PTR_ERR(rdev);
  860. goto unlock_rtnl;
  861. }
  862. if (!rdev->ops->add_virtual_intf ||
  863. !(rdev->wiphy.interface_modes & (1 << type))) {
  864. err = -EOPNOTSUPP;
  865. goto unlock;
  866. }
  867. if (type == NL80211_IFTYPE_MESH_POINT &&
  868. info->attrs[NL80211_ATTR_MESH_ID]) {
  869. params.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
  870. params.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
  871. }
  872. err = parse_monitor_flags(type == NL80211_IFTYPE_MONITOR ?
  873. info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL,
  874. &flags);
  875. err = rdev->ops->add_virtual_intf(&rdev->wiphy,
  876. nla_data(info->attrs[NL80211_ATTR_IFNAME]),
  877. type, err ? NULL : &flags, &params);
  878. unlock:
  879. cfg80211_unlock_rdev(rdev);
  880. unlock_rtnl:
  881. rtnl_unlock();
  882. return err;
  883. }
  884. static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
  885. {
  886. struct cfg80211_registered_device *rdev;
  887. int err;
  888. struct net_device *dev;
  889. rtnl_lock();
  890. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  891. if (err)
  892. goto unlock_rtnl;
  893. if (!rdev->ops->del_virtual_intf) {
  894. err = -EOPNOTSUPP;
  895. goto out;
  896. }
  897. err = rdev->ops->del_virtual_intf(&rdev->wiphy, dev);
  898. out:
  899. cfg80211_unlock_rdev(rdev);
  900. dev_put(dev);
  901. unlock_rtnl:
  902. rtnl_unlock();
  903. return err;
  904. }
  905. struct get_key_cookie {
  906. struct sk_buff *msg;
  907. int error;
  908. int idx;
  909. };
  910. static void get_key_callback(void *c, struct key_params *params)
  911. {
  912. struct nlattr *key;
  913. struct get_key_cookie *cookie = c;
  914. if (params->key)
  915. NLA_PUT(cookie->msg, NL80211_ATTR_KEY_DATA,
  916. params->key_len, params->key);
  917. if (params->seq)
  918. NLA_PUT(cookie->msg, NL80211_ATTR_KEY_SEQ,
  919. params->seq_len, params->seq);
  920. if (params->cipher)
  921. NLA_PUT_U32(cookie->msg, NL80211_ATTR_KEY_CIPHER,
  922. params->cipher);
  923. key = nla_nest_start(cookie->msg, NL80211_ATTR_KEY);
  924. if (!key)
  925. goto nla_put_failure;
  926. if (params->key)
  927. NLA_PUT(cookie->msg, NL80211_KEY_DATA,
  928. params->key_len, params->key);
  929. if (params->seq)
  930. NLA_PUT(cookie->msg, NL80211_KEY_SEQ,
  931. params->seq_len, params->seq);
  932. if (params->cipher)
  933. NLA_PUT_U32(cookie->msg, NL80211_KEY_CIPHER,
  934. params->cipher);
  935. NLA_PUT_U8(cookie->msg, NL80211_ATTR_KEY_IDX, cookie->idx);
  936. nla_nest_end(cookie->msg, key);
  937. return;
  938. nla_put_failure:
  939. cookie->error = 1;
  940. }
  941. static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
  942. {
  943. struct cfg80211_registered_device *rdev;
  944. int err;
  945. struct net_device *dev;
  946. u8 key_idx = 0;
  947. u8 *mac_addr = NULL;
  948. struct get_key_cookie cookie = {
  949. .error = 0,
  950. };
  951. void *hdr;
  952. struct sk_buff *msg;
  953. if (info->attrs[NL80211_ATTR_KEY_IDX])
  954. key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
  955. if (key_idx > 5)
  956. return -EINVAL;
  957. if (info->attrs[NL80211_ATTR_MAC])
  958. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  959. rtnl_lock();
  960. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  961. if (err)
  962. goto unlock_rtnl;
  963. if (!rdev->ops->get_key) {
  964. err = -EOPNOTSUPP;
  965. goto out;
  966. }
  967. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  968. if (!msg) {
  969. err = -ENOMEM;
  970. goto out;
  971. }
  972. hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
  973. NL80211_CMD_NEW_KEY);
  974. if (IS_ERR(hdr)) {
  975. err = PTR_ERR(hdr);
  976. goto free_msg;
  977. }
  978. cookie.msg = msg;
  979. cookie.idx = key_idx;
  980. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  981. NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_idx);
  982. if (mac_addr)
  983. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr);
  984. err = rdev->ops->get_key(&rdev->wiphy, dev, key_idx, mac_addr,
  985. &cookie, get_key_callback);
  986. if (err)
  987. goto free_msg;
  988. if (cookie.error)
  989. goto nla_put_failure;
  990. genlmsg_end(msg, hdr);
  991. err = genlmsg_reply(msg, info);
  992. goto out;
  993. nla_put_failure:
  994. err = -ENOBUFS;
  995. free_msg:
  996. nlmsg_free(msg);
  997. out:
  998. cfg80211_unlock_rdev(rdev);
  999. dev_put(dev);
  1000. unlock_rtnl:
  1001. rtnl_unlock();
  1002. return err;
  1003. }
  1004. static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
  1005. {
  1006. struct cfg80211_registered_device *rdev;
  1007. struct key_parse key;
  1008. int err;
  1009. struct net_device *dev;
  1010. int (*func)(struct wiphy *wiphy, struct net_device *netdev,
  1011. u8 key_index);
  1012. err = nl80211_parse_key(info, &key);
  1013. if (err)
  1014. return err;
  1015. if (key.idx < 0)
  1016. return -EINVAL;
  1017. /* only support setting default key */
  1018. if (!key.def && !key.defmgmt)
  1019. return -EINVAL;
  1020. rtnl_lock();
  1021. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1022. if (err)
  1023. goto unlock_rtnl;
  1024. if (key.def)
  1025. func = rdev->ops->set_default_key;
  1026. else
  1027. func = rdev->ops->set_default_mgmt_key;
  1028. if (!func) {
  1029. err = -EOPNOTSUPP;
  1030. goto out;
  1031. }
  1032. wdev_lock(dev->ieee80211_ptr);
  1033. err = nl80211_key_allowed(dev->ieee80211_ptr);
  1034. if (!err)
  1035. err = func(&rdev->wiphy, dev, key.idx);
  1036. #ifdef CONFIG_WIRELESS_EXT
  1037. if (!err) {
  1038. if (func == rdev->ops->set_default_key)
  1039. dev->ieee80211_ptr->wext.default_key = key.idx;
  1040. else
  1041. dev->ieee80211_ptr->wext.default_mgmt_key = key.idx;
  1042. }
  1043. #endif
  1044. wdev_unlock(dev->ieee80211_ptr);
  1045. out:
  1046. cfg80211_unlock_rdev(rdev);
  1047. dev_put(dev);
  1048. unlock_rtnl:
  1049. rtnl_unlock();
  1050. return err;
  1051. }
  1052. static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
  1053. {
  1054. struct cfg80211_registered_device *rdev;
  1055. int err;
  1056. struct net_device *dev;
  1057. struct key_parse key;
  1058. u8 *mac_addr = NULL;
  1059. err = nl80211_parse_key(info, &key);
  1060. if (err)
  1061. return err;
  1062. if (!key.p.key)
  1063. return -EINVAL;
  1064. if (info->attrs[NL80211_ATTR_MAC])
  1065. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1066. rtnl_lock();
  1067. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1068. if (err)
  1069. goto unlock_rtnl;
  1070. if (!rdev->ops->add_key) {
  1071. err = -EOPNOTSUPP;
  1072. goto out;
  1073. }
  1074. if (cfg80211_validate_key_settings(rdev, &key.p, key.idx, mac_addr)) {
  1075. err = -EINVAL;
  1076. goto out;
  1077. }
  1078. wdev_lock(dev->ieee80211_ptr);
  1079. err = nl80211_key_allowed(dev->ieee80211_ptr);
  1080. if (!err)
  1081. err = rdev->ops->add_key(&rdev->wiphy, dev, key.idx,
  1082. mac_addr, &key.p);
  1083. wdev_unlock(dev->ieee80211_ptr);
  1084. out:
  1085. cfg80211_unlock_rdev(rdev);
  1086. dev_put(dev);
  1087. unlock_rtnl:
  1088. rtnl_unlock();
  1089. return err;
  1090. }
  1091. static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
  1092. {
  1093. struct cfg80211_registered_device *rdev;
  1094. int err;
  1095. struct net_device *dev;
  1096. u8 *mac_addr = NULL;
  1097. struct key_parse key;
  1098. err = nl80211_parse_key(info, &key);
  1099. if (err)
  1100. return err;
  1101. if (info->attrs[NL80211_ATTR_MAC])
  1102. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1103. rtnl_lock();
  1104. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1105. if (err)
  1106. goto unlock_rtnl;
  1107. if (!rdev->ops->del_key) {
  1108. err = -EOPNOTSUPP;
  1109. goto out;
  1110. }
  1111. wdev_lock(dev->ieee80211_ptr);
  1112. err = nl80211_key_allowed(dev->ieee80211_ptr);
  1113. if (!err)
  1114. err = rdev->ops->del_key(&rdev->wiphy, dev, key.idx, mac_addr);
  1115. #ifdef CONFIG_WIRELESS_EXT
  1116. if (!err) {
  1117. if (key.idx == dev->ieee80211_ptr->wext.default_key)
  1118. dev->ieee80211_ptr->wext.default_key = -1;
  1119. else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key)
  1120. dev->ieee80211_ptr->wext.default_mgmt_key = -1;
  1121. }
  1122. #endif
  1123. wdev_unlock(dev->ieee80211_ptr);
  1124. out:
  1125. cfg80211_unlock_rdev(rdev);
  1126. dev_put(dev);
  1127. unlock_rtnl:
  1128. rtnl_unlock();
  1129. return err;
  1130. }
  1131. static int nl80211_addset_beacon(struct sk_buff *skb, struct genl_info *info)
  1132. {
  1133. int (*call)(struct wiphy *wiphy, struct net_device *dev,
  1134. struct beacon_parameters *info);
  1135. struct cfg80211_registered_device *rdev;
  1136. int err;
  1137. struct net_device *dev;
  1138. struct beacon_parameters params;
  1139. int haveinfo = 0;
  1140. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_BEACON_TAIL]))
  1141. return -EINVAL;
  1142. rtnl_lock();
  1143. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1144. if (err)
  1145. goto unlock_rtnl;
  1146. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP) {
  1147. err = -EOPNOTSUPP;
  1148. goto out;
  1149. }
  1150. switch (info->genlhdr->cmd) {
  1151. case NL80211_CMD_NEW_BEACON:
  1152. /* these are required for NEW_BEACON */
  1153. if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
  1154. !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
  1155. !info->attrs[NL80211_ATTR_BEACON_HEAD]) {
  1156. err = -EINVAL;
  1157. goto out;
  1158. }
  1159. call = rdev->ops->add_beacon;
  1160. break;
  1161. case NL80211_CMD_SET_BEACON:
  1162. call = rdev->ops->set_beacon;
  1163. break;
  1164. default:
  1165. WARN_ON(1);
  1166. err = -EOPNOTSUPP;
  1167. goto out;
  1168. }
  1169. if (!call) {
  1170. err = -EOPNOTSUPP;
  1171. goto out;
  1172. }
  1173. memset(&params, 0, sizeof(params));
  1174. if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
  1175. params.interval =
  1176. nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
  1177. haveinfo = 1;
  1178. }
  1179. if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
  1180. params.dtim_period =
  1181. nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
  1182. haveinfo = 1;
  1183. }
  1184. if (info->attrs[NL80211_ATTR_BEACON_HEAD]) {
  1185. params.head = nla_data(info->attrs[NL80211_ATTR_BEACON_HEAD]);
  1186. params.head_len =
  1187. nla_len(info->attrs[NL80211_ATTR_BEACON_HEAD]);
  1188. haveinfo = 1;
  1189. }
  1190. if (info->attrs[NL80211_ATTR_BEACON_TAIL]) {
  1191. params.tail = nla_data(info->attrs[NL80211_ATTR_BEACON_TAIL]);
  1192. params.tail_len =
  1193. nla_len(info->attrs[NL80211_ATTR_BEACON_TAIL]);
  1194. haveinfo = 1;
  1195. }
  1196. if (!haveinfo) {
  1197. err = -EINVAL;
  1198. goto out;
  1199. }
  1200. err = call(&rdev->wiphy, dev, &params);
  1201. out:
  1202. cfg80211_unlock_rdev(rdev);
  1203. dev_put(dev);
  1204. unlock_rtnl:
  1205. rtnl_unlock();
  1206. return err;
  1207. }
  1208. static int nl80211_del_beacon(struct sk_buff *skb, struct genl_info *info)
  1209. {
  1210. struct cfg80211_registered_device *rdev;
  1211. int err;
  1212. struct net_device *dev;
  1213. rtnl_lock();
  1214. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1215. if (err)
  1216. goto unlock_rtnl;
  1217. if (!rdev->ops->del_beacon) {
  1218. err = -EOPNOTSUPP;
  1219. goto out;
  1220. }
  1221. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP) {
  1222. err = -EOPNOTSUPP;
  1223. goto out;
  1224. }
  1225. err = rdev->ops->del_beacon(&rdev->wiphy, dev);
  1226. out:
  1227. cfg80211_unlock_rdev(rdev);
  1228. dev_put(dev);
  1229. unlock_rtnl:
  1230. rtnl_unlock();
  1231. return err;
  1232. }
  1233. static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = {
  1234. [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG },
  1235. [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG },
  1236. [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG },
  1237. [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG },
  1238. };
  1239. static int parse_station_flags(struct genl_info *info,
  1240. struct station_parameters *params)
  1241. {
  1242. struct nlattr *flags[NL80211_STA_FLAG_MAX + 1];
  1243. struct nlattr *nla;
  1244. int flag;
  1245. /*
  1246. * Try parsing the new attribute first so userspace
  1247. * can specify both for older kernels.
  1248. */
  1249. nla = info->attrs[NL80211_ATTR_STA_FLAGS2];
  1250. if (nla) {
  1251. struct nl80211_sta_flag_update *sta_flags;
  1252. sta_flags = nla_data(nla);
  1253. params->sta_flags_mask = sta_flags->mask;
  1254. params->sta_flags_set = sta_flags->set;
  1255. if ((params->sta_flags_mask |
  1256. params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID))
  1257. return -EINVAL;
  1258. return 0;
  1259. }
  1260. /* if present, parse the old attribute */
  1261. nla = info->attrs[NL80211_ATTR_STA_FLAGS];
  1262. if (!nla)
  1263. return 0;
  1264. if (nla_parse_nested(flags, NL80211_STA_FLAG_MAX,
  1265. nla, sta_flags_policy))
  1266. return -EINVAL;
  1267. params->sta_flags_mask = (1 << __NL80211_STA_FLAG_AFTER_LAST) - 1;
  1268. params->sta_flags_mask &= ~1;
  1269. for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++)
  1270. if (flags[flag])
  1271. params->sta_flags_set |= (1<<flag);
  1272. return 0;
  1273. }
  1274. static u16 nl80211_calculate_bitrate(struct rate_info *rate)
  1275. {
  1276. int modulation, streams, bitrate;
  1277. if (!(rate->flags & RATE_INFO_FLAGS_MCS))
  1278. return rate->legacy;
  1279. /* the formula below does only work for MCS values smaller than 32 */
  1280. if (rate->mcs >= 32)
  1281. return 0;
  1282. modulation = rate->mcs & 7;
  1283. streams = (rate->mcs >> 3) + 1;
  1284. bitrate = (rate->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) ?
  1285. 13500000 : 6500000;
  1286. if (modulation < 4)
  1287. bitrate *= (modulation + 1);
  1288. else if (modulation == 4)
  1289. bitrate *= (modulation + 2);
  1290. else
  1291. bitrate *= (modulation + 3);
  1292. bitrate *= streams;
  1293. if (rate->flags & RATE_INFO_FLAGS_SHORT_GI)
  1294. bitrate = (bitrate / 9) * 10;
  1295. /* do NOT round down here */
  1296. return (bitrate + 50000) / 100000;
  1297. }
  1298. static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
  1299. int flags, struct net_device *dev,
  1300. u8 *mac_addr, struct station_info *sinfo)
  1301. {
  1302. void *hdr;
  1303. struct nlattr *sinfoattr, *txrate;
  1304. u16 bitrate;
  1305. hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_STATION);
  1306. if (!hdr)
  1307. return -1;
  1308. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  1309. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr);
  1310. sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO);
  1311. if (!sinfoattr)
  1312. goto nla_put_failure;
  1313. if (sinfo->filled & STATION_INFO_INACTIVE_TIME)
  1314. NLA_PUT_U32(msg, NL80211_STA_INFO_INACTIVE_TIME,
  1315. sinfo->inactive_time);
  1316. if (sinfo->filled & STATION_INFO_RX_BYTES)
  1317. NLA_PUT_U32(msg, NL80211_STA_INFO_RX_BYTES,
  1318. sinfo->rx_bytes);
  1319. if (sinfo->filled & STATION_INFO_TX_BYTES)
  1320. NLA_PUT_U32(msg, NL80211_STA_INFO_TX_BYTES,
  1321. sinfo->tx_bytes);
  1322. if (sinfo->filled & STATION_INFO_LLID)
  1323. NLA_PUT_U16(msg, NL80211_STA_INFO_LLID,
  1324. sinfo->llid);
  1325. if (sinfo->filled & STATION_INFO_PLID)
  1326. NLA_PUT_U16(msg, NL80211_STA_INFO_PLID,
  1327. sinfo->plid);
  1328. if (sinfo->filled & STATION_INFO_PLINK_STATE)
  1329. NLA_PUT_U8(msg, NL80211_STA_INFO_PLINK_STATE,
  1330. sinfo->plink_state);
  1331. if (sinfo->filled & STATION_INFO_SIGNAL)
  1332. NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL,
  1333. sinfo->signal);
  1334. if (sinfo->filled & STATION_INFO_TX_BITRATE) {
  1335. txrate = nla_nest_start(msg, NL80211_STA_INFO_TX_BITRATE);
  1336. if (!txrate)
  1337. goto nla_put_failure;
  1338. /* nl80211_calculate_bitrate will return 0 for mcs >= 32 */
  1339. bitrate = nl80211_calculate_bitrate(&sinfo->txrate);
  1340. if (bitrate > 0)
  1341. NLA_PUT_U16(msg, NL80211_RATE_INFO_BITRATE, bitrate);
  1342. if (sinfo->txrate.flags & RATE_INFO_FLAGS_MCS)
  1343. NLA_PUT_U8(msg, NL80211_RATE_INFO_MCS,
  1344. sinfo->txrate.mcs);
  1345. if (sinfo->txrate.flags & RATE_INFO_FLAGS_40_MHZ_WIDTH)
  1346. NLA_PUT_FLAG(msg, NL80211_RATE_INFO_40_MHZ_WIDTH);
  1347. if (sinfo->txrate.flags & RATE_INFO_FLAGS_SHORT_GI)
  1348. NLA_PUT_FLAG(msg, NL80211_RATE_INFO_SHORT_GI);
  1349. nla_nest_end(msg, txrate);
  1350. }
  1351. if (sinfo->filled & STATION_INFO_RX_PACKETS)
  1352. NLA_PUT_U32(msg, NL80211_STA_INFO_RX_PACKETS,
  1353. sinfo->rx_packets);
  1354. if (sinfo->filled & STATION_INFO_TX_PACKETS)
  1355. NLA_PUT_U32(msg, NL80211_STA_INFO_TX_PACKETS,
  1356. sinfo->tx_packets);
  1357. nla_nest_end(msg, sinfoattr);
  1358. return genlmsg_end(msg, hdr);
  1359. nla_put_failure:
  1360. genlmsg_cancel(msg, hdr);
  1361. return -EMSGSIZE;
  1362. }
  1363. static int nl80211_dump_station(struct sk_buff *skb,
  1364. struct netlink_callback *cb)
  1365. {
  1366. struct station_info sinfo;
  1367. struct cfg80211_registered_device *dev;
  1368. struct net_device *netdev;
  1369. u8 mac_addr[ETH_ALEN];
  1370. int ifidx = cb->args[0];
  1371. int sta_idx = cb->args[1];
  1372. int err;
  1373. if (!ifidx) {
  1374. err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
  1375. nl80211_fam.attrbuf, nl80211_fam.maxattr,
  1376. nl80211_policy);
  1377. if (err)
  1378. return err;
  1379. if (!nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX])
  1380. return -EINVAL;
  1381. ifidx = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX]);
  1382. if (!ifidx)
  1383. return -EINVAL;
  1384. }
  1385. rtnl_lock();
  1386. netdev = __dev_get_by_index(sock_net(skb->sk), ifidx);
  1387. if (!netdev) {
  1388. err = -ENODEV;
  1389. goto out_rtnl;
  1390. }
  1391. dev = cfg80211_get_dev_from_ifindex(sock_net(skb->sk), ifidx);
  1392. if (IS_ERR(dev)) {
  1393. err = PTR_ERR(dev);
  1394. goto out_rtnl;
  1395. }
  1396. if (!dev->ops->dump_station) {
  1397. err = -EOPNOTSUPP;
  1398. goto out_err;
  1399. }
  1400. while (1) {
  1401. err = dev->ops->dump_station(&dev->wiphy, netdev, sta_idx,
  1402. mac_addr, &sinfo);
  1403. if (err == -ENOENT)
  1404. break;
  1405. if (err)
  1406. goto out_err;
  1407. if (nl80211_send_station(skb,
  1408. NETLINK_CB(cb->skb).pid,
  1409. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  1410. netdev, mac_addr,
  1411. &sinfo) < 0)
  1412. goto out;
  1413. sta_idx++;
  1414. }
  1415. out:
  1416. cb->args[1] = sta_idx;
  1417. err = skb->len;
  1418. out_err:
  1419. cfg80211_unlock_rdev(dev);
  1420. out_rtnl:
  1421. rtnl_unlock();
  1422. return err;
  1423. }
  1424. static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
  1425. {
  1426. struct cfg80211_registered_device *rdev;
  1427. int err;
  1428. struct net_device *dev;
  1429. struct station_info sinfo;
  1430. struct sk_buff *msg;
  1431. u8 *mac_addr = NULL;
  1432. memset(&sinfo, 0, sizeof(sinfo));
  1433. if (!info->attrs[NL80211_ATTR_MAC])
  1434. return -EINVAL;
  1435. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1436. rtnl_lock();
  1437. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1438. if (err)
  1439. goto out_rtnl;
  1440. if (!rdev->ops->get_station) {
  1441. err = -EOPNOTSUPP;
  1442. goto out;
  1443. }
  1444. err = rdev->ops->get_station(&rdev->wiphy, dev, mac_addr, &sinfo);
  1445. if (err)
  1446. goto out;
  1447. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  1448. if (!msg)
  1449. goto out;
  1450. if (nl80211_send_station(msg, info->snd_pid, info->snd_seq, 0,
  1451. dev, mac_addr, &sinfo) < 0)
  1452. goto out_free;
  1453. err = genlmsg_reply(msg, info);
  1454. goto out;
  1455. out_free:
  1456. nlmsg_free(msg);
  1457. out:
  1458. cfg80211_unlock_rdev(rdev);
  1459. dev_put(dev);
  1460. out_rtnl:
  1461. rtnl_unlock();
  1462. return err;
  1463. }
  1464. /*
  1465. * Get vlan interface making sure it is on the right wiphy.
  1466. */
  1467. static int get_vlan(struct genl_info *info,
  1468. struct cfg80211_registered_device *rdev,
  1469. struct net_device **vlan)
  1470. {
  1471. struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN];
  1472. *vlan = NULL;
  1473. if (vlanattr) {
  1474. *vlan = dev_get_by_index(genl_info_net(info),
  1475. nla_get_u32(vlanattr));
  1476. if (!*vlan)
  1477. return -ENODEV;
  1478. if (!(*vlan)->ieee80211_ptr)
  1479. return -EINVAL;
  1480. if ((*vlan)->ieee80211_ptr->wiphy != &rdev->wiphy)
  1481. return -EINVAL;
  1482. }
  1483. return 0;
  1484. }
  1485. static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
  1486. {
  1487. struct cfg80211_registered_device *rdev;
  1488. int err;
  1489. struct net_device *dev;
  1490. struct station_parameters params;
  1491. u8 *mac_addr = NULL;
  1492. memset(&params, 0, sizeof(params));
  1493. params.listen_interval = -1;
  1494. if (info->attrs[NL80211_ATTR_STA_AID])
  1495. return -EINVAL;
  1496. if (!info->attrs[NL80211_ATTR_MAC])
  1497. return -EINVAL;
  1498. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1499. if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
  1500. params.supported_rates =
  1501. nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
  1502. params.supported_rates_len =
  1503. nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
  1504. }
  1505. if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
  1506. params.listen_interval =
  1507. nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
  1508. if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
  1509. params.ht_capa =
  1510. nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
  1511. if (parse_station_flags(info, &params))
  1512. return -EINVAL;
  1513. if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
  1514. params.plink_action =
  1515. nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
  1516. rtnl_lock();
  1517. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1518. if (err)
  1519. goto out_rtnl;
  1520. err = get_vlan(info, rdev, &params.vlan);
  1521. if (err)
  1522. goto out;
  1523. /* validate settings */
  1524. err = 0;
  1525. switch (dev->ieee80211_ptr->iftype) {
  1526. case NL80211_IFTYPE_AP:
  1527. case NL80211_IFTYPE_AP_VLAN:
  1528. /* disallow mesh-specific things */
  1529. if (params.plink_action)
  1530. err = -EINVAL;
  1531. break;
  1532. case NL80211_IFTYPE_STATION:
  1533. /* disallow everything but AUTHORIZED flag */
  1534. if (params.plink_action)
  1535. err = -EINVAL;
  1536. if (params.vlan)
  1537. err = -EINVAL;
  1538. if (params.supported_rates)
  1539. err = -EINVAL;
  1540. if (params.ht_capa)
  1541. err = -EINVAL;
  1542. if (params.listen_interval >= 0)
  1543. err = -EINVAL;
  1544. if (params.sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED))
  1545. err = -EINVAL;
  1546. break;
  1547. case NL80211_IFTYPE_MESH_POINT:
  1548. /* disallow things mesh doesn't support */
  1549. if (params.vlan)
  1550. err = -EINVAL;
  1551. if (params.ht_capa)
  1552. err = -EINVAL;
  1553. if (params.listen_interval >= 0)
  1554. err = -EINVAL;
  1555. if (params.supported_rates)
  1556. err = -EINVAL;
  1557. if (params.sta_flags_mask)
  1558. err = -EINVAL;
  1559. break;
  1560. default:
  1561. err = -EINVAL;
  1562. }
  1563. if (err)
  1564. goto out;
  1565. if (!rdev->ops->change_station) {
  1566. err = -EOPNOTSUPP;
  1567. goto out;
  1568. }
  1569. err = rdev->ops->change_station(&rdev->wiphy, dev, mac_addr, &params);
  1570. out:
  1571. if (params.vlan)
  1572. dev_put(params.vlan);
  1573. cfg80211_unlock_rdev(rdev);
  1574. dev_put(dev);
  1575. out_rtnl:
  1576. rtnl_unlock();
  1577. return err;
  1578. }
  1579. static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
  1580. {
  1581. struct cfg80211_registered_device *rdev;
  1582. int err;
  1583. struct net_device *dev;
  1584. struct station_parameters params;
  1585. u8 *mac_addr = NULL;
  1586. memset(&params, 0, sizeof(params));
  1587. if (!info->attrs[NL80211_ATTR_MAC])
  1588. return -EINVAL;
  1589. if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
  1590. return -EINVAL;
  1591. if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
  1592. return -EINVAL;
  1593. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1594. params.supported_rates =
  1595. nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
  1596. params.supported_rates_len =
  1597. nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
  1598. params.listen_interval =
  1599. nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
  1600. if (info->attrs[NL80211_ATTR_STA_AID]) {
  1601. params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
  1602. if (!params.aid || params.aid > IEEE80211_MAX_AID)
  1603. return -EINVAL;
  1604. }
  1605. if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
  1606. params.ht_capa =
  1607. nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
  1608. if (parse_station_flags(info, &params))
  1609. return -EINVAL;
  1610. rtnl_lock();
  1611. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1612. if (err)
  1613. goto out_rtnl;
  1614. err = get_vlan(info, rdev, &params.vlan);
  1615. if (err)
  1616. goto out;
  1617. /* validate settings */
  1618. err = 0;
  1619. switch (dev->ieee80211_ptr->iftype) {
  1620. case NL80211_IFTYPE_AP:
  1621. case NL80211_IFTYPE_AP_VLAN:
  1622. /* all ok but must have AID */
  1623. if (!params.aid)
  1624. err = -EINVAL;
  1625. break;
  1626. case NL80211_IFTYPE_MESH_POINT:
  1627. /* disallow things mesh doesn't support */
  1628. if (params.vlan)
  1629. err = -EINVAL;
  1630. if (params.aid)
  1631. err = -EINVAL;
  1632. if (params.ht_capa)
  1633. err = -EINVAL;
  1634. if (params.listen_interval >= 0)
  1635. err = -EINVAL;
  1636. if (params.supported_rates)
  1637. err = -EINVAL;
  1638. if (params.sta_flags_mask)
  1639. err = -EINVAL;
  1640. break;
  1641. default:
  1642. err = -EINVAL;
  1643. }
  1644. if (err)
  1645. goto out;
  1646. if (!rdev->ops->add_station) {
  1647. err = -EOPNOTSUPP;
  1648. goto out;
  1649. }
  1650. if (!netif_running(dev)) {
  1651. err = -ENETDOWN;
  1652. goto out;
  1653. }
  1654. err = rdev->ops->add_station(&rdev->wiphy, dev, mac_addr, &params);
  1655. out:
  1656. if (params.vlan)
  1657. dev_put(params.vlan);
  1658. cfg80211_unlock_rdev(rdev);
  1659. dev_put(dev);
  1660. out_rtnl:
  1661. rtnl_unlock();
  1662. return err;
  1663. }
  1664. static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
  1665. {
  1666. struct cfg80211_registered_device *rdev;
  1667. int err;
  1668. struct net_device *dev;
  1669. u8 *mac_addr = NULL;
  1670. if (info->attrs[NL80211_ATTR_MAC])
  1671. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1672. rtnl_lock();
  1673. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1674. if (err)
  1675. goto out_rtnl;
  1676. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  1677. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
  1678. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) {
  1679. err = -EINVAL;
  1680. goto out;
  1681. }
  1682. if (!rdev->ops->del_station) {
  1683. err = -EOPNOTSUPP;
  1684. goto out;
  1685. }
  1686. err = rdev->ops->del_station(&rdev->wiphy, dev, mac_addr);
  1687. out:
  1688. cfg80211_unlock_rdev(rdev);
  1689. dev_put(dev);
  1690. out_rtnl:
  1691. rtnl_unlock();
  1692. return err;
  1693. }
  1694. static int nl80211_send_mpath(struct sk_buff *msg, u32 pid, u32 seq,
  1695. int flags, struct net_device *dev,
  1696. u8 *dst, u8 *next_hop,
  1697. struct mpath_info *pinfo)
  1698. {
  1699. void *hdr;
  1700. struct nlattr *pinfoattr;
  1701. hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_STATION);
  1702. if (!hdr)
  1703. return -1;
  1704. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  1705. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, dst);
  1706. NLA_PUT(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop);
  1707. pinfoattr = nla_nest_start(msg, NL80211_ATTR_MPATH_INFO);
  1708. if (!pinfoattr)
  1709. goto nla_put_failure;
  1710. if (pinfo->filled & MPATH_INFO_FRAME_QLEN)
  1711. NLA_PUT_U32(msg, NL80211_MPATH_INFO_FRAME_QLEN,
  1712. pinfo->frame_qlen);
  1713. if (pinfo->filled & MPATH_INFO_DSN)
  1714. NLA_PUT_U32(msg, NL80211_MPATH_INFO_DSN,
  1715. pinfo->dsn);
  1716. if (pinfo->filled & MPATH_INFO_METRIC)
  1717. NLA_PUT_U32(msg, NL80211_MPATH_INFO_METRIC,
  1718. pinfo->metric);
  1719. if (pinfo->filled & MPATH_INFO_EXPTIME)
  1720. NLA_PUT_U32(msg, NL80211_MPATH_INFO_EXPTIME,
  1721. pinfo->exptime);
  1722. if (pinfo->filled & MPATH_INFO_FLAGS)
  1723. NLA_PUT_U8(msg, NL80211_MPATH_INFO_FLAGS,
  1724. pinfo->flags);
  1725. if (pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT)
  1726. NLA_PUT_U32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
  1727. pinfo->discovery_timeout);
  1728. if (pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES)
  1729. NLA_PUT_U8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES,
  1730. pinfo->discovery_retries);
  1731. nla_nest_end(msg, pinfoattr);
  1732. return genlmsg_end(msg, hdr);
  1733. nla_put_failure:
  1734. genlmsg_cancel(msg, hdr);
  1735. return -EMSGSIZE;
  1736. }
  1737. static int nl80211_dump_mpath(struct sk_buff *skb,
  1738. struct netlink_callback *cb)
  1739. {
  1740. struct mpath_info pinfo;
  1741. struct cfg80211_registered_device *dev;
  1742. struct net_device *netdev;
  1743. u8 dst[ETH_ALEN];
  1744. u8 next_hop[ETH_ALEN];
  1745. int ifidx = cb->args[0];
  1746. int path_idx = cb->args[1];
  1747. int err;
  1748. if (!ifidx) {
  1749. err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
  1750. nl80211_fam.attrbuf, nl80211_fam.maxattr,
  1751. nl80211_policy);
  1752. if (err)
  1753. return err;
  1754. if (!nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX])
  1755. return -EINVAL;
  1756. ifidx = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX]);
  1757. if (!ifidx)
  1758. return -EINVAL;
  1759. }
  1760. rtnl_lock();
  1761. netdev = __dev_get_by_index(sock_net(skb->sk), ifidx);
  1762. if (!netdev) {
  1763. err = -ENODEV;
  1764. goto out_rtnl;
  1765. }
  1766. dev = cfg80211_get_dev_from_ifindex(sock_net(skb->sk), ifidx);
  1767. if (IS_ERR(dev)) {
  1768. err = PTR_ERR(dev);
  1769. goto out_rtnl;
  1770. }
  1771. if (!dev->ops->dump_mpath) {
  1772. err = -EOPNOTSUPP;
  1773. goto out_err;
  1774. }
  1775. if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) {
  1776. err = -EOPNOTSUPP;
  1777. goto out;
  1778. }
  1779. while (1) {
  1780. err = dev->ops->dump_mpath(&dev->wiphy, netdev, path_idx,
  1781. dst, next_hop, &pinfo);
  1782. if (err == -ENOENT)
  1783. break;
  1784. if (err)
  1785. goto out_err;
  1786. if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).pid,
  1787. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  1788. netdev, dst, next_hop,
  1789. &pinfo) < 0)
  1790. goto out;
  1791. path_idx++;
  1792. }
  1793. out:
  1794. cb->args[1] = path_idx;
  1795. err = skb->len;
  1796. out_err:
  1797. cfg80211_unlock_rdev(dev);
  1798. out_rtnl:
  1799. rtnl_unlock();
  1800. return err;
  1801. }
  1802. static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info)
  1803. {
  1804. struct cfg80211_registered_device *rdev;
  1805. int err;
  1806. struct net_device *dev;
  1807. struct mpath_info pinfo;
  1808. struct sk_buff *msg;
  1809. u8 *dst = NULL;
  1810. u8 next_hop[ETH_ALEN];
  1811. memset(&pinfo, 0, sizeof(pinfo));
  1812. if (!info->attrs[NL80211_ATTR_MAC])
  1813. return -EINVAL;
  1814. dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1815. rtnl_lock();
  1816. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1817. if (err)
  1818. goto out_rtnl;
  1819. if (!rdev->ops->get_mpath) {
  1820. err = -EOPNOTSUPP;
  1821. goto out;
  1822. }
  1823. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) {
  1824. err = -EOPNOTSUPP;
  1825. goto out;
  1826. }
  1827. err = rdev->ops->get_mpath(&rdev->wiphy, dev, dst, next_hop, &pinfo);
  1828. if (err)
  1829. goto out;
  1830. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  1831. if (!msg)
  1832. goto out;
  1833. if (nl80211_send_mpath(msg, info->snd_pid, info->snd_seq, 0,
  1834. dev, dst, next_hop, &pinfo) < 0)
  1835. goto out_free;
  1836. err = genlmsg_reply(msg, info);
  1837. goto out;
  1838. out_free:
  1839. nlmsg_free(msg);
  1840. out:
  1841. cfg80211_unlock_rdev(rdev);
  1842. dev_put(dev);
  1843. out_rtnl:
  1844. rtnl_unlock();
  1845. return err;
  1846. }
  1847. static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info)
  1848. {
  1849. struct cfg80211_registered_device *rdev;
  1850. int err;
  1851. struct net_device *dev;
  1852. u8 *dst = NULL;
  1853. u8 *next_hop = NULL;
  1854. if (!info->attrs[NL80211_ATTR_MAC])
  1855. return -EINVAL;
  1856. if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
  1857. return -EINVAL;
  1858. dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1859. next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
  1860. rtnl_lock();
  1861. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1862. if (err)
  1863. goto out_rtnl;
  1864. if (!rdev->ops->change_mpath) {
  1865. err = -EOPNOTSUPP;
  1866. goto out;
  1867. }
  1868. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) {
  1869. err = -EOPNOTSUPP;
  1870. goto out;
  1871. }
  1872. if (!netif_running(dev)) {
  1873. err = -ENETDOWN;
  1874. goto out;
  1875. }
  1876. err = rdev->ops->change_mpath(&rdev->wiphy, dev, dst, next_hop);
  1877. out:
  1878. cfg80211_unlock_rdev(rdev);
  1879. dev_put(dev);
  1880. out_rtnl:
  1881. rtnl_unlock();
  1882. return err;
  1883. }
  1884. static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info)
  1885. {
  1886. struct cfg80211_registered_device *rdev;
  1887. int err;
  1888. struct net_device *dev;
  1889. u8 *dst = NULL;
  1890. u8 *next_hop = NULL;
  1891. if (!info->attrs[NL80211_ATTR_MAC])
  1892. return -EINVAL;
  1893. if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
  1894. return -EINVAL;
  1895. dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1896. next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
  1897. rtnl_lock();
  1898. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1899. if (err)
  1900. goto out_rtnl;
  1901. if (!rdev->ops->add_mpath) {
  1902. err = -EOPNOTSUPP;
  1903. goto out;
  1904. }
  1905. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) {
  1906. err = -EOPNOTSUPP;
  1907. goto out;
  1908. }
  1909. if (!netif_running(dev)) {
  1910. err = -ENETDOWN;
  1911. goto out;
  1912. }
  1913. err = rdev->ops->add_mpath(&rdev->wiphy, dev, dst, next_hop);
  1914. out:
  1915. cfg80211_unlock_rdev(rdev);
  1916. dev_put(dev);
  1917. out_rtnl:
  1918. rtnl_unlock();
  1919. return err;
  1920. }
  1921. static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
  1922. {
  1923. struct cfg80211_registered_device *rdev;
  1924. int err;
  1925. struct net_device *dev;
  1926. u8 *dst = NULL;
  1927. if (info->attrs[NL80211_ATTR_MAC])
  1928. dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
  1929. rtnl_lock();
  1930. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1931. if (err)
  1932. goto out_rtnl;
  1933. if (!rdev->ops->del_mpath) {
  1934. err = -EOPNOTSUPP;
  1935. goto out;
  1936. }
  1937. err = rdev->ops->del_mpath(&rdev->wiphy, dev, dst);
  1938. out:
  1939. cfg80211_unlock_rdev(rdev);
  1940. dev_put(dev);
  1941. out_rtnl:
  1942. rtnl_unlock();
  1943. return err;
  1944. }
  1945. static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
  1946. {
  1947. struct cfg80211_registered_device *rdev;
  1948. int err;
  1949. struct net_device *dev;
  1950. struct bss_parameters params;
  1951. memset(&params, 0, sizeof(params));
  1952. /* default to not changing parameters */
  1953. params.use_cts_prot = -1;
  1954. params.use_short_preamble = -1;
  1955. params.use_short_slot_time = -1;
  1956. if (info->attrs[NL80211_ATTR_BSS_CTS_PROT])
  1957. params.use_cts_prot =
  1958. nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]);
  1959. if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE])
  1960. params.use_short_preamble =
  1961. nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]);
  1962. if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME])
  1963. params.use_short_slot_time =
  1964. nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]);
  1965. if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
  1966. params.basic_rates =
  1967. nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
  1968. params.basic_rates_len =
  1969. nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
  1970. }
  1971. rtnl_lock();
  1972. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  1973. if (err)
  1974. goto out_rtnl;
  1975. if (!rdev->ops->change_bss) {
  1976. err = -EOPNOTSUPP;
  1977. goto out;
  1978. }
  1979. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP) {
  1980. err = -EOPNOTSUPP;
  1981. goto out;
  1982. }
  1983. err = rdev->ops->change_bss(&rdev->wiphy, dev, &params);
  1984. out:
  1985. cfg80211_unlock_rdev(rdev);
  1986. dev_put(dev);
  1987. out_rtnl:
  1988. rtnl_unlock();
  1989. return err;
  1990. }
  1991. static const struct nla_policy
  1992. reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
  1993. [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 },
  1994. [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 },
  1995. [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 },
  1996. [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 },
  1997. [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 },
  1998. [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 },
  1999. };
  2000. static int parse_reg_rule(struct nlattr *tb[],
  2001. struct ieee80211_reg_rule *reg_rule)
  2002. {
  2003. struct ieee80211_freq_range *freq_range = &reg_rule->freq_range;
  2004. struct ieee80211_power_rule *power_rule = &reg_rule->power_rule;
  2005. if (!tb[NL80211_ATTR_REG_RULE_FLAGS])
  2006. return -EINVAL;
  2007. if (!tb[NL80211_ATTR_FREQ_RANGE_START])
  2008. return -EINVAL;
  2009. if (!tb[NL80211_ATTR_FREQ_RANGE_END])
  2010. return -EINVAL;
  2011. if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW])
  2012. return -EINVAL;
  2013. if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP])
  2014. return -EINVAL;
  2015. reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]);
  2016. freq_range->start_freq_khz =
  2017. nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]);
  2018. freq_range->end_freq_khz =
  2019. nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]);
  2020. freq_range->max_bandwidth_khz =
  2021. nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]);
  2022. power_rule->max_eirp =
  2023. nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]);
  2024. if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN])
  2025. power_rule->max_antenna_gain =
  2026. nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]);
  2027. return 0;
  2028. }
  2029. static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
  2030. {
  2031. int r;
  2032. char *data = NULL;
  2033. /*
  2034. * You should only get this when cfg80211 hasn't yet initialized
  2035. * completely when built-in to the kernel right between the time
  2036. * window between nl80211_init() and regulatory_init(), if that is
  2037. * even possible.
  2038. */
  2039. mutex_lock(&cfg80211_mutex);
  2040. if (unlikely(!cfg80211_regdomain)) {
  2041. mutex_unlock(&cfg80211_mutex);
  2042. return -EINPROGRESS;
  2043. }
  2044. mutex_unlock(&cfg80211_mutex);
  2045. if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
  2046. return -EINVAL;
  2047. data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
  2048. #ifdef CONFIG_WIRELESS_OLD_REGULATORY
  2049. /* We ignore world regdom requests with the old regdom setup */
  2050. if (is_world_regdom(data))
  2051. return -EINVAL;
  2052. #endif
  2053. r = regulatory_hint_user(data);
  2054. return r;
  2055. }
  2056. static int nl80211_get_mesh_params(struct sk_buff *skb,
  2057. struct genl_info *info)
  2058. {
  2059. struct cfg80211_registered_device *rdev;
  2060. struct mesh_config cur_params;
  2061. int err;
  2062. struct net_device *dev;
  2063. void *hdr;
  2064. struct nlattr *pinfoattr;
  2065. struct sk_buff *msg;
  2066. rtnl_lock();
  2067. /* Look up our device */
  2068. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  2069. if (err)
  2070. goto out_rtnl;
  2071. if (!rdev->ops->get_mesh_params) {
  2072. err = -EOPNOTSUPP;
  2073. goto out;
  2074. }
  2075. /* Get the mesh params */
  2076. err = rdev->ops->get_mesh_params(&rdev->wiphy, dev, &cur_params);
  2077. if (err)
  2078. goto out;
  2079. /* Draw up a netlink message to send back */
  2080. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  2081. if (!msg) {
  2082. err = -ENOBUFS;
  2083. goto out;
  2084. }
  2085. hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
  2086. NL80211_CMD_GET_MESH_PARAMS);
  2087. if (!hdr)
  2088. goto nla_put_failure;
  2089. pinfoattr = nla_nest_start(msg, NL80211_ATTR_MESH_PARAMS);
  2090. if (!pinfoattr)
  2091. goto nla_put_failure;
  2092. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
  2093. NLA_PUT_U16(msg, NL80211_MESHCONF_RETRY_TIMEOUT,
  2094. cur_params.dot11MeshRetryTimeout);
  2095. NLA_PUT_U16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT,
  2096. cur_params.dot11MeshConfirmTimeout);
  2097. NLA_PUT_U16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT,
  2098. cur_params.dot11MeshHoldingTimeout);
  2099. NLA_PUT_U16(msg, NL80211_MESHCONF_MAX_PEER_LINKS,
  2100. cur_params.dot11MeshMaxPeerLinks);
  2101. NLA_PUT_U8(msg, NL80211_MESHCONF_MAX_RETRIES,
  2102. cur_params.dot11MeshMaxRetries);
  2103. NLA_PUT_U8(msg, NL80211_MESHCONF_TTL,
  2104. cur_params.dot11MeshTTL);
  2105. NLA_PUT_U8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
  2106. cur_params.auto_open_plinks);
  2107. NLA_PUT_U8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
  2108. cur_params.dot11MeshHWMPmaxPREQretries);
  2109. NLA_PUT_U32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME,
  2110. cur_params.path_refresh_time);
  2111. NLA_PUT_U16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
  2112. cur_params.min_discovery_timeout);
  2113. NLA_PUT_U32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
  2114. cur_params.dot11MeshHWMPactivePathTimeout);
  2115. NLA_PUT_U16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
  2116. cur_params.dot11MeshHWMPpreqMinInterval);
  2117. NLA_PUT_U16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
  2118. cur_params.dot11MeshHWMPnetDiameterTraversalTime);
  2119. nla_nest_end(msg, pinfoattr);
  2120. genlmsg_end(msg, hdr);
  2121. err = genlmsg_reply(msg, info);
  2122. goto out;
  2123. nla_put_failure:
  2124. genlmsg_cancel(msg, hdr);
  2125. err = -EMSGSIZE;
  2126. out:
  2127. /* Cleanup */
  2128. cfg80211_unlock_rdev(rdev);
  2129. dev_put(dev);
  2130. out_rtnl:
  2131. rtnl_unlock();
  2132. return err;
  2133. }
  2134. #define FILL_IN_MESH_PARAM_IF_SET(table, cfg, param, mask, attr_num, nla_fn) \
  2135. do {\
  2136. if (table[attr_num]) {\
  2137. cfg.param = nla_fn(table[attr_num]); \
  2138. mask |= (1 << (attr_num - 1)); \
  2139. } \
  2140. } while (0);\
  2141. static struct nla_policy
  2142. nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] __read_mostly = {
  2143. [NL80211_MESHCONF_RETRY_TIMEOUT] = { .type = NLA_U16 },
  2144. [NL80211_MESHCONF_CONFIRM_TIMEOUT] = { .type = NLA_U16 },
  2145. [NL80211_MESHCONF_HOLDING_TIMEOUT] = { .type = NLA_U16 },
  2146. [NL80211_MESHCONF_MAX_PEER_LINKS] = { .type = NLA_U16 },
  2147. [NL80211_MESHCONF_MAX_RETRIES] = { .type = NLA_U8 },
  2148. [NL80211_MESHCONF_TTL] = { .type = NLA_U8 },
  2149. [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = { .type = NLA_U8 },
  2150. [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 },
  2151. [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 },
  2152. [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = { .type = NLA_U16 },
  2153. [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 },
  2154. [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = { .type = NLA_U16 },
  2155. [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = { .type = NLA_U16 },
  2156. };
  2157. static int nl80211_set_mesh_params(struct sk_buff *skb, struct genl_info *info)
  2158. {
  2159. int err;
  2160. u32 mask;
  2161. struct cfg80211_registered_device *rdev;
  2162. struct net_device *dev;
  2163. struct mesh_config cfg;
  2164. struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1];
  2165. struct nlattr *parent_attr;
  2166. parent_attr = info->attrs[NL80211_ATTR_MESH_PARAMS];
  2167. if (!parent_attr)
  2168. return -EINVAL;
  2169. if (nla_parse_nested(tb, NL80211_MESHCONF_ATTR_MAX,
  2170. parent_attr, nl80211_meshconf_params_policy))
  2171. return -EINVAL;
  2172. rtnl_lock();
  2173. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  2174. if (err)
  2175. goto out_rtnl;
  2176. if (!rdev->ops->set_mesh_params) {
  2177. err = -EOPNOTSUPP;
  2178. goto out;
  2179. }
  2180. /* This makes sure that there aren't more than 32 mesh config
  2181. * parameters (otherwise our bitfield scheme would not work.) */
  2182. BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
  2183. /* Fill in the params struct */
  2184. mask = 0;
  2185. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout,
  2186. mask, NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16);
  2187. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout,
  2188. mask, NL80211_MESHCONF_CONFIRM_TIMEOUT, nla_get_u16);
  2189. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout,
  2190. mask, NL80211_MESHCONF_HOLDING_TIMEOUT, nla_get_u16);
  2191. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks,
  2192. mask, NL80211_MESHCONF_MAX_PEER_LINKS, nla_get_u16);
  2193. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries,
  2194. mask, NL80211_MESHCONF_MAX_RETRIES, nla_get_u8);
  2195. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL,
  2196. mask, NL80211_MESHCONF_TTL, nla_get_u8);
  2197. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks,
  2198. mask, NL80211_MESHCONF_AUTO_OPEN_PLINKS, nla_get_u8);
  2199. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries,
  2200. mask, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
  2201. nla_get_u8);
  2202. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time,
  2203. mask, NL80211_MESHCONF_PATH_REFRESH_TIME, nla_get_u32);
  2204. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout,
  2205. mask, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
  2206. nla_get_u16);
  2207. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout,
  2208. mask, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
  2209. nla_get_u32);
  2210. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval,
  2211. mask, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
  2212. nla_get_u16);
  2213. FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
  2214. dot11MeshHWMPnetDiameterTraversalTime,
  2215. mask, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
  2216. nla_get_u16);
  2217. /* Apply changes */
  2218. err = rdev->ops->set_mesh_params(&rdev->wiphy, dev, &cfg, mask);
  2219. out:
  2220. /* cleanup */
  2221. cfg80211_unlock_rdev(rdev);
  2222. dev_put(dev);
  2223. out_rtnl:
  2224. rtnl_unlock();
  2225. return err;
  2226. }
  2227. #undef FILL_IN_MESH_PARAM_IF_SET
  2228. static int nl80211_get_reg(struct sk_buff *skb, struct genl_info *info)
  2229. {
  2230. struct sk_buff *msg;
  2231. void *hdr = NULL;
  2232. struct nlattr *nl_reg_rules;
  2233. unsigned int i;
  2234. int err = -EINVAL;
  2235. mutex_lock(&cfg80211_mutex);
  2236. if (!cfg80211_regdomain)
  2237. goto out;
  2238. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  2239. if (!msg) {
  2240. err = -ENOBUFS;
  2241. goto out;
  2242. }
  2243. hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
  2244. NL80211_CMD_GET_REG);
  2245. if (!hdr)
  2246. goto nla_put_failure;
  2247. NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2,
  2248. cfg80211_regdomain->alpha2);
  2249. nl_reg_rules = nla_nest_start(msg, NL80211_ATTR_REG_RULES);
  2250. if (!nl_reg_rules)
  2251. goto nla_put_failure;
  2252. for (i = 0; i < cfg80211_regdomain->n_reg_rules; i++) {
  2253. struct nlattr *nl_reg_rule;
  2254. const struct ieee80211_reg_rule *reg_rule;
  2255. const struct ieee80211_freq_range *freq_range;
  2256. const struct ieee80211_power_rule *power_rule;
  2257. reg_rule = &cfg80211_regdomain->reg_rules[i];
  2258. freq_range = &reg_rule->freq_range;
  2259. power_rule = &reg_rule->power_rule;
  2260. nl_reg_rule = nla_nest_start(msg, i);
  2261. if (!nl_reg_rule)
  2262. goto nla_put_failure;
  2263. NLA_PUT_U32(msg, NL80211_ATTR_REG_RULE_FLAGS,
  2264. reg_rule->flags);
  2265. NLA_PUT_U32(msg, NL80211_ATTR_FREQ_RANGE_START,
  2266. freq_range->start_freq_khz);
  2267. NLA_PUT_U32(msg, NL80211_ATTR_FREQ_RANGE_END,
  2268. freq_range->end_freq_khz);
  2269. NLA_PUT_U32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW,
  2270. freq_range->max_bandwidth_khz);
  2271. NLA_PUT_U32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN,
  2272. power_rule->max_antenna_gain);
  2273. NLA_PUT_U32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP,
  2274. power_rule->max_eirp);
  2275. nla_nest_end(msg, nl_reg_rule);
  2276. }
  2277. nla_nest_end(msg, nl_reg_rules);
  2278. genlmsg_end(msg, hdr);
  2279. err = genlmsg_reply(msg, info);
  2280. goto out;
  2281. nla_put_failure:
  2282. genlmsg_cancel(msg, hdr);
  2283. err = -EMSGSIZE;
  2284. out:
  2285. mutex_unlock(&cfg80211_mutex);
  2286. return err;
  2287. }
  2288. static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
  2289. {
  2290. struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1];
  2291. struct nlattr *nl_reg_rule;
  2292. char *alpha2 = NULL;
  2293. int rem_reg_rules = 0, r = 0;
  2294. u32 num_rules = 0, rule_idx = 0, size_of_regd;
  2295. struct ieee80211_regdomain *rd = NULL;
  2296. if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
  2297. return -EINVAL;
  2298. if (!info->attrs[NL80211_ATTR_REG_RULES])
  2299. return -EINVAL;
  2300. alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
  2301. nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
  2302. rem_reg_rules) {
  2303. num_rules++;
  2304. if (num_rules > NL80211_MAX_SUPP_REG_RULES)
  2305. return -EINVAL;
  2306. }
  2307. mutex_lock(&cfg80211_mutex);
  2308. if (!reg_is_valid_request(alpha2)) {
  2309. r = -EINVAL;
  2310. goto bad_reg;
  2311. }
  2312. size_of_regd = sizeof(struct ieee80211_regdomain) +
  2313. (num_rules * sizeof(struct ieee80211_reg_rule));
  2314. rd = kzalloc(size_of_regd, GFP_KERNEL);
  2315. if (!rd) {
  2316. r = -ENOMEM;
  2317. goto bad_reg;
  2318. }
  2319. rd->n_reg_rules = num_rules;
  2320. rd->alpha2[0] = alpha2[0];
  2321. rd->alpha2[1] = alpha2[1];
  2322. nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
  2323. rem_reg_rules) {
  2324. nla_parse(tb, NL80211_REG_RULE_ATTR_MAX,
  2325. nla_data(nl_reg_rule), nla_len(nl_reg_rule),
  2326. reg_rule_policy);
  2327. r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
  2328. if (r)
  2329. goto bad_reg;
  2330. rule_idx++;
  2331. if (rule_idx > NL80211_MAX_SUPP_REG_RULES) {
  2332. r = -EINVAL;
  2333. goto bad_reg;
  2334. }
  2335. }
  2336. BUG_ON(rule_idx != num_rules);
  2337. r = set_regdom(rd);
  2338. mutex_unlock(&cfg80211_mutex);
  2339. return r;
  2340. bad_reg:
  2341. mutex_unlock(&cfg80211_mutex);
  2342. kfree(rd);
  2343. return r;
  2344. }
  2345. static int validate_scan_freqs(struct nlattr *freqs)
  2346. {
  2347. struct nlattr *attr1, *attr2;
  2348. int n_channels = 0, tmp1, tmp2;
  2349. nla_for_each_nested(attr1, freqs, tmp1) {
  2350. n_channels++;
  2351. /*
  2352. * Some hardware has a limited channel list for
  2353. * scanning, and it is pretty much nonsensical
  2354. * to scan for a channel twice, so disallow that
  2355. * and don't require drivers to check that the
  2356. * channel list they get isn't longer than what
  2357. * they can scan, as long as they can scan all
  2358. * the channels they registered at once.
  2359. */
  2360. nla_for_each_nested(attr2, freqs, tmp2)
  2361. if (attr1 != attr2 &&
  2362. nla_get_u32(attr1) == nla_get_u32(attr2))
  2363. return 0;
  2364. }
  2365. return n_channels;
  2366. }
  2367. static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
  2368. {
  2369. struct cfg80211_registered_device *rdev;
  2370. struct net_device *dev;
  2371. struct cfg80211_scan_request *request;
  2372. struct cfg80211_ssid *ssid;
  2373. struct ieee80211_channel *channel;
  2374. struct nlattr *attr;
  2375. struct wiphy *wiphy;
  2376. int err, tmp, n_ssids = 0, n_channels, i;
  2377. enum ieee80211_band band;
  2378. size_t ie_len;
  2379. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  2380. return -EINVAL;
  2381. rtnl_lock();
  2382. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  2383. if (err)
  2384. goto out_rtnl;
  2385. wiphy = &rdev->wiphy;
  2386. if (!rdev->ops->scan) {
  2387. err = -EOPNOTSUPP;
  2388. goto out;
  2389. }
  2390. if (!netif_running(dev)) {
  2391. err = -ENETDOWN;
  2392. goto out;
  2393. }
  2394. if (rdev->scan_req) {
  2395. err = -EBUSY;
  2396. goto out;
  2397. }
  2398. if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
  2399. n_channels = validate_scan_freqs(
  2400. info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
  2401. if (!n_channels) {
  2402. err = -EINVAL;
  2403. goto out;
  2404. }
  2405. } else {
  2406. n_channels = 0;
  2407. for (band = 0; band < IEEE80211_NUM_BANDS; band++)
  2408. if (wiphy->bands[band])
  2409. n_channels += wiphy->bands[band]->n_channels;
  2410. }
  2411. if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
  2412. nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
  2413. n_ssids++;
  2414. if (n_ssids > wiphy->max_scan_ssids) {
  2415. err = -EINVAL;
  2416. goto out;
  2417. }
  2418. if (info->attrs[NL80211_ATTR_IE])
  2419. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  2420. else
  2421. ie_len = 0;
  2422. if (ie_len > wiphy->max_scan_ie_len) {
  2423. err = -EINVAL;
  2424. goto out;
  2425. }
  2426. request = kzalloc(sizeof(*request)
  2427. + sizeof(*ssid) * n_ssids
  2428. + sizeof(channel) * n_channels
  2429. + ie_len, GFP_KERNEL);
  2430. if (!request) {
  2431. err = -ENOMEM;
  2432. goto out;
  2433. }
  2434. request->channels = (void *)((char *)request + sizeof(*request));
  2435. request->n_channels = n_channels;
  2436. if (n_ssids)
  2437. request->ssids = (void *)(request->channels + n_channels);
  2438. request->n_ssids = n_ssids;
  2439. if (ie_len) {
  2440. if (request->ssids)
  2441. request->ie = (void *)(request->ssids + n_ssids);
  2442. else
  2443. request->ie = (void *)(request->channels + n_channels);
  2444. }
  2445. if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
  2446. /* user specified, bail out if channel not found */
  2447. request->n_channels = n_channels;
  2448. i = 0;
  2449. nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) {
  2450. request->channels[i] = ieee80211_get_channel(wiphy, nla_get_u32(attr));
  2451. if (!request->channels[i]) {
  2452. err = -EINVAL;
  2453. goto out_free;
  2454. }
  2455. i++;
  2456. }
  2457. } else {
  2458. /* all channels */
  2459. i = 0;
  2460. for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
  2461. int j;
  2462. if (!wiphy->bands[band])
  2463. continue;
  2464. for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
  2465. request->channels[i] = &wiphy->bands[band]->channels[j];
  2466. i++;
  2467. }
  2468. }
  2469. }
  2470. i = 0;
  2471. if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) {
  2472. nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
  2473. if (request->ssids[i].ssid_len > IEEE80211_MAX_SSID_LEN) {
  2474. err = -EINVAL;
  2475. goto out_free;
  2476. }
  2477. memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
  2478. request->ssids[i].ssid_len = nla_len(attr);
  2479. i++;
  2480. }
  2481. }
  2482. if (info->attrs[NL80211_ATTR_IE]) {
  2483. request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  2484. memcpy((void *)request->ie,
  2485. nla_data(info->attrs[NL80211_ATTR_IE]),
  2486. request->ie_len);
  2487. }
  2488. request->dev = dev;
  2489. request->wiphy = &rdev->wiphy;
  2490. rdev->scan_req = request;
  2491. err = rdev->ops->scan(&rdev->wiphy, dev, request);
  2492. if (!err) {
  2493. nl80211_send_scan_start(rdev, dev);
  2494. dev_hold(dev);
  2495. }
  2496. out_free:
  2497. if (err) {
  2498. rdev->scan_req = NULL;
  2499. kfree(request);
  2500. }
  2501. out:
  2502. cfg80211_unlock_rdev(rdev);
  2503. dev_put(dev);
  2504. out_rtnl:
  2505. rtnl_unlock();
  2506. return err;
  2507. }
  2508. static int nl80211_send_bss(struct sk_buff *msg, u32 pid, u32 seq, int flags,
  2509. struct cfg80211_registered_device *rdev,
  2510. struct wireless_dev *wdev,
  2511. struct cfg80211_internal_bss *intbss)
  2512. {
  2513. struct cfg80211_bss *res = &intbss->pub;
  2514. void *hdr;
  2515. struct nlattr *bss;
  2516. int i;
  2517. ASSERT_WDEV_LOCK(wdev);
  2518. hdr = nl80211hdr_put(msg, pid, seq, flags,
  2519. NL80211_CMD_NEW_SCAN_RESULTS);
  2520. if (!hdr)
  2521. return -1;
  2522. NLA_PUT_U32(msg, NL80211_ATTR_SCAN_GENERATION,
  2523. rdev->bss_generation);
  2524. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex);
  2525. bss = nla_nest_start(msg, NL80211_ATTR_BSS);
  2526. if (!bss)
  2527. goto nla_put_failure;
  2528. if (!is_zero_ether_addr(res->bssid))
  2529. NLA_PUT(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid);
  2530. if (res->information_elements && res->len_information_elements)
  2531. NLA_PUT(msg, NL80211_BSS_INFORMATION_ELEMENTS,
  2532. res->len_information_elements,
  2533. res->information_elements);
  2534. if (res->tsf)
  2535. NLA_PUT_U64(msg, NL80211_BSS_TSF, res->tsf);
  2536. if (res->beacon_interval)
  2537. NLA_PUT_U16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval);
  2538. NLA_PUT_U16(msg, NL80211_BSS_CAPABILITY, res->capability);
  2539. NLA_PUT_U32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq);
  2540. switch (rdev->wiphy.signal_type) {
  2541. case CFG80211_SIGNAL_TYPE_MBM:
  2542. NLA_PUT_U32(msg, NL80211_BSS_SIGNAL_MBM, res->signal);
  2543. break;
  2544. case CFG80211_SIGNAL_TYPE_UNSPEC:
  2545. NLA_PUT_U8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal);
  2546. break;
  2547. default:
  2548. break;
  2549. }
  2550. switch (wdev->iftype) {
  2551. case NL80211_IFTYPE_STATION:
  2552. if (intbss == wdev->current_bss)
  2553. NLA_PUT_U32(msg, NL80211_BSS_STATUS,
  2554. NL80211_BSS_STATUS_ASSOCIATED);
  2555. else for (i = 0; i < MAX_AUTH_BSSES; i++) {
  2556. if (intbss != wdev->auth_bsses[i])
  2557. continue;
  2558. NLA_PUT_U32(msg, NL80211_BSS_STATUS,
  2559. NL80211_BSS_STATUS_AUTHENTICATED);
  2560. break;
  2561. }
  2562. break;
  2563. case NL80211_IFTYPE_ADHOC:
  2564. if (intbss == wdev->current_bss)
  2565. NLA_PUT_U32(msg, NL80211_BSS_STATUS,
  2566. NL80211_BSS_STATUS_IBSS_JOINED);
  2567. break;
  2568. default:
  2569. break;
  2570. }
  2571. nla_nest_end(msg, bss);
  2572. return genlmsg_end(msg, hdr);
  2573. nla_put_failure:
  2574. genlmsg_cancel(msg, hdr);
  2575. return -EMSGSIZE;
  2576. }
  2577. static int nl80211_dump_scan(struct sk_buff *skb,
  2578. struct netlink_callback *cb)
  2579. {
  2580. struct cfg80211_registered_device *rdev;
  2581. struct net_device *dev;
  2582. struct cfg80211_internal_bss *scan;
  2583. struct wireless_dev *wdev;
  2584. int ifidx = cb->args[0];
  2585. int start = cb->args[1], idx = 0;
  2586. int err;
  2587. if (!ifidx) {
  2588. err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize,
  2589. nl80211_fam.attrbuf, nl80211_fam.maxattr,
  2590. nl80211_policy);
  2591. if (err)
  2592. return err;
  2593. if (!nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX])
  2594. return -EINVAL;
  2595. ifidx = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX]);
  2596. if (!ifidx)
  2597. return -EINVAL;
  2598. cb->args[0] = ifidx;
  2599. }
  2600. dev = dev_get_by_index(sock_net(skb->sk), ifidx);
  2601. if (!dev)
  2602. return -ENODEV;
  2603. rdev = cfg80211_get_dev_from_ifindex(sock_net(skb->sk), ifidx);
  2604. if (IS_ERR(rdev)) {
  2605. err = PTR_ERR(rdev);
  2606. goto out_put_netdev;
  2607. }
  2608. wdev = dev->ieee80211_ptr;
  2609. wdev_lock(wdev);
  2610. spin_lock_bh(&rdev->bss_lock);
  2611. cfg80211_bss_expire(rdev);
  2612. list_for_each_entry(scan, &rdev->bss_list, list) {
  2613. if (++idx <= start)
  2614. continue;
  2615. if (nl80211_send_bss(skb,
  2616. NETLINK_CB(cb->skb).pid,
  2617. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  2618. rdev, wdev, scan) < 0) {
  2619. idx--;
  2620. goto out;
  2621. }
  2622. }
  2623. out:
  2624. spin_unlock_bh(&rdev->bss_lock);
  2625. wdev_unlock(wdev);
  2626. cb->args[1] = idx;
  2627. err = skb->len;
  2628. cfg80211_unlock_rdev(rdev);
  2629. out_put_netdev:
  2630. dev_put(dev);
  2631. return err;
  2632. }
  2633. static bool nl80211_valid_auth_type(enum nl80211_auth_type auth_type)
  2634. {
  2635. return auth_type <= NL80211_AUTHTYPE_MAX;
  2636. }
  2637. static bool nl80211_valid_wpa_versions(u32 wpa_versions)
  2638. {
  2639. return !(wpa_versions & ~(NL80211_WPA_VERSION_1 |
  2640. NL80211_WPA_VERSION_2));
  2641. }
  2642. static bool nl80211_valid_akm_suite(u32 akm)
  2643. {
  2644. return akm == WLAN_AKM_SUITE_8021X ||
  2645. akm == WLAN_AKM_SUITE_PSK;
  2646. }
  2647. static bool nl80211_valid_cipher_suite(u32 cipher)
  2648. {
  2649. return cipher == WLAN_CIPHER_SUITE_WEP40 ||
  2650. cipher == WLAN_CIPHER_SUITE_WEP104 ||
  2651. cipher == WLAN_CIPHER_SUITE_TKIP ||
  2652. cipher == WLAN_CIPHER_SUITE_CCMP ||
  2653. cipher == WLAN_CIPHER_SUITE_AES_CMAC;
  2654. }
  2655. static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
  2656. {
  2657. struct cfg80211_registered_device *rdev;
  2658. struct net_device *dev;
  2659. struct ieee80211_channel *chan;
  2660. const u8 *bssid, *ssid, *ie = NULL;
  2661. int err, ssid_len, ie_len = 0;
  2662. enum nl80211_auth_type auth_type;
  2663. struct key_parse key;
  2664. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  2665. return -EINVAL;
  2666. if (!info->attrs[NL80211_ATTR_MAC])
  2667. return -EINVAL;
  2668. if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
  2669. return -EINVAL;
  2670. if (!info->attrs[NL80211_ATTR_SSID])
  2671. return -EINVAL;
  2672. if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
  2673. return -EINVAL;
  2674. err = nl80211_parse_key(info, &key);
  2675. if (err)
  2676. return err;
  2677. if (key.idx >= 0) {
  2678. if (!key.p.key || !key.p.key_len)
  2679. return -EINVAL;
  2680. if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 ||
  2681. key.p.key_len != WLAN_KEY_LEN_WEP40) &&
  2682. (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 ||
  2683. key.p.key_len != WLAN_KEY_LEN_WEP104))
  2684. return -EINVAL;
  2685. if (key.idx > 4)
  2686. return -EINVAL;
  2687. } else {
  2688. key.p.key_len = 0;
  2689. key.p.key = NULL;
  2690. }
  2691. rtnl_lock();
  2692. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  2693. if (err)
  2694. goto unlock_rtnl;
  2695. if (!rdev->ops->auth) {
  2696. err = -EOPNOTSUPP;
  2697. goto out;
  2698. }
  2699. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) {
  2700. err = -EOPNOTSUPP;
  2701. goto out;
  2702. }
  2703. if (!netif_running(dev)) {
  2704. err = -ENETDOWN;
  2705. goto out;
  2706. }
  2707. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  2708. chan = ieee80211_get_channel(&rdev->wiphy,
  2709. nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
  2710. if (!chan || (chan->flags & IEEE80211_CHAN_DISABLED)) {
  2711. err = -EINVAL;
  2712. goto out;
  2713. }
  2714. ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  2715. ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  2716. if (info->attrs[NL80211_ATTR_IE]) {
  2717. ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  2718. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  2719. }
  2720. auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
  2721. if (!nl80211_valid_auth_type(auth_type)) {
  2722. err = -EINVAL;
  2723. goto out;
  2724. }
  2725. err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
  2726. ssid, ssid_len, ie, ie_len,
  2727. key.p.key, key.p.key_len, key.idx);
  2728. out:
  2729. cfg80211_unlock_rdev(rdev);
  2730. dev_put(dev);
  2731. unlock_rtnl:
  2732. rtnl_unlock();
  2733. return err;
  2734. }
  2735. static int nl80211_crypto_settings(struct genl_info *info,
  2736. struct cfg80211_crypto_settings *settings,
  2737. int cipher_limit)
  2738. {
  2739. memset(settings, 0, sizeof(*settings));
  2740. settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
  2741. if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) {
  2742. void *data;
  2743. int len, i;
  2744. data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
  2745. len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
  2746. settings->n_ciphers_pairwise = len / sizeof(u32);
  2747. if (len % sizeof(u32))
  2748. return -EINVAL;
  2749. if (settings->n_ciphers_pairwise > cipher_limit)
  2750. return -EINVAL;
  2751. memcpy(settings->ciphers_pairwise, data, len);
  2752. for (i = 0; i < settings->n_ciphers_pairwise; i++)
  2753. if (!nl80211_valid_cipher_suite(
  2754. settings->ciphers_pairwise[i]))
  2755. return -EINVAL;
  2756. }
  2757. if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) {
  2758. settings->cipher_group =
  2759. nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]);
  2760. if (!nl80211_valid_cipher_suite(settings->cipher_group))
  2761. return -EINVAL;
  2762. }
  2763. if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) {
  2764. settings->wpa_versions =
  2765. nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]);
  2766. if (!nl80211_valid_wpa_versions(settings->wpa_versions))
  2767. return -EINVAL;
  2768. }
  2769. if (info->attrs[NL80211_ATTR_AKM_SUITES]) {
  2770. void *data;
  2771. int len, i;
  2772. data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]);
  2773. len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]);
  2774. settings->n_akm_suites = len / sizeof(u32);
  2775. if (len % sizeof(u32))
  2776. return -EINVAL;
  2777. memcpy(settings->akm_suites, data, len);
  2778. for (i = 0; i < settings->n_ciphers_pairwise; i++)
  2779. if (!nl80211_valid_akm_suite(settings->akm_suites[i]))
  2780. return -EINVAL;
  2781. }
  2782. return 0;
  2783. }
  2784. static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
  2785. {
  2786. struct cfg80211_registered_device *rdev;
  2787. struct net_device *dev;
  2788. struct cfg80211_crypto_settings crypto;
  2789. struct ieee80211_channel *chan, *fixedchan;
  2790. const u8 *bssid, *ssid, *ie = NULL, *prev_bssid = NULL;
  2791. int err, ssid_len, ie_len = 0;
  2792. bool use_mfp = false;
  2793. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  2794. return -EINVAL;
  2795. if (!info->attrs[NL80211_ATTR_MAC] ||
  2796. !info->attrs[NL80211_ATTR_SSID] ||
  2797. !info->attrs[NL80211_ATTR_WIPHY_FREQ])
  2798. return -EINVAL;
  2799. rtnl_lock();
  2800. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  2801. if (err)
  2802. goto unlock_rtnl;
  2803. if (!rdev->ops->assoc) {
  2804. err = -EOPNOTSUPP;
  2805. goto out;
  2806. }
  2807. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) {
  2808. err = -EOPNOTSUPP;
  2809. goto out;
  2810. }
  2811. if (!netif_running(dev)) {
  2812. err = -ENETDOWN;
  2813. goto out;
  2814. }
  2815. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  2816. chan = ieee80211_get_channel(&rdev->wiphy,
  2817. nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
  2818. if (!chan || (chan->flags & IEEE80211_CHAN_DISABLED)) {
  2819. err = -EINVAL;
  2820. goto out;
  2821. }
  2822. mutex_lock(&rdev->devlist_mtx);
  2823. fixedchan = rdev_fixed_channel(rdev, NULL);
  2824. if (fixedchan && chan != fixedchan) {
  2825. err = -EBUSY;
  2826. mutex_unlock(&rdev->devlist_mtx);
  2827. goto out;
  2828. }
  2829. mutex_unlock(&rdev->devlist_mtx);
  2830. ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  2831. ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  2832. if (info->attrs[NL80211_ATTR_IE]) {
  2833. ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  2834. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  2835. }
  2836. if (info->attrs[NL80211_ATTR_USE_MFP]) {
  2837. enum nl80211_mfp mfp =
  2838. nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
  2839. if (mfp == NL80211_MFP_REQUIRED)
  2840. use_mfp = true;
  2841. else if (mfp != NL80211_MFP_NO) {
  2842. err = -EINVAL;
  2843. goto out;
  2844. }
  2845. }
  2846. if (info->attrs[NL80211_ATTR_PREV_BSSID])
  2847. prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
  2848. err = nl80211_crypto_settings(info, &crypto, 1);
  2849. if (!err)
  2850. err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, prev_bssid,
  2851. ssid, ssid_len, ie, ie_len, use_mfp,
  2852. &crypto);
  2853. out:
  2854. cfg80211_unlock_rdev(rdev);
  2855. dev_put(dev);
  2856. unlock_rtnl:
  2857. rtnl_unlock();
  2858. return err;
  2859. }
  2860. static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
  2861. {
  2862. struct cfg80211_registered_device *rdev;
  2863. struct net_device *dev;
  2864. const u8 *ie = NULL, *bssid;
  2865. int err, ie_len = 0;
  2866. u16 reason_code;
  2867. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  2868. return -EINVAL;
  2869. if (!info->attrs[NL80211_ATTR_MAC])
  2870. return -EINVAL;
  2871. if (!info->attrs[NL80211_ATTR_REASON_CODE])
  2872. return -EINVAL;
  2873. rtnl_lock();
  2874. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  2875. if (err)
  2876. goto unlock_rtnl;
  2877. if (!rdev->ops->deauth) {
  2878. err = -EOPNOTSUPP;
  2879. goto out;
  2880. }
  2881. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) {
  2882. err = -EOPNOTSUPP;
  2883. goto out;
  2884. }
  2885. if (!netif_running(dev)) {
  2886. err = -ENETDOWN;
  2887. goto out;
  2888. }
  2889. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  2890. reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
  2891. if (reason_code == 0) {
  2892. /* Reason Code 0 is reserved */
  2893. err = -EINVAL;
  2894. goto out;
  2895. }
  2896. if (info->attrs[NL80211_ATTR_IE]) {
  2897. ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  2898. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  2899. }
  2900. err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code);
  2901. out:
  2902. cfg80211_unlock_rdev(rdev);
  2903. dev_put(dev);
  2904. unlock_rtnl:
  2905. rtnl_unlock();
  2906. return err;
  2907. }
  2908. static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
  2909. {
  2910. struct cfg80211_registered_device *rdev;
  2911. struct net_device *dev;
  2912. const u8 *ie = NULL, *bssid;
  2913. int err, ie_len = 0;
  2914. u16 reason_code;
  2915. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  2916. return -EINVAL;
  2917. if (!info->attrs[NL80211_ATTR_MAC])
  2918. return -EINVAL;
  2919. if (!info->attrs[NL80211_ATTR_REASON_CODE])
  2920. return -EINVAL;
  2921. rtnl_lock();
  2922. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  2923. if (err)
  2924. goto unlock_rtnl;
  2925. if (!rdev->ops->disassoc) {
  2926. err = -EOPNOTSUPP;
  2927. goto out;
  2928. }
  2929. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) {
  2930. err = -EOPNOTSUPP;
  2931. goto out;
  2932. }
  2933. if (!netif_running(dev)) {
  2934. err = -ENETDOWN;
  2935. goto out;
  2936. }
  2937. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  2938. reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
  2939. if (reason_code == 0) {
  2940. /* Reason Code 0 is reserved */
  2941. err = -EINVAL;
  2942. goto out;
  2943. }
  2944. if (info->attrs[NL80211_ATTR_IE]) {
  2945. ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  2946. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  2947. }
  2948. err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code);
  2949. out:
  2950. cfg80211_unlock_rdev(rdev);
  2951. dev_put(dev);
  2952. unlock_rtnl:
  2953. rtnl_unlock();
  2954. return err;
  2955. }
  2956. static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
  2957. {
  2958. struct cfg80211_registered_device *rdev;
  2959. struct net_device *dev;
  2960. struct cfg80211_ibss_params ibss;
  2961. struct wiphy *wiphy;
  2962. struct cfg80211_cached_keys *connkeys = NULL;
  2963. int err;
  2964. memset(&ibss, 0, sizeof(ibss));
  2965. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  2966. return -EINVAL;
  2967. if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
  2968. !info->attrs[NL80211_ATTR_SSID] ||
  2969. !nla_len(info->attrs[NL80211_ATTR_SSID]))
  2970. return -EINVAL;
  2971. ibss.beacon_interval = 100;
  2972. if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
  2973. ibss.beacon_interval =
  2974. nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
  2975. if (ibss.beacon_interval < 1 || ibss.beacon_interval > 10000)
  2976. return -EINVAL;
  2977. }
  2978. rtnl_lock();
  2979. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  2980. if (err)
  2981. goto unlock_rtnl;
  2982. if (!rdev->ops->join_ibss) {
  2983. err = -EOPNOTSUPP;
  2984. goto out;
  2985. }
  2986. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) {
  2987. err = -EOPNOTSUPP;
  2988. goto out;
  2989. }
  2990. if (!netif_running(dev)) {
  2991. err = -ENETDOWN;
  2992. goto out;
  2993. }
  2994. wiphy = &rdev->wiphy;
  2995. if (info->attrs[NL80211_ATTR_MAC])
  2996. ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  2997. ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  2998. ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  2999. if (info->attrs[NL80211_ATTR_IE]) {
  3000. ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  3001. ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  3002. }
  3003. ibss.channel = ieee80211_get_channel(wiphy,
  3004. nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
  3005. if (!ibss.channel ||
  3006. ibss.channel->flags & IEEE80211_CHAN_NO_IBSS ||
  3007. ibss.channel->flags & IEEE80211_CHAN_DISABLED) {
  3008. err = -EINVAL;
  3009. goto out;
  3010. }
  3011. ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
  3012. ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
  3013. if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
  3014. connkeys = nl80211_parse_connkeys(rdev,
  3015. info->attrs[NL80211_ATTR_KEYS]);
  3016. if (IS_ERR(connkeys)) {
  3017. err = PTR_ERR(connkeys);
  3018. connkeys = NULL;
  3019. goto out;
  3020. }
  3021. }
  3022. err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
  3023. out:
  3024. cfg80211_unlock_rdev(rdev);
  3025. dev_put(dev);
  3026. unlock_rtnl:
  3027. if (err)
  3028. kfree(connkeys);
  3029. rtnl_unlock();
  3030. return err;
  3031. }
  3032. static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
  3033. {
  3034. struct cfg80211_registered_device *rdev;
  3035. struct net_device *dev;
  3036. int err;
  3037. rtnl_lock();
  3038. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  3039. if (err)
  3040. goto unlock_rtnl;
  3041. if (!rdev->ops->leave_ibss) {
  3042. err = -EOPNOTSUPP;
  3043. goto out;
  3044. }
  3045. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) {
  3046. err = -EOPNOTSUPP;
  3047. goto out;
  3048. }
  3049. if (!netif_running(dev)) {
  3050. err = -ENETDOWN;
  3051. goto out;
  3052. }
  3053. err = cfg80211_leave_ibss(rdev, dev, false);
  3054. out:
  3055. cfg80211_unlock_rdev(rdev);
  3056. dev_put(dev);
  3057. unlock_rtnl:
  3058. rtnl_unlock();
  3059. return err;
  3060. }
  3061. #ifdef CONFIG_NL80211_TESTMODE
  3062. static struct genl_multicast_group nl80211_testmode_mcgrp = {
  3063. .name = "testmode",
  3064. };
  3065. static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
  3066. {
  3067. struct cfg80211_registered_device *rdev;
  3068. int err;
  3069. if (!info->attrs[NL80211_ATTR_TESTDATA])
  3070. return -EINVAL;
  3071. rtnl_lock();
  3072. rdev = cfg80211_get_dev_from_info(info);
  3073. if (IS_ERR(rdev)) {
  3074. err = PTR_ERR(rdev);
  3075. goto unlock_rtnl;
  3076. }
  3077. err = -EOPNOTSUPP;
  3078. if (rdev->ops->testmode_cmd) {
  3079. rdev->testmode_info = info;
  3080. err = rdev->ops->testmode_cmd(&rdev->wiphy,
  3081. nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
  3082. nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
  3083. rdev->testmode_info = NULL;
  3084. }
  3085. cfg80211_unlock_rdev(rdev);
  3086. unlock_rtnl:
  3087. rtnl_unlock();
  3088. return err;
  3089. }
  3090. static struct sk_buff *
  3091. __cfg80211_testmode_alloc_skb(struct cfg80211_registered_device *rdev,
  3092. int approxlen, u32 pid, u32 seq, gfp_t gfp)
  3093. {
  3094. struct sk_buff *skb;
  3095. void *hdr;
  3096. struct nlattr *data;
  3097. skb = nlmsg_new(approxlen + 100, gfp);
  3098. if (!skb)
  3099. return NULL;
  3100. hdr = nl80211hdr_put(skb, pid, seq, 0, NL80211_CMD_TESTMODE);
  3101. if (!hdr) {
  3102. kfree_skb(skb);
  3103. return NULL;
  3104. }
  3105. NLA_PUT_U32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  3106. data = nla_nest_start(skb, NL80211_ATTR_TESTDATA);
  3107. ((void **)skb->cb)[0] = rdev;
  3108. ((void **)skb->cb)[1] = hdr;
  3109. ((void **)skb->cb)[2] = data;
  3110. return skb;
  3111. nla_put_failure:
  3112. kfree_skb(skb);
  3113. return NULL;
  3114. }
  3115. struct sk_buff *cfg80211_testmode_alloc_reply_skb(struct wiphy *wiphy,
  3116. int approxlen)
  3117. {
  3118. struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
  3119. if (WARN_ON(!rdev->testmode_info))
  3120. return NULL;
  3121. return __cfg80211_testmode_alloc_skb(rdev, approxlen,
  3122. rdev->testmode_info->snd_pid,
  3123. rdev->testmode_info->snd_seq,
  3124. GFP_KERNEL);
  3125. }
  3126. EXPORT_SYMBOL(cfg80211_testmode_alloc_reply_skb);
  3127. int cfg80211_testmode_reply(struct sk_buff *skb)
  3128. {
  3129. struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
  3130. void *hdr = ((void **)skb->cb)[1];
  3131. struct nlattr *data = ((void **)skb->cb)[2];
  3132. if (WARN_ON(!rdev->testmode_info)) {
  3133. kfree_skb(skb);
  3134. return -EINVAL;
  3135. }
  3136. nla_nest_end(skb, data);
  3137. genlmsg_end(skb, hdr);
  3138. return genlmsg_reply(skb, rdev->testmode_info);
  3139. }
  3140. EXPORT_SYMBOL(cfg80211_testmode_reply);
  3141. struct sk_buff *cfg80211_testmode_alloc_event_skb(struct wiphy *wiphy,
  3142. int approxlen, gfp_t gfp)
  3143. {
  3144. struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
  3145. return __cfg80211_testmode_alloc_skb(rdev, approxlen, 0, 0, gfp);
  3146. }
  3147. EXPORT_SYMBOL(cfg80211_testmode_alloc_event_skb);
  3148. void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)
  3149. {
  3150. void *hdr = ((void **)skb->cb)[1];
  3151. struct nlattr *data = ((void **)skb->cb)[2];
  3152. nla_nest_end(skb, data);
  3153. genlmsg_end(skb, hdr);
  3154. genlmsg_multicast(skb, 0, nl80211_testmode_mcgrp.id, gfp);
  3155. }
  3156. EXPORT_SYMBOL(cfg80211_testmode_event);
  3157. #endif
  3158. static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
  3159. {
  3160. struct cfg80211_registered_device *rdev;
  3161. struct net_device *dev;
  3162. struct cfg80211_connect_params connect;
  3163. struct wiphy *wiphy;
  3164. struct cfg80211_cached_keys *connkeys = NULL;
  3165. int err;
  3166. memset(&connect, 0, sizeof(connect));
  3167. if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
  3168. return -EINVAL;
  3169. if (!info->attrs[NL80211_ATTR_SSID] ||
  3170. !nla_len(info->attrs[NL80211_ATTR_SSID]))
  3171. return -EINVAL;
  3172. if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
  3173. connect.auth_type =
  3174. nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
  3175. if (!nl80211_valid_auth_type(connect.auth_type))
  3176. return -EINVAL;
  3177. } else
  3178. connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
  3179. connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
  3180. err = nl80211_crypto_settings(info, &connect.crypto,
  3181. NL80211_MAX_NR_CIPHER_SUITES);
  3182. if (err)
  3183. return err;
  3184. rtnl_lock();
  3185. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  3186. if (err)
  3187. goto unlock_rtnl;
  3188. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) {
  3189. err = -EOPNOTSUPP;
  3190. goto out;
  3191. }
  3192. if (!netif_running(dev)) {
  3193. err = -ENETDOWN;
  3194. goto out;
  3195. }
  3196. wiphy = &rdev->wiphy;
  3197. if (info->attrs[NL80211_ATTR_MAC])
  3198. connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  3199. connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  3200. connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  3201. if (info->attrs[NL80211_ATTR_IE]) {
  3202. connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  3203. connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  3204. }
  3205. if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
  3206. connect.channel =
  3207. ieee80211_get_channel(wiphy,
  3208. nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
  3209. if (!connect.channel ||
  3210. connect.channel->flags & IEEE80211_CHAN_DISABLED) {
  3211. err = -EINVAL;
  3212. goto out;
  3213. }
  3214. }
  3215. if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
  3216. connkeys = nl80211_parse_connkeys(rdev,
  3217. info->attrs[NL80211_ATTR_KEYS]);
  3218. if (IS_ERR(connkeys)) {
  3219. err = PTR_ERR(connkeys);
  3220. connkeys = NULL;
  3221. goto out;
  3222. }
  3223. }
  3224. err = cfg80211_connect(rdev, dev, &connect, connkeys);
  3225. out:
  3226. cfg80211_unlock_rdev(rdev);
  3227. dev_put(dev);
  3228. unlock_rtnl:
  3229. if (err)
  3230. kfree(connkeys);
  3231. rtnl_unlock();
  3232. return err;
  3233. }
  3234. static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
  3235. {
  3236. struct cfg80211_registered_device *rdev;
  3237. struct net_device *dev;
  3238. int err;
  3239. u16 reason;
  3240. if (!info->attrs[NL80211_ATTR_REASON_CODE])
  3241. reason = WLAN_REASON_DEAUTH_LEAVING;
  3242. else
  3243. reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
  3244. if (reason == 0)
  3245. return -EINVAL;
  3246. rtnl_lock();
  3247. err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
  3248. if (err)
  3249. goto unlock_rtnl;
  3250. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) {
  3251. err = -EOPNOTSUPP;
  3252. goto out;
  3253. }
  3254. if (!netif_running(dev)) {
  3255. err = -ENETDOWN;
  3256. goto out;
  3257. }
  3258. err = cfg80211_disconnect(rdev, dev, reason, true);
  3259. out:
  3260. cfg80211_unlock_rdev(rdev);
  3261. dev_put(dev);
  3262. unlock_rtnl:
  3263. rtnl_unlock();
  3264. return err;
  3265. }
  3266. static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
  3267. {
  3268. struct cfg80211_registered_device *rdev;
  3269. struct net *net;
  3270. int err;
  3271. u32 pid;
  3272. if (!info->attrs[NL80211_ATTR_PID])
  3273. return -EINVAL;
  3274. pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
  3275. rtnl_lock();
  3276. rdev = cfg80211_get_dev_from_info(info);
  3277. if (IS_ERR(rdev)) {
  3278. err = PTR_ERR(rdev);
  3279. goto out;
  3280. }
  3281. net = get_net_ns_by_pid(pid);
  3282. if (IS_ERR(net)) {
  3283. err = PTR_ERR(net);
  3284. goto out;
  3285. }
  3286. err = 0;
  3287. /* check if anything to do */
  3288. if (net_eq(wiphy_net(&rdev->wiphy), net))
  3289. goto out_put_net;
  3290. err = cfg80211_switch_netns(rdev, net);
  3291. out_put_net:
  3292. put_net(net);
  3293. out:
  3294. cfg80211_unlock_rdev(rdev);
  3295. rtnl_unlock();
  3296. return err;
  3297. }
  3298. static struct genl_ops nl80211_ops[] = {
  3299. {
  3300. .cmd = NL80211_CMD_GET_WIPHY,
  3301. .doit = nl80211_get_wiphy,
  3302. .dumpit = nl80211_dump_wiphy,
  3303. .policy = nl80211_policy,
  3304. /* can be retrieved by unprivileged users */
  3305. },
  3306. {
  3307. .cmd = NL80211_CMD_SET_WIPHY,
  3308. .doit = nl80211_set_wiphy,
  3309. .policy = nl80211_policy,
  3310. .flags = GENL_ADMIN_PERM,
  3311. },
  3312. {
  3313. .cmd = NL80211_CMD_GET_INTERFACE,
  3314. .doit = nl80211_get_interface,
  3315. .dumpit = nl80211_dump_interface,
  3316. .policy = nl80211_policy,
  3317. /* can be retrieved by unprivileged users */
  3318. },
  3319. {
  3320. .cmd = NL80211_CMD_SET_INTERFACE,
  3321. .doit = nl80211_set_interface,
  3322. .policy = nl80211_policy,
  3323. .flags = GENL_ADMIN_PERM,
  3324. },
  3325. {
  3326. .cmd = NL80211_CMD_NEW_INTERFACE,
  3327. .doit = nl80211_new_interface,
  3328. .policy = nl80211_policy,
  3329. .flags = GENL_ADMIN_PERM,
  3330. },
  3331. {
  3332. .cmd = NL80211_CMD_DEL_INTERFACE,
  3333. .doit = nl80211_del_interface,
  3334. .policy = nl80211_policy,
  3335. .flags = GENL_ADMIN_PERM,
  3336. },
  3337. {
  3338. .cmd = NL80211_CMD_GET_KEY,
  3339. .doit = nl80211_get_key,
  3340. .policy = nl80211_policy,
  3341. .flags = GENL_ADMIN_PERM,
  3342. },
  3343. {
  3344. .cmd = NL80211_CMD_SET_KEY,
  3345. .doit = nl80211_set_key,
  3346. .policy = nl80211_policy,
  3347. .flags = GENL_ADMIN_PERM,
  3348. },
  3349. {
  3350. .cmd = NL80211_CMD_NEW_KEY,
  3351. .doit = nl80211_new_key,
  3352. .policy = nl80211_policy,
  3353. .flags = GENL_ADMIN_PERM,
  3354. },
  3355. {
  3356. .cmd = NL80211_CMD_DEL_KEY,
  3357. .doit = nl80211_del_key,
  3358. .policy = nl80211_policy,
  3359. .flags = GENL_ADMIN_PERM,
  3360. },
  3361. {
  3362. .cmd = NL80211_CMD_SET_BEACON,
  3363. .policy = nl80211_policy,
  3364. .flags = GENL_ADMIN_PERM,
  3365. .doit = nl80211_addset_beacon,
  3366. },
  3367. {
  3368. .cmd = NL80211_CMD_NEW_BEACON,
  3369. .policy = nl80211_policy,
  3370. .flags = GENL_ADMIN_PERM,
  3371. .doit = nl80211_addset_beacon,
  3372. },
  3373. {
  3374. .cmd = NL80211_CMD_DEL_BEACON,
  3375. .policy = nl80211_policy,
  3376. .flags = GENL_ADMIN_PERM,
  3377. .doit = nl80211_del_beacon,
  3378. },
  3379. {
  3380. .cmd = NL80211_CMD_GET_STATION,
  3381. .doit = nl80211_get_station,
  3382. .dumpit = nl80211_dump_station,
  3383. .policy = nl80211_policy,
  3384. },
  3385. {
  3386. .cmd = NL80211_CMD_SET_STATION,
  3387. .doit = nl80211_set_station,
  3388. .policy = nl80211_policy,
  3389. .flags = GENL_ADMIN_PERM,
  3390. },
  3391. {
  3392. .cmd = NL80211_CMD_NEW_STATION,
  3393. .doit = nl80211_new_station,
  3394. .policy = nl80211_policy,
  3395. .flags = GENL_ADMIN_PERM,
  3396. },
  3397. {
  3398. .cmd = NL80211_CMD_DEL_STATION,
  3399. .doit = nl80211_del_station,
  3400. .policy = nl80211_policy,
  3401. .flags = GENL_ADMIN_PERM,
  3402. },
  3403. {
  3404. .cmd = NL80211_CMD_GET_MPATH,
  3405. .doit = nl80211_get_mpath,
  3406. .dumpit = nl80211_dump_mpath,
  3407. .policy = nl80211_policy,
  3408. .flags = GENL_ADMIN_PERM,
  3409. },
  3410. {
  3411. .cmd = NL80211_CMD_SET_MPATH,
  3412. .doit = nl80211_set_mpath,
  3413. .policy = nl80211_policy,
  3414. .flags = GENL_ADMIN_PERM,
  3415. },
  3416. {
  3417. .cmd = NL80211_CMD_NEW_MPATH,
  3418. .doit = nl80211_new_mpath,
  3419. .policy = nl80211_policy,
  3420. .flags = GENL_ADMIN_PERM,
  3421. },
  3422. {
  3423. .cmd = NL80211_CMD_DEL_MPATH,
  3424. .doit = nl80211_del_mpath,
  3425. .policy = nl80211_policy,
  3426. .flags = GENL_ADMIN_PERM,
  3427. },
  3428. {
  3429. .cmd = NL80211_CMD_SET_BSS,
  3430. .doit = nl80211_set_bss,
  3431. .policy = nl80211_policy,
  3432. .flags = GENL_ADMIN_PERM,
  3433. },
  3434. {
  3435. .cmd = NL80211_CMD_GET_REG,
  3436. .doit = nl80211_get_reg,
  3437. .policy = nl80211_policy,
  3438. /* can be retrieved by unprivileged users */
  3439. },
  3440. {
  3441. .cmd = NL80211_CMD_SET_REG,
  3442. .doit = nl80211_set_reg,
  3443. .policy = nl80211_policy,
  3444. .flags = GENL_ADMIN_PERM,
  3445. },
  3446. {
  3447. .cmd = NL80211_CMD_REQ_SET_REG,
  3448. .doit = nl80211_req_set_reg,
  3449. .policy = nl80211_policy,
  3450. .flags = GENL_ADMIN_PERM,
  3451. },
  3452. {
  3453. .cmd = NL80211_CMD_GET_MESH_PARAMS,
  3454. .doit = nl80211_get_mesh_params,
  3455. .policy = nl80211_policy,
  3456. /* can be retrieved by unprivileged users */
  3457. },
  3458. {
  3459. .cmd = NL80211_CMD_SET_MESH_PARAMS,
  3460. .doit = nl80211_set_mesh_params,
  3461. .policy = nl80211_policy,
  3462. .flags = GENL_ADMIN_PERM,
  3463. },
  3464. {
  3465. .cmd = NL80211_CMD_TRIGGER_SCAN,
  3466. .doit = nl80211_trigger_scan,
  3467. .policy = nl80211_policy,
  3468. .flags = GENL_ADMIN_PERM,
  3469. },
  3470. {
  3471. .cmd = NL80211_CMD_GET_SCAN,
  3472. .policy = nl80211_policy,
  3473. .dumpit = nl80211_dump_scan,
  3474. },
  3475. {
  3476. .cmd = NL80211_CMD_AUTHENTICATE,
  3477. .doit = nl80211_authenticate,
  3478. .policy = nl80211_policy,
  3479. .flags = GENL_ADMIN_PERM,
  3480. },
  3481. {
  3482. .cmd = NL80211_CMD_ASSOCIATE,
  3483. .doit = nl80211_associate,
  3484. .policy = nl80211_policy,
  3485. .flags = GENL_ADMIN_PERM,
  3486. },
  3487. {
  3488. .cmd = NL80211_CMD_DEAUTHENTICATE,
  3489. .doit = nl80211_deauthenticate,
  3490. .policy = nl80211_policy,
  3491. .flags = GENL_ADMIN_PERM,
  3492. },
  3493. {
  3494. .cmd = NL80211_CMD_DISASSOCIATE,
  3495. .doit = nl80211_disassociate,
  3496. .policy = nl80211_policy,
  3497. .flags = GENL_ADMIN_PERM,
  3498. },
  3499. {
  3500. .cmd = NL80211_CMD_JOIN_IBSS,
  3501. .doit = nl80211_join_ibss,
  3502. .policy = nl80211_policy,
  3503. .flags = GENL_ADMIN_PERM,
  3504. },
  3505. {
  3506. .cmd = NL80211_CMD_LEAVE_IBSS,
  3507. .doit = nl80211_leave_ibss,
  3508. .policy = nl80211_policy,
  3509. .flags = GENL_ADMIN_PERM,
  3510. },
  3511. #ifdef CONFIG_NL80211_TESTMODE
  3512. {
  3513. .cmd = NL80211_CMD_TESTMODE,
  3514. .doit = nl80211_testmode_do,
  3515. .policy = nl80211_policy,
  3516. .flags = GENL_ADMIN_PERM,
  3517. },
  3518. #endif
  3519. {
  3520. .cmd = NL80211_CMD_CONNECT,
  3521. .doit = nl80211_connect,
  3522. .policy = nl80211_policy,
  3523. .flags = GENL_ADMIN_PERM,
  3524. },
  3525. {
  3526. .cmd = NL80211_CMD_DISCONNECT,
  3527. .doit = nl80211_disconnect,
  3528. .policy = nl80211_policy,
  3529. .flags = GENL_ADMIN_PERM,
  3530. },
  3531. {
  3532. .cmd = NL80211_CMD_SET_WIPHY_NETNS,
  3533. .doit = nl80211_wiphy_netns,
  3534. .policy = nl80211_policy,
  3535. .flags = GENL_ADMIN_PERM,
  3536. },
  3537. };
  3538. static struct genl_multicast_group nl80211_mlme_mcgrp = {
  3539. .name = "mlme",
  3540. };
  3541. /* multicast groups */
  3542. static struct genl_multicast_group nl80211_config_mcgrp = {
  3543. .name = "config",
  3544. };
  3545. static struct genl_multicast_group nl80211_scan_mcgrp = {
  3546. .name = "scan",
  3547. };
  3548. static struct genl_multicast_group nl80211_regulatory_mcgrp = {
  3549. .name = "regulatory",
  3550. };
  3551. /* notification functions */
  3552. void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev)
  3553. {
  3554. struct sk_buff *msg;
  3555. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  3556. if (!msg)
  3557. return;
  3558. if (nl80211_send_wiphy(msg, 0, 0, 0, rdev) < 0) {
  3559. nlmsg_free(msg);
  3560. return;
  3561. }
  3562. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  3563. nl80211_config_mcgrp.id, GFP_KERNEL);
  3564. }
  3565. static int nl80211_add_scan_req(struct sk_buff *msg,
  3566. struct cfg80211_registered_device *rdev)
  3567. {
  3568. struct cfg80211_scan_request *req = rdev->scan_req;
  3569. struct nlattr *nest;
  3570. int i;
  3571. ASSERT_RDEV_LOCK(rdev);
  3572. if (WARN_ON(!req))
  3573. return 0;
  3574. nest = nla_nest_start(msg, NL80211_ATTR_SCAN_SSIDS);
  3575. if (!nest)
  3576. goto nla_put_failure;
  3577. for (i = 0; i < req->n_ssids; i++)
  3578. NLA_PUT(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid);
  3579. nla_nest_end(msg, nest);
  3580. nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
  3581. if (!nest)
  3582. goto nla_put_failure;
  3583. for (i = 0; i < req->n_channels; i++)
  3584. NLA_PUT_U32(msg, i, req->channels[i]->center_freq);
  3585. nla_nest_end(msg, nest);
  3586. if (req->ie)
  3587. NLA_PUT(msg, NL80211_ATTR_IE, req->ie_len, req->ie);
  3588. return 0;
  3589. nla_put_failure:
  3590. return -ENOBUFS;
  3591. }
  3592. static int nl80211_send_scan_msg(struct sk_buff *msg,
  3593. struct cfg80211_registered_device *rdev,
  3594. struct net_device *netdev,
  3595. u32 pid, u32 seq, int flags,
  3596. u32 cmd)
  3597. {
  3598. void *hdr;
  3599. hdr = nl80211hdr_put(msg, pid, seq, flags, cmd);
  3600. if (!hdr)
  3601. return -1;
  3602. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  3603. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  3604. /* ignore errors and send incomplete event anyway */
  3605. nl80211_add_scan_req(msg, rdev);
  3606. return genlmsg_end(msg, hdr);
  3607. nla_put_failure:
  3608. genlmsg_cancel(msg, hdr);
  3609. return -EMSGSIZE;
  3610. }
  3611. void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
  3612. struct net_device *netdev)
  3613. {
  3614. struct sk_buff *msg;
  3615. msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
  3616. if (!msg)
  3617. return;
  3618. if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
  3619. NL80211_CMD_TRIGGER_SCAN) < 0) {
  3620. nlmsg_free(msg);
  3621. return;
  3622. }
  3623. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  3624. nl80211_scan_mcgrp.id, GFP_KERNEL);
  3625. }
  3626. void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
  3627. struct net_device *netdev)
  3628. {
  3629. struct sk_buff *msg;
  3630. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  3631. if (!msg)
  3632. return;
  3633. if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
  3634. NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
  3635. nlmsg_free(msg);
  3636. return;
  3637. }
  3638. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  3639. nl80211_scan_mcgrp.id, GFP_KERNEL);
  3640. }
  3641. void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
  3642. struct net_device *netdev)
  3643. {
  3644. struct sk_buff *msg;
  3645. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  3646. if (!msg)
  3647. return;
  3648. if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
  3649. NL80211_CMD_SCAN_ABORTED) < 0) {
  3650. nlmsg_free(msg);
  3651. return;
  3652. }
  3653. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  3654. nl80211_scan_mcgrp.id, GFP_KERNEL);
  3655. }
  3656. /*
  3657. * This can happen on global regulatory changes or device specific settings
  3658. * based on custom world regulatory domains.
  3659. */
  3660. void nl80211_send_reg_change_event(struct regulatory_request *request)
  3661. {
  3662. struct sk_buff *msg;
  3663. void *hdr;
  3664. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  3665. if (!msg)
  3666. return;
  3667. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_CHANGE);
  3668. if (!hdr) {
  3669. nlmsg_free(msg);
  3670. return;
  3671. }
  3672. /* Userspace can always count this one always being set */
  3673. NLA_PUT_U8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator);
  3674. if (request->alpha2[0] == '0' && request->alpha2[1] == '0')
  3675. NLA_PUT_U8(msg, NL80211_ATTR_REG_TYPE,
  3676. NL80211_REGDOM_TYPE_WORLD);
  3677. else if (request->alpha2[0] == '9' && request->alpha2[1] == '9')
  3678. NLA_PUT_U8(msg, NL80211_ATTR_REG_TYPE,
  3679. NL80211_REGDOM_TYPE_CUSTOM_WORLD);
  3680. else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
  3681. request->intersect)
  3682. NLA_PUT_U8(msg, NL80211_ATTR_REG_TYPE,
  3683. NL80211_REGDOM_TYPE_INTERSECTION);
  3684. else {
  3685. NLA_PUT_U8(msg, NL80211_ATTR_REG_TYPE,
  3686. NL80211_REGDOM_TYPE_COUNTRY);
  3687. NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2, request->alpha2);
  3688. }
  3689. if (wiphy_idx_valid(request->wiphy_idx))
  3690. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx);
  3691. if (genlmsg_end(msg, hdr) < 0) {
  3692. nlmsg_free(msg);
  3693. return;
  3694. }
  3695. rcu_read_lock();
  3696. genlmsg_multicast_allns(msg, 0, nl80211_regulatory_mcgrp.id,
  3697. GFP_ATOMIC);
  3698. rcu_read_unlock();
  3699. return;
  3700. nla_put_failure:
  3701. genlmsg_cancel(msg, hdr);
  3702. nlmsg_free(msg);
  3703. }
  3704. static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
  3705. struct net_device *netdev,
  3706. const u8 *buf, size_t len,
  3707. enum nl80211_commands cmd, gfp_t gfp)
  3708. {
  3709. struct sk_buff *msg;
  3710. void *hdr;
  3711. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  3712. if (!msg)
  3713. return;
  3714. hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
  3715. if (!hdr) {
  3716. nlmsg_free(msg);
  3717. return;
  3718. }
  3719. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  3720. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  3721. NLA_PUT(msg, NL80211_ATTR_FRAME, len, buf);
  3722. if (genlmsg_end(msg, hdr) < 0) {
  3723. nlmsg_free(msg);
  3724. return;
  3725. }
  3726. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  3727. nl80211_mlme_mcgrp.id, gfp);
  3728. return;
  3729. nla_put_failure:
  3730. genlmsg_cancel(msg, hdr);
  3731. nlmsg_free(msg);
  3732. }
  3733. void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
  3734. struct net_device *netdev, const u8 *buf,
  3735. size_t len, gfp_t gfp)
  3736. {
  3737. nl80211_send_mlme_event(rdev, netdev, buf, len,
  3738. NL80211_CMD_AUTHENTICATE, gfp);
  3739. }
  3740. void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
  3741. struct net_device *netdev, const u8 *buf,
  3742. size_t len, gfp_t gfp)
  3743. {
  3744. nl80211_send_mlme_event(rdev, netdev, buf, len,
  3745. NL80211_CMD_ASSOCIATE, gfp);
  3746. }
  3747. void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
  3748. struct net_device *netdev, const u8 *buf,
  3749. size_t len, gfp_t gfp)
  3750. {
  3751. nl80211_send_mlme_event(rdev, netdev, buf, len,
  3752. NL80211_CMD_DEAUTHENTICATE, gfp);
  3753. }
  3754. void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
  3755. struct net_device *netdev, const u8 *buf,
  3756. size_t len, gfp_t gfp)
  3757. {
  3758. nl80211_send_mlme_event(rdev, netdev, buf, len,
  3759. NL80211_CMD_DISASSOCIATE, gfp);
  3760. }
  3761. static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
  3762. struct net_device *netdev, int cmd,
  3763. const u8 *addr, gfp_t gfp)
  3764. {
  3765. struct sk_buff *msg;
  3766. void *hdr;
  3767. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  3768. if (!msg)
  3769. return;
  3770. hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
  3771. if (!hdr) {
  3772. nlmsg_free(msg);
  3773. return;
  3774. }
  3775. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  3776. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  3777. NLA_PUT_FLAG(msg, NL80211_ATTR_TIMED_OUT);
  3778. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
  3779. if (genlmsg_end(msg, hdr) < 0) {
  3780. nlmsg_free(msg);
  3781. return;
  3782. }
  3783. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  3784. nl80211_mlme_mcgrp.id, gfp);
  3785. return;
  3786. nla_put_failure:
  3787. genlmsg_cancel(msg, hdr);
  3788. nlmsg_free(msg);
  3789. }
  3790. void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
  3791. struct net_device *netdev, const u8 *addr,
  3792. gfp_t gfp)
  3793. {
  3794. nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
  3795. addr, gfp);
  3796. }
  3797. void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
  3798. struct net_device *netdev, const u8 *addr,
  3799. gfp_t gfp)
  3800. {
  3801. nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE,
  3802. addr, gfp);
  3803. }
  3804. void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
  3805. struct net_device *netdev, const u8 *bssid,
  3806. const u8 *req_ie, size_t req_ie_len,
  3807. const u8 *resp_ie, size_t resp_ie_len,
  3808. u16 status, gfp_t gfp)
  3809. {
  3810. struct sk_buff *msg;
  3811. void *hdr;
  3812. msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
  3813. if (!msg)
  3814. return;
  3815. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT);
  3816. if (!hdr) {
  3817. nlmsg_free(msg);
  3818. return;
  3819. }
  3820. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  3821. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  3822. if (bssid)
  3823. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid);
  3824. NLA_PUT_U16(msg, NL80211_ATTR_STATUS_CODE, status);
  3825. if (req_ie)
  3826. NLA_PUT(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie);
  3827. if (resp_ie)
  3828. NLA_PUT(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie);
  3829. if (genlmsg_end(msg, hdr) < 0) {
  3830. nlmsg_free(msg);
  3831. return;
  3832. }
  3833. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  3834. nl80211_mlme_mcgrp.id, gfp);
  3835. return;
  3836. nla_put_failure:
  3837. genlmsg_cancel(msg, hdr);
  3838. nlmsg_free(msg);
  3839. }
  3840. void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
  3841. struct net_device *netdev, const u8 *bssid,
  3842. const u8 *req_ie, size_t req_ie_len,
  3843. const u8 *resp_ie, size_t resp_ie_len, gfp_t gfp)
  3844. {
  3845. struct sk_buff *msg;
  3846. void *hdr;
  3847. msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
  3848. if (!msg)
  3849. return;
  3850. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM);
  3851. if (!hdr) {
  3852. nlmsg_free(msg);
  3853. return;
  3854. }
  3855. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  3856. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  3857. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid);
  3858. if (req_ie)
  3859. NLA_PUT(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie);
  3860. if (resp_ie)
  3861. NLA_PUT(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie);
  3862. if (genlmsg_end(msg, hdr) < 0) {
  3863. nlmsg_free(msg);
  3864. return;
  3865. }
  3866. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  3867. nl80211_mlme_mcgrp.id, gfp);
  3868. return;
  3869. nla_put_failure:
  3870. genlmsg_cancel(msg, hdr);
  3871. nlmsg_free(msg);
  3872. }
  3873. void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
  3874. struct net_device *netdev, u16 reason,
  3875. const u8 *ie, size_t ie_len, bool from_ap)
  3876. {
  3877. struct sk_buff *msg;
  3878. void *hdr;
  3879. msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
  3880. if (!msg)
  3881. return;
  3882. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT);
  3883. if (!hdr) {
  3884. nlmsg_free(msg);
  3885. return;
  3886. }
  3887. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  3888. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  3889. if (from_ap && reason)
  3890. NLA_PUT_U16(msg, NL80211_ATTR_REASON_CODE, reason);
  3891. if (from_ap)
  3892. NLA_PUT_FLAG(msg, NL80211_ATTR_DISCONNECTED_BY_AP);
  3893. if (ie)
  3894. NLA_PUT(msg, NL80211_ATTR_IE, ie_len, ie);
  3895. if (genlmsg_end(msg, hdr) < 0) {
  3896. nlmsg_free(msg);
  3897. return;
  3898. }
  3899. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  3900. nl80211_mlme_mcgrp.id, GFP_KERNEL);
  3901. return;
  3902. nla_put_failure:
  3903. genlmsg_cancel(msg, hdr);
  3904. nlmsg_free(msg);
  3905. }
  3906. void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
  3907. struct net_device *netdev, const u8 *bssid,
  3908. gfp_t gfp)
  3909. {
  3910. struct sk_buff *msg;
  3911. void *hdr;
  3912. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  3913. if (!msg)
  3914. return;
  3915. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
  3916. if (!hdr) {
  3917. nlmsg_free(msg);
  3918. return;
  3919. }
  3920. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  3921. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  3922. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid);
  3923. if (genlmsg_end(msg, hdr) < 0) {
  3924. nlmsg_free(msg);
  3925. return;
  3926. }
  3927. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  3928. nl80211_mlme_mcgrp.id, gfp);
  3929. return;
  3930. nla_put_failure:
  3931. genlmsg_cancel(msg, hdr);
  3932. nlmsg_free(msg);
  3933. }
  3934. void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
  3935. struct net_device *netdev, const u8 *addr,
  3936. enum nl80211_key_type key_type, int key_id,
  3937. const u8 *tsc, gfp_t gfp)
  3938. {
  3939. struct sk_buff *msg;
  3940. void *hdr;
  3941. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  3942. if (!msg)
  3943. return;
  3944. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
  3945. if (!hdr) {
  3946. nlmsg_free(msg);
  3947. return;
  3948. }
  3949. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
  3950. NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
  3951. if (addr)
  3952. NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
  3953. NLA_PUT_U32(msg, NL80211_ATTR_KEY_TYPE, key_type);
  3954. NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_id);
  3955. if (tsc)
  3956. NLA_PUT(msg, NL80211_ATTR_KEY_SEQ, 6, tsc);
  3957. if (genlmsg_end(msg, hdr) < 0) {
  3958. nlmsg_free(msg);
  3959. return;
  3960. }
  3961. genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  3962. nl80211_mlme_mcgrp.id, gfp);
  3963. return;
  3964. nla_put_failure:
  3965. genlmsg_cancel(msg, hdr);
  3966. nlmsg_free(msg);
  3967. }
  3968. void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
  3969. struct ieee80211_channel *channel_before,
  3970. struct ieee80211_channel *channel_after)
  3971. {
  3972. struct sk_buff *msg;
  3973. void *hdr;
  3974. struct nlattr *nl_freq;
  3975. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
  3976. if (!msg)
  3977. return;
  3978. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
  3979. if (!hdr) {
  3980. nlmsg_free(msg);
  3981. return;
  3982. }
  3983. /*
  3984. * Since we are applying the beacon hint to a wiphy we know its
  3985. * wiphy_idx is valid
  3986. */
  3987. NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy));
  3988. /* Before */
  3989. nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_BEFORE);
  3990. if (!nl_freq)
  3991. goto nla_put_failure;
  3992. if (nl80211_msg_put_channel(msg, channel_before))
  3993. goto nla_put_failure;
  3994. nla_nest_end(msg, nl_freq);
  3995. /* After */
  3996. nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_AFTER);
  3997. if (!nl_freq)
  3998. goto nla_put_failure;
  3999. if (nl80211_msg_put_channel(msg, channel_after))
  4000. goto nla_put_failure;
  4001. nla_nest_end(msg, nl_freq);
  4002. if (genlmsg_end(msg, hdr) < 0) {
  4003. nlmsg_free(msg);
  4004. return;
  4005. }
  4006. rcu_read_lock();
  4007. genlmsg_multicast_allns(msg, 0, nl80211_regulatory_mcgrp.id,
  4008. GFP_ATOMIC);
  4009. rcu_read_unlock();
  4010. return;
  4011. nla_put_failure:
  4012. genlmsg_cancel(msg, hdr);
  4013. nlmsg_free(msg);
  4014. }
  4015. /* initialisation/exit functions */
  4016. int nl80211_init(void)
  4017. {
  4018. int err;
  4019. err = genl_register_family_with_ops(&nl80211_fam,
  4020. nl80211_ops, ARRAY_SIZE(nl80211_ops));
  4021. if (err)
  4022. return err;
  4023. err = genl_register_mc_group(&nl80211_fam, &nl80211_config_mcgrp);
  4024. if (err)
  4025. goto err_out;
  4026. err = genl_register_mc_group(&nl80211_fam, &nl80211_scan_mcgrp);
  4027. if (err)
  4028. goto err_out;
  4029. err = genl_register_mc_group(&nl80211_fam, &nl80211_regulatory_mcgrp);
  4030. if (err)
  4031. goto err_out;
  4032. err = genl_register_mc_group(&nl80211_fam, &nl80211_mlme_mcgrp);
  4033. if (err)
  4034. goto err_out;
  4035. #ifdef CONFIG_NL80211_TESTMODE
  4036. err = genl_register_mc_group(&nl80211_fam, &nl80211_testmode_mcgrp);
  4037. if (err)
  4038. goto err_out;
  4039. #endif
  4040. return 0;
  4041. err_out:
  4042. genl_unregister_family(&nl80211_fam);
  4043. return err;
  4044. }
  4045. void nl80211_exit(void)
  4046. {
  4047. genl_unregister_family(&nl80211_fam);
  4048. }