nl80211.c 483 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * This is the new netlink-based wireless configuration interface.
  4. *
  5. * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
  6. * Copyright 2013-2014 Intel Mobile Communications GmbH
  7. * Copyright 2015-2017 Intel Deutschland GmbH
  8. * Copyright (C) 2018-2021 Intel Corporation
  9. */
  10. #include <linux/if.h>
  11. #include <linux/module.h>
  12. #include <linux/err.h>
  13. #include <linux/slab.h>
  14. #include <linux/list.h>
  15. #include <linux/if_ether.h>
  16. #include <linux/ieee80211.h>
  17. #include <linux/nl80211.h>
  18. #include <linux/rtnetlink.h>
  19. #include <linux/netlink.h>
  20. #include <linux/nospec.h>
  21. #include <linux/etherdevice.h>
  22. #include <linux/if_vlan.h>
  23. #include <net/net_namespace.h>
  24. #include <net/genetlink.h>
  25. #include <net/cfg80211.h>
  26. #include <net/sock.h>
  27. #include <net/inet_connection_sock.h>
  28. #include "core.h"
  29. #include "nl80211.h"
  30. #include "reg.h"
  31. #include "rdev-ops.h"
  32. static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
  33. struct genl_info *info,
  34. struct cfg80211_crypto_settings *settings,
  35. int cipher_limit);
  36. /* the netlink family */
  37. static struct genl_family nl80211_fam;
  38. /* multicast groups */
  39. enum nl80211_multicast_groups {
  40. NL80211_MCGRP_CONFIG,
  41. NL80211_MCGRP_SCAN,
  42. NL80211_MCGRP_REGULATORY,
  43. NL80211_MCGRP_MLME,
  44. NL80211_MCGRP_VENDOR,
  45. NL80211_MCGRP_NAN,
  46. NL80211_MCGRP_TESTMODE /* keep last - ifdef! */
  47. };
  48. static const struct genl_multicast_group nl80211_mcgrps[] = {
  49. [NL80211_MCGRP_CONFIG] = { .name = NL80211_MULTICAST_GROUP_CONFIG },
  50. [NL80211_MCGRP_SCAN] = { .name = NL80211_MULTICAST_GROUP_SCAN },
  51. [NL80211_MCGRP_REGULATORY] = { .name = NL80211_MULTICAST_GROUP_REG },
  52. [NL80211_MCGRP_MLME] = { .name = NL80211_MULTICAST_GROUP_MLME },
  53. [NL80211_MCGRP_VENDOR] = { .name = NL80211_MULTICAST_GROUP_VENDOR },
  54. [NL80211_MCGRP_NAN] = { .name = NL80211_MULTICAST_GROUP_NAN },
  55. #ifdef CONFIG_NL80211_TESTMODE
  56. [NL80211_MCGRP_TESTMODE] = { .name = NL80211_MULTICAST_GROUP_TESTMODE }
  57. #endif
  58. };
  59. /* returns ERR_PTR values */
  60. static struct wireless_dev *
  61. __cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs)
  62. {
  63. struct cfg80211_registered_device *rdev;
  64. struct wireless_dev *result = NULL;
  65. bool have_ifidx = attrs[NL80211_ATTR_IFINDEX];
  66. bool have_wdev_id = attrs[NL80211_ATTR_WDEV];
  67. u64 wdev_id;
  68. int wiphy_idx = -1;
  69. int ifidx = -1;
  70. ASSERT_RTNL();
  71. if (!have_ifidx && !have_wdev_id)
  72. return ERR_PTR(-EINVAL);
  73. if (have_ifidx)
  74. ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
  75. if (have_wdev_id) {
  76. wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
  77. wiphy_idx = wdev_id >> 32;
  78. }
  79. list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
  80. struct wireless_dev *wdev;
  81. if (wiphy_net(&rdev->wiphy) != netns)
  82. continue;
  83. if (have_wdev_id && rdev->wiphy_idx != wiphy_idx)
  84. continue;
  85. list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
  86. if (have_ifidx && wdev->netdev &&
  87. wdev->netdev->ifindex == ifidx) {
  88. result = wdev;
  89. break;
  90. }
  91. if (have_wdev_id && wdev->identifier == (u32)wdev_id) {
  92. result = wdev;
  93. break;
  94. }
  95. }
  96. if (result)
  97. break;
  98. }
  99. if (result)
  100. return result;
  101. return ERR_PTR(-ENODEV);
  102. }
  103. static struct cfg80211_registered_device *
  104. __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs)
  105. {
  106. struct cfg80211_registered_device *rdev = NULL, *tmp;
  107. struct net_device *netdev;
  108. ASSERT_RTNL();
  109. if (!attrs[NL80211_ATTR_WIPHY] &&
  110. !attrs[NL80211_ATTR_IFINDEX] &&
  111. !attrs[NL80211_ATTR_WDEV])
  112. return ERR_PTR(-EINVAL);
  113. if (attrs[NL80211_ATTR_WIPHY])
  114. rdev = cfg80211_rdev_by_wiphy_idx(
  115. nla_get_u32(attrs[NL80211_ATTR_WIPHY]));
  116. if (attrs[NL80211_ATTR_WDEV]) {
  117. u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]);
  118. struct wireless_dev *wdev;
  119. bool found = false;
  120. tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32);
  121. if (tmp) {
  122. /* make sure wdev exists */
  123. list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) {
  124. if (wdev->identifier != (u32)wdev_id)
  125. continue;
  126. found = true;
  127. break;
  128. }
  129. if (!found)
  130. tmp = NULL;
  131. if (rdev && tmp != rdev)
  132. return ERR_PTR(-EINVAL);
  133. rdev = tmp;
  134. }
  135. }
  136. if (attrs[NL80211_ATTR_IFINDEX]) {
  137. int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
  138. netdev = __dev_get_by_index(netns, ifindex);
  139. if (netdev) {
  140. if (netdev->ieee80211_ptr)
  141. tmp = wiphy_to_rdev(
  142. netdev->ieee80211_ptr->wiphy);
  143. else
  144. tmp = NULL;
  145. /* not wireless device -- return error */
  146. if (!tmp)
  147. return ERR_PTR(-EINVAL);
  148. /* mismatch -- return error */
  149. if (rdev && tmp != rdev)
  150. return ERR_PTR(-EINVAL);
  151. rdev = tmp;
  152. }
  153. }
  154. if (!rdev)
  155. return ERR_PTR(-ENODEV);
  156. if (netns != wiphy_net(&rdev->wiphy))
  157. return ERR_PTR(-ENODEV);
  158. return rdev;
  159. }
  160. /*
  161. * This function returns a pointer to the driver
  162. * that the genl_info item that is passed refers to.
  163. *
  164. * The result of this can be a PTR_ERR and hence must
  165. * be checked with IS_ERR() for errors.
  166. */
  167. static struct cfg80211_registered_device *
  168. cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info)
  169. {
  170. return __cfg80211_rdev_from_attrs(netns, info->attrs);
  171. }
  172. static int validate_beacon_head(const struct nlattr *attr,
  173. struct netlink_ext_ack *extack)
  174. {
  175. const u8 *data = nla_data(attr);
  176. unsigned int len = nla_len(attr);
  177. const struct element *elem;
  178. const struct ieee80211_mgmt *mgmt = (void *)data;
  179. unsigned int fixedlen, hdrlen;
  180. bool s1g_bcn;
  181. if (len < offsetofend(typeof(*mgmt), frame_control))
  182. goto err;
  183. s1g_bcn = ieee80211_is_s1g_beacon(mgmt->frame_control);
  184. if (s1g_bcn) {
  185. fixedlen = offsetof(struct ieee80211_ext,
  186. u.s1g_beacon.variable);
  187. hdrlen = offsetof(struct ieee80211_ext, u.s1g_beacon);
  188. } else {
  189. fixedlen = offsetof(struct ieee80211_mgmt,
  190. u.beacon.variable);
  191. hdrlen = offsetof(struct ieee80211_mgmt, u.beacon);
  192. }
  193. if (len < fixedlen)
  194. goto err;
  195. if (ieee80211_hdrlen(mgmt->frame_control) != hdrlen)
  196. goto err;
  197. data += fixedlen;
  198. len -= fixedlen;
  199. for_each_element(elem, data, len) {
  200. /* nothing */
  201. }
  202. if (for_each_element_completed(elem, data, len))
  203. return 0;
  204. err:
  205. NL_SET_ERR_MSG_ATTR(extack, attr, "malformed beacon head");
  206. return -EINVAL;
  207. }
  208. static int validate_ie_attr(const struct nlattr *attr,
  209. struct netlink_ext_ack *extack)
  210. {
  211. const u8 *data = nla_data(attr);
  212. unsigned int len = nla_len(attr);
  213. const struct element *elem;
  214. for_each_element(elem, data, len) {
  215. /* nothing */
  216. }
  217. if (for_each_element_completed(elem, data, len))
  218. return 0;
  219. NL_SET_ERR_MSG_ATTR(extack, attr, "malformed information elements");
  220. return -EINVAL;
  221. }
  222. /* policy for the attributes */
  223. static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR];
  224. static const struct nla_policy
  225. nl80211_ftm_responder_policy[NL80211_FTM_RESP_ATTR_MAX + 1] = {
  226. [NL80211_FTM_RESP_ATTR_ENABLED] = { .type = NLA_FLAG, },
  227. [NL80211_FTM_RESP_ATTR_LCI] = { .type = NLA_BINARY,
  228. .len = U8_MAX },
  229. [NL80211_FTM_RESP_ATTR_CIVICLOC] = { .type = NLA_BINARY,
  230. .len = U8_MAX },
  231. };
  232. static const struct nla_policy
  233. nl80211_pmsr_ftm_req_attr_policy[NL80211_PMSR_FTM_REQ_ATTR_MAX + 1] = {
  234. [NL80211_PMSR_FTM_REQ_ATTR_ASAP] = { .type = NLA_FLAG },
  235. [NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE] = { .type = NLA_U32 },
  236. [NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP] =
  237. NLA_POLICY_MAX(NLA_U8, 15),
  238. [NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD] = { .type = NLA_U16 },
  239. [NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION] =
  240. NLA_POLICY_MAX(NLA_U8, 15),
  241. [NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST] =
  242. NLA_POLICY_MAX(NLA_U8, 31),
  243. [NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES] = { .type = NLA_U8 },
  244. [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI] = { .type = NLA_FLAG },
  245. [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG },
  246. [NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED] = { .type = NLA_FLAG },
  247. [NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED] = { .type = NLA_FLAG },
  248. };
  249. static const struct nla_policy
  250. nl80211_pmsr_req_data_policy[NL80211_PMSR_TYPE_MAX + 1] = {
  251. [NL80211_PMSR_TYPE_FTM] =
  252. NLA_POLICY_NESTED(nl80211_pmsr_ftm_req_attr_policy),
  253. };
  254. static const struct nla_policy
  255. nl80211_pmsr_req_attr_policy[NL80211_PMSR_REQ_ATTR_MAX + 1] = {
  256. [NL80211_PMSR_REQ_ATTR_DATA] =
  257. NLA_POLICY_NESTED(nl80211_pmsr_req_data_policy),
  258. [NL80211_PMSR_REQ_ATTR_GET_AP_TSF] = { .type = NLA_FLAG },
  259. };
  260. static const struct nla_policy
  261. nl80211_psmr_peer_attr_policy[NL80211_PMSR_PEER_ATTR_MAX + 1] = {
  262. [NL80211_PMSR_PEER_ATTR_ADDR] = NLA_POLICY_ETH_ADDR,
  263. [NL80211_PMSR_PEER_ATTR_CHAN] = NLA_POLICY_NESTED(nl80211_policy),
  264. [NL80211_PMSR_PEER_ATTR_REQ] =
  265. NLA_POLICY_NESTED(nl80211_pmsr_req_attr_policy),
  266. [NL80211_PMSR_PEER_ATTR_RESP] = { .type = NLA_REJECT },
  267. };
  268. static const struct nla_policy
  269. nl80211_pmsr_attr_policy[NL80211_PMSR_ATTR_MAX + 1] = {
  270. [NL80211_PMSR_ATTR_MAX_PEERS] = { .type = NLA_REJECT },
  271. [NL80211_PMSR_ATTR_REPORT_AP_TSF] = { .type = NLA_REJECT },
  272. [NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR] = { .type = NLA_REJECT },
  273. [NL80211_PMSR_ATTR_TYPE_CAPA] = { .type = NLA_REJECT },
  274. [NL80211_PMSR_ATTR_PEERS] =
  275. NLA_POLICY_NESTED_ARRAY(nl80211_psmr_peer_attr_policy),
  276. };
  277. static const struct nla_policy
  278. he_obss_pd_policy[NL80211_HE_OBSS_PD_ATTR_MAX + 1] = {
  279. [NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET] =
  280. NLA_POLICY_RANGE(NLA_U8, 1, 20),
  281. [NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET] =
  282. NLA_POLICY_RANGE(NLA_U8, 1, 20),
  283. [NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET] =
  284. NLA_POLICY_RANGE(NLA_U8, 1, 20),
  285. [NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP] =
  286. NLA_POLICY_EXACT_LEN(8),
  287. [NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP] =
  288. NLA_POLICY_EXACT_LEN(8),
  289. [NL80211_HE_OBSS_PD_ATTR_SR_CTRL] = { .type = NLA_U8 },
  290. };
  291. static const struct nla_policy
  292. he_bss_color_policy[NL80211_HE_BSS_COLOR_ATTR_MAX + 1] = {
  293. [NL80211_HE_BSS_COLOR_ATTR_COLOR] = NLA_POLICY_RANGE(NLA_U8, 1, 63),
  294. [NL80211_HE_BSS_COLOR_ATTR_DISABLED] = { .type = NLA_FLAG },
  295. [NL80211_HE_BSS_COLOR_ATTR_PARTIAL] = { .type = NLA_FLAG },
  296. };
  297. static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
  298. [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY,
  299. .len = NL80211_MAX_SUPP_RATES },
  300. [NL80211_TXRATE_HT] = { .type = NLA_BINARY,
  301. .len = NL80211_MAX_SUPP_HT_RATES },
  302. [NL80211_TXRATE_VHT] = NLA_POLICY_EXACT_LEN_WARN(sizeof(struct nl80211_txrate_vht)),
  303. [NL80211_TXRATE_GI] = { .type = NLA_U8 },
  304. [NL80211_TXRATE_HE] = NLA_POLICY_EXACT_LEN(sizeof(struct nl80211_txrate_he)),
  305. [NL80211_TXRATE_HE_GI] = NLA_POLICY_RANGE(NLA_U8,
  306. NL80211_RATE_INFO_HE_GI_0_8,
  307. NL80211_RATE_INFO_HE_GI_3_2),
  308. [NL80211_TXRATE_HE_LTF] = NLA_POLICY_RANGE(NLA_U8,
  309. NL80211_RATE_INFO_HE_1XLTF,
  310. NL80211_RATE_INFO_HE_4XLTF),
  311. };
  312. static const struct nla_policy
  313. nl80211_tid_config_attr_policy[NL80211_TID_CONFIG_ATTR_MAX + 1] = {
  314. [NL80211_TID_CONFIG_ATTR_VIF_SUPP] = { .type = NLA_U64 },
  315. [NL80211_TID_CONFIG_ATTR_PEER_SUPP] = { .type = NLA_U64 },
  316. [NL80211_TID_CONFIG_ATTR_OVERRIDE] = { .type = NLA_FLAG },
  317. [NL80211_TID_CONFIG_ATTR_TIDS] = NLA_POLICY_RANGE(NLA_U16, 1, 0xff),
  318. [NL80211_TID_CONFIG_ATTR_NOACK] =
  319. NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE),
  320. [NL80211_TID_CONFIG_ATTR_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1),
  321. [NL80211_TID_CONFIG_ATTR_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1),
  322. [NL80211_TID_CONFIG_ATTR_AMPDU_CTRL] =
  323. NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE),
  324. [NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL] =
  325. NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE),
  326. [NL80211_TID_CONFIG_ATTR_AMSDU_CTRL] =
  327. NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE),
  328. [NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE] =
  329. NLA_POLICY_MAX(NLA_U8, NL80211_TX_RATE_FIXED),
  330. [NL80211_TID_CONFIG_ATTR_TX_RATE] =
  331. NLA_POLICY_NESTED(nl80211_txattr_policy),
  332. };
  333. static const struct nla_policy
  334. nl80211_fils_discovery_policy[NL80211_FILS_DISCOVERY_ATTR_MAX + 1] = {
  335. [NL80211_FILS_DISCOVERY_ATTR_INT_MIN] = NLA_POLICY_MAX(NLA_U32, 10000),
  336. [NL80211_FILS_DISCOVERY_ATTR_INT_MAX] = NLA_POLICY_MAX(NLA_U32, 10000),
  337. NLA_POLICY_RANGE(NLA_BINARY,
  338. NL80211_FILS_DISCOVERY_TMPL_MIN_LEN,
  339. IEEE80211_MAX_DATA_LEN),
  340. };
  341. static const struct nla_policy
  342. nl80211_unsol_bcast_probe_resp_policy[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1] = {
  343. [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] = NLA_POLICY_MAX(NLA_U32, 20),
  344. [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL] = { .type = NLA_BINARY,
  345. .len = IEEE80211_MAX_DATA_LEN }
  346. };
  347. static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
  348. [0] = { .strict_start_type = NL80211_ATTR_HE_OBSS_PD },
  349. [NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
  350. [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING,
  351. .len = 20-1 },
  352. [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED },
  353. [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 },
  354. [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 },
  355. [NL80211_ATTR_WIPHY_EDMG_CHANNELS] = NLA_POLICY_RANGE(NLA_U8,
  356. NL80211_EDMG_CHANNELS_MIN,
  357. NL80211_EDMG_CHANNELS_MAX),
  358. [NL80211_ATTR_WIPHY_EDMG_BW_CONFIG] = NLA_POLICY_RANGE(NLA_U8,
  359. NL80211_EDMG_BW_CONFIG_MIN,
  360. NL80211_EDMG_BW_CONFIG_MAX),
  361. [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 },
  362. [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 },
  363. [NL80211_ATTR_CENTER_FREQ1_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999),
  364. [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 },
  365. [NL80211_ATTR_WIPHY_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1),
  366. [NL80211_ATTR_WIPHY_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1),
  367. [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 },
  368. [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 },
  369. [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 },
  370. [NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG },
  371. [NL80211_ATTR_IFTYPE] = NLA_POLICY_MAX(NLA_U32, NL80211_IFTYPE_MAX),
  372. [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
  373. [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
  374. [NL80211_ATTR_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
  375. [NL80211_ATTR_PREV_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
  376. [NL80211_ATTR_KEY] = { .type = NLA_NESTED, },
  377. [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
  378. .len = WLAN_MAX_KEY_LEN },
  379. [NL80211_ATTR_KEY_IDX] = NLA_POLICY_MAX(NLA_U8, 7),
  380. [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 },
  381. [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG },
  382. [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
  383. [NL80211_ATTR_KEY_TYPE] =
  384. NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES),
  385. [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 },
  386. [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 },
  387. [NL80211_ATTR_BEACON_HEAD] =
  388. NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head,
  389. IEEE80211_MAX_DATA_LEN),
  390. [NL80211_ATTR_BEACON_TAIL] =
  391. NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
  392. IEEE80211_MAX_DATA_LEN),
  393. [NL80211_ATTR_STA_AID] =
  394. NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID),
  395. [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED },
  396. [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 },
  397. [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY,
  398. .len = NL80211_MAX_SUPP_RATES },
  399. [NL80211_ATTR_STA_PLINK_ACTION] =
  400. NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1),
  401. [NL80211_ATTR_STA_TX_POWER_SETTING] =
  402. NLA_POLICY_RANGE(NLA_U8,
  403. NL80211_TX_POWER_AUTOMATIC,
  404. NL80211_TX_POWER_FIXED),
  405. [NL80211_ATTR_STA_TX_POWER] = { .type = NLA_S16 },
  406. [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 },
  407. [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ },
  408. [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
  409. .len = IEEE80211_MAX_MESH_ID_LEN },
  410. [NL80211_ATTR_MPATH_NEXT_HOP] = NLA_POLICY_ETH_ADDR_COMPAT,
  411. /* allow 3 for NUL-termination, we used to declare this NLA_STRING */
  412. [NL80211_ATTR_REG_ALPHA2] = NLA_POLICY_RANGE(NLA_BINARY, 2, 3),
  413. [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED },
  414. [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 },
  415. [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 },
  416. [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 },
  417. [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY,
  418. .len = NL80211_MAX_SUPP_RATES },
  419. [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 },
  420. [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED },
  421. [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG },
  422. [NL80211_ATTR_HT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_HT_CAPABILITY_LEN),
  423. [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 },
  424. [NL80211_ATTR_IE] = NLA_POLICY_VALIDATE_FN(NLA_BINARY,
  425. validate_ie_attr,
  426. IEEE80211_MAX_DATA_LEN),
  427. [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED },
  428. [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED },
  429. [NL80211_ATTR_SSID] = { .type = NLA_BINARY,
  430. .len = IEEE80211_MAX_SSID_LEN },
  431. [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 },
  432. [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 },
  433. [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG },
  434. [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG },
  435. [NL80211_ATTR_USE_MFP] = NLA_POLICY_RANGE(NLA_U32,
  436. NL80211_MFP_NO,
  437. NL80211_MFP_OPTIONAL),
  438. [NL80211_ATTR_STA_FLAGS2] = {
  439. .len = sizeof(struct nl80211_sta_flag_update),
  440. },
  441. [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
  442. [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 },
  443. [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG },
  444. [NL80211_ATTR_CONTROL_PORT_OVER_NL80211] = { .type = NLA_FLAG },
  445. [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG },
  446. [NL80211_ATTR_STATUS_CODE] = { .type = NLA_U16 },
  447. [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 },
  448. [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 },
  449. [NL80211_ATTR_PID] = { .type = NLA_U32 },
  450. [NL80211_ATTR_4ADDR] = { .type = NLA_U8 },
  451. [NL80211_ATTR_PMKID] = NLA_POLICY_EXACT_LEN_WARN(WLAN_PMKID_LEN),
  452. [NL80211_ATTR_DURATION] = { .type = NLA_U32 },
  453. [NL80211_ATTR_COOKIE] = { .type = NLA_U64 },
  454. [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED },
  455. [NL80211_ATTR_FRAME] = { .type = NLA_BINARY,
  456. .len = IEEE80211_MAX_DATA_LEN },
  457. [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, },
  458. [NL80211_ATTR_PS_STATE] = NLA_POLICY_RANGE(NLA_U32,
  459. NL80211_PS_DISABLED,
  460. NL80211_PS_ENABLED),
  461. [NL80211_ATTR_CQM] = { .type = NLA_NESTED, },
  462. [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG },
  463. [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 },
  464. [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 },
  465. [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 },
  466. [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 },
  467. [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 },
  468. [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 },
  469. [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 },
  470. [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG },
  471. [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
  472. [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED },
  473. [NL80211_ATTR_STA_PLINK_STATE] =
  474. NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1),
  475. [NL80211_ATTR_MEASUREMENT_DURATION] = { .type = NLA_U16 },
  476. [NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY] = { .type = NLA_FLAG },
  477. [NL80211_ATTR_MESH_PEER_AID] =
  478. NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID),
  479. [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 },
  480. [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED },
  481. [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED },
  482. [NL80211_ATTR_HIDDEN_SSID] =
  483. NLA_POLICY_RANGE(NLA_U32,
  484. NL80211_HIDDEN_SSID_NOT_IN_USE,
  485. NL80211_HIDDEN_SSID_ZERO_CONTENTS),
  486. [NL80211_ATTR_IE_PROBE_RESP] =
  487. NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
  488. IEEE80211_MAX_DATA_LEN),
  489. [NL80211_ATTR_IE_ASSOC_RESP] =
  490. NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
  491. IEEE80211_MAX_DATA_LEN),
  492. [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG },
  493. [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED },
  494. [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG },
  495. [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 },
  496. [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 },
  497. [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 },
  498. [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG },
  499. [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG },
  500. [NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG },
  501. [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG },
  502. [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
  503. .len = IEEE80211_MAX_DATA_LEN },
  504. [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 },
  505. [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG },
  506. [NL80211_ATTR_HT_CAPABILITY_MASK] = {
  507. .len = NL80211_HT_CAPABILITY_LEN
  508. },
  509. [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 },
  510. [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 },
  511. [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 },
  512. [NL80211_ATTR_WDEV] = { .type = NLA_U64 },
  513. [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 },
  514. /* need to include at least Auth Transaction and Status Code */
  515. [NL80211_ATTR_AUTH_DATA] = NLA_POLICY_MIN_LEN(4),
  516. [NL80211_ATTR_VHT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_VHT_CAPABILITY_LEN),
  517. [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 },
  518. [NL80211_ATTR_P2P_CTWINDOW] = NLA_POLICY_MAX(NLA_U8, 127),
  519. [NL80211_ATTR_P2P_OPPPS] = NLA_POLICY_MAX(NLA_U8, 1),
  520. [NL80211_ATTR_LOCAL_MESH_POWER_MODE] =
  521. NLA_POLICY_RANGE(NLA_U32,
  522. NL80211_MESH_POWER_UNKNOWN + 1,
  523. NL80211_MESH_POWER_MAX),
  524. [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 },
  525. [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED },
  526. [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 },
  527. [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, },
  528. [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, },
  529. [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG },
  530. [NL80211_ATTR_VHT_CAPABILITY_MASK] = {
  531. .len = NL80211_VHT_CAPABILITY_LEN,
  532. },
  533. [NL80211_ATTR_MDID] = { .type = NLA_U16 },
  534. [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
  535. .len = IEEE80211_MAX_DATA_LEN },
  536. [NL80211_ATTR_CRIT_PROT_ID] = { .type = NLA_U16 },
  537. [NL80211_ATTR_MAX_CRIT_PROT_DURATION] =
  538. NLA_POLICY_MAX(NLA_U16, NL80211_CRIT_PROTO_MAX_DURATION),
  539. [NL80211_ATTR_PEER_AID] =
  540. NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID),
  541. [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 },
  542. [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG },
  543. [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED },
  544. [NL80211_ATTR_CNTDWN_OFFS_BEACON] = { .type = NLA_BINARY },
  545. [NL80211_ATTR_CNTDWN_OFFS_PRESP] = { .type = NLA_BINARY },
  546. [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = NLA_POLICY_MIN_LEN(2),
  547. /*
  548. * The value of the Length field of the Supported Operating
  549. * Classes element is between 2 and 253.
  550. */
  551. [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] =
  552. NLA_POLICY_RANGE(NLA_BINARY, 2, 253),
  553. [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG },
  554. [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 },
  555. [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 },
  556. [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 },
  557. [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
  558. [NL80211_ATTR_QOS_MAP] = NLA_POLICY_RANGE(NLA_BINARY,
  559. IEEE80211_QOS_MAP_LEN_MIN,
  560. IEEE80211_QOS_MAP_LEN_MAX),
  561. [NL80211_ATTR_MAC_HINT] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
  562. [NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 },
  563. [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 },
  564. [NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG },
  565. [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY },
  566. [NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG },
  567. [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1),
  568. [NL80211_ATTR_USER_PRIO] =
  569. NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1),
  570. [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 },
  571. [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 },
  572. [NL80211_ATTR_OPER_CLASS] = { .type = NLA_U8 },
  573. [NL80211_ATTR_MAC_MASK] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
  574. [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG },
  575. [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 },
  576. [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 },
  577. [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG },
  578. [NL80211_ATTR_PBSS] = { .type = NLA_FLAG },
  579. [NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED },
  580. [NL80211_ATTR_STA_SUPPORT_P2P_PS] =
  581. NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1),
  582. [NL80211_ATTR_MU_MIMO_GROUP_DATA] = {
  583. .len = VHT_MUMIMO_GROUPS_DATA_LEN
  584. },
  585. [NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
  586. [NL80211_ATTR_NAN_MASTER_PREF] = NLA_POLICY_MIN(NLA_U8, 1),
  587. [NL80211_ATTR_BANDS] = { .type = NLA_U32 },
  588. [NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED },
  589. [NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY,
  590. .len = FILS_MAX_KEK_LEN },
  591. [NL80211_ATTR_FILS_NONCES] = NLA_POLICY_EXACT_LEN_WARN(2 * FILS_NONCE_LEN),
  592. [NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, },
  593. [NL80211_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
  594. [NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] = { .type = NLA_S8 },
  595. [NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = {
  596. .len = sizeof(struct nl80211_bss_select_rssi_adjust)
  597. },
  598. [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 },
  599. [NL80211_ATTR_FILS_ERP_USERNAME] = { .type = NLA_BINARY,
  600. .len = FILS_ERP_MAX_USERNAME_LEN },
  601. [NL80211_ATTR_FILS_ERP_REALM] = { .type = NLA_BINARY,
  602. .len = FILS_ERP_MAX_REALM_LEN },
  603. [NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] = { .type = NLA_U16 },
  604. [NL80211_ATTR_FILS_ERP_RRK] = { .type = NLA_BINARY,
  605. .len = FILS_ERP_MAX_RRK_LEN },
  606. [NL80211_ATTR_FILS_CACHE_ID] = NLA_POLICY_EXACT_LEN_WARN(2),
  607. [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN },
  608. [NL80211_ATTR_PMKR0_NAME] = NLA_POLICY_EXACT_LEN(WLAN_PMK_NAME_LEN),
  609. [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG },
  610. [NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG },
  611. [NL80211_ATTR_TXQ_LIMIT] = { .type = NLA_U32 },
  612. [NL80211_ATTR_TXQ_MEMORY_LIMIT] = { .type = NLA_U32 },
  613. [NL80211_ATTR_TXQ_QUANTUM] = { .type = NLA_U32 },
  614. [NL80211_ATTR_HE_CAPABILITY] =
  615. NLA_POLICY_RANGE(NLA_BINARY,
  616. NL80211_HE_MIN_CAPABILITY_LEN,
  617. NL80211_HE_MAX_CAPABILITY_LEN),
  618. [NL80211_ATTR_FTM_RESPONDER] =
  619. NLA_POLICY_NESTED(nl80211_ftm_responder_policy),
  620. [NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1),
  621. [NL80211_ATTR_PEER_MEASUREMENTS] =
  622. NLA_POLICY_NESTED(nl80211_pmsr_attr_policy),
  623. [NL80211_ATTR_AIRTIME_WEIGHT] = NLA_POLICY_MIN(NLA_U16, 1),
  624. [NL80211_ATTR_SAE_PASSWORD] = { .type = NLA_BINARY,
  625. .len = SAE_PASSWORD_MAX_LEN },
  626. [NL80211_ATTR_TWT_RESPONDER] = { .type = NLA_FLAG },
  627. [NL80211_ATTR_HE_OBSS_PD] = NLA_POLICY_NESTED(he_obss_pd_policy),
  628. [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2),
  629. [NL80211_ATTR_HE_BSS_COLOR] = NLA_POLICY_NESTED(he_bss_color_policy),
  630. [NL80211_ATTR_TID_CONFIG] =
  631. NLA_POLICY_NESTED_ARRAY(nl80211_tid_config_attr_policy),
  632. [NL80211_ATTR_CONTROL_PORT_NO_PREAUTH] = { .type = NLA_FLAG },
  633. [NL80211_ATTR_PMK_LIFETIME] = NLA_POLICY_MIN(NLA_U32, 1),
  634. [NL80211_ATTR_PMK_REAUTH_THRESHOLD] = NLA_POLICY_RANGE(NLA_U8, 1, 100),
  635. [NL80211_ATTR_RECEIVE_MULTICAST] = { .type = NLA_FLAG },
  636. [NL80211_ATTR_WIPHY_FREQ_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999),
  637. [NL80211_ATTR_SCAN_FREQ_KHZ] = { .type = NLA_NESTED },
  638. [NL80211_ATTR_HE_6GHZ_CAPABILITY] =
  639. NLA_POLICY_EXACT_LEN(sizeof(struct ieee80211_he_6ghz_capa)),
  640. [NL80211_ATTR_FILS_DISCOVERY] =
  641. NLA_POLICY_NESTED(nl80211_fils_discovery_policy),
  642. [NL80211_ATTR_UNSOL_BCAST_PROBE_RESP] =
  643. NLA_POLICY_NESTED(nl80211_unsol_bcast_probe_resp_policy),
  644. [NL80211_ATTR_S1G_CAPABILITY] =
  645. NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN),
  646. [NL80211_ATTR_S1G_CAPABILITY_MASK] =
  647. NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN),
  648. [NL80211_ATTR_SAE_PWE] =
  649. NLA_POLICY_RANGE(NLA_U8, NL80211_SAE_PWE_HUNT_AND_PECK,
  650. NL80211_SAE_PWE_BOTH),
  651. };
  652. /* policy for the key attributes */
  653. static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = {
  654. [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN },
  655. [NL80211_KEY_IDX] = { .type = NLA_U8 },
  656. [NL80211_KEY_CIPHER] = { .type = NLA_U32 },
  657. [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 },
  658. [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG },
  659. [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG },
  660. [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1),
  661. [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
  662. [NL80211_KEY_MODE] = NLA_POLICY_RANGE(NLA_U8, 0, NL80211_KEY_SET_TX),
  663. };
  664. /* policy for the key default flags */
  665. static const struct nla_policy
  666. nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = {
  667. [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG },
  668. [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG },
  669. };
  670. #ifdef CONFIG_PM
  671. /* policy for WoWLAN attributes */
  672. static const struct nla_policy
  673. nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = {
  674. [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG },
  675. [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG },
  676. [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG },
  677. [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED },
  678. [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG },
  679. [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG },
  680. [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG },
  681. [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG },
  682. [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED },
  683. [NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED },
  684. };
  685. static const struct nla_policy
  686. nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = {
  687. [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 },
  688. [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 },
  689. [NL80211_WOWLAN_TCP_DST_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
  690. [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 },
  691. [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 },
  692. [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = NLA_POLICY_MIN_LEN(1),
  693. [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = {
  694. .len = sizeof(struct nl80211_wowlan_tcp_data_seq)
  695. },
  696. [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = {
  697. .len = sizeof(struct nl80211_wowlan_tcp_data_token)
  698. },
  699. [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 },
  700. [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = NLA_POLICY_MIN_LEN(1),
  701. [NL80211_WOWLAN_TCP_WAKE_MASK] = NLA_POLICY_MIN_LEN(1),
  702. };
  703. #endif /* CONFIG_PM */
  704. /* policy for coalesce rule attributes */
  705. static const struct nla_policy
  706. nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = {
  707. [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 },
  708. [NL80211_ATTR_COALESCE_RULE_CONDITION] =
  709. NLA_POLICY_RANGE(NLA_U32,
  710. NL80211_COALESCE_CONDITION_MATCH,
  711. NL80211_COALESCE_CONDITION_NO_MATCH),
  712. [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED },
  713. };
  714. /* policy for GTK rekey offload attributes */
  715. static const struct nla_policy
  716. nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = {
  717. [NL80211_REKEY_DATA_KEK] = {
  718. .type = NLA_BINARY,
  719. .len = NL80211_KEK_EXT_LEN
  720. },
  721. [NL80211_REKEY_DATA_KCK] = {
  722. .type = NLA_BINARY,
  723. .len = NL80211_KCK_EXT_LEN
  724. },
  725. [NL80211_REKEY_DATA_REPLAY_CTR] = NLA_POLICY_EXACT_LEN(NL80211_REPLAY_CTR_LEN),
  726. [NL80211_REKEY_DATA_AKM] = { .type = NLA_U32 },
  727. };
  728. static const struct nla_policy
  729. nl80211_match_band_rssi_policy[NUM_NL80211_BANDS] = {
  730. [NL80211_BAND_2GHZ] = { .type = NLA_S32 },
  731. [NL80211_BAND_5GHZ] = { .type = NLA_S32 },
  732. [NL80211_BAND_6GHZ] = { .type = NLA_S32 },
  733. [NL80211_BAND_60GHZ] = { .type = NLA_S32 },
  734. };
  735. static const struct nla_policy
  736. nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = {
  737. [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY,
  738. .len = IEEE80211_MAX_SSID_LEN },
  739. [NL80211_SCHED_SCAN_MATCH_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
  740. [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 },
  741. [NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI] =
  742. NLA_POLICY_NESTED(nl80211_match_band_rssi_policy),
  743. };
  744. static const struct nla_policy
  745. nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = {
  746. [NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 },
  747. [NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 },
  748. };
  749. static const struct nla_policy
  750. nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = {
  751. [NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG },
  752. [NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 },
  753. [NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = {
  754. .len = sizeof(struct nl80211_bss_select_rssi_adjust)
  755. },
  756. };
  757. /* policy for NAN function attributes */
  758. static const struct nla_policy
  759. nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = {
  760. [NL80211_NAN_FUNC_TYPE] =
  761. NLA_POLICY_MAX(NLA_U8, NL80211_NAN_FUNC_MAX_TYPE),
  762. [NL80211_NAN_FUNC_SERVICE_ID] = {
  763. .len = NL80211_NAN_FUNC_SERVICE_ID_LEN },
  764. [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 },
  765. [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG },
  766. [NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE] = { .type = NLA_FLAG },
  767. [NL80211_NAN_FUNC_FOLLOW_UP_ID] = { .type = NLA_U8 },
  768. [NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] = { .type = NLA_U8 },
  769. [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
  770. [NL80211_NAN_FUNC_CLOSE_RANGE] = { .type = NLA_FLAG },
  771. [NL80211_NAN_FUNC_TTL] = { .type = NLA_U32 },
  772. [NL80211_NAN_FUNC_SERVICE_INFO] = { .type = NLA_BINARY,
  773. .len = NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN },
  774. [NL80211_NAN_FUNC_SRF] = { .type = NLA_NESTED },
  775. [NL80211_NAN_FUNC_RX_MATCH_FILTER] = { .type = NLA_NESTED },
  776. [NL80211_NAN_FUNC_TX_MATCH_FILTER] = { .type = NLA_NESTED },
  777. [NL80211_NAN_FUNC_INSTANCE_ID] = { .type = NLA_U8 },
  778. [NL80211_NAN_FUNC_TERM_REASON] = { .type = NLA_U8 },
  779. };
  780. /* policy for Service Response Filter attributes */
  781. static const struct nla_policy
  782. nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = {
  783. [NL80211_NAN_SRF_INCLUDE] = { .type = NLA_FLAG },
  784. [NL80211_NAN_SRF_BF] = { .type = NLA_BINARY,
  785. .len = NL80211_NAN_FUNC_SRF_MAX_LEN },
  786. [NL80211_NAN_SRF_BF_IDX] = { .type = NLA_U8 },
  787. [NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED },
  788. };
  789. /* policy for packet pattern attributes */
  790. static const struct nla_policy
  791. nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = {
  792. [NL80211_PKTPAT_MASK] = { .type = NLA_BINARY, },
  793. [NL80211_PKTPAT_PATTERN] = { .type = NLA_BINARY, },
  794. [NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 },
  795. };
  796. int nl80211_prepare_wdev_dump(struct netlink_callback *cb,
  797. struct cfg80211_registered_device **rdev,
  798. struct wireless_dev **wdev)
  799. {
  800. int err;
  801. if (!cb->args[0]) {
  802. struct nlattr **attrbuf;
  803. attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf),
  804. GFP_KERNEL);
  805. if (!attrbuf)
  806. return -ENOMEM;
  807. err = nlmsg_parse_deprecated(cb->nlh,
  808. GENL_HDRLEN + nl80211_fam.hdrsize,
  809. attrbuf, nl80211_fam.maxattr,
  810. nl80211_policy, NULL);
  811. if (err) {
  812. kfree(attrbuf);
  813. return err;
  814. }
  815. *wdev = __cfg80211_wdev_from_attrs(sock_net(cb->skb->sk),
  816. attrbuf);
  817. kfree(attrbuf);
  818. if (IS_ERR(*wdev))
  819. return PTR_ERR(*wdev);
  820. *rdev = wiphy_to_rdev((*wdev)->wiphy);
  821. /* 0 is the first index - add 1 to parse only once */
  822. cb->args[0] = (*rdev)->wiphy_idx + 1;
  823. cb->args[1] = (*wdev)->identifier;
  824. } else {
  825. /* subtract the 1 again here */
  826. struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
  827. struct wireless_dev *tmp;
  828. if (!wiphy)
  829. return -ENODEV;
  830. *rdev = wiphy_to_rdev(wiphy);
  831. *wdev = NULL;
  832. list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) {
  833. if (tmp->identifier == cb->args[1]) {
  834. *wdev = tmp;
  835. break;
  836. }
  837. }
  838. if (!*wdev)
  839. return -ENODEV;
  840. }
  841. return 0;
  842. }
  843. /* message building helper */
  844. void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq,
  845. int flags, u8 cmd)
  846. {
  847. /* since there is no private header just add the generic one */
  848. return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd);
  849. }
  850. static int nl80211_msg_put_wmm_rules(struct sk_buff *msg,
  851. const struct ieee80211_reg_rule *rule)
  852. {
  853. int j;
  854. struct nlattr *nl_wmm_rules =
  855. nla_nest_start_noflag(msg, NL80211_FREQUENCY_ATTR_WMM);
  856. if (!nl_wmm_rules)
  857. goto nla_put_failure;
  858. for (j = 0; j < IEEE80211_NUM_ACS; j++) {
  859. struct nlattr *nl_wmm_rule = nla_nest_start_noflag(msg, j);
  860. if (!nl_wmm_rule)
  861. goto nla_put_failure;
  862. if (nla_put_u16(msg, NL80211_WMMR_CW_MIN,
  863. rule->wmm_rule.client[j].cw_min) ||
  864. nla_put_u16(msg, NL80211_WMMR_CW_MAX,
  865. rule->wmm_rule.client[j].cw_max) ||
  866. nla_put_u8(msg, NL80211_WMMR_AIFSN,
  867. rule->wmm_rule.client[j].aifsn) ||
  868. nla_put_u16(msg, NL80211_WMMR_TXOP,
  869. rule->wmm_rule.client[j].cot))
  870. goto nla_put_failure;
  871. nla_nest_end(msg, nl_wmm_rule);
  872. }
  873. nla_nest_end(msg, nl_wmm_rules);
  874. return 0;
  875. nla_put_failure:
  876. return -ENOBUFS;
  877. }
  878. static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy,
  879. struct ieee80211_channel *chan,
  880. bool large)
  881. {
  882. /* Some channels must be completely excluded from the
  883. * list to protect old user-space tools from breaking
  884. */
  885. if (!large && chan->flags &
  886. (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ))
  887. return 0;
  888. if (!large && chan->freq_offset)
  889. return 0;
  890. if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ,
  891. chan->center_freq))
  892. goto nla_put_failure;
  893. if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset))
  894. goto nla_put_failure;
  895. if ((chan->flags & IEEE80211_CHAN_DISABLED) &&
  896. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED))
  897. goto nla_put_failure;
  898. if (chan->flags & IEEE80211_CHAN_NO_IR) {
  899. if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR))
  900. goto nla_put_failure;
  901. if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS))
  902. goto nla_put_failure;
  903. }
  904. if (chan->flags & IEEE80211_CHAN_RADAR) {
  905. if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
  906. goto nla_put_failure;
  907. if (large) {
  908. u32 time;
  909. time = elapsed_jiffies_msecs(chan->dfs_state_entered);
  910. if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE,
  911. chan->dfs_state))
  912. goto nla_put_failure;
  913. if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME,
  914. time))
  915. goto nla_put_failure;
  916. if (nla_put_u32(msg,
  917. NL80211_FREQUENCY_ATTR_DFS_CAC_TIME,
  918. chan->dfs_cac_ms))
  919. goto nla_put_failure;
  920. }
  921. }
  922. if (large) {
  923. if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) &&
  924. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS))
  925. goto nla_put_failure;
  926. if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) &&
  927. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS))
  928. goto nla_put_failure;
  929. if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) &&
  930. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ))
  931. goto nla_put_failure;
  932. if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) &&
  933. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ))
  934. goto nla_put_failure;
  935. if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) &&
  936. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY))
  937. goto nla_put_failure;
  938. if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) &&
  939. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT))
  940. goto nla_put_failure;
  941. if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) &&
  942. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ))
  943. goto nla_put_failure;
  944. if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) &&
  945. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ))
  946. goto nla_put_failure;
  947. if ((chan->flags & IEEE80211_CHAN_NO_HE) &&
  948. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HE))
  949. goto nla_put_failure;
  950. if ((chan->flags & IEEE80211_CHAN_1MHZ) &&
  951. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_1MHZ))
  952. goto nla_put_failure;
  953. if ((chan->flags & IEEE80211_CHAN_2MHZ) &&
  954. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_2MHZ))
  955. goto nla_put_failure;
  956. if ((chan->flags & IEEE80211_CHAN_4MHZ) &&
  957. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_4MHZ))
  958. goto nla_put_failure;
  959. if ((chan->flags & IEEE80211_CHAN_8MHZ) &&
  960. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_8MHZ))
  961. goto nla_put_failure;
  962. if ((chan->flags & IEEE80211_CHAN_16MHZ) &&
  963. nla_put_flag(msg, NL80211_FREQUENCY_ATTR_16MHZ))
  964. goto nla_put_failure;
  965. }
  966. if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
  967. DBM_TO_MBM(chan->max_power)))
  968. goto nla_put_failure;
  969. if (large) {
  970. const struct ieee80211_reg_rule *rule =
  971. freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq));
  972. if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) {
  973. if (nl80211_msg_put_wmm_rules(msg, rule))
  974. goto nla_put_failure;
  975. }
  976. }
  977. return 0;
  978. nla_put_failure:
  979. return -ENOBUFS;
  980. }
  981. static bool nl80211_put_txq_stats(struct sk_buff *msg,
  982. struct cfg80211_txq_stats *txqstats,
  983. int attrtype)
  984. {
  985. struct nlattr *txqattr;
  986. #define PUT_TXQVAL_U32(attr, memb) do { \
  987. if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \
  988. nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \
  989. return false; \
  990. } while (0)
  991. txqattr = nla_nest_start_noflag(msg, attrtype);
  992. if (!txqattr)
  993. return false;
  994. PUT_TXQVAL_U32(BACKLOG_BYTES, backlog_bytes);
  995. PUT_TXQVAL_U32(BACKLOG_PACKETS, backlog_packets);
  996. PUT_TXQVAL_U32(FLOWS, flows);
  997. PUT_TXQVAL_U32(DROPS, drops);
  998. PUT_TXQVAL_U32(ECN_MARKS, ecn_marks);
  999. PUT_TXQVAL_U32(OVERLIMIT, overlimit);
  1000. PUT_TXQVAL_U32(OVERMEMORY, overmemory);
  1001. PUT_TXQVAL_U32(COLLISIONS, collisions);
  1002. PUT_TXQVAL_U32(TX_BYTES, tx_bytes);
  1003. PUT_TXQVAL_U32(TX_PACKETS, tx_packets);
  1004. PUT_TXQVAL_U32(MAX_FLOWS, max_flows);
  1005. nla_nest_end(msg, txqattr);
  1006. #undef PUT_TXQVAL_U32
  1007. return true;
  1008. }
  1009. /* netlink command implementations */
  1010. struct key_parse {
  1011. struct key_params p;
  1012. int idx;
  1013. int type;
  1014. bool def, defmgmt, defbeacon;
  1015. bool def_uni, def_multi;
  1016. };
  1017. static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key,
  1018. struct key_parse *k)
  1019. {
  1020. struct nlattr *tb[NL80211_KEY_MAX + 1];
  1021. int err = nla_parse_nested_deprecated(tb, NL80211_KEY_MAX, key,
  1022. nl80211_key_policy,
  1023. info->extack);
  1024. if (err)
  1025. return err;
  1026. k->def = !!tb[NL80211_KEY_DEFAULT];
  1027. k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT];
  1028. k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON];
  1029. if (k->def) {
  1030. k->def_uni = true;
  1031. k->def_multi = true;
  1032. }
  1033. if (k->defmgmt || k->defbeacon)
  1034. k->def_multi = true;
  1035. if (tb[NL80211_KEY_IDX])
  1036. k->idx = nla_get_u8(tb[NL80211_KEY_IDX]);
  1037. if (tb[NL80211_KEY_DATA]) {
  1038. k->p.key = nla_data(tb[NL80211_KEY_DATA]);
  1039. k->p.key_len = nla_len(tb[NL80211_KEY_DATA]);
  1040. }
  1041. if (tb[NL80211_KEY_SEQ]) {
  1042. k->p.seq = nla_data(tb[NL80211_KEY_SEQ]);
  1043. k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]);
  1044. }
  1045. if (tb[NL80211_KEY_CIPHER])
  1046. k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]);
  1047. if (tb[NL80211_KEY_TYPE])
  1048. k->type = nla_get_u32(tb[NL80211_KEY_TYPE]);
  1049. if (tb[NL80211_KEY_DEFAULT_TYPES]) {
  1050. struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
  1051. err = nla_parse_nested_deprecated(kdt,
  1052. NUM_NL80211_KEY_DEFAULT_TYPES - 1,
  1053. tb[NL80211_KEY_DEFAULT_TYPES],
  1054. nl80211_key_default_policy,
  1055. info->extack);
  1056. if (err)
  1057. return err;
  1058. k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
  1059. k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
  1060. }
  1061. if (tb[NL80211_KEY_MODE])
  1062. k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]);
  1063. return 0;
  1064. }
  1065. static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
  1066. {
  1067. if (info->attrs[NL80211_ATTR_KEY_DATA]) {
  1068. k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
  1069. k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
  1070. }
  1071. if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
  1072. k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
  1073. k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
  1074. }
  1075. if (info->attrs[NL80211_ATTR_KEY_IDX])
  1076. k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
  1077. if (info->attrs[NL80211_ATTR_KEY_CIPHER])
  1078. k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
  1079. k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT];
  1080. k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT];
  1081. if (k->def) {
  1082. k->def_uni = true;
  1083. k->def_multi = true;
  1084. }
  1085. if (k->defmgmt)
  1086. k->def_multi = true;
  1087. if (info->attrs[NL80211_ATTR_KEY_TYPE])
  1088. k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
  1089. if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
  1090. struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES];
  1091. int err = nla_parse_nested_deprecated(kdt,
  1092. NUM_NL80211_KEY_DEFAULT_TYPES - 1,
  1093. info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
  1094. nl80211_key_default_policy,
  1095. info->extack);
  1096. if (err)
  1097. return err;
  1098. k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST];
  1099. k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST];
  1100. }
  1101. return 0;
  1102. }
  1103. static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
  1104. {
  1105. int err;
  1106. memset(k, 0, sizeof(*k));
  1107. k->idx = -1;
  1108. k->type = -1;
  1109. if (info->attrs[NL80211_ATTR_KEY])
  1110. err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k);
  1111. else
  1112. err = nl80211_parse_key_old(info, k);
  1113. if (err)
  1114. return err;
  1115. if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) +
  1116. (k->defbeacon ? 1 : 0) > 1) {
  1117. GENL_SET_ERR_MSG(info,
  1118. "key with multiple default flags is invalid");
  1119. return -EINVAL;
  1120. }
  1121. if (k->defmgmt || k->defbeacon) {
  1122. if (k->def_uni || !k->def_multi) {
  1123. GENL_SET_ERR_MSG(info,
  1124. "defmgmt/defbeacon key must be mcast");
  1125. return -EINVAL;
  1126. }
  1127. }
  1128. if (k->idx != -1) {
  1129. if (k->defmgmt) {
  1130. if (k->idx < 4 || k->idx > 5) {
  1131. GENL_SET_ERR_MSG(info,
  1132. "defmgmt key idx not 4 or 5");
  1133. return -EINVAL;
  1134. }
  1135. } else if (k->defbeacon) {
  1136. if (k->idx < 6 || k->idx > 7) {
  1137. GENL_SET_ERR_MSG(info,
  1138. "defbeacon key idx not 6 or 7");
  1139. return -EINVAL;
  1140. }
  1141. } else if (k->def) {
  1142. if (k->idx < 0 || k->idx > 3) {
  1143. GENL_SET_ERR_MSG(info, "def key idx not 0-3");
  1144. return -EINVAL;
  1145. }
  1146. } else {
  1147. if (k->idx < 0 || k->idx > 7) {
  1148. GENL_SET_ERR_MSG(info, "key idx not 0-7");
  1149. return -EINVAL;
  1150. }
  1151. }
  1152. }
  1153. return 0;
  1154. }
  1155. static struct cfg80211_cached_keys *
  1156. nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
  1157. struct genl_info *info, bool *no_ht)
  1158. {
  1159. struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS];
  1160. struct key_parse parse;
  1161. struct nlattr *key;
  1162. struct cfg80211_cached_keys *result;
  1163. int rem, err, def = 0;
  1164. bool have_key = false;
  1165. nla_for_each_nested(key, keys, rem) {
  1166. have_key = true;
  1167. break;
  1168. }
  1169. if (!have_key)
  1170. return NULL;
  1171. result = kzalloc(sizeof(*result), GFP_KERNEL);
  1172. if (!result)
  1173. return ERR_PTR(-ENOMEM);
  1174. result->def = -1;
  1175. nla_for_each_nested(key, keys, rem) {
  1176. memset(&parse, 0, sizeof(parse));
  1177. parse.idx = -1;
  1178. err = nl80211_parse_key_new(info, key, &parse);
  1179. if (err)
  1180. goto error;
  1181. err = -EINVAL;
  1182. if (!parse.p.key)
  1183. goto error;
  1184. if (parse.idx < 0 || parse.idx > 3) {
  1185. GENL_SET_ERR_MSG(info, "key index out of range [0-3]");
  1186. goto error;
  1187. }
  1188. if (parse.def) {
  1189. if (def) {
  1190. GENL_SET_ERR_MSG(info,
  1191. "only one key can be default");
  1192. goto error;
  1193. }
  1194. def = 1;
  1195. result->def = parse.idx;
  1196. if (!parse.def_uni || !parse.def_multi)
  1197. goto error;
  1198. } else if (parse.defmgmt)
  1199. goto error;
  1200. err = cfg80211_validate_key_settings(rdev, &parse.p,
  1201. parse.idx, false, NULL);
  1202. if (err)
  1203. goto error;
  1204. if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 &&
  1205. parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) {
  1206. GENL_SET_ERR_MSG(info, "connect key must be WEP");
  1207. err = -EINVAL;
  1208. goto error;
  1209. }
  1210. result->params[parse.idx].cipher = parse.p.cipher;
  1211. result->params[parse.idx].key_len = parse.p.key_len;
  1212. result->params[parse.idx].key = result->data[parse.idx];
  1213. memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len);
  1214. /* must be WEP key if we got here */
  1215. if (no_ht)
  1216. *no_ht = true;
  1217. }
  1218. if (result->def < 0) {
  1219. err = -EINVAL;
  1220. GENL_SET_ERR_MSG(info, "need a default/TX key");
  1221. goto error;
  1222. }
  1223. return result;
  1224. error:
  1225. kfree(result);
  1226. return ERR_PTR(err);
  1227. }
  1228. static int nl80211_key_allowed(struct wireless_dev *wdev)
  1229. {
  1230. ASSERT_WDEV_LOCK(wdev);
  1231. switch (wdev->iftype) {
  1232. case NL80211_IFTYPE_AP:
  1233. case NL80211_IFTYPE_AP_VLAN:
  1234. case NL80211_IFTYPE_P2P_GO:
  1235. case NL80211_IFTYPE_MESH_POINT:
  1236. break;
  1237. case NL80211_IFTYPE_ADHOC:
  1238. case NL80211_IFTYPE_STATION:
  1239. case NL80211_IFTYPE_P2P_CLIENT:
  1240. if (!wdev->current_bss)
  1241. return -ENOLINK;
  1242. break;
  1243. case NL80211_IFTYPE_UNSPECIFIED:
  1244. case NL80211_IFTYPE_OCB:
  1245. case NL80211_IFTYPE_MONITOR:
  1246. case NL80211_IFTYPE_NAN:
  1247. case NL80211_IFTYPE_P2P_DEVICE:
  1248. case NL80211_IFTYPE_WDS:
  1249. case NUM_NL80211_IFTYPES:
  1250. return -EINVAL;
  1251. }
  1252. return 0;
  1253. }
  1254. static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy,
  1255. u32 freq)
  1256. {
  1257. struct ieee80211_channel *chan;
  1258. chan = ieee80211_get_channel_khz(wiphy, freq);
  1259. if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
  1260. return NULL;
  1261. return chan;
  1262. }
  1263. static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes)
  1264. {
  1265. struct nlattr *nl_modes = nla_nest_start_noflag(msg, attr);
  1266. int i;
  1267. if (!nl_modes)
  1268. goto nla_put_failure;
  1269. i = 0;
  1270. while (ifmodes) {
  1271. if ((ifmodes & 1) && nla_put_flag(msg, i))
  1272. goto nla_put_failure;
  1273. ifmodes >>= 1;
  1274. i++;
  1275. }
  1276. nla_nest_end(msg, nl_modes);
  1277. return 0;
  1278. nla_put_failure:
  1279. return -ENOBUFS;
  1280. }
  1281. static int nl80211_put_iface_combinations(struct wiphy *wiphy,
  1282. struct sk_buff *msg,
  1283. bool large)
  1284. {
  1285. struct nlattr *nl_combis;
  1286. int i, j;
  1287. nl_combis = nla_nest_start_noflag(msg,
  1288. NL80211_ATTR_INTERFACE_COMBINATIONS);
  1289. if (!nl_combis)
  1290. goto nla_put_failure;
  1291. for (i = 0; i < wiphy->n_iface_combinations; i++) {
  1292. const struct ieee80211_iface_combination *c;
  1293. struct nlattr *nl_combi, *nl_limits;
  1294. c = &wiphy->iface_combinations[i];
  1295. nl_combi = nla_nest_start_noflag(msg, i + 1);
  1296. if (!nl_combi)
  1297. goto nla_put_failure;
  1298. nl_limits = nla_nest_start_noflag(msg,
  1299. NL80211_IFACE_COMB_LIMITS);
  1300. if (!nl_limits)
  1301. goto nla_put_failure;
  1302. for (j = 0; j < c->n_limits; j++) {
  1303. struct nlattr *nl_limit;
  1304. nl_limit = nla_nest_start_noflag(msg, j + 1);
  1305. if (!nl_limit)
  1306. goto nla_put_failure;
  1307. if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX,
  1308. c->limits[j].max))
  1309. goto nla_put_failure;
  1310. if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
  1311. c->limits[j].types))
  1312. goto nla_put_failure;
  1313. nla_nest_end(msg, nl_limit);
  1314. }
  1315. nla_nest_end(msg, nl_limits);
  1316. if (c->beacon_int_infra_match &&
  1317. nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
  1318. goto nla_put_failure;
  1319. if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
  1320. c->num_different_channels) ||
  1321. nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
  1322. c->max_interfaces))
  1323. goto nla_put_failure;
  1324. if (large &&
  1325. (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
  1326. c->radar_detect_widths) ||
  1327. nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
  1328. c->radar_detect_regions)))
  1329. goto nla_put_failure;
  1330. if (c->beacon_int_min_gcd &&
  1331. nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD,
  1332. c->beacon_int_min_gcd))
  1333. goto nla_put_failure;
  1334. nla_nest_end(msg, nl_combi);
  1335. }
  1336. nla_nest_end(msg, nl_combis);
  1337. return 0;
  1338. nla_put_failure:
  1339. return -ENOBUFS;
  1340. }
  1341. #ifdef CONFIG_PM
  1342. static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev,
  1343. struct sk_buff *msg)
  1344. {
  1345. const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp;
  1346. struct nlattr *nl_tcp;
  1347. if (!tcp)
  1348. return 0;
  1349. nl_tcp = nla_nest_start_noflag(msg,
  1350. NL80211_WOWLAN_TRIG_TCP_CONNECTION);
  1351. if (!nl_tcp)
  1352. return -ENOBUFS;
  1353. if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
  1354. tcp->data_payload_max))
  1355. return -ENOBUFS;
  1356. if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
  1357. tcp->data_payload_max))
  1358. return -ENOBUFS;
  1359. if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ))
  1360. return -ENOBUFS;
  1361. if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
  1362. sizeof(*tcp->tok), tcp->tok))
  1363. return -ENOBUFS;
  1364. if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
  1365. tcp->data_interval_max))
  1366. return -ENOBUFS;
  1367. if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
  1368. tcp->wake_payload_max))
  1369. return -ENOBUFS;
  1370. nla_nest_end(msg, nl_tcp);
  1371. return 0;
  1372. }
  1373. static int nl80211_send_wowlan(struct sk_buff *msg,
  1374. struct cfg80211_registered_device *rdev,
  1375. bool large)
  1376. {
  1377. struct nlattr *nl_wowlan;
  1378. if (!rdev->wiphy.wowlan)
  1379. return 0;
  1380. nl_wowlan = nla_nest_start_noflag(msg,
  1381. NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED);
  1382. if (!nl_wowlan)
  1383. return -ENOBUFS;
  1384. if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) &&
  1385. nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
  1386. ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) &&
  1387. nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
  1388. ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) &&
  1389. nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
  1390. ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) &&
  1391. nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) ||
  1392. ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
  1393. nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
  1394. ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) &&
  1395. nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
  1396. ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) &&
  1397. nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
  1398. ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) &&
  1399. nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
  1400. return -ENOBUFS;
  1401. if (rdev->wiphy.wowlan->n_patterns) {
  1402. struct nl80211_pattern_support pat = {
  1403. .max_patterns = rdev->wiphy.wowlan->n_patterns,
  1404. .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len,
  1405. .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len,
  1406. .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset,
  1407. };
  1408. if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
  1409. sizeof(pat), &pat))
  1410. return -ENOBUFS;
  1411. }
  1412. if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) &&
  1413. nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT,
  1414. rdev->wiphy.wowlan->max_nd_match_sets))
  1415. return -ENOBUFS;
  1416. if (large && nl80211_send_wowlan_tcp_caps(rdev, msg))
  1417. return -ENOBUFS;
  1418. nla_nest_end(msg, nl_wowlan);
  1419. return 0;
  1420. }
  1421. #endif
  1422. static int nl80211_send_coalesce(struct sk_buff *msg,
  1423. struct cfg80211_registered_device *rdev)
  1424. {
  1425. struct nl80211_coalesce_rule_support rule;
  1426. if (!rdev->wiphy.coalesce)
  1427. return 0;
  1428. rule.max_rules = rdev->wiphy.coalesce->n_rules;
  1429. rule.max_delay = rdev->wiphy.coalesce->max_delay;
  1430. rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns;
  1431. rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len;
  1432. rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len;
  1433. rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset;
  1434. if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule))
  1435. return -ENOBUFS;
  1436. return 0;
  1437. }
  1438. static int
  1439. nl80211_send_iftype_data(struct sk_buff *msg,
  1440. const struct ieee80211_supported_band *sband,
  1441. const struct ieee80211_sband_iftype_data *iftdata)
  1442. {
  1443. const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap;
  1444. if (nl80211_put_iftypes(msg, NL80211_BAND_IFTYPE_ATTR_IFTYPES,
  1445. iftdata->types_mask))
  1446. return -ENOBUFS;
  1447. if (he_cap->has_he) {
  1448. if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC,
  1449. sizeof(he_cap->he_cap_elem.mac_cap_info),
  1450. he_cap->he_cap_elem.mac_cap_info) ||
  1451. nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY,
  1452. sizeof(he_cap->he_cap_elem.phy_cap_info),
  1453. he_cap->he_cap_elem.phy_cap_info) ||
  1454. nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET,
  1455. sizeof(he_cap->he_mcs_nss_supp),
  1456. &he_cap->he_mcs_nss_supp) ||
  1457. nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE,
  1458. sizeof(he_cap->ppe_thres), he_cap->ppe_thres))
  1459. return -ENOBUFS;
  1460. }
  1461. if (sband->band == NL80211_BAND_6GHZ &&
  1462. nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA,
  1463. sizeof(iftdata->he_6ghz_capa),
  1464. &iftdata->he_6ghz_capa))
  1465. return -ENOBUFS;
  1466. return 0;
  1467. }
  1468. static int nl80211_send_band_rateinfo(struct sk_buff *msg,
  1469. struct ieee80211_supported_band *sband,
  1470. bool large)
  1471. {
  1472. struct nlattr *nl_rates, *nl_rate;
  1473. struct ieee80211_rate *rate;
  1474. int i;
  1475. /* add HT info */
  1476. if (sband->ht_cap.ht_supported &&
  1477. (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET,
  1478. sizeof(sband->ht_cap.mcs),
  1479. &sband->ht_cap.mcs) ||
  1480. nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA,
  1481. sband->ht_cap.cap) ||
  1482. nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
  1483. sband->ht_cap.ampdu_factor) ||
  1484. nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
  1485. sband->ht_cap.ampdu_density)))
  1486. return -ENOBUFS;
  1487. /* add VHT info */
  1488. if (sband->vht_cap.vht_supported &&
  1489. (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET,
  1490. sizeof(sband->vht_cap.vht_mcs),
  1491. &sband->vht_cap.vht_mcs) ||
  1492. nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA,
  1493. sband->vht_cap.cap)))
  1494. return -ENOBUFS;
  1495. if (large && sband->n_iftype_data) {
  1496. struct nlattr *nl_iftype_data =
  1497. nla_nest_start_noflag(msg,
  1498. NL80211_BAND_ATTR_IFTYPE_DATA);
  1499. int err;
  1500. if (!nl_iftype_data)
  1501. return -ENOBUFS;
  1502. for (i = 0; i < sband->n_iftype_data; i++) {
  1503. struct nlattr *iftdata;
  1504. iftdata = nla_nest_start_noflag(msg, i + 1);
  1505. if (!iftdata)
  1506. return -ENOBUFS;
  1507. err = nl80211_send_iftype_data(msg, sband,
  1508. &sband->iftype_data[i]);
  1509. if (err)
  1510. return err;
  1511. nla_nest_end(msg, iftdata);
  1512. }
  1513. nla_nest_end(msg, nl_iftype_data);
  1514. }
  1515. /* add EDMG info */
  1516. if (large && sband->edmg_cap.channels &&
  1517. (nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_CHANNELS,
  1518. sband->edmg_cap.channels) ||
  1519. nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_BW_CONFIG,
  1520. sband->edmg_cap.bw_config)))
  1521. return -ENOBUFS;
  1522. /* add bitrates */
  1523. nl_rates = nla_nest_start_noflag(msg, NL80211_BAND_ATTR_RATES);
  1524. if (!nl_rates)
  1525. return -ENOBUFS;
  1526. for (i = 0; i < sband->n_bitrates; i++) {
  1527. nl_rate = nla_nest_start_noflag(msg, i);
  1528. if (!nl_rate)
  1529. return -ENOBUFS;
  1530. rate = &sband->bitrates[i];
  1531. if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE,
  1532. rate->bitrate))
  1533. return -ENOBUFS;
  1534. if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) &&
  1535. nla_put_flag(msg,
  1536. NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE))
  1537. return -ENOBUFS;
  1538. nla_nest_end(msg, nl_rate);
  1539. }
  1540. nla_nest_end(msg, nl_rates);
  1541. return 0;
  1542. }
  1543. static int
  1544. nl80211_send_mgmt_stypes(struct sk_buff *msg,
  1545. const struct ieee80211_txrx_stypes *mgmt_stypes)
  1546. {
  1547. u16 stypes;
  1548. struct nlattr *nl_ftypes, *nl_ifs;
  1549. enum nl80211_iftype ift;
  1550. int i;
  1551. if (!mgmt_stypes)
  1552. return 0;
  1553. nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_TX_FRAME_TYPES);
  1554. if (!nl_ifs)
  1555. return -ENOBUFS;
  1556. for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
  1557. nl_ftypes = nla_nest_start_noflag(msg, ift);
  1558. if (!nl_ftypes)
  1559. return -ENOBUFS;
  1560. i = 0;
  1561. stypes = mgmt_stypes[ift].tx;
  1562. while (stypes) {
  1563. if ((stypes & 1) &&
  1564. nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
  1565. (i << 4) | IEEE80211_FTYPE_MGMT))
  1566. return -ENOBUFS;
  1567. stypes >>= 1;
  1568. i++;
  1569. }
  1570. nla_nest_end(msg, nl_ftypes);
  1571. }
  1572. nla_nest_end(msg, nl_ifs);
  1573. nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_RX_FRAME_TYPES);
  1574. if (!nl_ifs)
  1575. return -ENOBUFS;
  1576. for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) {
  1577. nl_ftypes = nla_nest_start_noflag(msg, ift);
  1578. if (!nl_ftypes)
  1579. return -ENOBUFS;
  1580. i = 0;
  1581. stypes = mgmt_stypes[ift].rx;
  1582. while (stypes) {
  1583. if ((stypes & 1) &&
  1584. nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE,
  1585. (i << 4) | IEEE80211_FTYPE_MGMT))
  1586. return -ENOBUFS;
  1587. stypes >>= 1;
  1588. i++;
  1589. }
  1590. nla_nest_end(msg, nl_ftypes);
  1591. }
  1592. nla_nest_end(msg, nl_ifs);
  1593. return 0;
  1594. }
  1595. #define CMD(op, n) \
  1596. do { \
  1597. if (rdev->ops->op) { \
  1598. i++; \
  1599. if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) \
  1600. goto nla_put_failure; \
  1601. } \
  1602. } while (0)
  1603. static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev,
  1604. struct sk_buff *msg)
  1605. {
  1606. int i = 0;
  1607. /*
  1608. * do *NOT* add anything into this function, new things need to be
  1609. * advertised only to new versions of userspace that can deal with
  1610. * the split (and they can't possibly care about new features...
  1611. */
  1612. CMD(add_virtual_intf, NEW_INTERFACE);
  1613. CMD(change_virtual_intf, SET_INTERFACE);
  1614. CMD(add_key, NEW_KEY);
  1615. CMD(start_ap, START_AP);
  1616. CMD(add_station, NEW_STATION);
  1617. CMD(add_mpath, NEW_MPATH);
  1618. CMD(update_mesh_config, SET_MESH_CONFIG);
  1619. CMD(change_bss, SET_BSS);
  1620. CMD(auth, AUTHENTICATE);
  1621. CMD(assoc, ASSOCIATE);
  1622. CMD(deauth, DEAUTHENTICATE);
  1623. CMD(disassoc, DISASSOCIATE);
  1624. CMD(join_ibss, JOIN_IBSS);
  1625. CMD(join_mesh, JOIN_MESH);
  1626. CMD(set_pmksa, SET_PMKSA);
  1627. CMD(del_pmksa, DEL_PMKSA);
  1628. CMD(flush_pmksa, FLUSH_PMKSA);
  1629. if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)
  1630. CMD(remain_on_channel, REMAIN_ON_CHANNEL);
  1631. CMD(set_bitrate_mask, SET_TX_BITRATE_MASK);
  1632. CMD(mgmt_tx, FRAME);
  1633. CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL);
  1634. if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) {
  1635. i++;
  1636. if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS))
  1637. goto nla_put_failure;
  1638. }
  1639. if (rdev->ops->set_monitor_channel || rdev->ops->start_ap ||
  1640. rdev->ops->join_mesh) {
  1641. i++;
  1642. if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL))
  1643. goto nla_put_failure;
  1644. }
  1645. CMD(set_wds_peer, SET_WDS_PEER);
  1646. if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) {
  1647. CMD(tdls_mgmt, TDLS_MGMT);
  1648. CMD(tdls_oper, TDLS_OPER);
  1649. }
  1650. if (rdev->wiphy.max_sched_scan_reqs)
  1651. CMD(sched_scan_start, START_SCHED_SCAN);
  1652. CMD(probe_client, PROBE_CLIENT);
  1653. CMD(set_noack_map, SET_NOACK_MAP);
  1654. if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) {
  1655. i++;
  1656. if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS))
  1657. goto nla_put_failure;
  1658. }
  1659. CMD(start_p2p_device, START_P2P_DEVICE);
  1660. CMD(set_mcast_rate, SET_MCAST_RATE);
  1661. #ifdef CONFIG_NL80211_TESTMODE
  1662. CMD(testmode_cmd, TESTMODE);
  1663. #endif
  1664. if (rdev->ops->connect || rdev->ops->auth) {
  1665. i++;
  1666. if (nla_put_u32(msg, i, NL80211_CMD_CONNECT))
  1667. goto nla_put_failure;
  1668. }
  1669. if (rdev->ops->disconnect || rdev->ops->deauth) {
  1670. i++;
  1671. if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT))
  1672. goto nla_put_failure;
  1673. }
  1674. return i;
  1675. nla_put_failure:
  1676. return -ENOBUFS;
  1677. }
  1678. static int
  1679. nl80211_send_pmsr_ftm_capa(const struct cfg80211_pmsr_capabilities *cap,
  1680. struct sk_buff *msg)
  1681. {
  1682. struct nlattr *ftm;
  1683. if (!cap->ftm.supported)
  1684. return 0;
  1685. ftm = nla_nest_start_noflag(msg, NL80211_PMSR_TYPE_FTM);
  1686. if (!ftm)
  1687. return -ENOBUFS;
  1688. if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP))
  1689. return -ENOBUFS;
  1690. if (cap->ftm.non_asap &&
  1691. nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP))
  1692. return -ENOBUFS;
  1693. if (cap->ftm.request_lci &&
  1694. nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI))
  1695. return -ENOBUFS;
  1696. if (cap->ftm.request_civicloc &&
  1697. nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC))
  1698. return -ENOBUFS;
  1699. if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES,
  1700. cap->ftm.preambles))
  1701. return -ENOBUFS;
  1702. if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS,
  1703. cap->ftm.bandwidths))
  1704. return -ENOBUFS;
  1705. if (cap->ftm.max_bursts_exponent >= 0 &&
  1706. nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT,
  1707. cap->ftm.max_bursts_exponent))
  1708. return -ENOBUFS;
  1709. if (cap->ftm.max_ftms_per_burst &&
  1710. nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST,
  1711. cap->ftm.max_ftms_per_burst))
  1712. return -ENOBUFS;
  1713. if (cap->ftm.trigger_based &&
  1714. nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED))
  1715. return -ENOBUFS;
  1716. if (cap->ftm.non_trigger_based &&
  1717. nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED))
  1718. return -ENOBUFS;
  1719. nla_nest_end(msg, ftm);
  1720. return 0;
  1721. }
  1722. static int nl80211_send_pmsr_capa(struct cfg80211_registered_device *rdev,
  1723. struct sk_buff *msg)
  1724. {
  1725. const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa;
  1726. struct nlattr *pmsr, *caps;
  1727. if (!cap)
  1728. return 0;
  1729. /*
  1730. * we don't need to clean up anything here since the caller
  1731. * will genlmsg_cancel() if we fail
  1732. */
  1733. pmsr = nla_nest_start_noflag(msg, NL80211_ATTR_PEER_MEASUREMENTS);
  1734. if (!pmsr)
  1735. return -ENOBUFS;
  1736. if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers))
  1737. return -ENOBUFS;
  1738. if (cap->report_ap_tsf &&
  1739. nla_put_flag(msg, NL80211_PMSR_ATTR_REPORT_AP_TSF))
  1740. return -ENOBUFS;
  1741. if (cap->randomize_mac_addr &&
  1742. nla_put_flag(msg, NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR))
  1743. return -ENOBUFS;
  1744. caps = nla_nest_start_noflag(msg, NL80211_PMSR_ATTR_TYPE_CAPA);
  1745. if (!caps)
  1746. return -ENOBUFS;
  1747. if (nl80211_send_pmsr_ftm_capa(cap, msg))
  1748. return -ENOBUFS;
  1749. nla_nest_end(msg, caps);
  1750. nla_nest_end(msg, pmsr);
  1751. return 0;
  1752. }
  1753. static int
  1754. nl80211_put_iftype_akm_suites(struct cfg80211_registered_device *rdev,
  1755. struct sk_buff *msg)
  1756. {
  1757. int i;
  1758. struct nlattr *nested, *nested_akms;
  1759. const struct wiphy_iftype_akm_suites *iftype_akms;
  1760. if (!rdev->wiphy.num_iftype_akm_suites ||
  1761. !rdev->wiphy.iftype_akm_suites)
  1762. return 0;
  1763. nested = nla_nest_start(msg, NL80211_ATTR_IFTYPE_AKM_SUITES);
  1764. if (!nested)
  1765. return -ENOBUFS;
  1766. for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) {
  1767. nested_akms = nla_nest_start(msg, i + 1);
  1768. if (!nested_akms)
  1769. return -ENOBUFS;
  1770. iftype_akms = &rdev->wiphy.iftype_akm_suites[i];
  1771. if (nl80211_put_iftypes(msg, NL80211_IFTYPE_AKM_ATTR_IFTYPES,
  1772. iftype_akms->iftypes_mask))
  1773. return -ENOBUFS;
  1774. if (nla_put(msg, NL80211_IFTYPE_AKM_ATTR_SUITES,
  1775. sizeof(u32) * iftype_akms->n_akm_suites,
  1776. iftype_akms->akm_suites)) {
  1777. return -ENOBUFS;
  1778. }
  1779. nla_nest_end(msg, nested_akms);
  1780. }
  1781. nla_nest_end(msg, nested);
  1782. return 0;
  1783. }
  1784. static int
  1785. nl80211_put_tid_config_support(struct cfg80211_registered_device *rdev,
  1786. struct sk_buff *msg)
  1787. {
  1788. struct nlattr *supp;
  1789. if (!rdev->wiphy.tid_config_support.vif &&
  1790. !rdev->wiphy.tid_config_support.peer)
  1791. return 0;
  1792. supp = nla_nest_start(msg, NL80211_ATTR_TID_CONFIG);
  1793. if (!supp)
  1794. return -ENOSPC;
  1795. if (rdev->wiphy.tid_config_support.vif &&
  1796. nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_VIF_SUPP,
  1797. rdev->wiphy.tid_config_support.vif,
  1798. NL80211_TID_CONFIG_ATTR_PAD))
  1799. goto fail;
  1800. if (rdev->wiphy.tid_config_support.peer &&
  1801. nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_PEER_SUPP,
  1802. rdev->wiphy.tid_config_support.peer,
  1803. NL80211_TID_CONFIG_ATTR_PAD))
  1804. goto fail;
  1805. /* for now we just use the same value ... makes more sense */
  1806. if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_SHORT,
  1807. rdev->wiphy.tid_config_support.max_retry))
  1808. goto fail;
  1809. if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_LONG,
  1810. rdev->wiphy.tid_config_support.max_retry))
  1811. goto fail;
  1812. nla_nest_end(msg, supp);
  1813. return 0;
  1814. fail:
  1815. nla_nest_cancel(msg, supp);
  1816. return -ENOBUFS;
  1817. }
  1818. struct nl80211_dump_wiphy_state {
  1819. s64 filter_wiphy;
  1820. long start;
  1821. long split_start, band_start, chan_start, capa_start;
  1822. bool split;
  1823. };
  1824. static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
  1825. enum nl80211_commands cmd,
  1826. struct sk_buff *msg, u32 portid, u32 seq,
  1827. int flags, struct nl80211_dump_wiphy_state *state)
  1828. {
  1829. void *hdr;
  1830. struct nlattr *nl_bands, *nl_band;
  1831. struct nlattr *nl_freqs, *nl_freq;
  1832. struct nlattr *nl_cmds;
  1833. enum nl80211_band band;
  1834. struct ieee80211_channel *chan;
  1835. int i;
  1836. const struct ieee80211_txrx_stypes *mgmt_stypes =
  1837. rdev->wiphy.mgmt_stypes;
  1838. u32 features;
  1839. hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
  1840. if (!hdr)
  1841. return -ENOBUFS;
  1842. if (WARN_ON(!state))
  1843. return -EINVAL;
  1844. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  1845. nla_put_string(msg, NL80211_ATTR_WIPHY_NAME,
  1846. wiphy_name(&rdev->wiphy)) ||
  1847. nla_put_u32(msg, NL80211_ATTR_GENERATION,
  1848. cfg80211_rdev_list_generation))
  1849. goto nla_put_failure;
  1850. if (cmd != NL80211_CMD_NEW_WIPHY)
  1851. goto finish;
  1852. switch (state->split_start) {
  1853. case 0:
  1854. if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
  1855. rdev->wiphy.retry_short) ||
  1856. nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
  1857. rdev->wiphy.retry_long) ||
  1858. nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
  1859. rdev->wiphy.frag_threshold) ||
  1860. nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
  1861. rdev->wiphy.rts_threshold) ||
  1862. nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS,
  1863. rdev->wiphy.coverage_class) ||
  1864. nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
  1865. rdev->wiphy.max_scan_ssids) ||
  1866. nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
  1867. rdev->wiphy.max_sched_scan_ssids) ||
  1868. nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
  1869. rdev->wiphy.max_scan_ie_len) ||
  1870. nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
  1871. rdev->wiphy.max_sched_scan_ie_len) ||
  1872. nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS,
  1873. rdev->wiphy.max_match_sets))
  1874. goto nla_put_failure;
  1875. if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) &&
  1876. nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN))
  1877. goto nla_put_failure;
  1878. if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) &&
  1879. nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH))
  1880. goto nla_put_failure;
  1881. if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) &&
  1882. nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD))
  1883. goto nla_put_failure;
  1884. if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) &&
  1885. nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT))
  1886. goto nla_put_failure;
  1887. if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) &&
  1888. nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT))
  1889. goto nla_put_failure;
  1890. if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) &&
  1891. nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP))
  1892. goto nla_put_failure;
  1893. state->split_start++;
  1894. if (state->split)
  1895. break;
  1896. fallthrough;
  1897. case 1:
  1898. if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES,
  1899. sizeof(u32) * rdev->wiphy.n_cipher_suites,
  1900. rdev->wiphy.cipher_suites))
  1901. goto nla_put_failure;
  1902. if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS,
  1903. rdev->wiphy.max_num_pmkids))
  1904. goto nla_put_failure;
  1905. if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
  1906. nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE))
  1907. goto nla_put_failure;
  1908. if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
  1909. rdev->wiphy.available_antennas_tx) ||
  1910. nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
  1911. rdev->wiphy.available_antennas_rx))
  1912. goto nla_put_failure;
  1913. if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) &&
  1914. nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD,
  1915. rdev->wiphy.probe_resp_offload))
  1916. goto nla_put_failure;
  1917. if ((rdev->wiphy.available_antennas_tx ||
  1918. rdev->wiphy.available_antennas_rx) &&
  1919. rdev->ops->get_antenna) {
  1920. u32 tx_ant = 0, rx_ant = 0;
  1921. int res;
  1922. res = rdev_get_antenna(rdev, &tx_ant, &rx_ant);
  1923. if (!res) {
  1924. if (nla_put_u32(msg,
  1925. NL80211_ATTR_WIPHY_ANTENNA_TX,
  1926. tx_ant) ||
  1927. nla_put_u32(msg,
  1928. NL80211_ATTR_WIPHY_ANTENNA_RX,
  1929. rx_ant))
  1930. goto nla_put_failure;
  1931. }
  1932. }
  1933. state->split_start++;
  1934. if (state->split)
  1935. break;
  1936. fallthrough;
  1937. case 2:
  1938. if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES,
  1939. rdev->wiphy.interface_modes))
  1940. goto nla_put_failure;
  1941. state->split_start++;
  1942. if (state->split)
  1943. break;
  1944. fallthrough;
  1945. case 3:
  1946. nl_bands = nla_nest_start_noflag(msg,
  1947. NL80211_ATTR_WIPHY_BANDS);
  1948. if (!nl_bands)
  1949. goto nla_put_failure;
  1950. for (band = state->band_start;
  1951. band < NUM_NL80211_BANDS; band++) {
  1952. struct ieee80211_supported_band *sband;
  1953. /* omit higher bands for ancient software */
  1954. if (band > NL80211_BAND_5GHZ && !state->split)
  1955. break;
  1956. sband = rdev->wiphy.bands[band];
  1957. if (!sband)
  1958. continue;
  1959. nl_band = nla_nest_start_noflag(msg, band);
  1960. if (!nl_band)
  1961. goto nla_put_failure;
  1962. switch (state->chan_start) {
  1963. case 0:
  1964. if (nl80211_send_band_rateinfo(msg, sband,
  1965. state->split))
  1966. goto nla_put_failure;
  1967. state->chan_start++;
  1968. if (state->split)
  1969. break;
  1970. fallthrough;
  1971. default:
  1972. /* add frequencies */
  1973. nl_freqs = nla_nest_start_noflag(msg,
  1974. NL80211_BAND_ATTR_FREQS);
  1975. if (!nl_freqs)
  1976. goto nla_put_failure;
  1977. for (i = state->chan_start - 1;
  1978. i < sband->n_channels;
  1979. i++) {
  1980. nl_freq = nla_nest_start_noflag(msg,
  1981. i);
  1982. if (!nl_freq)
  1983. goto nla_put_failure;
  1984. chan = &sband->channels[i];
  1985. if (nl80211_msg_put_channel(
  1986. msg, &rdev->wiphy, chan,
  1987. state->split))
  1988. goto nla_put_failure;
  1989. nla_nest_end(msg, nl_freq);
  1990. if (state->split)
  1991. break;
  1992. }
  1993. if (i < sband->n_channels)
  1994. state->chan_start = i + 2;
  1995. else
  1996. state->chan_start = 0;
  1997. nla_nest_end(msg, nl_freqs);
  1998. }
  1999. nla_nest_end(msg, nl_band);
  2000. if (state->split) {
  2001. /* start again here */
  2002. if (state->chan_start)
  2003. band--;
  2004. break;
  2005. }
  2006. }
  2007. nla_nest_end(msg, nl_bands);
  2008. if (band < NUM_NL80211_BANDS)
  2009. state->band_start = band + 1;
  2010. else
  2011. state->band_start = 0;
  2012. /* if bands & channels are done, continue outside */
  2013. if (state->band_start == 0 && state->chan_start == 0)
  2014. state->split_start++;
  2015. if (state->split)
  2016. break;
  2017. fallthrough;
  2018. case 4:
  2019. nl_cmds = nla_nest_start_noflag(msg,
  2020. NL80211_ATTR_SUPPORTED_COMMANDS);
  2021. if (!nl_cmds)
  2022. goto nla_put_failure;
  2023. i = nl80211_add_commands_unsplit(rdev, msg);
  2024. if (i < 0)
  2025. goto nla_put_failure;
  2026. if (state->split) {
  2027. CMD(crit_proto_start, CRIT_PROTOCOL_START);
  2028. CMD(crit_proto_stop, CRIT_PROTOCOL_STOP);
  2029. if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)
  2030. CMD(channel_switch, CHANNEL_SWITCH);
  2031. CMD(set_qos_map, SET_QOS_MAP);
  2032. if (rdev->wiphy.features &
  2033. NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)
  2034. CMD(add_tx_ts, ADD_TX_TS);
  2035. CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST);
  2036. CMD(update_connect_params, UPDATE_CONNECT_PARAMS);
  2037. CMD(update_ft_ies, UPDATE_FT_IES);
  2038. }
  2039. #undef CMD
  2040. nla_nest_end(msg, nl_cmds);
  2041. state->split_start++;
  2042. if (state->split)
  2043. break;
  2044. fallthrough;
  2045. case 5:
  2046. if (rdev->ops->remain_on_channel &&
  2047. (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) &&
  2048. nla_put_u32(msg,
  2049. NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
  2050. rdev->wiphy.max_remain_on_channel_duration))
  2051. goto nla_put_failure;
  2052. if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) &&
  2053. nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK))
  2054. goto nla_put_failure;
  2055. state->split_start++;
  2056. if (state->split)
  2057. break;
  2058. fallthrough;
  2059. case 6:
  2060. #ifdef CONFIG_PM
  2061. if (nl80211_send_wowlan(msg, rdev, state->split))
  2062. goto nla_put_failure;
  2063. state->split_start++;
  2064. if (state->split)
  2065. break;
  2066. #else
  2067. state->split_start++;
  2068. #endif
  2069. fallthrough;
  2070. case 7:
  2071. if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
  2072. rdev->wiphy.software_iftypes))
  2073. goto nla_put_failure;
  2074. if (nl80211_put_iface_combinations(&rdev->wiphy, msg,
  2075. state->split))
  2076. goto nla_put_failure;
  2077. state->split_start++;
  2078. if (state->split)
  2079. break;
  2080. fallthrough;
  2081. case 8:
  2082. if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) &&
  2083. nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME,
  2084. rdev->wiphy.ap_sme_capa))
  2085. goto nla_put_failure;
  2086. features = rdev->wiphy.features;
  2087. /*
  2088. * We can only add the per-channel limit information if the
  2089. * dump is split, otherwise it makes it too big. Therefore
  2090. * only advertise it in that case.
  2091. */
  2092. if (state->split)
  2093. features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS;
  2094. if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features))
  2095. goto nla_put_failure;
  2096. if (rdev->wiphy.ht_capa_mod_mask &&
  2097. nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK,
  2098. sizeof(*rdev->wiphy.ht_capa_mod_mask),
  2099. rdev->wiphy.ht_capa_mod_mask))
  2100. goto nla_put_failure;
  2101. if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME &&
  2102. rdev->wiphy.max_acl_mac_addrs &&
  2103. nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX,
  2104. rdev->wiphy.max_acl_mac_addrs))
  2105. goto nla_put_failure;
  2106. /*
  2107. * Any information below this point is only available to
  2108. * applications that can deal with it being split. This
  2109. * helps ensure that newly added capabilities don't break
  2110. * older tools by overrunning their buffers.
  2111. *
  2112. * We still increment split_start so that in the split
  2113. * case we'll continue with more data in the next round,
  2114. * but break unconditionally so unsplit data stops here.
  2115. */
  2116. if (state->split)
  2117. state->split_start++;
  2118. else
  2119. state->split_start = 0;
  2120. break;
  2121. case 9:
  2122. if (nl80211_send_mgmt_stypes(msg, mgmt_stypes))
  2123. goto nla_put_failure;
  2124. if (nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS,
  2125. rdev->wiphy.max_sched_scan_plans) ||
  2126. nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL,
  2127. rdev->wiphy.max_sched_scan_plan_interval) ||
  2128. nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
  2129. rdev->wiphy.max_sched_scan_plan_iterations))
  2130. goto nla_put_failure;
  2131. if (rdev->wiphy.extended_capabilities &&
  2132. (nla_put(msg, NL80211_ATTR_EXT_CAPA,
  2133. rdev->wiphy.extended_capabilities_len,
  2134. rdev->wiphy.extended_capabilities) ||
  2135. nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
  2136. rdev->wiphy.extended_capabilities_len,
  2137. rdev->wiphy.extended_capabilities_mask)))
  2138. goto nla_put_failure;
  2139. if (rdev->wiphy.vht_capa_mod_mask &&
  2140. nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK,
  2141. sizeof(*rdev->wiphy.vht_capa_mod_mask),
  2142. rdev->wiphy.vht_capa_mod_mask))
  2143. goto nla_put_failure;
  2144. if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN,
  2145. rdev->wiphy.perm_addr))
  2146. goto nla_put_failure;
  2147. if (!is_zero_ether_addr(rdev->wiphy.addr_mask) &&
  2148. nla_put(msg, NL80211_ATTR_MAC_MASK, ETH_ALEN,
  2149. rdev->wiphy.addr_mask))
  2150. goto nla_put_failure;
  2151. if (rdev->wiphy.n_addresses > 1) {
  2152. void *attr;
  2153. attr = nla_nest_start(msg, NL80211_ATTR_MAC_ADDRS);
  2154. if (!attr)
  2155. goto nla_put_failure;
  2156. for (i = 0; i < rdev->wiphy.n_addresses; i++)
  2157. if (nla_put(msg, i + 1, ETH_ALEN,
  2158. rdev->wiphy.addresses[i].addr))
  2159. goto nla_put_failure;
  2160. nla_nest_end(msg, attr);
  2161. }
  2162. state->split_start++;
  2163. break;
  2164. case 10:
  2165. if (nl80211_send_coalesce(msg, rdev))
  2166. goto nla_put_failure;
  2167. if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) &&
  2168. (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) ||
  2169. nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ)))
  2170. goto nla_put_failure;
  2171. if (rdev->wiphy.max_ap_assoc_sta &&
  2172. nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA,
  2173. rdev->wiphy.max_ap_assoc_sta))
  2174. goto nla_put_failure;
  2175. state->split_start++;
  2176. break;
  2177. case 11:
  2178. if (rdev->wiphy.n_vendor_commands) {
  2179. const struct nl80211_vendor_cmd_info *info;
  2180. struct nlattr *nested;
  2181. nested = nla_nest_start_noflag(msg,
  2182. NL80211_ATTR_VENDOR_DATA);
  2183. if (!nested)
  2184. goto nla_put_failure;
  2185. for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
  2186. info = &rdev->wiphy.vendor_commands[i].info;
  2187. if (nla_put(msg, i + 1, sizeof(*info), info))
  2188. goto nla_put_failure;
  2189. }
  2190. nla_nest_end(msg, nested);
  2191. }
  2192. if (rdev->wiphy.n_vendor_events) {
  2193. const struct nl80211_vendor_cmd_info *info;
  2194. struct nlattr *nested;
  2195. nested = nla_nest_start_noflag(msg,
  2196. NL80211_ATTR_VENDOR_EVENTS);
  2197. if (!nested)
  2198. goto nla_put_failure;
  2199. for (i = 0; i < rdev->wiphy.n_vendor_events; i++) {
  2200. info = &rdev->wiphy.vendor_events[i];
  2201. if (nla_put(msg, i + 1, sizeof(*info), info))
  2202. goto nla_put_failure;
  2203. }
  2204. nla_nest_end(msg, nested);
  2205. }
  2206. state->split_start++;
  2207. break;
  2208. case 12:
  2209. if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH &&
  2210. nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS,
  2211. rdev->wiphy.max_num_csa_counters))
  2212. goto nla_put_failure;
  2213. if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
  2214. nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
  2215. goto nla_put_failure;
  2216. if (rdev->wiphy.max_sched_scan_reqs &&
  2217. nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS,
  2218. rdev->wiphy.max_sched_scan_reqs))
  2219. goto nla_put_failure;
  2220. if (nla_put(msg, NL80211_ATTR_EXT_FEATURES,
  2221. sizeof(rdev->wiphy.ext_features),
  2222. rdev->wiphy.ext_features))
  2223. goto nla_put_failure;
  2224. if (rdev->wiphy.bss_select_support) {
  2225. struct nlattr *nested;
  2226. u32 bss_select_support = rdev->wiphy.bss_select_support;
  2227. nested = nla_nest_start_noflag(msg,
  2228. NL80211_ATTR_BSS_SELECT);
  2229. if (!nested)
  2230. goto nla_put_failure;
  2231. i = 0;
  2232. while (bss_select_support) {
  2233. if ((bss_select_support & 1) &&
  2234. nla_put_flag(msg, i))
  2235. goto nla_put_failure;
  2236. i++;
  2237. bss_select_support >>= 1;
  2238. }
  2239. nla_nest_end(msg, nested);
  2240. }
  2241. state->split_start++;
  2242. break;
  2243. case 13:
  2244. if (rdev->wiphy.num_iftype_ext_capab &&
  2245. rdev->wiphy.iftype_ext_capab) {
  2246. struct nlattr *nested_ext_capab, *nested;
  2247. nested = nla_nest_start_noflag(msg,
  2248. NL80211_ATTR_IFTYPE_EXT_CAPA);
  2249. if (!nested)
  2250. goto nla_put_failure;
  2251. for (i = state->capa_start;
  2252. i < rdev->wiphy.num_iftype_ext_capab; i++) {
  2253. const struct wiphy_iftype_ext_capab *capab;
  2254. capab = &rdev->wiphy.iftype_ext_capab[i];
  2255. nested_ext_capab = nla_nest_start_noflag(msg,
  2256. i);
  2257. if (!nested_ext_capab ||
  2258. nla_put_u32(msg, NL80211_ATTR_IFTYPE,
  2259. capab->iftype) ||
  2260. nla_put(msg, NL80211_ATTR_EXT_CAPA,
  2261. capab->extended_capabilities_len,
  2262. capab->extended_capabilities) ||
  2263. nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
  2264. capab->extended_capabilities_len,
  2265. capab->extended_capabilities_mask))
  2266. goto nla_put_failure;
  2267. nla_nest_end(msg, nested_ext_capab);
  2268. if (state->split)
  2269. break;
  2270. }
  2271. nla_nest_end(msg, nested);
  2272. if (i < rdev->wiphy.num_iftype_ext_capab) {
  2273. state->capa_start = i + 1;
  2274. break;
  2275. }
  2276. }
  2277. if (nla_put_u32(msg, NL80211_ATTR_BANDS,
  2278. rdev->wiphy.nan_supported_bands))
  2279. goto nla_put_failure;
  2280. if (wiphy_ext_feature_isset(&rdev->wiphy,
  2281. NL80211_EXT_FEATURE_TXQS)) {
  2282. struct cfg80211_txq_stats txqstats = {};
  2283. int res;
  2284. res = rdev_get_txq_stats(rdev, NULL, &txqstats);
  2285. if (!res &&
  2286. !nl80211_put_txq_stats(msg, &txqstats,
  2287. NL80211_ATTR_TXQ_STATS))
  2288. goto nla_put_failure;
  2289. if (nla_put_u32(msg, NL80211_ATTR_TXQ_LIMIT,
  2290. rdev->wiphy.txq_limit))
  2291. goto nla_put_failure;
  2292. if (nla_put_u32(msg, NL80211_ATTR_TXQ_MEMORY_LIMIT,
  2293. rdev->wiphy.txq_memory_limit))
  2294. goto nla_put_failure;
  2295. if (nla_put_u32(msg, NL80211_ATTR_TXQ_QUANTUM,
  2296. rdev->wiphy.txq_quantum))
  2297. goto nla_put_failure;
  2298. }
  2299. state->split_start++;
  2300. break;
  2301. case 14:
  2302. if (nl80211_send_pmsr_capa(rdev, msg))
  2303. goto nla_put_failure;
  2304. state->split_start++;
  2305. break;
  2306. case 15:
  2307. if (rdev->wiphy.akm_suites &&
  2308. nla_put(msg, NL80211_ATTR_AKM_SUITES,
  2309. sizeof(u32) * rdev->wiphy.n_akm_suites,
  2310. rdev->wiphy.akm_suites))
  2311. goto nla_put_failure;
  2312. if (nl80211_put_iftype_akm_suites(rdev, msg))
  2313. goto nla_put_failure;
  2314. if (nl80211_put_tid_config_support(rdev, msg))
  2315. goto nla_put_failure;
  2316. /* done */
  2317. state->split_start = 0;
  2318. break;
  2319. }
  2320. finish:
  2321. genlmsg_end(msg, hdr);
  2322. return 0;
  2323. nla_put_failure:
  2324. genlmsg_cancel(msg, hdr);
  2325. return -EMSGSIZE;
  2326. }
  2327. static int nl80211_dump_wiphy_parse(struct sk_buff *skb,
  2328. struct netlink_callback *cb,
  2329. struct nl80211_dump_wiphy_state *state)
  2330. {
  2331. struct nlattr **tb = kcalloc(NUM_NL80211_ATTR, sizeof(*tb), GFP_KERNEL);
  2332. int ret;
  2333. if (!tb)
  2334. return -ENOMEM;
  2335. ret = nlmsg_parse_deprecated(cb->nlh,
  2336. GENL_HDRLEN + nl80211_fam.hdrsize,
  2337. tb, nl80211_fam.maxattr,
  2338. nl80211_policy, NULL);
  2339. /* ignore parse errors for backward compatibility */
  2340. if (ret) {
  2341. ret = 0;
  2342. goto out;
  2343. }
  2344. state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP];
  2345. if (tb[NL80211_ATTR_WIPHY])
  2346. state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
  2347. if (tb[NL80211_ATTR_WDEV])
  2348. state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32;
  2349. if (tb[NL80211_ATTR_IFINDEX]) {
  2350. struct net_device *netdev;
  2351. struct cfg80211_registered_device *rdev;
  2352. int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
  2353. netdev = __dev_get_by_index(sock_net(skb->sk), ifidx);
  2354. if (!netdev) {
  2355. ret = -ENODEV;
  2356. goto out;
  2357. }
  2358. if (netdev->ieee80211_ptr) {
  2359. rdev = wiphy_to_rdev(
  2360. netdev->ieee80211_ptr->wiphy);
  2361. state->filter_wiphy = rdev->wiphy_idx;
  2362. }
  2363. }
  2364. ret = 0;
  2365. out:
  2366. kfree(tb);
  2367. return ret;
  2368. }
  2369. static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
  2370. {
  2371. int idx = 0, ret;
  2372. struct nl80211_dump_wiphy_state *state = (void *)cb->args[0];
  2373. struct cfg80211_registered_device *rdev;
  2374. rtnl_lock();
  2375. if (!state) {
  2376. state = kzalloc(sizeof(*state), GFP_KERNEL);
  2377. if (!state) {
  2378. rtnl_unlock();
  2379. return -ENOMEM;
  2380. }
  2381. state->filter_wiphy = -1;
  2382. ret = nl80211_dump_wiphy_parse(skb, cb, state);
  2383. if (ret) {
  2384. kfree(state);
  2385. rtnl_unlock();
  2386. return ret;
  2387. }
  2388. cb->args[0] = (long)state;
  2389. }
  2390. list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
  2391. if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
  2392. continue;
  2393. if (++idx <= state->start)
  2394. continue;
  2395. if (state->filter_wiphy != -1 &&
  2396. state->filter_wiphy != rdev->wiphy_idx)
  2397. continue;
  2398. /* attempt to fit multiple wiphy data chunks into the skb */
  2399. do {
  2400. ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY,
  2401. skb,
  2402. NETLINK_CB(cb->skb).portid,
  2403. cb->nlh->nlmsg_seq,
  2404. NLM_F_MULTI, state);
  2405. if (ret < 0) {
  2406. /*
  2407. * If sending the wiphy data didn't fit (ENOBUFS
  2408. * or EMSGSIZE returned), this SKB is still
  2409. * empty (so it's not too big because another
  2410. * wiphy dataset is already in the skb) and
  2411. * we've not tried to adjust the dump allocation
  2412. * yet ... then adjust the alloc size to be
  2413. * bigger, and return 1 but with the empty skb.
  2414. * This results in an empty message being RX'ed
  2415. * in userspace, but that is ignored.
  2416. *
  2417. * We can then retry with the larger buffer.
  2418. */
  2419. if ((ret == -ENOBUFS || ret == -EMSGSIZE) &&
  2420. !skb->len && !state->split &&
  2421. cb->min_dump_alloc < 4096) {
  2422. cb->min_dump_alloc = 4096;
  2423. state->split_start = 0;
  2424. rtnl_unlock();
  2425. return 1;
  2426. }
  2427. idx--;
  2428. break;
  2429. }
  2430. } while (state->split_start > 0);
  2431. break;
  2432. }
  2433. rtnl_unlock();
  2434. state->start = idx;
  2435. return skb->len;
  2436. }
  2437. static int nl80211_dump_wiphy_done(struct netlink_callback *cb)
  2438. {
  2439. kfree((void *)cb->args[0]);
  2440. return 0;
  2441. }
  2442. static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
  2443. {
  2444. struct sk_buff *msg;
  2445. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2446. struct nl80211_dump_wiphy_state state = {};
  2447. msg = nlmsg_new(4096, GFP_KERNEL);
  2448. if (!msg)
  2449. return -ENOMEM;
  2450. if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg,
  2451. info->snd_portid, info->snd_seq, 0,
  2452. &state) < 0) {
  2453. nlmsg_free(msg);
  2454. return -ENOBUFS;
  2455. }
  2456. return genlmsg_reply(msg, info);
  2457. }
  2458. static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = {
  2459. [NL80211_TXQ_ATTR_QUEUE] = { .type = NLA_U8 },
  2460. [NL80211_TXQ_ATTR_TXOP] = { .type = NLA_U16 },
  2461. [NL80211_TXQ_ATTR_CWMIN] = { .type = NLA_U16 },
  2462. [NL80211_TXQ_ATTR_CWMAX] = { .type = NLA_U16 },
  2463. [NL80211_TXQ_ATTR_AIFS] = { .type = NLA_U8 },
  2464. };
  2465. static int parse_txq_params(struct nlattr *tb[],
  2466. struct ieee80211_txq_params *txq_params)
  2467. {
  2468. u8 ac;
  2469. if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] ||
  2470. !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] ||
  2471. !tb[NL80211_TXQ_ATTR_AIFS])
  2472. return -EINVAL;
  2473. ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]);
  2474. txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]);
  2475. txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]);
  2476. txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]);
  2477. txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]);
  2478. if (ac >= NL80211_NUM_ACS)
  2479. return -EINVAL;
  2480. txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS);
  2481. return 0;
  2482. }
  2483. static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
  2484. {
  2485. /*
  2486. * You can only set the channel explicitly for WDS interfaces,
  2487. * all others have their channel managed via their respective
  2488. * "establish a connection" command (connect, join, ...)
  2489. *
  2490. * For AP/GO and mesh mode, the channel can be set with the
  2491. * channel userspace API, but is only stored and passed to the
  2492. * low-level driver when the AP starts or the mesh is joined.
  2493. * This is for backward compatibility, userspace can also give
  2494. * the channel in the start-ap or join-mesh commands instead.
  2495. *
  2496. * Monitors are special as they are normally slaved to
  2497. * whatever else is going on, so they have their own special
  2498. * operation to set the monitor channel if possible.
  2499. */
  2500. return !wdev ||
  2501. wdev->iftype == NL80211_IFTYPE_AP ||
  2502. wdev->iftype == NL80211_IFTYPE_MESH_POINT ||
  2503. wdev->iftype == NL80211_IFTYPE_MONITOR ||
  2504. wdev->iftype == NL80211_IFTYPE_P2P_GO;
  2505. }
  2506. int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
  2507. struct genl_info *info,
  2508. struct cfg80211_chan_def *chandef)
  2509. {
  2510. struct netlink_ext_ack *extack = info->extack;
  2511. struct nlattr **attrs = info->attrs;
  2512. u32 control_freq;
  2513. if (!attrs[NL80211_ATTR_WIPHY_FREQ])
  2514. return -EINVAL;
  2515. control_freq = MHZ_TO_KHZ(
  2516. nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
  2517. if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
  2518. control_freq +=
  2519. nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
  2520. memset(chandef, 0, sizeof(*chandef));
  2521. chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq);
  2522. chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
  2523. chandef->center_freq1 = KHZ_TO_MHZ(control_freq);
  2524. chandef->freq1_offset = control_freq % 1000;
  2525. chandef->center_freq2 = 0;
  2526. /* Primary channel not allowed */
  2527. if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) {
  2528. NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ],
  2529. "Channel is disabled");
  2530. return -EINVAL;
  2531. }
  2532. if (attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
  2533. enum nl80211_channel_type chantype;
  2534. chantype = nla_get_u32(attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
  2535. switch (chantype) {
  2536. case NL80211_CHAN_NO_HT:
  2537. case NL80211_CHAN_HT20:
  2538. case NL80211_CHAN_HT40PLUS:
  2539. case NL80211_CHAN_HT40MINUS:
  2540. cfg80211_chandef_create(chandef, chandef->chan,
  2541. chantype);
  2542. /* user input for center_freq is incorrect */
  2543. if (attrs[NL80211_ATTR_CENTER_FREQ1] &&
  2544. chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) {
  2545. NL_SET_ERR_MSG_ATTR(extack,
  2546. attrs[NL80211_ATTR_CENTER_FREQ1],
  2547. "bad center frequency 1");
  2548. return -EINVAL;
  2549. }
  2550. /* center_freq2 must be zero */
  2551. if (attrs[NL80211_ATTR_CENTER_FREQ2] &&
  2552. nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2])) {
  2553. NL_SET_ERR_MSG_ATTR(extack,
  2554. attrs[NL80211_ATTR_CENTER_FREQ2],
  2555. "center frequency 2 can't be used");
  2556. return -EINVAL;
  2557. }
  2558. break;
  2559. default:
  2560. NL_SET_ERR_MSG_ATTR(extack,
  2561. attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE],
  2562. "invalid channel type");
  2563. return -EINVAL;
  2564. }
  2565. } else if (attrs[NL80211_ATTR_CHANNEL_WIDTH]) {
  2566. chandef->width =
  2567. nla_get_u32(attrs[NL80211_ATTR_CHANNEL_WIDTH]);
  2568. if (attrs[NL80211_ATTR_CENTER_FREQ1]) {
  2569. chandef->center_freq1 =
  2570. nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1]);
  2571. if (attrs[NL80211_ATTR_CENTER_FREQ1_OFFSET])
  2572. chandef->freq1_offset = nla_get_u32(
  2573. attrs[NL80211_ATTR_CENTER_FREQ1_OFFSET]);
  2574. else
  2575. chandef->freq1_offset = 0;
  2576. }
  2577. if (attrs[NL80211_ATTR_CENTER_FREQ2])
  2578. chandef->center_freq2 =
  2579. nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2]);
  2580. }
  2581. if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) {
  2582. chandef->edmg.channels =
  2583. nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]);
  2584. if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG])
  2585. chandef->edmg.bw_config =
  2586. nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]);
  2587. } else {
  2588. chandef->edmg.bw_config = 0;
  2589. chandef->edmg.channels = 0;
  2590. }
  2591. if (!cfg80211_chandef_valid(chandef)) {
  2592. NL_SET_ERR_MSG(extack, "invalid channel definition");
  2593. return -EINVAL;
  2594. }
  2595. if (!cfg80211_chandef_usable(&rdev->wiphy, chandef,
  2596. IEEE80211_CHAN_DISABLED)) {
  2597. NL_SET_ERR_MSG(extack, "(extension) channel is disabled");
  2598. return -EINVAL;
  2599. }
  2600. if ((chandef->width == NL80211_CHAN_WIDTH_5 ||
  2601. chandef->width == NL80211_CHAN_WIDTH_10) &&
  2602. !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) {
  2603. NL_SET_ERR_MSG(extack, "5/10 MHz not supported");
  2604. return -EINVAL;
  2605. }
  2606. return 0;
  2607. }
  2608. static int __nl80211_set_channel(struct cfg80211_registered_device *rdev,
  2609. struct net_device *dev,
  2610. struct genl_info *info)
  2611. {
  2612. struct cfg80211_chan_def chandef;
  2613. int result;
  2614. enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR;
  2615. struct wireless_dev *wdev = NULL;
  2616. if (dev)
  2617. wdev = dev->ieee80211_ptr;
  2618. if (!nl80211_can_set_dev_channel(wdev))
  2619. return -EOPNOTSUPP;
  2620. if (wdev)
  2621. iftype = wdev->iftype;
  2622. result = nl80211_parse_chandef(rdev, info, &chandef);
  2623. if (result)
  2624. return result;
  2625. switch (iftype) {
  2626. case NL80211_IFTYPE_AP:
  2627. case NL80211_IFTYPE_P2P_GO:
  2628. if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
  2629. iftype)) {
  2630. result = -EINVAL;
  2631. break;
  2632. }
  2633. if (wdev->beacon_interval) {
  2634. if (!dev || !rdev->ops->set_ap_chanwidth ||
  2635. !(rdev->wiphy.features &
  2636. NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)) {
  2637. result = -EBUSY;
  2638. break;
  2639. }
  2640. /* Only allow dynamic channel width changes */
  2641. if (chandef.chan != wdev->preset_chandef.chan) {
  2642. result = -EBUSY;
  2643. break;
  2644. }
  2645. result = rdev_set_ap_chanwidth(rdev, dev, &chandef);
  2646. if (result)
  2647. break;
  2648. }
  2649. wdev->preset_chandef = chandef;
  2650. result = 0;
  2651. break;
  2652. case NL80211_IFTYPE_MESH_POINT:
  2653. result = cfg80211_set_mesh_channel(rdev, wdev, &chandef);
  2654. break;
  2655. case NL80211_IFTYPE_MONITOR:
  2656. result = cfg80211_set_monitor_channel(rdev, &chandef);
  2657. break;
  2658. default:
  2659. result = -EINVAL;
  2660. }
  2661. return result;
  2662. }
  2663. static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
  2664. {
  2665. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2666. struct net_device *netdev = info->user_ptr[1];
  2667. return __nl80211_set_channel(rdev, netdev, info);
  2668. }
  2669. static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info)
  2670. {
  2671. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  2672. struct net_device *dev = info->user_ptr[1];
  2673. struct wireless_dev *wdev = dev->ieee80211_ptr;
  2674. const u8 *bssid;
  2675. if (!info->attrs[NL80211_ATTR_MAC])
  2676. return -EINVAL;
  2677. if (netif_running(dev))
  2678. return -EBUSY;
  2679. if (!rdev->ops->set_wds_peer)
  2680. return -EOPNOTSUPP;
  2681. if (wdev->iftype != NL80211_IFTYPE_WDS)
  2682. return -EOPNOTSUPP;
  2683. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  2684. return rdev_set_wds_peer(rdev, dev, bssid);
  2685. }
  2686. static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
  2687. {
  2688. struct cfg80211_registered_device *rdev;
  2689. struct net_device *netdev = NULL;
  2690. struct wireless_dev *wdev;
  2691. int result = 0, rem_txq_params = 0;
  2692. struct nlattr *nl_txq_params;
  2693. u32 changed;
  2694. u8 retry_short = 0, retry_long = 0;
  2695. u32 frag_threshold = 0, rts_threshold = 0;
  2696. u8 coverage_class = 0;
  2697. u32 txq_limit = 0, txq_memory_limit = 0, txq_quantum = 0;
  2698. ASSERT_RTNL();
  2699. /*
  2700. * Try to find the wiphy and netdev. Normally this
  2701. * function shouldn't need the netdev, but this is
  2702. * done for backward compatibility -- previously
  2703. * setting the channel was done per wiphy, but now
  2704. * it is per netdev. Previous userland like hostapd
  2705. * also passed a netdev to set_wiphy, so that it is
  2706. * possible to let that go to the right netdev!
  2707. */
  2708. if (info->attrs[NL80211_ATTR_IFINDEX]) {
  2709. int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
  2710. netdev = __dev_get_by_index(genl_info_net(info), ifindex);
  2711. if (netdev && netdev->ieee80211_ptr)
  2712. rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy);
  2713. else
  2714. netdev = NULL;
  2715. }
  2716. if (!netdev) {
  2717. rdev = __cfg80211_rdev_from_attrs(genl_info_net(info),
  2718. info->attrs);
  2719. if (IS_ERR(rdev))
  2720. return PTR_ERR(rdev);
  2721. wdev = NULL;
  2722. netdev = NULL;
  2723. result = 0;
  2724. } else
  2725. wdev = netdev->ieee80211_ptr;
  2726. /*
  2727. * end workaround code, by now the rdev is available
  2728. * and locked, and wdev may or may not be NULL.
  2729. */
  2730. if (info->attrs[NL80211_ATTR_WIPHY_NAME])
  2731. result = cfg80211_dev_rename(
  2732. rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
  2733. if (result)
  2734. return result;
  2735. if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
  2736. struct ieee80211_txq_params txq_params;
  2737. struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
  2738. if (!rdev->ops->set_txq_params)
  2739. return -EOPNOTSUPP;
  2740. if (!netdev)
  2741. return -EINVAL;
  2742. if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  2743. netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  2744. return -EINVAL;
  2745. if (!netif_running(netdev))
  2746. return -ENETDOWN;
  2747. nla_for_each_nested(nl_txq_params,
  2748. info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
  2749. rem_txq_params) {
  2750. result = nla_parse_nested_deprecated(tb,
  2751. NL80211_TXQ_ATTR_MAX,
  2752. nl_txq_params,
  2753. txq_params_policy,
  2754. info->extack);
  2755. if (result)
  2756. return result;
  2757. result = parse_txq_params(tb, &txq_params);
  2758. if (result)
  2759. return result;
  2760. result = rdev_set_txq_params(rdev, netdev,
  2761. &txq_params);
  2762. if (result)
  2763. return result;
  2764. }
  2765. }
  2766. if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
  2767. result = __nl80211_set_channel(
  2768. rdev,
  2769. nl80211_can_set_dev_channel(wdev) ? netdev : NULL,
  2770. info);
  2771. if (result)
  2772. return result;
  2773. }
  2774. if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
  2775. struct wireless_dev *txp_wdev = wdev;
  2776. enum nl80211_tx_power_setting type;
  2777. int idx, mbm = 0;
  2778. if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER))
  2779. txp_wdev = NULL;
  2780. if (!rdev->ops->set_tx_power)
  2781. return -EOPNOTSUPP;
  2782. idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING;
  2783. type = nla_get_u32(info->attrs[idx]);
  2784. if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
  2785. (type != NL80211_TX_POWER_AUTOMATIC))
  2786. return -EINVAL;
  2787. if (type != NL80211_TX_POWER_AUTOMATIC) {
  2788. idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL;
  2789. mbm = nla_get_u32(info->attrs[idx]);
  2790. }
  2791. result = rdev_set_tx_power(rdev, txp_wdev, type, mbm);
  2792. if (result)
  2793. return result;
  2794. }
  2795. if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
  2796. info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
  2797. u32 tx_ant, rx_ant;
  2798. if ((!rdev->wiphy.available_antennas_tx &&
  2799. !rdev->wiphy.available_antennas_rx) ||
  2800. !rdev->ops->set_antenna)
  2801. return -EOPNOTSUPP;
  2802. tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
  2803. rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
  2804. /* reject antenna configurations which don't match the
  2805. * available antenna masks, except for the "all" mask */
  2806. if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) ||
  2807. (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx)))
  2808. return -EINVAL;
  2809. tx_ant = tx_ant & rdev->wiphy.available_antennas_tx;
  2810. rx_ant = rx_ant & rdev->wiphy.available_antennas_rx;
  2811. result = rdev_set_antenna(rdev, tx_ant, rx_ant);
  2812. if (result)
  2813. return result;
  2814. }
  2815. changed = 0;
  2816. if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
  2817. retry_short = nla_get_u8(
  2818. info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
  2819. changed |= WIPHY_PARAM_RETRY_SHORT;
  2820. }
  2821. if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
  2822. retry_long = nla_get_u8(
  2823. info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
  2824. changed |= WIPHY_PARAM_RETRY_LONG;
  2825. }
  2826. if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
  2827. frag_threshold = nla_get_u32(
  2828. info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
  2829. if (frag_threshold < 256)
  2830. return -EINVAL;
  2831. if (frag_threshold != (u32) -1) {
  2832. /*
  2833. * Fragments (apart from the last one) are required to
  2834. * have even length. Make the fragmentation code
  2835. * simpler by stripping LSB should someone try to use
  2836. * odd threshold value.
  2837. */
  2838. frag_threshold &= ~0x1;
  2839. }
  2840. changed |= WIPHY_PARAM_FRAG_THRESHOLD;
  2841. }
  2842. if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
  2843. rts_threshold = nla_get_u32(
  2844. info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
  2845. changed |= WIPHY_PARAM_RTS_THRESHOLD;
  2846. }
  2847. if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
  2848. if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK])
  2849. return -EINVAL;
  2850. coverage_class = nla_get_u8(
  2851. info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
  2852. changed |= WIPHY_PARAM_COVERAGE_CLASS;
  2853. }
  2854. if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) {
  2855. if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION))
  2856. return -EOPNOTSUPP;
  2857. changed |= WIPHY_PARAM_DYN_ACK;
  2858. }
  2859. if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) {
  2860. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  2861. NL80211_EXT_FEATURE_TXQS))
  2862. return -EOPNOTSUPP;
  2863. txq_limit = nla_get_u32(
  2864. info->attrs[NL80211_ATTR_TXQ_LIMIT]);
  2865. changed |= WIPHY_PARAM_TXQ_LIMIT;
  2866. }
  2867. if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) {
  2868. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  2869. NL80211_EXT_FEATURE_TXQS))
  2870. return -EOPNOTSUPP;
  2871. txq_memory_limit = nla_get_u32(
  2872. info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]);
  2873. changed |= WIPHY_PARAM_TXQ_MEMORY_LIMIT;
  2874. }
  2875. if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) {
  2876. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  2877. NL80211_EXT_FEATURE_TXQS))
  2878. return -EOPNOTSUPP;
  2879. txq_quantum = nla_get_u32(
  2880. info->attrs[NL80211_ATTR_TXQ_QUANTUM]);
  2881. changed |= WIPHY_PARAM_TXQ_QUANTUM;
  2882. }
  2883. if (changed) {
  2884. u8 old_retry_short, old_retry_long;
  2885. u32 old_frag_threshold, old_rts_threshold;
  2886. u8 old_coverage_class;
  2887. u32 old_txq_limit, old_txq_memory_limit, old_txq_quantum;
  2888. if (!rdev->ops->set_wiphy_params)
  2889. return -EOPNOTSUPP;
  2890. old_retry_short = rdev->wiphy.retry_short;
  2891. old_retry_long = rdev->wiphy.retry_long;
  2892. old_frag_threshold = rdev->wiphy.frag_threshold;
  2893. old_rts_threshold = rdev->wiphy.rts_threshold;
  2894. old_coverage_class = rdev->wiphy.coverage_class;
  2895. old_txq_limit = rdev->wiphy.txq_limit;
  2896. old_txq_memory_limit = rdev->wiphy.txq_memory_limit;
  2897. old_txq_quantum = rdev->wiphy.txq_quantum;
  2898. if (changed & WIPHY_PARAM_RETRY_SHORT)
  2899. rdev->wiphy.retry_short = retry_short;
  2900. if (changed & WIPHY_PARAM_RETRY_LONG)
  2901. rdev->wiphy.retry_long = retry_long;
  2902. if (changed & WIPHY_PARAM_FRAG_THRESHOLD)
  2903. rdev->wiphy.frag_threshold = frag_threshold;
  2904. if (changed & WIPHY_PARAM_RTS_THRESHOLD)
  2905. rdev->wiphy.rts_threshold = rts_threshold;
  2906. if (changed & WIPHY_PARAM_COVERAGE_CLASS)
  2907. rdev->wiphy.coverage_class = coverage_class;
  2908. if (changed & WIPHY_PARAM_TXQ_LIMIT)
  2909. rdev->wiphy.txq_limit = txq_limit;
  2910. if (changed & WIPHY_PARAM_TXQ_MEMORY_LIMIT)
  2911. rdev->wiphy.txq_memory_limit = txq_memory_limit;
  2912. if (changed & WIPHY_PARAM_TXQ_QUANTUM)
  2913. rdev->wiphy.txq_quantum = txq_quantum;
  2914. result = rdev_set_wiphy_params(rdev, changed);
  2915. if (result) {
  2916. rdev->wiphy.retry_short = old_retry_short;
  2917. rdev->wiphy.retry_long = old_retry_long;
  2918. rdev->wiphy.frag_threshold = old_frag_threshold;
  2919. rdev->wiphy.rts_threshold = old_rts_threshold;
  2920. rdev->wiphy.coverage_class = old_coverage_class;
  2921. rdev->wiphy.txq_limit = old_txq_limit;
  2922. rdev->wiphy.txq_memory_limit = old_txq_memory_limit;
  2923. rdev->wiphy.txq_quantum = old_txq_quantum;
  2924. return result;
  2925. }
  2926. }
  2927. return 0;
  2928. }
  2929. static int nl80211_send_chandef(struct sk_buff *msg,
  2930. const struct cfg80211_chan_def *chandef)
  2931. {
  2932. if (WARN_ON(!cfg80211_chandef_valid(chandef)))
  2933. return -EINVAL;
  2934. if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ,
  2935. chandef->chan->center_freq))
  2936. return -ENOBUFS;
  2937. if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET,
  2938. chandef->chan->freq_offset))
  2939. return -ENOBUFS;
  2940. switch (chandef->width) {
  2941. case NL80211_CHAN_WIDTH_20_NOHT:
  2942. case NL80211_CHAN_WIDTH_20:
  2943. case NL80211_CHAN_WIDTH_40:
  2944. if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
  2945. cfg80211_get_chandef_type(chandef)))
  2946. return -ENOBUFS;
  2947. break;
  2948. default:
  2949. break;
  2950. }
  2951. if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width))
  2952. return -ENOBUFS;
  2953. if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1))
  2954. return -ENOBUFS;
  2955. if (chandef->center_freq2 &&
  2956. nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2))
  2957. return -ENOBUFS;
  2958. return 0;
  2959. }
  2960. static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags,
  2961. struct cfg80211_registered_device *rdev,
  2962. struct wireless_dev *wdev,
  2963. enum nl80211_commands cmd)
  2964. {
  2965. struct net_device *dev = wdev->netdev;
  2966. void *hdr;
  2967. WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE &&
  2968. cmd != NL80211_CMD_DEL_INTERFACE &&
  2969. cmd != NL80211_CMD_SET_INTERFACE);
  2970. hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
  2971. if (!hdr)
  2972. return -1;
  2973. if (dev &&
  2974. (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
  2975. nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name)))
  2976. goto nla_put_failure;
  2977. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  2978. nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) ||
  2979. nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
  2980. NL80211_ATTR_PAD) ||
  2981. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) ||
  2982. nla_put_u32(msg, NL80211_ATTR_GENERATION,
  2983. rdev->devlist_generation ^
  2984. (cfg80211_rdev_list_generation << 2)) ||
  2985. nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr))
  2986. goto nla_put_failure;
  2987. if (rdev->ops->get_channel) {
  2988. int ret;
  2989. struct cfg80211_chan_def chandef = {};
  2990. ret = rdev_get_channel(rdev, wdev, &chandef);
  2991. if (ret == 0) {
  2992. if (nl80211_send_chandef(msg, &chandef))
  2993. goto nla_put_failure;
  2994. }
  2995. }
  2996. if (rdev->ops->get_tx_power) {
  2997. int dbm, ret;
  2998. ret = rdev_get_tx_power(rdev, wdev, &dbm);
  2999. if (ret == 0 &&
  3000. nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL,
  3001. DBM_TO_MBM(dbm)))
  3002. goto nla_put_failure;
  3003. }
  3004. wdev_lock(wdev);
  3005. switch (wdev->iftype) {
  3006. case NL80211_IFTYPE_AP:
  3007. if (wdev->ssid_len &&
  3008. nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid))
  3009. goto nla_put_failure_locked;
  3010. break;
  3011. case NL80211_IFTYPE_STATION:
  3012. case NL80211_IFTYPE_P2P_CLIENT:
  3013. case NL80211_IFTYPE_ADHOC: {
  3014. const u8 *ssid_ie;
  3015. if (!wdev->current_bss)
  3016. break;
  3017. rcu_read_lock();
  3018. ssid_ie = ieee80211_bss_get_ie(&wdev->current_bss->pub,
  3019. WLAN_EID_SSID);
  3020. if (ssid_ie &&
  3021. nla_put(msg, NL80211_ATTR_SSID, ssid_ie[1], ssid_ie + 2))
  3022. goto nla_put_failure_rcu_locked;
  3023. rcu_read_unlock();
  3024. break;
  3025. }
  3026. default:
  3027. /* nothing */
  3028. break;
  3029. }
  3030. wdev_unlock(wdev);
  3031. if (rdev->ops->get_txq_stats) {
  3032. struct cfg80211_txq_stats txqstats = {};
  3033. int ret = rdev_get_txq_stats(rdev, wdev, &txqstats);
  3034. if (ret == 0 &&
  3035. !nl80211_put_txq_stats(msg, &txqstats,
  3036. NL80211_ATTR_TXQ_STATS))
  3037. goto nla_put_failure;
  3038. }
  3039. genlmsg_end(msg, hdr);
  3040. return 0;
  3041. nla_put_failure_rcu_locked:
  3042. rcu_read_unlock();
  3043. nla_put_failure_locked:
  3044. wdev_unlock(wdev);
  3045. nla_put_failure:
  3046. genlmsg_cancel(msg, hdr);
  3047. return -EMSGSIZE;
  3048. }
  3049. static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb)
  3050. {
  3051. int wp_idx = 0;
  3052. int if_idx = 0;
  3053. int wp_start = cb->args[0];
  3054. int if_start = cb->args[1];
  3055. int filter_wiphy = -1;
  3056. struct cfg80211_registered_device *rdev;
  3057. struct wireless_dev *wdev;
  3058. int ret;
  3059. rtnl_lock();
  3060. if (!cb->args[2]) {
  3061. struct nl80211_dump_wiphy_state state = {
  3062. .filter_wiphy = -1,
  3063. };
  3064. ret = nl80211_dump_wiphy_parse(skb, cb, &state);
  3065. if (ret)
  3066. goto out_unlock;
  3067. filter_wiphy = state.filter_wiphy;
  3068. /*
  3069. * if filtering, set cb->args[2] to +1 since 0 is the default
  3070. * value needed to determine that parsing is necessary.
  3071. */
  3072. if (filter_wiphy >= 0)
  3073. cb->args[2] = filter_wiphy + 1;
  3074. else
  3075. cb->args[2] = -1;
  3076. } else if (cb->args[2] > 0) {
  3077. filter_wiphy = cb->args[2] - 1;
  3078. }
  3079. list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
  3080. if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk)))
  3081. continue;
  3082. if (wp_idx < wp_start) {
  3083. wp_idx++;
  3084. continue;
  3085. }
  3086. if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx)
  3087. continue;
  3088. if_idx = 0;
  3089. list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
  3090. if (if_idx < if_start) {
  3091. if_idx++;
  3092. continue;
  3093. }
  3094. if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid,
  3095. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  3096. rdev, wdev,
  3097. NL80211_CMD_NEW_INTERFACE) < 0) {
  3098. goto out;
  3099. }
  3100. if_idx++;
  3101. }
  3102. wp_idx++;
  3103. }
  3104. out:
  3105. cb->args[0] = wp_idx;
  3106. cb->args[1] = if_idx;
  3107. ret = skb->len;
  3108. out_unlock:
  3109. rtnl_unlock();
  3110. return ret;
  3111. }
  3112. static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
  3113. {
  3114. struct sk_buff *msg;
  3115. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3116. struct wireless_dev *wdev = info->user_ptr[1];
  3117. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  3118. if (!msg)
  3119. return -ENOMEM;
  3120. if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
  3121. rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) {
  3122. nlmsg_free(msg);
  3123. return -ENOBUFS;
  3124. }
  3125. return genlmsg_reply(msg, info);
  3126. }
  3127. static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = {
  3128. [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG },
  3129. [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG },
  3130. [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG },
  3131. [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG },
  3132. [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG },
  3133. [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG },
  3134. };
  3135. static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
  3136. {
  3137. struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1];
  3138. int flag;
  3139. *mntrflags = 0;
  3140. if (!nla)
  3141. return -EINVAL;
  3142. if (nla_parse_nested_deprecated(flags, NL80211_MNTR_FLAG_MAX, nla, mntr_flags_policy, NULL))
  3143. return -EINVAL;
  3144. for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++)
  3145. if (flags[flag])
  3146. *mntrflags |= (1<<flag);
  3147. *mntrflags |= MONITOR_FLAG_CHANGED;
  3148. return 0;
  3149. }
  3150. static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev,
  3151. enum nl80211_iftype type,
  3152. struct genl_info *info,
  3153. struct vif_params *params)
  3154. {
  3155. bool change = false;
  3156. int err;
  3157. if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
  3158. if (type != NL80211_IFTYPE_MONITOR)
  3159. return -EINVAL;
  3160. err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
  3161. &params->flags);
  3162. if (err)
  3163. return err;
  3164. change = true;
  3165. }
  3166. if (params->flags & MONITOR_FLAG_ACTIVE &&
  3167. !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR))
  3168. return -EOPNOTSUPP;
  3169. if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) {
  3170. const u8 *mumimo_groups;
  3171. u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
  3172. if (type != NL80211_IFTYPE_MONITOR)
  3173. return -EINVAL;
  3174. if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag))
  3175. return -EOPNOTSUPP;
  3176. mumimo_groups =
  3177. nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]);
  3178. /* bits 0 and 63 are reserved and must be zero */
  3179. if ((mumimo_groups[0] & BIT(0)) ||
  3180. (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7)))
  3181. return -EINVAL;
  3182. params->vht_mumimo_groups = mumimo_groups;
  3183. change = true;
  3184. }
  3185. if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) {
  3186. u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
  3187. if (type != NL80211_IFTYPE_MONITOR)
  3188. return -EINVAL;
  3189. if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag))
  3190. return -EOPNOTSUPP;
  3191. params->vht_mumimo_follow_addr =
  3192. nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]);
  3193. change = true;
  3194. }
  3195. return change ? 1 : 0;
  3196. }
  3197. static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev,
  3198. struct net_device *netdev, u8 use_4addr,
  3199. enum nl80211_iftype iftype)
  3200. {
  3201. if (!use_4addr) {
  3202. if (netdev && netif_is_bridge_port(netdev))
  3203. return -EBUSY;
  3204. return 0;
  3205. }
  3206. switch (iftype) {
  3207. case NL80211_IFTYPE_AP_VLAN:
  3208. if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP)
  3209. return 0;
  3210. break;
  3211. case NL80211_IFTYPE_STATION:
  3212. if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION)
  3213. return 0;
  3214. break;
  3215. default:
  3216. break;
  3217. }
  3218. return -EOPNOTSUPP;
  3219. }
  3220. static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
  3221. {
  3222. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3223. struct vif_params params;
  3224. int err;
  3225. enum nl80211_iftype otype, ntype;
  3226. struct net_device *dev = info->user_ptr[1];
  3227. bool change = false;
  3228. memset(&params, 0, sizeof(params));
  3229. otype = ntype = dev->ieee80211_ptr->iftype;
  3230. if (info->attrs[NL80211_ATTR_IFTYPE]) {
  3231. ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
  3232. if (otype != ntype)
  3233. change = true;
  3234. }
  3235. if (info->attrs[NL80211_ATTR_MESH_ID]) {
  3236. struct wireless_dev *wdev = dev->ieee80211_ptr;
  3237. if (ntype != NL80211_IFTYPE_MESH_POINT)
  3238. return -EINVAL;
  3239. if (netif_running(dev))
  3240. return -EBUSY;
  3241. wdev_lock(wdev);
  3242. BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
  3243. IEEE80211_MAX_MESH_ID_LEN);
  3244. wdev->mesh_id_up_len =
  3245. nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
  3246. memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
  3247. wdev->mesh_id_up_len);
  3248. wdev_unlock(wdev);
  3249. }
  3250. if (info->attrs[NL80211_ATTR_4ADDR]) {
  3251. params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
  3252. change = true;
  3253. err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype);
  3254. if (err)
  3255. return err;
  3256. } else {
  3257. params.use_4addr = -1;
  3258. }
  3259. err = nl80211_parse_mon_options(rdev, ntype, info, &params);
  3260. if (err < 0)
  3261. return err;
  3262. if (err > 0)
  3263. change = true;
  3264. if (change)
  3265. err = cfg80211_change_iface(rdev, dev, ntype, &params);
  3266. else
  3267. err = 0;
  3268. if (!err && params.use_4addr != -1)
  3269. dev->ieee80211_ptr->use_4addr = params.use_4addr;
  3270. if (change && !err) {
  3271. struct wireless_dev *wdev = dev->ieee80211_ptr;
  3272. nl80211_notify_iface(rdev, wdev, NL80211_CMD_SET_INTERFACE);
  3273. }
  3274. return err;
  3275. }
  3276. static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
  3277. {
  3278. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3279. struct vif_params params;
  3280. struct wireless_dev *wdev;
  3281. struct sk_buff *msg;
  3282. int err;
  3283. enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
  3284. /* to avoid failing a new interface creation due to pending removal */
  3285. cfg80211_destroy_ifaces(rdev);
  3286. memset(&params, 0, sizeof(params));
  3287. if (!info->attrs[NL80211_ATTR_IFNAME])
  3288. return -EINVAL;
  3289. if (info->attrs[NL80211_ATTR_IFTYPE])
  3290. type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
  3291. if (!rdev->ops->add_virtual_intf)
  3292. return -EOPNOTSUPP;
  3293. if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN ||
  3294. rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) &&
  3295. info->attrs[NL80211_ATTR_MAC]) {
  3296. nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC],
  3297. ETH_ALEN);
  3298. if (!is_valid_ether_addr(params.macaddr))
  3299. return -EADDRNOTAVAIL;
  3300. }
  3301. if (info->attrs[NL80211_ATTR_4ADDR]) {
  3302. params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
  3303. err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type);
  3304. if (err)
  3305. return err;
  3306. }
  3307. if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0))
  3308. return -EOPNOTSUPP;
  3309. err = nl80211_parse_mon_options(rdev, type, info, &params);
  3310. if (err < 0)
  3311. return err;
  3312. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  3313. if (!msg)
  3314. return -ENOMEM;
  3315. wdev = rdev_add_virtual_intf(rdev,
  3316. nla_data(info->attrs[NL80211_ATTR_IFNAME]),
  3317. NET_NAME_USER, type, &params);
  3318. if (WARN_ON(!wdev)) {
  3319. nlmsg_free(msg);
  3320. return -EPROTO;
  3321. } else if (IS_ERR(wdev)) {
  3322. nlmsg_free(msg);
  3323. return PTR_ERR(wdev);
  3324. }
  3325. if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
  3326. wdev->owner_nlportid = info->snd_portid;
  3327. switch (type) {
  3328. case NL80211_IFTYPE_MESH_POINT:
  3329. if (!info->attrs[NL80211_ATTR_MESH_ID])
  3330. break;
  3331. wdev_lock(wdev);
  3332. BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN !=
  3333. IEEE80211_MAX_MESH_ID_LEN);
  3334. wdev->mesh_id_up_len =
  3335. nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
  3336. memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
  3337. wdev->mesh_id_up_len);
  3338. wdev_unlock(wdev);
  3339. break;
  3340. case NL80211_IFTYPE_NAN:
  3341. case NL80211_IFTYPE_P2P_DEVICE:
  3342. /*
  3343. * P2P Device and NAN do not have a netdev, so don't go
  3344. * through the netdev notifier and must be added here
  3345. */
  3346. cfg80211_init_wdev(wdev);
  3347. cfg80211_register_wdev(rdev, wdev);
  3348. break;
  3349. default:
  3350. break;
  3351. }
  3352. if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
  3353. rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) {
  3354. nlmsg_free(msg);
  3355. return -ENOBUFS;
  3356. }
  3357. return genlmsg_reply(msg, info);
  3358. }
  3359. static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
  3360. {
  3361. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3362. struct wireless_dev *wdev = info->user_ptr[1];
  3363. if (!rdev->ops->del_virtual_intf)
  3364. return -EOPNOTSUPP;
  3365. /*
  3366. * If we remove a wireless device without a netdev then clear
  3367. * user_ptr[1] so that nl80211_post_doit won't dereference it
  3368. * to check if it needs to do dev_put(). Otherwise it crashes
  3369. * since the wdev has been freed, unlike with a netdev where
  3370. * we need the dev_put() for the netdev to really be freed.
  3371. */
  3372. if (!wdev->netdev)
  3373. info->user_ptr[1] = NULL;
  3374. return rdev_del_virtual_intf(rdev, wdev);
  3375. }
  3376. static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info)
  3377. {
  3378. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3379. struct net_device *dev = info->user_ptr[1];
  3380. u16 noack_map;
  3381. if (!info->attrs[NL80211_ATTR_NOACK_MAP])
  3382. return -EINVAL;
  3383. if (!rdev->ops->set_noack_map)
  3384. return -EOPNOTSUPP;
  3385. noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]);
  3386. return rdev_set_noack_map(rdev, dev, noack_map);
  3387. }
  3388. struct get_key_cookie {
  3389. struct sk_buff *msg;
  3390. int error;
  3391. int idx;
  3392. };
  3393. static void get_key_callback(void *c, struct key_params *params)
  3394. {
  3395. struct nlattr *key;
  3396. struct get_key_cookie *cookie = c;
  3397. if ((params->key &&
  3398. nla_put(cookie->msg, NL80211_ATTR_KEY_DATA,
  3399. params->key_len, params->key)) ||
  3400. (params->seq &&
  3401. nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ,
  3402. params->seq_len, params->seq)) ||
  3403. (params->cipher &&
  3404. nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER,
  3405. params->cipher)))
  3406. goto nla_put_failure;
  3407. key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY);
  3408. if (!key)
  3409. goto nla_put_failure;
  3410. if ((params->key &&
  3411. nla_put(cookie->msg, NL80211_KEY_DATA,
  3412. params->key_len, params->key)) ||
  3413. (params->seq &&
  3414. nla_put(cookie->msg, NL80211_KEY_SEQ,
  3415. params->seq_len, params->seq)) ||
  3416. (params->cipher &&
  3417. nla_put_u32(cookie->msg, NL80211_KEY_CIPHER,
  3418. params->cipher)))
  3419. goto nla_put_failure;
  3420. if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx))
  3421. goto nla_put_failure;
  3422. nla_nest_end(cookie->msg, key);
  3423. return;
  3424. nla_put_failure:
  3425. cookie->error = 1;
  3426. }
  3427. static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
  3428. {
  3429. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3430. int err;
  3431. struct net_device *dev = info->user_ptr[1];
  3432. u8 key_idx = 0;
  3433. const u8 *mac_addr = NULL;
  3434. bool pairwise;
  3435. struct get_key_cookie cookie = {
  3436. .error = 0,
  3437. };
  3438. void *hdr;
  3439. struct sk_buff *msg;
  3440. bool bigtk_support = false;
  3441. if (wiphy_ext_feature_isset(&rdev->wiphy,
  3442. NL80211_EXT_FEATURE_BEACON_PROTECTION))
  3443. bigtk_support = true;
  3444. if ((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_STATION ||
  3445. dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_CLIENT) &&
  3446. wiphy_ext_feature_isset(&rdev->wiphy,
  3447. NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT))
  3448. bigtk_support = true;
  3449. if (info->attrs[NL80211_ATTR_KEY_IDX]) {
  3450. key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
  3451. if (key_idx >= 6 && key_idx <= 7 && !bigtk_support) {
  3452. GENL_SET_ERR_MSG(info, "BIGTK not supported");
  3453. return -EINVAL;
  3454. }
  3455. }
  3456. if (info->attrs[NL80211_ATTR_MAC])
  3457. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  3458. pairwise = !!mac_addr;
  3459. if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
  3460. u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
  3461. if (kt != NL80211_KEYTYPE_GROUP &&
  3462. kt != NL80211_KEYTYPE_PAIRWISE)
  3463. return -EINVAL;
  3464. pairwise = kt == NL80211_KEYTYPE_PAIRWISE;
  3465. }
  3466. if (!rdev->ops->get_key)
  3467. return -EOPNOTSUPP;
  3468. if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
  3469. return -ENOENT;
  3470. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  3471. if (!msg)
  3472. return -ENOMEM;
  3473. hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
  3474. NL80211_CMD_NEW_KEY);
  3475. if (!hdr)
  3476. goto nla_put_failure;
  3477. cookie.msg = msg;
  3478. cookie.idx = key_idx;
  3479. if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
  3480. nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx))
  3481. goto nla_put_failure;
  3482. if (mac_addr &&
  3483. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
  3484. goto nla_put_failure;
  3485. err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie,
  3486. get_key_callback);
  3487. if (err)
  3488. goto free_msg;
  3489. if (cookie.error)
  3490. goto nla_put_failure;
  3491. genlmsg_end(msg, hdr);
  3492. return genlmsg_reply(msg, info);
  3493. nla_put_failure:
  3494. err = -ENOBUFS;
  3495. free_msg:
  3496. nlmsg_free(msg);
  3497. return err;
  3498. }
  3499. static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
  3500. {
  3501. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3502. struct key_parse key;
  3503. int err;
  3504. struct net_device *dev = info->user_ptr[1];
  3505. err = nl80211_parse_key(info, &key);
  3506. if (err)
  3507. return err;
  3508. if (key.idx < 0)
  3509. return -EINVAL;
  3510. /* Only support setting default key and
  3511. * Extended Key ID action NL80211_KEY_SET_TX.
  3512. */
  3513. if (!key.def && !key.defmgmt && !key.defbeacon &&
  3514. !(key.p.mode == NL80211_KEY_SET_TX))
  3515. return -EINVAL;
  3516. wdev_lock(dev->ieee80211_ptr);
  3517. if (key.def) {
  3518. if (!rdev->ops->set_default_key) {
  3519. err = -EOPNOTSUPP;
  3520. goto out;
  3521. }
  3522. err = nl80211_key_allowed(dev->ieee80211_ptr);
  3523. if (err)
  3524. goto out;
  3525. err = rdev_set_default_key(rdev, dev, key.idx,
  3526. key.def_uni, key.def_multi);
  3527. if (err)
  3528. goto out;
  3529. #ifdef CONFIG_CFG80211_WEXT
  3530. dev->ieee80211_ptr->wext.default_key = key.idx;
  3531. #endif
  3532. } else if (key.defmgmt) {
  3533. if (key.def_uni || !key.def_multi) {
  3534. err = -EINVAL;
  3535. goto out;
  3536. }
  3537. if (!rdev->ops->set_default_mgmt_key) {
  3538. err = -EOPNOTSUPP;
  3539. goto out;
  3540. }
  3541. err = nl80211_key_allowed(dev->ieee80211_ptr);
  3542. if (err)
  3543. goto out;
  3544. err = rdev_set_default_mgmt_key(rdev, dev, key.idx);
  3545. if (err)
  3546. goto out;
  3547. #ifdef CONFIG_CFG80211_WEXT
  3548. dev->ieee80211_ptr->wext.default_mgmt_key = key.idx;
  3549. #endif
  3550. } else if (key.defbeacon) {
  3551. if (key.def_uni || !key.def_multi) {
  3552. err = -EINVAL;
  3553. goto out;
  3554. }
  3555. if (!rdev->ops->set_default_beacon_key) {
  3556. err = -EOPNOTSUPP;
  3557. goto out;
  3558. }
  3559. err = nl80211_key_allowed(dev->ieee80211_ptr);
  3560. if (err)
  3561. goto out;
  3562. err = rdev_set_default_beacon_key(rdev, dev, key.idx);
  3563. if (err)
  3564. goto out;
  3565. } else if (key.p.mode == NL80211_KEY_SET_TX &&
  3566. wiphy_ext_feature_isset(&rdev->wiphy,
  3567. NL80211_EXT_FEATURE_EXT_KEY_ID)) {
  3568. u8 *mac_addr = NULL;
  3569. if (info->attrs[NL80211_ATTR_MAC])
  3570. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  3571. if (!mac_addr || key.idx < 0 || key.idx > 1) {
  3572. err = -EINVAL;
  3573. goto out;
  3574. }
  3575. err = rdev_add_key(rdev, dev, key.idx,
  3576. NL80211_KEYTYPE_PAIRWISE,
  3577. mac_addr, &key.p);
  3578. } else {
  3579. err = -EINVAL;
  3580. }
  3581. out:
  3582. wdev_unlock(dev->ieee80211_ptr);
  3583. return err;
  3584. }
  3585. static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
  3586. {
  3587. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3588. int err;
  3589. struct net_device *dev = info->user_ptr[1];
  3590. struct key_parse key;
  3591. const u8 *mac_addr = NULL;
  3592. err = nl80211_parse_key(info, &key);
  3593. if (err)
  3594. return err;
  3595. if (!key.p.key) {
  3596. GENL_SET_ERR_MSG(info, "no key");
  3597. return -EINVAL;
  3598. }
  3599. if (info->attrs[NL80211_ATTR_MAC])
  3600. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  3601. if (key.type == -1) {
  3602. if (mac_addr)
  3603. key.type = NL80211_KEYTYPE_PAIRWISE;
  3604. else
  3605. key.type = NL80211_KEYTYPE_GROUP;
  3606. }
  3607. /* for now */
  3608. if (key.type != NL80211_KEYTYPE_PAIRWISE &&
  3609. key.type != NL80211_KEYTYPE_GROUP) {
  3610. GENL_SET_ERR_MSG(info, "key type not pairwise or group");
  3611. return -EINVAL;
  3612. }
  3613. if (key.type == NL80211_KEYTYPE_GROUP &&
  3614. info->attrs[NL80211_ATTR_VLAN_ID])
  3615. key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
  3616. if (!rdev->ops->add_key)
  3617. return -EOPNOTSUPP;
  3618. if (cfg80211_validate_key_settings(rdev, &key.p, key.idx,
  3619. key.type == NL80211_KEYTYPE_PAIRWISE,
  3620. mac_addr)) {
  3621. GENL_SET_ERR_MSG(info, "key setting validation failed");
  3622. return -EINVAL;
  3623. }
  3624. wdev_lock(dev->ieee80211_ptr);
  3625. err = nl80211_key_allowed(dev->ieee80211_ptr);
  3626. if (err)
  3627. GENL_SET_ERR_MSG(info, "key not allowed");
  3628. if (!err) {
  3629. err = rdev_add_key(rdev, dev, key.idx,
  3630. key.type == NL80211_KEYTYPE_PAIRWISE,
  3631. mac_addr, &key.p);
  3632. if (err)
  3633. GENL_SET_ERR_MSG(info, "key addition failed");
  3634. }
  3635. wdev_unlock(dev->ieee80211_ptr);
  3636. return err;
  3637. }
  3638. static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
  3639. {
  3640. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3641. int err;
  3642. struct net_device *dev = info->user_ptr[1];
  3643. u8 *mac_addr = NULL;
  3644. struct key_parse key;
  3645. err = nl80211_parse_key(info, &key);
  3646. if (err)
  3647. return err;
  3648. if (info->attrs[NL80211_ATTR_MAC])
  3649. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  3650. if (key.type == -1) {
  3651. if (mac_addr)
  3652. key.type = NL80211_KEYTYPE_PAIRWISE;
  3653. else
  3654. key.type = NL80211_KEYTYPE_GROUP;
  3655. }
  3656. /* for now */
  3657. if (key.type != NL80211_KEYTYPE_PAIRWISE &&
  3658. key.type != NL80211_KEYTYPE_GROUP)
  3659. return -EINVAL;
  3660. if (!cfg80211_valid_key_idx(rdev, key.idx,
  3661. key.type == NL80211_KEYTYPE_PAIRWISE))
  3662. return -EINVAL;
  3663. if (!rdev->ops->del_key)
  3664. return -EOPNOTSUPP;
  3665. wdev_lock(dev->ieee80211_ptr);
  3666. err = nl80211_key_allowed(dev->ieee80211_ptr);
  3667. if (key.type == NL80211_KEYTYPE_GROUP && mac_addr &&
  3668. !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
  3669. err = -ENOENT;
  3670. if (!err)
  3671. err = rdev_del_key(rdev, dev, key.idx,
  3672. key.type == NL80211_KEYTYPE_PAIRWISE,
  3673. mac_addr);
  3674. #ifdef CONFIG_CFG80211_WEXT
  3675. if (!err) {
  3676. if (key.idx == dev->ieee80211_ptr->wext.default_key)
  3677. dev->ieee80211_ptr->wext.default_key = -1;
  3678. else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key)
  3679. dev->ieee80211_ptr->wext.default_mgmt_key = -1;
  3680. }
  3681. #endif
  3682. wdev_unlock(dev->ieee80211_ptr);
  3683. return err;
  3684. }
  3685. /* This function returns an error or the number of nested attributes */
  3686. static int validate_acl_mac_addrs(struct nlattr *nl_attr)
  3687. {
  3688. struct nlattr *attr;
  3689. int n_entries = 0, tmp;
  3690. nla_for_each_nested(attr, nl_attr, tmp) {
  3691. if (nla_len(attr) != ETH_ALEN)
  3692. return -EINVAL;
  3693. n_entries++;
  3694. }
  3695. return n_entries;
  3696. }
  3697. /*
  3698. * This function parses ACL information and allocates memory for ACL data.
  3699. * On successful return, the calling function is responsible to free the
  3700. * ACL buffer returned by this function.
  3701. */
  3702. static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy,
  3703. struct genl_info *info)
  3704. {
  3705. enum nl80211_acl_policy acl_policy;
  3706. struct nlattr *attr;
  3707. struct cfg80211_acl_data *acl;
  3708. int i = 0, n_entries, tmp;
  3709. if (!wiphy->max_acl_mac_addrs)
  3710. return ERR_PTR(-EOPNOTSUPP);
  3711. if (!info->attrs[NL80211_ATTR_ACL_POLICY])
  3712. return ERR_PTR(-EINVAL);
  3713. acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]);
  3714. if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED &&
  3715. acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED)
  3716. return ERR_PTR(-EINVAL);
  3717. if (!info->attrs[NL80211_ATTR_MAC_ADDRS])
  3718. return ERR_PTR(-EINVAL);
  3719. n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]);
  3720. if (n_entries < 0)
  3721. return ERR_PTR(n_entries);
  3722. if (n_entries > wiphy->max_acl_mac_addrs)
  3723. return ERR_PTR(-ENOTSUPP);
  3724. acl = kzalloc(struct_size(acl, mac_addrs, n_entries), GFP_KERNEL);
  3725. if (!acl)
  3726. return ERR_PTR(-ENOMEM);
  3727. nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) {
  3728. memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN);
  3729. i++;
  3730. }
  3731. acl->n_acl_entries = n_entries;
  3732. acl->acl_policy = acl_policy;
  3733. return acl;
  3734. }
  3735. static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info)
  3736. {
  3737. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3738. struct net_device *dev = info->user_ptr[1];
  3739. struct cfg80211_acl_data *acl;
  3740. int err;
  3741. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  3742. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  3743. return -EOPNOTSUPP;
  3744. if (!dev->ieee80211_ptr->beacon_interval)
  3745. return -EINVAL;
  3746. acl = parse_acl_data(&rdev->wiphy, info);
  3747. if (IS_ERR(acl))
  3748. return PTR_ERR(acl);
  3749. err = rdev_set_mac_acl(rdev, dev, acl);
  3750. kfree(acl);
  3751. return err;
  3752. }
  3753. static u32 rateset_to_mask(struct ieee80211_supported_band *sband,
  3754. u8 *rates, u8 rates_len)
  3755. {
  3756. u8 i;
  3757. u32 mask = 0;
  3758. for (i = 0; i < rates_len; i++) {
  3759. int rate = (rates[i] & 0x7f) * 5;
  3760. int ridx;
  3761. for (ridx = 0; ridx < sband->n_bitrates; ridx++) {
  3762. struct ieee80211_rate *srate =
  3763. &sband->bitrates[ridx];
  3764. if (rate == srate->bitrate) {
  3765. mask |= 1 << ridx;
  3766. break;
  3767. }
  3768. }
  3769. if (ridx == sband->n_bitrates)
  3770. return 0; /* rate not found */
  3771. }
  3772. return mask;
  3773. }
  3774. static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband,
  3775. u8 *rates, u8 rates_len,
  3776. u8 mcs[IEEE80211_HT_MCS_MASK_LEN])
  3777. {
  3778. u8 i;
  3779. memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN);
  3780. for (i = 0; i < rates_len; i++) {
  3781. int ridx, rbit;
  3782. ridx = rates[i] / 8;
  3783. rbit = BIT(rates[i] % 8);
  3784. /* check validity */
  3785. if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN))
  3786. return false;
  3787. /* check availability */
  3788. ridx = array_index_nospec(ridx, IEEE80211_HT_MCS_MASK_LEN);
  3789. if (sband->ht_cap.mcs.rx_mask[ridx] & rbit)
  3790. mcs[ridx] |= rbit;
  3791. else
  3792. return false;
  3793. }
  3794. return true;
  3795. }
  3796. static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map)
  3797. {
  3798. u16 mcs_mask = 0;
  3799. switch (vht_mcs_map) {
  3800. case IEEE80211_VHT_MCS_NOT_SUPPORTED:
  3801. break;
  3802. case IEEE80211_VHT_MCS_SUPPORT_0_7:
  3803. mcs_mask = 0x00FF;
  3804. break;
  3805. case IEEE80211_VHT_MCS_SUPPORT_0_8:
  3806. mcs_mask = 0x01FF;
  3807. break;
  3808. case IEEE80211_VHT_MCS_SUPPORT_0_9:
  3809. mcs_mask = 0x03FF;
  3810. break;
  3811. default:
  3812. break;
  3813. }
  3814. return mcs_mask;
  3815. }
  3816. static void vht_build_mcs_mask(u16 vht_mcs_map,
  3817. u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
  3818. {
  3819. u8 nss;
  3820. for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
  3821. vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03);
  3822. vht_mcs_map >>= 2;
  3823. }
  3824. }
  3825. static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband,
  3826. struct nl80211_txrate_vht *txrate,
  3827. u16 mcs[NL80211_VHT_NSS_MAX])
  3828. {
  3829. u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
  3830. u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {};
  3831. u8 i;
  3832. if (!sband->vht_cap.vht_supported)
  3833. return false;
  3834. memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX);
  3835. /* Build vht_mcs_mask from VHT capabilities */
  3836. vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask);
  3837. for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
  3838. if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i])
  3839. mcs[i] = txrate->mcs[i];
  3840. else
  3841. return false;
  3842. }
  3843. return true;
  3844. }
  3845. static u16 he_mcs_map_to_mcs_mask(u8 he_mcs_map)
  3846. {
  3847. switch (he_mcs_map) {
  3848. case IEEE80211_HE_MCS_NOT_SUPPORTED:
  3849. return 0;
  3850. case IEEE80211_HE_MCS_SUPPORT_0_7:
  3851. return 0x00FF;
  3852. case IEEE80211_HE_MCS_SUPPORT_0_9:
  3853. return 0x03FF;
  3854. case IEEE80211_HE_MCS_SUPPORT_0_11:
  3855. return 0xFFF;
  3856. default:
  3857. break;
  3858. }
  3859. return 0;
  3860. }
  3861. static void he_build_mcs_mask(u16 he_mcs_map,
  3862. u16 he_mcs_mask[NL80211_HE_NSS_MAX])
  3863. {
  3864. u8 nss;
  3865. for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
  3866. he_mcs_mask[nss] = he_mcs_map_to_mcs_mask(he_mcs_map & 0x03);
  3867. he_mcs_map >>= 2;
  3868. }
  3869. }
  3870. static u16 he_get_txmcsmap(struct genl_info *info,
  3871. const struct ieee80211_sta_he_cap *he_cap)
  3872. {
  3873. struct net_device *dev = info->user_ptr[1];
  3874. struct wireless_dev *wdev = dev->ieee80211_ptr;
  3875. __le16 tx_mcs;
  3876. switch (wdev->chandef.width) {
  3877. case NL80211_CHAN_WIDTH_80P80:
  3878. tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80;
  3879. break;
  3880. case NL80211_CHAN_WIDTH_160:
  3881. tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160;
  3882. break;
  3883. default:
  3884. tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80;
  3885. break;
  3886. }
  3887. return le16_to_cpu(tx_mcs);
  3888. }
  3889. static bool he_set_mcs_mask(struct genl_info *info,
  3890. struct wireless_dev *wdev,
  3891. struct ieee80211_supported_band *sband,
  3892. struct nl80211_txrate_he *txrate,
  3893. u16 mcs[NL80211_HE_NSS_MAX])
  3894. {
  3895. const struct ieee80211_sta_he_cap *he_cap;
  3896. u16 tx_mcs_mask[NL80211_HE_NSS_MAX] = {};
  3897. u16 tx_mcs_map = 0;
  3898. u8 i;
  3899. he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype);
  3900. if (!he_cap)
  3901. return false;
  3902. memset(mcs, 0, sizeof(u16) * NL80211_HE_NSS_MAX);
  3903. tx_mcs_map = he_get_txmcsmap(info, he_cap);
  3904. /* Build he_mcs_mask from HE capabilities */
  3905. he_build_mcs_mask(tx_mcs_map, tx_mcs_mask);
  3906. for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
  3907. if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i])
  3908. mcs[i] = txrate->mcs[i];
  3909. else
  3910. return false;
  3911. }
  3912. return true;
  3913. }
  3914. static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
  3915. struct nlattr *attrs[],
  3916. enum nl80211_attrs attr,
  3917. struct cfg80211_bitrate_mask *mask,
  3918. struct net_device *dev)
  3919. {
  3920. struct nlattr *tb[NL80211_TXRATE_MAX + 1];
  3921. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  3922. struct wireless_dev *wdev = dev->ieee80211_ptr;
  3923. int rem, i;
  3924. struct nlattr *tx_rates;
  3925. struct ieee80211_supported_band *sband;
  3926. u16 vht_tx_mcs_map, he_tx_mcs_map;
  3927. memset(mask, 0, sizeof(*mask));
  3928. /* Default to all rates enabled */
  3929. for (i = 0; i < NUM_NL80211_BANDS; i++) {
  3930. const struct ieee80211_sta_he_cap *he_cap;
  3931. sband = rdev->wiphy.bands[i];
  3932. if (!sband)
  3933. continue;
  3934. mask->control[i].legacy = (1 << sband->n_bitrates) - 1;
  3935. memcpy(mask->control[i].ht_mcs,
  3936. sband->ht_cap.mcs.rx_mask,
  3937. sizeof(mask->control[i].ht_mcs));
  3938. if (sband->vht_cap.vht_supported) {
  3939. vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
  3940. vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs);
  3941. }
  3942. he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype);
  3943. if (!he_cap)
  3944. continue;
  3945. he_tx_mcs_map = he_get_txmcsmap(info, he_cap);
  3946. he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs);
  3947. mask->control[i].he_gi = 0xFF;
  3948. mask->control[i].he_ltf = 0xFF;
  3949. }
  3950. /* if no rates are given set it back to the defaults */
  3951. if (!attrs[attr])
  3952. goto out;
  3953. /* The nested attribute uses enum nl80211_band as the index. This maps
  3954. * directly to the enum nl80211_band values used in cfg80211.
  3955. */
  3956. BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8);
  3957. nla_for_each_nested(tx_rates, attrs[attr], rem) {
  3958. enum nl80211_band band = nla_type(tx_rates);
  3959. int err;
  3960. if (band < 0 || band >= NUM_NL80211_BANDS)
  3961. return -EINVAL;
  3962. sband = rdev->wiphy.bands[band];
  3963. if (sband == NULL)
  3964. return -EINVAL;
  3965. err = nla_parse_nested_deprecated(tb, NL80211_TXRATE_MAX,
  3966. tx_rates,
  3967. nl80211_txattr_policy,
  3968. info->extack);
  3969. if (err)
  3970. return err;
  3971. if (tb[NL80211_TXRATE_LEGACY]) {
  3972. mask->control[band].legacy = rateset_to_mask(
  3973. sband,
  3974. nla_data(tb[NL80211_TXRATE_LEGACY]),
  3975. nla_len(tb[NL80211_TXRATE_LEGACY]));
  3976. if ((mask->control[band].legacy == 0) &&
  3977. nla_len(tb[NL80211_TXRATE_LEGACY]))
  3978. return -EINVAL;
  3979. }
  3980. if (tb[NL80211_TXRATE_HT]) {
  3981. if (!ht_rateset_to_mask(
  3982. sband,
  3983. nla_data(tb[NL80211_TXRATE_HT]),
  3984. nla_len(tb[NL80211_TXRATE_HT]),
  3985. mask->control[band].ht_mcs))
  3986. return -EINVAL;
  3987. }
  3988. if (tb[NL80211_TXRATE_VHT]) {
  3989. if (!vht_set_mcs_mask(
  3990. sband,
  3991. nla_data(tb[NL80211_TXRATE_VHT]),
  3992. mask->control[band].vht_mcs))
  3993. return -EINVAL;
  3994. }
  3995. if (tb[NL80211_TXRATE_GI]) {
  3996. mask->control[band].gi =
  3997. nla_get_u8(tb[NL80211_TXRATE_GI]);
  3998. if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI)
  3999. return -EINVAL;
  4000. }
  4001. if (tb[NL80211_TXRATE_HE] &&
  4002. !he_set_mcs_mask(info, wdev, sband,
  4003. nla_data(tb[NL80211_TXRATE_HE]),
  4004. mask->control[band].he_mcs))
  4005. return -EINVAL;
  4006. if (tb[NL80211_TXRATE_HE_GI])
  4007. mask->control[band].he_gi =
  4008. nla_get_u8(tb[NL80211_TXRATE_HE_GI]);
  4009. if (tb[NL80211_TXRATE_HE_LTF])
  4010. mask->control[band].he_ltf =
  4011. nla_get_u8(tb[NL80211_TXRATE_HE_LTF]);
  4012. if (mask->control[band].legacy == 0) {
  4013. /* don't allow empty legacy rates if HT, VHT or HE
  4014. * are not even supported.
  4015. */
  4016. if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported ||
  4017. rdev->wiphy.bands[band]->vht_cap.vht_supported ||
  4018. ieee80211_get_he_iftype_cap(sband, wdev->iftype)))
  4019. return -EINVAL;
  4020. for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
  4021. if (mask->control[band].ht_mcs[i])
  4022. goto out;
  4023. for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
  4024. if (mask->control[band].vht_mcs[i])
  4025. goto out;
  4026. for (i = 0; i < NL80211_HE_NSS_MAX; i++)
  4027. if (mask->control[band].he_mcs[i])
  4028. goto out;
  4029. /* legacy and mcs rates may not be both empty */
  4030. return -EINVAL;
  4031. }
  4032. }
  4033. out:
  4034. return 0;
  4035. }
  4036. static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev,
  4037. enum nl80211_band band,
  4038. struct cfg80211_bitrate_mask *beacon_rate)
  4039. {
  4040. u32 count_ht, count_vht, i;
  4041. u32 rate = beacon_rate->control[band].legacy;
  4042. /* Allow only one rate */
  4043. if (hweight32(rate) > 1)
  4044. return -EINVAL;
  4045. count_ht = 0;
  4046. for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
  4047. if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) {
  4048. return -EINVAL;
  4049. } else if (beacon_rate->control[band].ht_mcs[i]) {
  4050. count_ht++;
  4051. if (count_ht > 1)
  4052. return -EINVAL;
  4053. }
  4054. if (count_ht && rate)
  4055. return -EINVAL;
  4056. }
  4057. count_vht = 0;
  4058. for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
  4059. if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) {
  4060. return -EINVAL;
  4061. } else if (beacon_rate->control[band].vht_mcs[i]) {
  4062. count_vht++;
  4063. if (count_vht > 1)
  4064. return -EINVAL;
  4065. }
  4066. if (count_vht && rate)
  4067. return -EINVAL;
  4068. }
  4069. if ((count_ht && count_vht) || (!rate && !count_ht && !count_vht))
  4070. return -EINVAL;
  4071. if (rate &&
  4072. !wiphy_ext_feature_isset(&rdev->wiphy,
  4073. NL80211_EXT_FEATURE_BEACON_RATE_LEGACY))
  4074. return -EINVAL;
  4075. if (count_ht &&
  4076. !wiphy_ext_feature_isset(&rdev->wiphy,
  4077. NL80211_EXT_FEATURE_BEACON_RATE_HT))
  4078. return -EINVAL;
  4079. if (count_vht &&
  4080. !wiphy_ext_feature_isset(&rdev->wiphy,
  4081. NL80211_EXT_FEATURE_BEACON_RATE_VHT))
  4082. return -EINVAL;
  4083. return 0;
  4084. }
  4085. static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev,
  4086. struct nlattr *attrs[],
  4087. struct cfg80211_beacon_data *bcn)
  4088. {
  4089. bool haveinfo = false;
  4090. int err;
  4091. memset(bcn, 0, sizeof(*bcn));
  4092. if (attrs[NL80211_ATTR_BEACON_HEAD]) {
  4093. bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]);
  4094. bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]);
  4095. if (!bcn->head_len)
  4096. return -EINVAL;
  4097. haveinfo = true;
  4098. }
  4099. if (attrs[NL80211_ATTR_BEACON_TAIL]) {
  4100. bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]);
  4101. bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]);
  4102. haveinfo = true;
  4103. }
  4104. if (!haveinfo)
  4105. return -EINVAL;
  4106. if (attrs[NL80211_ATTR_IE]) {
  4107. bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]);
  4108. bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]);
  4109. }
  4110. if (attrs[NL80211_ATTR_IE_PROBE_RESP]) {
  4111. bcn->proberesp_ies =
  4112. nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]);
  4113. bcn->proberesp_ies_len =
  4114. nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]);
  4115. }
  4116. if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) {
  4117. bcn->assocresp_ies =
  4118. nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
  4119. bcn->assocresp_ies_len =
  4120. nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
  4121. }
  4122. if (attrs[NL80211_ATTR_PROBE_RESP]) {
  4123. bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]);
  4124. bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]);
  4125. }
  4126. if (attrs[NL80211_ATTR_FTM_RESPONDER]) {
  4127. struct nlattr *tb[NL80211_FTM_RESP_ATTR_MAX + 1];
  4128. err = nla_parse_nested_deprecated(tb,
  4129. NL80211_FTM_RESP_ATTR_MAX,
  4130. attrs[NL80211_ATTR_FTM_RESPONDER],
  4131. NULL, NULL);
  4132. if (err)
  4133. return err;
  4134. if (tb[NL80211_FTM_RESP_ATTR_ENABLED] &&
  4135. wiphy_ext_feature_isset(&rdev->wiphy,
  4136. NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER))
  4137. bcn->ftm_responder = 1;
  4138. else
  4139. return -EOPNOTSUPP;
  4140. if (tb[NL80211_FTM_RESP_ATTR_LCI]) {
  4141. bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]);
  4142. bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]);
  4143. }
  4144. if (tb[NL80211_FTM_RESP_ATTR_CIVICLOC]) {
  4145. bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]);
  4146. bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]);
  4147. }
  4148. } else {
  4149. bcn->ftm_responder = -1;
  4150. }
  4151. return 0;
  4152. }
  4153. static int nl80211_parse_he_obss_pd(struct nlattr *attrs,
  4154. struct ieee80211_he_obss_pd *he_obss_pd)
  4155. {
  4156. struct nlattr *tb[NL80211_HE_OBSS_PD_ATTR_MAX + 1];
  4157. int err;
  4158. err = nla_parse_nested(tb, NL80211_HE_OBSS_PD_ATTR_MAX, attrs,
  4159. he_obss_pd_policy, NULL);
  4160. if (err)
  4161. return err;
  4162. if (!tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL])
  4163. return -EINVAL;
  4164. he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]);
  4165. if (tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET])
  4166. he_obss_pd->min_offset =
  4167. nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]);
  4168. if (tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET])
  4169. he_obss_pd->max_offset =
  4170. nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]);
  4171. if (tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET])
  4172. he_obss_pd->non_srg_max_offset =
  4173. nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET]);
  4174. if (he_obss_pd->min_offset > he_obss_pd->max_offset)
  4175. return -EINVAL;
  4176. if (tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP])
  4177. memcpy(he_obss_pd->bss_color_bitmap,
  4178. nla_data(tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP]),
  4179. sizeof(he_obss_pd->bss_color_bitmap));
  4180. if (tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP])
  4181. memcpy(he_obss_pd->partial_bssid_bitmap,
  4182. nla_data(tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP]),
  4183. sizeof(he_obss_pd->partial_bssid_bitmap));
  4184. he_obss_pd->enable = true;
  4185. return 0;
  4186. }
  4187. static int nl80211_parse_he_bss_color(struct nlattr *attrs,
  4188. struct cfg80211_he_bss_color *he_bss_color)
  4189. {
  4190. struct nlattr *tb[NL80211_HE_BSS_COLOR_ATTR_MAX + 1];
  4191. int err;
  4192. err = nla_parse_nested(tb, NL80211_HE_BSS_COLOR_ATTR_MAX, attrs,
  4193. he_bss_color_policy, NULL);
  4194. if (err)
  4195. return err;
  4196. if (!tb[NL80211_HE_BSS_COLOR_ATTR_COLOR])
  4197. return -EINVAL;
  4198. he_bss_color->color =
  4199. nla_get_u8(tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]);
  4200. he_bss_color->enabled =
  4201. !nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_DISABLED]);
  4202. he_bss_color->partial =
  4203. nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_PARTIAL]);
  4204. return 0;
  4205. }
  4206. static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev,
  4207. struct nlattr *attrs,
  4208. struct cfg80211_ap_settings *params)
  4209. {
  4210. struct nlattr *tb[NL80211_FILS_DISCOVERY_ATTR_MAX + 1];
  4211. int ret;
  4212. struct cfg80211_fils_discovery *fd = &params->fils_discovery;
  4213. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  4214. NL80211_EXT_FEATURE_FILS_DISCOVERY))
  4215. return -EINVAL;
  4216. ret = nla_parse_nested(tb, NL80211_FILS_DISCOVERY_ATTR_MAX, attrs,
  4217. NULL, NULL);
  4218. if (ret)
  4219. return ret;
  4220. if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] ||
  4221. !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] ||
  4222. !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL])
  4223. return -EINVAL;
  4224. fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]);
  4225. fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]);
  4226. fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]);
  4227. fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]);
  4228. return 0;
  4229. }
  4230. static int
  4231. nl80211_parse_unsol_bcast_probe_resp(struct cfg80211_registered_device *rdev,
  4232. struct nlattr *attrs,
  4233. struct cfg80211_ap_settings *params)
  4234. {
  4235. struct nlattr *tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1];
  4236. int ret;
  4237. struct cfg80211_unsol_bcast_probe_resp *presp =
  4238. &params->unsol_bcast_probe_resp;
  4239. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  4240. NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP))
  4241. return -EINVAL;
  4242. ret = nla_parse_nested(tb, NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX,
  4243. attrs, NULL, NULL);
  4244. if (ret)
  4245. return ret;
  4246. if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] ||
  4247. !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL])
  4248. return -EINVAL;
  4249. presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]);
  4250. presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]);
  4251. presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]);
  4252. return 0;
  4253. }
  4254. static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params,
  4255. const u8 *rates)
  4256. {
  4257. int i;
  4258. if (!rates)
  4259. return;
  4260. for (i = 0; i < rates[1]; i++) {
  4261. if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY)
  4262. params->ht_required = true;
  4263. if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY)
  4264. params->vht_required = true;
  4265. if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_HE_PHY)
  4266. params->he_required = true;
  4267. }
  4268. }
  4269. /*
  4270. * Since the nl80211 API didn't include, from the beginning, attributes about
  4271. * HT/VHT requirements/capabilities, we parse them out of the IEs for the
  4272. * benefit of drivers that rebuild IEs in the firmware.
  4273. */
  4274. static void nl80211_calculate_ap_params(struct cfg80211_ap_settings *params)
  4275. {
  4276. const struct cfg80211_beacon_data *bcn = &params->beacon;
  4277. size_t ies_len = bcn->tail_len;
  4278. const u8 *ies = bcn->tail;
  4279. const u8 *rates;
  4280. const u8 *cap;
  4281. rates = cfg80211_find_ie(WLAN_EID_SUPP_RATES, ies, ies_len);
  4282. nl80211_check_ap_rate_selectors(params, rates);
  4283. rates = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, ies, ies_len);
  4284. nl80211_check_ap_rate_selectors(params, rates);
  4285. cap = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, ies, ies_len);
  4286. if (cap && cap[1] >= sizeof(*params->ht_cap))
  4287. params->ht_cap = (void *)(cap + 2);
  4288. cap = cfg80211_find_ie(WLAN_EID_VHT_CAPABILITY, ies, ies_len);
  4289. if (cap && cap[1] >= sizeof(*params->vht_cap))
  4290. params->vht_cap = (void *)(cap + 2);
  4291. cap = cfg80211_find_ext_ie(WLAN_EID_EXT_HE_CAPABILITY, ies, ies_len);
  4292. if (cap && cap[1] >= sizeof(*params->he_cap) + 1)
  4293. params->he_cap = (void *)(cap + 3);
  4294. cap = cfg80211_find_ext_ie(WLAN_EID_EXT_HE_OPERATION, ies, ies_len);
  4295. if (cap && cap[1] >= sizeof(*params->he_oper) + 1)
  4296. params->he_oper = (void *)(cap + 3);
  4297. }
  4298. static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
  4299. struct cfg80211_ap_settings *params)
  4300. {
  4301. struct wireless_dev *wdev;
  4302. bool ret = false;
  4303. list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
  4304. if (wdev->iftype != NL80211_IFTYPE_AP &&
  4305. wdev->iftype != NL80211_IFTYPE_P2P_GO)
  4306. continue;
  4307. if (!wdev->preset_chandef.chan)
  4308. continue;
  4309. params->chandef = wdev->preset_chandef;
  4310. ret = true;
  4311. break;
  4312. }
  4313. return ret;
  4314. }
  4315. static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
  4316. enum nl80211_auth_type auth_type,
  4317. enum nl80211_commands cmd)
  4318. {
  4319. if (auth_type > NL80211_AUTHTYPE_MAX)
  4320. return false;
  4321. switch (cmd) {
  4322. case NL80211_CMD_AUTHENTICATE:
  4323. if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
  4324. auth_type == NL80211_AUTHTYPE_SAE)
  4325. return false;
  4326. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  4327. NL80211_EXT_FEATURE_FILS_STA) &&
  4328. (auth_type == NL80211_AUTHTYPE_FILS_SK ||
  4329. auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
  4330. auth_type == NL80211_AUTHTYPE_FILS_PK))
  4331. return false;
  4332. return true;
  4333. case NL80211_CMD_CONNECT:
  4334. if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
  4335. !wiphy_ext_feature_isset(&rdev->wiphy,
  4336. NL80211_EXT_FEATURE_SAE_OFFLOAD) &&
  4337. auth_type == NL80211_AUTHTYPE_SAE)
  4338. return false;
  4339. /* FILS with SK PFS or PK not supported yet */
  4340. if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
  4341. auth_type == NL80211_AUTHTYPE_FILS_PK)
  4342. return false;
  4343. if (!wiphy_ext_feature_isset(
  4344. &rdev->wiphy,
  4345. NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
  4346. auth_type == NL80211_AUTHTYPE_FILS_SK)
  4347. return false;
  4348. return true;
  4349. case NL80211_CMD_START_AP:
  4350. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  4351. NL80211_EXT_FEATURE_SAE_OFFLOAD_AP) &&
  4352. auth_type == NL80211_AUTHTYPE_SAE)
  4353. return false;
  4354. /* FILS not supported yet */
  4355. if (auth_type == NL80211_AUTHTYPE_FILS_SK ||
  4356. auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
  4357. auth_type == NL80211_AUTHTYPE_FILS_PK)
  4358. return false;
  4359. return true;
  4360. default:
  4361. return false;
  4362. }
  4363. }
  4364. static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
  4365. {
  4366. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  4367. struct net_device *dev = info->user_ptr[1];
  4368. struct wireless_dev *wdev = dev->ieee80211_ptr;
  4369. struct cfg80211_ap_settings params;
  4370. int err;
  4371. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  4372. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  4373. return -EOPNOTSUPP;
  4374. if (!rdev->ops->start_ap)
  4375. return -EOPNOTSUPP;
  4376. if (wdev->beacon_interval)
  4377. return -EALREADY;
  4378. memset(&params, 0, sizeof(params));
  4379. /* these are required for START_AP */
  4380. if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
  4381. !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
  4382. !info->attrs[NL80211_ATTR_BEACON_HEAD])
  4383. return -EINVAL;
  4384. err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon);
  4385. if (err)
  4386. return err;
  4387. params.beacon_interval =
  4388. nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
  4389. params.dtim_period =
  4390. nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
  4391. err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype,
  4392. params.beacon_interval);
  4393. if (err)
  4394. return err;
  4395. /*
  4396. * In theory, some of these attributes should be required here
  4397. * but since they were not used when the command was originally
  4398. * added, keep them optional for old user space programs to let
  4399. * them continue to work with drivers that do not need the
  4400. * additional information -- drivers must check!
  4401. */
  4402. if (info->attrs[NL80211_ATTR_SSID]) {
  4403. params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  4404. params.ssid_len =
  4405. nla_len(info->attrs[NL80211_ATTR_SSID]);
  4406. if (params.ssid_len == 0)
  4407. return -EINVAL;
  4408. }
  4409. if (info->attrs[NL80211_ATTR_HIDDEN_SSID])
  4410. params.hidden_ssid = nla_get_u32(
  4411. info->attrs[NL80211_ATTR_HIDDEN_SSID]);
  4412. params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
  4413. if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
  4414. params.auth_type = nla_get_u32(
  4415. info->attrs[NL80211_ATTR_AUTH_TYPE]);
  4416. if (!nl80211_valid_auth_type(rdev, params.auth_type,
  4417. NL80211_CMD_START_AP))
  4418. return -EINVAL;
  4419. } else
  4420. params.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
  4421. err = nl80211_crypto_settings(rdev, info, &params.crypto,
  4422. NL80211_MAX_NR_CIPHER_SUITES);
  4423. if (err)
  4424. return err;
  4425. if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) {
  4426. if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER))
  4427. return -EOPNOTSUPP;
  4428. params.inactivity_timeout = nla_get_u16(
  4429. info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]);
  4430. }
  4431. if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
  4432. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  4433. return -EINVAL;
  4434. params.p2p_ctwindow =
  4435. nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
  4436. if (params.p2p_ctwindow != 0 &&
  4437. !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
  4438. return -EINVAL;
  4439. }
  4440. if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
  4441. u8 tmp;
  4442. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  4443. return -EINVAL;
  4444. tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
  4445. params.p2p_opp_ps = tmp;
  4446. if (params.p2p_opp_ps != 0 &&
  4447. !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
  4448. return -EINVAL;
  4449. }
  4450. if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
  4451. err = nl80211_parse_chandef(rdev, info, &params.chandef);
  4452. if (err)
  4453. return err;
  4454. } else if (wdev->preset_chandef.chan) {
  4455. params.chandef = wdev->preset_chandef;
  4456. } else if (!nl80211_get_ap_channel(rdev, &params))
  4457. return -EINVAL;
  4458. if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef,
  4459. wdev->iftype))
  4460. return -EINVAL;
  4461. if (info->attrs[NL80211_ATTR_TX_RATES]) {
  4462. err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
  4463. NL80211_ATTR_TX_RATES,
  4464. &params.beacon_rate,
  4465. dev);
  4466. if (err)
  4467. return err;
  4468. err = validate_beacon_tx_rate(rdev, params.chandef.chan->band,
  4469. &params.beacon_rate);
  4470. if (err)
  4471. return err;
  4472. }
  4473. if (info->attrs[NL80211_ATTR_SMPS_MODE]) {
  4474. params.smps_mode =
  4475. nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]);
  4476. switch (params.smps_mode) {
  4477. case NL80211_SMPS_OFF:
  4478. break;
  4479. case NL80211_SMPS_STATIC:
  4480. if (!(rdev->wiphy.features &
  4481. NL80211_FEATURE_STATIC_SMPS))
  4482. return -EINVAL;
  4483. break;
  4484. case NL80211_SMPS_DYNAMIC:
  4485. if (!(rdev->wiphy.features &
  4486. NL80211_FEATURE_DYNAMIC_SMPS))
  4487. return -EINVAL;
  4488. break;
  4489. default:
  4490. return -EINVAL;
  4491. }
  4492. } else {
  4493. params.smps_mode = NL80211_SMPS_OFF;
  4494. }
  4495. params.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
  4496. if (params.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ])
  4497. return -EOPNOTSUPP;
  4498. if (info->attrs[NL80211_ATTR_ACL_POLICY]) {
  4499. params.acl = parse_acl_data(&rdev->wiphy, info);
  4500. if (IS_ERR(params.acl))
  4501. return PTR_ERR(params.acl);
  4502. }
  4503. params.twt_responder =
  4504. nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]);
  4505. if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) {
  4506. err = nl80211_parse_he_obss_pd(
  4507. info->attrs[NL80211_ATTR_HE_OBSS_PD],
  4508. &params.he_obss_pd);
  4509. if (err)
  4510. goto out;
  4511. }
  4512. if (info->attrs[NL80211_ATTR_HE_BSS_COLOR]) {
  4513. err = nl80211_parse_he_bss_color(
  4514. info->attrs[NL80211_ATTR_HE_BSS_COLOR],
  4515. &params.he_bss_color);
  4516. if (err)
  4517. goto out;
  4518. }
  4519. if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) {
  4520. err = nl80211_parse_fils_discovery(rdev,
  4521. info->attrs[NL80211_ATTR_FILS_DISCOVERY],
  4522. &params);
  4523. if (err)
  4524. goto out;
  4525. }
  4526. if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) {
  4527. err = nl80211_parse_unsol_bcast_probe_resp(
  4528. rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP],
  4529. &params);
  4530. if (err)
  4531. goto out;
  4532. }
  4533. nl80211_calculate_ap_params(&params);
  4534. if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])
  4535. params.flags |= AP_SETTINGS_EXTERNAL_AUTH_SUPPORT;
  4536. wdev_lock(wdev);
  4537. err = rdev_start_ap(rdev, dev, &params);
  4538. if (!err) {
  4539. wdev->preset_chandef = params.chandef;
  4540. wdev->beacon_interval = params.beacon_interval;
  4541. wdev->chandef = params.chandef;
  4542. wdev->ssid_len = params.ssid_len;
  4543. memcpy(wdev->ssid, params.ssid, wdev->ssid_len);
  4544. if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
  4545. wdev->conn_owner_nlportid = info->snd_portid;
  4546. }
  4547. wdev_unlock(wdev);
  4548. out:
  4549. kfree(params.acl);
  4550. return err;
  4551. }
  4552. static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
  4553. {
  4554. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  4555. struct net_device *dev = info->user_ptr[1];
  4556. struct wireless_dev *wdev = dev->ieee80211_ptr;
  4557. struct cfg80211_beacon_data params;
  4558. int err;
  4559. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  4560. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  4561. return -EOPNOTSUPP;
  4562. if (!rdev->ops->change_beacon)
  4563. return -EOPNOTSUPP;
  4564. if (!wdev->beacon_interval)
  4565. return -EINVAL;
  4566. err = nl80211_parse_beacon(rdev, info->attrs, &params);
  4567. if (err)
  4568. return err;
  4569. wdev_lock(wdev);
  4570. err = rdev_change_beacon(rdev, dev, &params);
  4571. wdev_unlock(wdev);
  4572. return err;
  4573. }
  4574. static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info)
  4575. {
  4576. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  4577. struct net_device *dev = info->user_ptr[1];
  4578. return cfg80211_stop_ap(rdev, dev, false);
  4579. }
  4580. static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = {
  4581. [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG },
  4582. [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG },
  4583. [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG },
  4584. [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG },
  4585. [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG },
  4586. [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG },
  4587. };
  4588. static int parse_station_flags(struct genl_info *info,
  4589. enum nl80211_iftype iftype,
  4590. struct station_parameters *params)
  4591. {
  4592. struct nlattr *flags[NL80211_STA_FLAG_MAX + 1];
  4593. struct nlattr *nla;
  4594. int flag;
  4595. /*
  4596. * Try parsing the new attribute first so userspace
  4597. * can specify both for older kernels.
  4598. */
  4599. nla = info->attrs[NL80211_ATTR_STA_FLAGS2];
  4600. if (nla) {
  4601. struct nl80211_sta_flag_update *sta_flags;
  4602. sta_flags = nla_data(nla);
  4603. params->sta_flags_mask = sta_flags->mask;
  4604. params->sta_flags_set = sta_flags->set;
  4605. params->sta_flags_set &= params->sta_flags_mask;
  4606. if ((params->sta_flags_mask |
  4607. params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID))
  4608. return -EINVAL;
  4609. return 0;
  4610. }
  4611. /* if present, parse the old attribute */
  4612. nla = info->attrs[NL80211_ATTR_STA_FLAGS];
  4613. if (!nla)
  4614. return 0;
  4615. if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack))
  4616. return -EINVAL;
  4617. /*
  4618. * Only allow certain flags for interface types so that
  4619. * other attributes are silently ignored. Remember that
  4620. * this is backward compatibility code with old userspace
  4621. * and shouldn't be hit in other cases anyway.
  4622. */
  4623. switch (iftype) {
  4624. case NL80211_IFTYPE_AP:
  4625. case NL80211_IFTYPE_AP_VLAN:
  4626. case NL80211_IFTYPE_P2P_GO:
  4627. params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
  4628. BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
  4629. BIT(NL80211_STA_FLAG_WME) |
  4630. BIT(NL80211_STA_FLAG_MFP);
  4631. break;
  4632. case NL80211_IFTYPE_P2P_CLIENT:
  4633. case NL80211_IFTYPE_STATION:
  4634. params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
  4635. BIT(NL80211_STA_FLAG_TDLS_PEER);
  4636. break;
  4637. case NL80211_IFTYPE_MESH_POINT:
  4638. params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
  4639. BIT(NL80211_STA_FLAG_MFP) |
  4640. BIT(NL80211_STA_FLAG_AUTHORIZED);
  4641. break;
  4642. default:
  4643. return -EINVAL;
  4644. }
  4645. for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) {
  4646. if (flags[flag]) {
  4647. params->sta_flags_set |= (1<<flag);
  4648. /* no longer support new API additions in old API */
  4649. if (flag > NL80211_STA_FLAG_MAX_OLD_API)
  4650. return -EINVAL;
  4651. }
  4652. }
  4653. return 0;
  4654. }
  4655. bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, int attr)
  4656. {
  4657. struct nlattr *rate;
  4658. u32 bitrate;
  4659. u16 bitrate_compat;
  4660. enum nl80211_rate_info rate_flg;
  4661. rate = nla_nest_start_noflag(msg, attr);
  4662. if (!rate)
  4663. return false;
  4664. /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
  4665. bitrate = cfg80211_calculate_bitrate(info);
  4666. /* report 16-bit bitrate only if we can */
  4667. bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0;
  4668. if (bitrate > 0 &&
  4669. nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate))
  4670. return false;
  4671. if (bitrate_compat > 0 &&
  4672. nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat))
  4673. return false;
  4674. switch (info->bw) {
  4675. case RATE_INFO_BW_5:
  4676. rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH;
  4677. break;
  4678. case RATE_INFO_BW_10:
  4679. rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH;
  4680. break;
  4681. default:
  4682. WARN_ON(1);
  4683. fallthrough;
  4684. case RATE_INFO_BW_20:
  4685. rate_flg = 0;
  4686. break;
  4687. case RATE_INFO_BW_40:
  4688. rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH;
  4689. break;
  4690. case RATE_INFO_BW_80:
  4691. rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH;
  4692. break;
  4693. case RATE_INFO_BW_160:
  4694. rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH;
  4695. break;
  4696. case RATE_INFO_BW_HE_RU:
  4697. rate_flg = 0;
  4698. WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS));
  4699. }
  4700. if (rate_flg && nla_put_flag(msg, rate_flg))
  4701. return false;
  4702. if (info->flags & RATE_INFO_FLAGS_MCS) {
  4703. if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs))
  4704. return false;
  4705. if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
  4706. nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
  4707. return false;
  4708. } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) {
  4709. if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs))
  4710. return false;
  4711. if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss))
  4712. return false;
  4713. if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
  4714. nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
  4715. return false;
  4716. } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) {
  4717. if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs))
  4718. return false;
  4719. if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss))
  4720. return false;
  4721. if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi))
  4722. return false;
  4723. if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm))
  4724. return false;
  4725. if (info->bw == RATE_INFO_BW_HE_RU &&
  4726. nla_put_u8(msg, NL80211_RATE_INFO_HE_RU_ALLOC,
  4727. info->he_ru_alloc))
  4728. return false;
  4729. }
  4730. nla_nest_end(msg, rate);
  4731. return true;
  4732. }
  4733. static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal,
  4734. int id)
  4735. {
  4736. void *attr;
  4737. int i = 0;
  4738. if (!mask)
  4739. return true;
  4740. attr = nla_nest_start_noflag(msg, id);
  4741. if (!attr)
  4742. return false;
  4743. for (i = 0; i < IEEE80211_MAX_CHAINS; i++) {
  4744. if (!(mask & BIT(i)))
  4745. continue;
  4746. if (nla_put_u8(msg, i, signal[i]))
  4747. return false;
  4748. }
  4749. nla_nest_end(msg, attr);
  4750. return true;
  4751. }
  4752. static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
  4753. u32 seq, int flags,
  4754. struct cfg80211_registered_device *rdev,
  4755. struct net_device *dev,
  4756. const u8 *mac_addr, struct station_info *sinfo)
  4757. {
  4758. void *hdr;
  4759. struct nlattr *sinfoattr, *bss_param;
  4760. hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
  4761. if (!hdr) {
  4762. cfg80211_sinfo_release_content(sinfo);
  4763. return -1;
  4764. }
  4765. if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
  4766. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
  4767. nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation))
  4768. goto nla_put_failure;
  4769. sinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_STA_INFO);
  4770. if (!sinfoattr)
  4771. goto nla_put_failure;
  4772. #define PUT_SINFO(attr, memb, type) do { \
  4773. BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \
  4774. if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \
  4775. nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \
  4776. sinfo->memb)) \
  4777. goto nla_put_failure; \
  4778. } while (0)
  4779. #define PUT_SINFO_U64(attr, memb) do { \
  4780. if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \
  4781. nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \
  4782. sinfo->memb, NL80211_STA_INFO_PAD)) \
  4783. goto nla_put_failure; \
  4784. } while (0)
  4785. PUT_SINFO(CONNECTED_TIME, connected_time, u32);
  4786. PUT_SINFO(INACTIVE_TIME, inactive_time, u32);
  4787. PUT_SINFO_U64(ASSOC_AT_BOOTTIME, assoc_at);
  4788. if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) |
  4789. BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) &&
  4790. nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES,
  4791. (u32)sinfo->rx_bytes))
  4792. goto nla_put_failure;
  4793. if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) |
  4794. BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) &&
  4795. nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES,
  4796. (u32)sinfo->tx_bytes))
  4797. goto nla_put_failure;
  4798. PUT_SINFO_U64(RX_BYTES64, rx_bytes);
  4799. PUT_SINFO_U64(TX_BYTES64, tx_bytes);
  4800. PUT_SINFO(LLID, llid, u16);
  4801. PUT_SINFO(PLID, plid, u16);
  4802. PUT_SINFO(PLINK_STATE, plink_state, u8);
  4803. PUT_SINFO_U64(RX_DURATION, rx_duration);
  4804. PUT_SINFO_U64(TX_DURATION, tx_duration);
  4805. if (wiphy_ext_feature_isset(&rdev->wiphy,
  4806. NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
  4807. PUT_SINFO(AIRTIME_WEIGHT, airtime_weight, u16);
  4808. switch (rdev->wiphy.signal_type) {
  4809. case CFG80211_SIGNAL_TYPE_MBM:
  4810. PUT_SINFO(SIGNAL, signal, u8);
  4811. PUT_SINFO(SIGNAL_AVG, signal_avg, u8);
  4812. break;
  4813. default:
  4814. break;
  4815. }
  4816. if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) {
  4817. if (!nl80211_put_signal(msg, sinfo->chains,
  4818. sinfo->chain_signal,
  4819. NL80211_STA_INFO_CHAIN_SIGNAL))
  4820. goto nla_put_failure;
  4821. }
  4822. if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) {
  4823. if (!nl80211_put_signal(msg, sinfo->chains,
  4824. sinfo->chain_signal_avg,
  4825. NL80211_STA_INFO_CHAIN_SIGNAL_AVG))
  4826. goto nla_put_failure;
  4827. }
  4828. if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) {
  4829. if (!nl80211_put_sta_rate(msg, &sinfo->txrate,
  4830. NL80211_STA_INFO_TX_BITRATE))
  4831. goto nla_put_failure;
  4832. }
  4833. if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) {
  4834. if (!nl80211_put_sta_rate(msg, &sinfo->rxrate,
  4835. NL80211_STA_INFO_RX_BITRATE))
  4836. goto nla_put_failure;
  4837. }
  4838. PUT_SINFO(RX_PACKETS, rx_packets, u32);
  4839. PUT_SINFO(TX_PACKETS, tx_packets, u32);
  4840. PUT_SINFO(TX_RETRIES, tx_retries, u32);
  4841. PUT_SINFO(TX_FAILED, tx_failed, u32);
  4842. PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32);
  4843. PUT_SINFO(AIRTIME_LINK_METRIC, airtime_link_metric, u32);
  4844. PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32);
  4845. PUT_SINFO(LOCAL_PM, local_pm, u32);
  4846. PUT_SINFO(PEER_PM, peer_pm, u32);
  4847. PUT_SINFO(NONPEER_PM, nonpeer_pm, u32);
  4848. PUT_SINFO(CONNECTED_TO_GATE, connected_to_gate, u8);
  4849. PUT_SINFO(CONNECTED_TO_AS, connected_to_as, u8);
  4850. if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) {
  4851. bss_param = nla_nest_start_noflag(msg,
  4852. NL80211_STA_INFO_BSS_PARAM);
  4853. if (!bss_param)
  4854. goto nla_put_failure;
  4855. if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) &&
  4856. nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) ||
  4857. ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) &&
  4858. nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) ||
  4859. ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) &&
  4860. nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) ||
  4861. nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD,
  4862. sinfo->bss_param.dtim_period) ||
  4863. nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL,
  4864. sinfo->bss_param.beacon_interval))
  4865. goto nla_put_failure;
  4866. nla_nest_end(msg, bss_param);
  4867. }
  4868. if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) &&
  4869. nla_put(msg, NL80211_STA_INFO_STA_FLAGS,
  4870. sizeof(struct nl80211_sta_flag_update),
  4871. &sinfo->sta_flags))
  4872. goto nla_put_failure;
  4873. PUT_SINFO_U64(T_OFFSET, t_offset);
  4874. PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc);
  4875. PUT_SINFO_U64(BEACON_RX, rx_beacon);
  4876. PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8);
  4877. PUT_SINFO(RX_MPDUS, rx_mpdu_count, u32);
  4878. PUT_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32);
  4879. if (wiphy_ext_feature_isset(&rdev->wiphy,
  4880. NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) {
  4881. PUT_SINFO(ACK_SIGNAL, ack_signal, u8);
  4882. PUT_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8);
  4883. }
  4884. #undef PUT_SINFO
  4885. #undef PUT_SINFO_U64
  4886. if (sinfo->pertid) {
  4887. struct nlattr *tidsattr;
  4888. int tid;
  4889. tidsattr = nla_nest_start_noflag(msg,
  4890. NL80211_STA_INFO_TID_STATS);
  4891. if (!tidsattr)
  4892. goto nla_put_failure;
  4893. for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) {
  4894. struct cfg80211_tid_stats *tidstats;
  4895. struct nlattr *tidattr;
  4896. tidstats = &sinfo->pertid[tid];
  4897. if (!tidstats->filled)
  4898. continue;
  4899. tidattr = nla_nest_start_noflag(msg, tid + 1);
  4900. if (!tidattr)
  4901. goto nla_put_failure;
  4902. #define PUT_TIDVAL_U64(attr, memb) do { \
  4903. if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \
  4904. nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \
  4905. tidstats->memb, NL80211_TID_STATS_PAD)) \
  4906. goto nla_put_failure; \
  4907. } while (0)
  4908. PUT_TIDVAL_U64(RX_MSDU, rx_msdu);
  4909. PUT_TIDVAL_U64(TX_MSDU, tx_msdu);
  4910. PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries);
  4911. PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed);
  4912. #undef PUT_TIDVAL_U64
  4913. if ((tidstats->filled &
  4914. BIT(NL80211_TID_STATS_TXQ_STATS)) &&
  4915. !nl80211_put_txq_stats(msg, &tidstats->txq_stats,
  4916. NL80211_TID_STATS_TXQ_STATS))
  4917. goto nla_put_failure;
  4918. nla_nest_end(msg, tidattr);
  4919. }
  4920. nla_nest_end(msg, tidsattr);
  4921. }
  4922. nla_nest_end(msg, sinfoattr);
  4923. if (sinfo->assoc_req_ies_len &&
  4924. nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len,
  4925. sinfo->assoc_req_ies))
  4926. goto nla_put_failure;
  4927. cfg80211_sinfo_release_content(sinfo);
  4928. genlmsg_end(msg, hdr);
  4929. return 0;
  4930. nla_put_failure:
  4931. cfg80211_sinfo_release_content(sinfo);
  4932. genlmsg_cancel(msg, hdr);
  4933. return -EMSGSIZE;
  4934. }
  4935. static int nl80211_dump_station(struct sk_buff *skb,
  4936. struct netlink_callback *cb)
  4937. {
  4938. struct station_info sinfo;
  4939. struct cfg80211_registered_device *rdev;
  4940. struct wireless_dev *wdev;
  4941. u8 mac_addr[ETH_ALEN];
  4942. int sta_idx = cb->args[2];
  4943. int err;
  4944. rtnl_lock();
  4945. err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
  4946. if (err)
  4947. goto out_err;
  4948. if (!wdev->netdev) {
  4949. err = -EINVAL;
  4950. goto out_err;
  4951. }
  4952. if (!rdev->ops->dump_station) {
  4953. err = -EOPNOTSUPP;
  4954. goto out_err;
  4955. }
  4956. while (1) {
  4957. memset(&sinfo, 0, sizeof(sinfo));
  4958. err = rdev_dump_station(rdev, wdev->netdev, sta_idx,
  4959. mac_addr, &sinfo);
  4960. if (err == -ENOENT)
  4961. break;
  4962. if (err)
  4963. goto out_err;
  4964. if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION,
  4965. NETLINK_CB(cb->skb).portid,
  4966. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  4967. rdev, wdev->netdev, mac_addr,
  4968. &sinfo) < 0)
  4969. goto out;
  4970. sta_idx++;
  4971. }
  4972. out:
  4973. cb->args[2] = sta_idx;
  4974. err = skb->len;
  4975. out_err:
  4976. rtnl_unlock();
  4977. return err;
  4978. }
  4979. static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
  4980. {
  4981. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  4982. struct net_device *dev = info->user_ptr[1];
  4983. struct station_info sinfo;
  4984. struct sk_buff *msg;
  4985. u8 *mac_addr = NULL;
  4986. int err;
  4987. memset(&sinfo, 0, sizeof(sinfo));
  4988. if (!info->attrs[NL80211_ATTR_MAC])
  4989. return -EINVAL;
  4990. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  4991. if (!rdev->ops->get_station)
  4992. return -EOPNOTSUPP;
  4993. err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
  4994. if (err)
  4995. return err;
  4996. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  4997. if (!msg) {
  4998. cfg80211_sinfo_release_content(&sinfo);
  4999. return -ENOMEM;
  5000. }
  5001. if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION,
  5002. info->snd_portid, info->snd_seq, 0,
  5003. rdev, dev, mac_addr, &sinfo) < 0) {
  5004. nlmsg_free(msg);
  5005. return -ENOBUFS;
  5006. }
  5007. return genlmsg_reply(msg, info);
  5008. }
  5009. int cfg80211_check_station_change(struct wiphy *wiphy,
  5010. struct station_parameters *params,
  5011. enum cfg80211_station_type statype)
  5012. {
  5013. if (params->listen_interval != -1 &&
  5014. statype != CFG80211_STA_AP_CLIENT_UNASSOC)
  5015. return -EINVAL;
  5016. if (params->support_p2p_ps != -1 &&
  5017. statype != CFG80211_STA_AP_CLIENT_UNASSOC)
  5018. return -EINVAL;
  5019. if (params->aid &&
  5020. !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) &&
  5021. statype != CFG80211_STA_AP_CLIENT_UNASSOC)
  5022. return -EINVAL;
  5023. /* When you run into this, adjust the code below for the new flag */
  5024. BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
  5025. switch (statype) {
  5026. case CFG80211_STA_MESH_PEER_KERNEL:
  5027. case CFG80211_STA_MESH_PEER_USER:
  5028. /*
  5029. * No ignoring the TDLS flag here -- the userspace mesh
  5030. * code doesn't have the bug of including TDLS in the
  5031. * mask everywhere.
  5032. */
  5033. if (params->sta_flags_mask &
  5034. ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
  5035. BIT(NL80211_STA_FLAG_MFP) |
  5036. BIT(NL80211_STA_FLAG_AUTHORIZED)))
  5037. return -EINVAL;
  5038. break;
  5039. case CFG80211_STA_TDLS_PEER_SETUP:
  5040. case CFG80211_STA_TDLS_PEER_ACTIVE:
  5041. if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
  5042. return -EINVAL;
  5043. /* ignore since it can't change */
  5044. params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
  5045. break;
  5046. default:
  5047. /* disallow mesh-specific things */
  5048. if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION)
  5049. return -EINVAL;
  5050. if (params->local_pm)
  5051. return -EINVAL;
  5052. if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
  5053. return -EINVAL;
  5054. }
  5055. if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
  5056. statype != CFG80211_STA_TDLS_PEER_ACTIVE) {
  5057. /* TDLS can't be set, ... */
  5058. if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
  5059. return -EINVAL;
  5060. /*
  5061. * ... but don't bother the driver with it. This works around
  5062. * a hostapd/wpa_supplicant issue -- it always includes the
  5063. * TLDS_PEER flag in the mask even for AP mode.
  5064. */
  5065. params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
  5066. }
  5067. if (statype != CFG80211_STA_TDLS_PEER_SETUP &&
  5068. statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
  5069. /* reject other things that can't change */
  5070. if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD)
  5071. return -EINVAL;
  5072. if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY)
  5073. return -EINVAL;
  5074. if (params->supported_rates)
  5075. return -EINVAL;
  5076. if (params->ext_capab || params->ht_capa || params->vht_capa ||
  5077. params->he_capa)
  5078. return -EINVAL;
  5079. }
  5080. if (statype != CFG80211_STA_AP_CLIENT &&
  5081. statype != CFG80211_STA_AP_CLIENT_UNASSOC) {
  5082. if (params->vlan)
  5083. return -EINVAL;
  5084. }
  5085. switch (statype) {
  5086. case CFG80211_STA_AP_MLME_CLIENT:
  5087. /* Use this only for authorizing/unauthorizing a station */
  5088. if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)))
  5089. return -EOPNOTSUPP;
  5090. break;
  5091. case CFG80211_STA_AP_CLIENT:
  5092. case CFG80211_STA_AP_CLIENT_UNASSOC:
  5093. /* accept only the listed bits */
  5094. if (params->sta_flags_mask &
  5095. ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
  5096. BIT(NL80211_STA_FLAG_AUTHENTICATED) |
  5097. BIT(NL80211_STA_FLAG_ASSOCIATED) |
  5098. BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
  5099. BIT(NL80211_STA_FLAG_WME) |
  5100. BIT(NL80211_STA_FLAG_MFP)))
  5101. return -EINVAL;
  5102. /* but authenticated/associated only if driver handles it */
  5103. if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
  5104. params->sta_flags_mask &
  5105. (BIT(NL80211_STA_FLAG_AUTHENTICATED) |
  5106. BIT(NL80211_STA_FLAG_ASSOCIATED)))
  5107. return -EINVAL;
  5108. break;
  5109. case CFG80211_STA_IBSS:
  5110. case CFG80211_STA_AP_STA:
  5111. /* reject any changes other than AUTHORIZED */
  5112. if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED))
  5113. return -EINVAL;
  5114. break;
  5115. case CFG80211_STA_TDLS_PEER_SETUP:
  5116. /* reject any changes other than AUTHORIZED or WME */
  5117. if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
  5118. BIT(NL80211_STA_FLAG_WME)))
  5119. return -EINVAL;
  5120. /* force (at least) rates when authorizing */
  5121. if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) &&
  5122. !params->supported_rates)
  5123. return -EINVAL;
  5124. break;
  5125. case CFG80211_STA_TDLS_PEER_ACTIVE:
  5126. /* reject any changes */
  5127. return -EINVAL;
  5128. case CFG80211_STA_MESH_PEER_KERNEL:
  5129. if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE)
  5130. return -EINVAL;
  5131. break;
  5132. case CFG80211_STA_MESH_PEER_USER:
  5133. if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION &&
  5134. params->plink_action != NL80211_PLINK_ACTION_BLOCK)
  5135. return -EINVAL;
  5136. break;
  5137. }
  5138. /*
  5139. * Older kernel versions ignored this attribute entirely, so don't
  5140. * reject attempts to update it but mark it as unused instead so the
  5141. * driver won't look at the data.
  5142. */
  5143. if (statype != CFG80211_STA_AP_CLIENT_UNASSOC &&
  5144. statype != CFG80211_STA_TDLS_PEER_SETUP)
  5145. params->opmode_notif_used = false;
  5146. return 0;
  5147. }
  5148. EXPORT_SYMBOL(cfg80211_check_station_change);
  5149. /*
  5150. * Get vlan interface making sure it is running and on the right wiphy.
  5151. */
  5152. static struct net_device *get_vlan(struct genl_info *info,
  5153. struct cfg80211_registered_device *rdev)
  5154. {
  5155. struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN];
  5156. struct net_device *v;
  5157. int ret;
  5158. if (!vlanattr)
  5159. return NULL;
  5160. v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr));
  5161. if (!v)
  5162. return ERR_PTR(-ENODEV);
  5163. if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) {
  5164. ret = -EINVAL;
  5165. goto error;
  5166. }
  5167. if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
  5168. v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  5169. v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
  5170. ret = -EINVAL;
  5171. goto error;
  5172. }
  5173. if (!netif_running(v)) {
  5174. ret = -ENETDOWN;
  5175. goto error;
  5176. }
  5177. return v;
  5178. error:
  5179. dev_put(v);
  5180. return ERR_PTR(ret);
  5181. }
  5182. static const struct nla_policy
  5183. nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = {
  5184. [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 },
  5185. [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 },
  5186. };
  5187. static int nl80211_parse_sta_wme(struct genl_info *info,
  5188. struct station_parameters *params)
  5189. {
  5190. struct nlattr *tb[NL80211_STA_WME_MAX + 1];
  5191. struct nlattr *nla;
  5192. int err;
  5193. /* parse WME attributes if present */
  5194. if (!info->attrs[NL80211_ATTR_STA_WME])
  5195. return 0;
  5196. nla = info->attrs[NL80211_ATTR_STA_WME];
  5197. err = nla_parse_nested_deprecated(tb, NL80211_STA_WME_MAX, nla,
  5198. nl80211_sta_wme_policy,
  5199. info->extack);
  5200. if (err)
  5201. return err;
  5202. if (tb[NL80211_STA_WME_UAPSD_QUEUES])
  5203. params->uapsd_queues = nla_get_u8(
  5204. tb[NL80211_STA_WME_UAPSD_QUEUES]);
  5205. if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK)
  5206. return -EINVAL;
  5207. if (tb[NL80211_STA_WME_MAX_SP])
  5208. params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]);
  5209. if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK)
  5210. return -EINVAL;
  5211. params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD;
  5212. return 0;
  5213. }
  5214. static int nl80211_parse_sta_channel_info(struct genl_info *info,
  5215. struct station_parameters *params)
  5216. {
  5217. if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
  5218. params->supported_channels =
  5219. nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
  5220. params->supported_channels_len =
  5221. nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
  5222. /*
  5223. * Need to include at least one (first channel, number of
  5224. * channels) tuple for each subband (checked in policy),
  5225. * and must have proper tuples for the rest of the data as well.
  5226. */
  5227. if (params->supported_channels_len % 2)
  5228. return -EINVAL;
  5229. }
  5230. if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
  5231. params->supported_oper_classes =
  5232. nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
  5233. params->supported_oper_classes_len =
  5234. nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
  5235. }
  5236. return 0;
  5237. }
  5238. static int nl80211_set_station_tdls(struct genl_info *info,
  5239. struct station_parameters *params)
  5240. {
  5241. int err;
  5242. /* Dummy STA entry gets updated once the peer capabilities are known */
  5243. if (info->attrs[NL80211_ATTR_PEER_AID])
  5244. params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
  5245. if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
  5246. params->ht_capa =
  5247. nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
  5248. if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
  5249. params->vht_capa =
  5250. nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
  5251. if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) {
  5252. params->he_capa =
  5253. nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
  5254. params->he_capa_len =
  5255. nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
  5256. }
  5257. err = nl80211_parse_sta_channel_info(info, params);
  5258. if (err)
  5259. return err;
  5260. return nl80211_parse_sta_wme(info, params);
  5261. }
  5262. static int nl80211_parse_sta_txpower_setting(struct genl_info *info,
  5263. struct station_parameters *params)
  5264. {
  5265. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  5266. int idx;
  5267. if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) {
  5268. if (!rdev->ops->set_tx_power ||
  5269. !wiphy_ext_feature_isset(&rdev->wiphy,
  5270. NL80211_EXT_FEATURE_STA_TX_PWR))
  5271. return -EOPNOTSUPP;
  5272. idx = NL80211_ATTR_STA_TX_POWER_SETTING;
  5273. params->txpwr.type = nla_get_u8(info->attrs[idx]);
  5274. if (params->txpwr.type == NL80211_TX_POWER_LIMITED) {
  5275. idx = NL80211_ATTR_STA_TX_POWER;
  5276. if (info->attrs[idx])
  5277. params->txpwr.power =
  5278. nla_get_s16(info->attrs[idx]);
  5279. else
  5280. return -EINVAL;
  5281. }
  5282. params->sta_modify_mask |= STATION_PARAM_APPLY_STA_TXPOWER;
  5283. }
  5284. return 0;
  5285. }
  5286. static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
  5287. {
  5288. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  5289. struct net_device *dev = info->user_ptr[1];
  5290. struct station_parameters params;
  5291. u8 *mac_addr;
  5292. int err;
  5293. memset(&params, 0, sizeof(params));
  5294. if (!rdev->ops->change_station)
  5295. return -EOPNOTSUPP;
  5296. /*
  5297. * AID and listen_interval properties can be set only for unassociated
  5298. * station. Include these parameters here and will check them in
  5299. * cfg80211_check_station_change().
  5300. */
  5301. if (info->attrs[NL80211_ATTR_STA_AID])
  5302. params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
  5303. if (info->attrs[NL80211_ATTR_VLAN_ID])
  5304. params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
  5305. if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
  5306. params.listen_interval =
  5307. nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
  5308. else
  5309. params.listen_interval = -1;
  5310. if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS])
  5311. params.support_p2p_ps =
  5312. nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
  5313. else
  5314. params.support_p2p_ps = -1;
  5315. if (!info->attrs[NL80211_ATTR_MAC])
  5316. return -EINVAL;
  5317. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  5318. if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
  5319. params.supported_rates =
  5320. nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
  5321. params.supported_rates_len =
  5322. nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
  5323. }
  5324. if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
  5325. params.capability =
  5326. nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
  5327. params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
  5328. }
  5329. if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
  5330. params.ext_capab =
  5331. nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
  5332. params.ext_capab_len =
  5333. nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
  5334. }
  5335. if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
  5336. return -EINVAL;
  5337. if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
  5338. params.plink_action =
  5339. nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
  5340. if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) {
  5341. params.plink_state =
  5342. nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]);
  5343. if (info->attrs[NL80211_ATTR_MESH_PEER_AID])
  5344. params.peer_aid = nla_get_u16(
  5345. info->attrs[NL80211_ATTR_MESH_PEER_AID]);
  5346. params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE;
  5347. }
  5348. if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE])
  5349. params.local_pm = nla_get_u32(
  5350. info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]);
  5351. if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
  5352. params.opmode_notif_used = true;
  5353. params.opmode_notif =
  5354. nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
  5355. }
  5356. if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY])
  5357. params.he_6ghz_capa =
  5358. nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]);
  5359. if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT])
  5360. params.airtime_weight =
  5361. nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]);
  5362. if (params.airtime_weight &&
  5363. !wiphy_ext_feature_isset(&rdev->wiphy,
  5364. NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
  5365. return -EOPNOTSUPP;
  5366. err = nl80211_parse_sta_txpower_setting(info, &params);
  5367. if (err)
  5368. return err;
  5369. /* Include parameters for TDLS peer (will check later) */
  5370. err = nl80211_set_station_tdls(info, &params);
  5371. if (err)
  5372. return err;
  5373. params.vlan = get_vlan(info, rdev);
  5374. if (IS_ERR(params.vlan))
  5375. return PTR_ERR(params.vlan);
  5376. switch (dev->ieee80211_ptr->iftype) {
  5377. case NL80211_IFTYPE_AP:
  5378. case NL80211_IFTYPE_AP_VLAN:
  5379. case NL80211_IFTYPE_P2P_GO:
  5380. case NL80211_IFTYPE_P2P_CLIENT:
  5381. case NL80211_IFTYPE_STATION:
  5382. case NL80211_IFTYPE_ADHOC:
  5383. case NL80211_IFTYPE_MESH_POINT:
  5384. break;
  5385. default:
  5386. err = -EOPNOTSUPP;
  5387. goto out_put_vlan;
  5388. }
  5389. /* driver will call cfg80211_check_station_change() */
  5390. err = rdev_change_station(rdev, dev, mac_addr, &params);
  5391. out_put_vlan:
  5392. if (params.vlan)
  5393. dev_put(params.vlan);
  5394. return err;
  5395. }
  5396. static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
  5397. {
  5398. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  5399. int err;
  5400. struct net_device *dev = info->user_ptr[1];
  5401. struct station_parameters params;
  5402. u8 *mac_addr = NULL;
  5403. u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
  5404. BIT(NL80211_STA_FLAG_ASSOCIATED);
  5405. memset(&params, 0, sizeof(params));
  5406. if (!rdev->ops->add_station)
  5407. return -EOPNOTSUPP;
  5408. if (!info->attrs[NL80211_ATTR_MAC])
  5409. return -EINVAL;
  5410. if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
  5411. return -EINVAL;
  5412. if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
  5413. return -EINVAL;
  5414. if (!info->attrs[NL80211_ATTR_STA_AID] &&
  5415. !info->attrs[NL80211_ATTR_PEER_AID])
  5416. return -EINVAL;
  5417. mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  5418. params.supported_rates =
  5419. nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
  5420. params.supported_rates_len =
  5421. nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
  5422. params.listen_interval =
  5423. nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
  5424. if (info->attrs[NL80211_ATTR_VLAN_ID])
  5425. params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
  5426. if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
  5427. params.support_p2p_ps =
  5428. nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
  5429. } else {
  5430. /*
  5431. * if not specified, assume it's supported for P2P GO interface,
  5432. * and is NOT supported for AP interface
  5433. */
  5434. params.support_p2p_ps =
  5435. dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO;
  5436. }
  5437. if (info->attrs[NL80211_ATTR_PEER_AID])
  5438. params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
  5439. else
  5440. params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
  5441. if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
  5442. params.capability =
  5443. nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
  5444. params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY;
  5445. }
  5446. if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
  5447. params.ext_capab =
  5448. nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
  5449. params.ext_capab_len =
  5450. nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
  5451. }
  5452. if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
  5453. params.ht_capa =
  5454. nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
  5455. if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
  5456. params.vht_capa =
  5457. nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
  5458. if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) {
  5459. params.he_capa =
  5460. nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
  5461. params.he_capa_len =
  5462. nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
  5463. }
  5464. if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY])
  5465. params.he_6ghz_capa =
  5466. nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]);
  5467. if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
  5468. params.opmode_notif_used = true;
  5469. params.opmode_notif =
  5470. nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
  5471. }
  5472. if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
  5473. params.plink_action =
  5474. nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
  5475. if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT])
  5476. params.airtime_weight =
  5477. nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]);
  5478. if (params.airtime_weight &&
  5479. !wiphy_ext_feature_isset(&rdev->wiphy,
  5480. NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
  5481. return -EOPNOTSUPP;
  5482. err = nl80211_parse_sta_txpower_setting(info, &params);
  5483. if (err)
  5484. return err;
  5485. err = nl80211_parse_sta_channel_info(info, &params);
  5486. if (err)
  5487. return err;
  5488. err = nl80211_parse_sta_wme(info, &params);
  5489. if (err)
  5490. return err;
  5491. if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
  5492. return -EINVAL;
  5493. /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT
  5494. * as userspace might just pass through the capabilities from the IEs
  5495. * directly, rather than enforcing this restriction and returning an
  5496. * error in this case.
  5497. */
  5498. if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) {
  5499. params.ht_capa = NULL;
  5500. params.vht_capa = NULL;
  5501. /* HE requires WME */
  5502. if (params.he_capa_len || params.he_6ghz_capa)
  5503. return -EINVAL;
  5504. }
  5505. /* Ensure that HT/VHT capabilities are not set for 6 GHz HE STA */
  5506. if (params.he_6ghz_capa && (params.ht_capa || params.vht_capa))
  5507. return -EINVAL;
  5508. /* When you run into this, adjust the code below for the new flag */
  5509. BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7);
  5510. switch (dev->ieee80211_ptr->iftype) {
  5511. case NL80211_IFTYPE_AP:
  5512. case NL80211_IFTYPE_AP_VLAN:
  5513. case NL80211_IFTYPE_P2P_GO:
  5514. /* ignore WME attributes if iface/sta is not capable */
  5515. if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) ||
  5516. !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME)))
  5517. params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
  5518. /* TDLS peers cannot be added */
  5519. if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
  5520. info->attrs[NL80211_ATTR_PEER_AID])
  5521. return -EINVAL;
  5522. /* but don't bother the driver with it */
  5523. params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
  5524. /* allow authenticated/associated only if driver handles it */
  5525. if (!(rdev->wiphy.features &
  5526. NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
  5527. params.sta_flags_mask & auth_assoc)
  5528. return -EINVAL;
  5529. /* Older userspace, or userspace wanting to be compatible with
  5530. * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth
  5531. * and assoc flags in the mask, but assumes the station will be
  5532. * added as associated anyway since this was the required driver
  5533. * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was
  5534. * introduced.
  5535. * In order to not bother drivers with this quirk in the API
  5536. * set the flags in both the mask and set for new stations in
  5537. * this case.
  5538. */
  5539. if (!(params.sta_flags_mask & auth_assoc)) {
  5540. params.sta_flags_mask |= auth_assoc;
  5541. params.sta_flags_set |= auth_assoc;
  5542. }
  5543. /* must be last in here for error handling */
  5544. params.vlan = get_vlan(info, rdev);
  5545. if (IS_ERR(params.vlan))
  5546. return PTR_ERR(params.vlan);
  5547. break;
  5548. case NL80211_IFTYPE_MESH_POINT:
  5549. /* ignore uAPSD data */
  5550. params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
  5551. /* associated is disallowed */
  5552. if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED))
  5553. return -EINVAL;
  5554. /* TDLS peers cannot be added */
  5555. if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
  5556. info->attrs[NL80211_ATTR_PEER_AID])
  5557. return -EINVAL;
  5558. break;
  5559. case NL80211_IFTYPE_STATION:
  5560. case NL80211_IFTYPE_P2P_CLIENT:
  5561. /* ignore uAPSD data */
  5562. params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD;
  5563. /* these are disallowed */
  5564. if (params.sta_flags_mask &
  5565. (BIT(NL80211_STA_FLAG_ASSOCIATED) |
  5566. BIT(NL80211_STA_FLAG_AUTHENTICATED)))
  5567. return -EINVAL;
  5568. /* Only TDLS peers can be added */
  5569. if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
  5570. return -EINVAL;
  5571. /* Can only add if TDLS ... */
  5572. if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS))
  5573. return -EOPNOTSUPP;
  5574. /* ... with external setup is supported */
  5575. if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP))
  5576. return -EOPNOTSUPP;
  5577. /*
  5578. * Older wpa_supplicant versions always mark the TDLS peer
  5579. * as authorized, but it shouldn't yet be.
  5580. */
  5581. params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED);
  5582. break;
  5583. default:
  5584. return -EOPNOTSUPP;
  5585. }
  5586. /* be aware of params.vlan when changing code here */
  5587. err = rdev_add_station(rdev, dev, mac_addr, &params);
  5588. if (params.vlan)
  5589. dev_put(params.vlan);
  5590. return err;
  5591. }
  5592. static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
  5593. {
  5594. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  5595. struct net_device *dev = info->user_ptr[1];
  5596. struct station_del_parameters params;
  5597. memset(&params, 0, sizeof(params));
  5598. if (info->attrs[NL80211_ATTR_MAC])
  5599. params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]);
  5600. switch (dev->ieee80211_ptr->iftype) {
  5601. case NL80211_IFTYPE_AP:
  5602. case NL80211_IFTYPE_AP_VLAN:
  5603. case NL80211_IFTYPE_MESH_POINT:
  5604. case NL80211_IFTYPE_P2P_GO:
  5605. /* always accept these */
  5606. break;
  5607. case NL80211_IFTYPE_ADHOC:
  5608. /* conditionally accept */
  5609. if (wiphy_ext_feature_isset(&rdev->wiphy,
  5610. NL80211_EXT_FEATURE_DEL_IBSS_STA))
  5611. break;
  5612. return -EINVAL;
  5613. default:
  5614. return -EINVAL;
  5615. }
  5616. if (!rdev->ops->del_station)
  5617. return -EOPNOTSUPP;
  5618. if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) {
  5619. params.subtype =
  5620. nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]);
  5621. if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 &&
  5622. params.subtype != IEEE80211_STYPE_DEAUTH >> 4)
  5623. return -EINVAL;
  5624. } else {
  5625. /* Default to Deauthentication frame */
  5626. params.subtype = IEEE80211_STYPE_DEAUTH >> 4;
  5627. }
  5628. if (info->attrs[NL80211_ATTR_REASON_CODE]) {
  5629. params.reason_code =
  5630. nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
  5631. if (params.reason_code == 0)
  5632. return -EINVAL; /* 0 is reserved */
  5633. } else {
  5634. /* Default to reason code 2 */
  5635. params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID;
  5636. }
  5637. return rdev_del_station(rdev, dev, &params);
  5638. }
  5639. static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq,
  5640. int flags, struct net_device *dev,
  5641. u8 *dst, u8 *next_hop,
  5642. struct mpath_info *pinfo)
  5643. {
  5644. void *hdr;
  5645. struct nlattr *pinfoattr;
  5646. hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH);
  5647. if (!hdr)
  5648. return -1;
  5649. if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
  5650. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) ||
  5651. nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) ||
  5652. nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation))
  5653. goto nla_put_failure;
  5654. pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MPATH_INFO);
  5655. if (!pinfoattr)
  5656. goto nla_put_failure;
  5657. if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) &&
  5658. nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN,
  5659. pinfo->frame_qlen))
  5660. goto nla_put_failure;
  5661. if (((pinfo->filled & MPATH_INFO_SN) &&
  5662. nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) ||
  5663. ((pinfo->filled & MPATH_INFO_METRIC) &&
  5664. nla_put_u32(msg, NL80211_MPATH_INFO_METRIC,
  5665. pinfo->metric)) ||
  5666. ((pinfo->filled & MPATH_INFO_EXPTIME) &&
  5667. nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME,
  5668. pinfo->exptime)) ||
  5669. ((pinfo->filled & MPATH_INFO_FLAGS) &&
  5670. nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS,
  5671. pinfo->flags)) ||
  5672. ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) &&
  5673. nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
  5674. pinfo->discovery_timeout)) ||
  5675. ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) &&
  5676. nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES,
  5677. pinfo->discovery_retries)) ||
  5678. ((pinfo->filled & MPATH_INFO_HOP_COUNT) &&
  5679. nla_put_u8(msg, NL80211_MPATH_INFO_HOP_COUNT,
  5680. pinfo->hop_count)) ||
  5681. ((pinfo->filled & MPATH_INFO_PATH_CHANGE) &&
  5682. nla_put_u32(msg, NL80211_MPATH_INFO_PATH_CHANGE,
  5683. pinfo->path_change_count)))
  5684. goto nla_put_failure;
  5685. nla_nest_end(msg, pinfoattr);
  5686. genlmsg_end(msg, hdr);
  5687. return 0;
  5688. nla_put_failure:
  5689. genlmsg_cancel(msg, hdr);
  5690. return -EMSGSIZE;
  5691. }
  5692. static int nl80211_dump_mpath(struct sk_buff *skb,
  5693. struct netlink_callback *cb)
  5694. {
  5695. struct mpath_info pinfo;
  5696. struct cfg80211_registered_device *rdev;
  5697. struct wireless_dev *wdev;
  5698. u8 dst[ETH_ALEN];
  5699. u8 next_hop[ETH_ALEN];
  5700. int path_idx = cb->args[2];
  5701. int err;
  5702. rtnl_lock();
  5703. err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
  5704. if (err)
  5705. goto out_err;
  5706. if (!rdev->ops->dump_mpath) {
  5707. err = -EOPNOTSUPP;
  5708. goto out_err;
  5709. }
  5710. if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
  5711. err = -EOPNOTSUPP;
  5712. goto out_err;
  5713. }
  5714. while (1) {
  5715. err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst,
  5716. next_hop, &pinfo);
  5717. if (err == -ENOENT)
  5718. break;
  5719. if (err)
  5720. goto out_err;
  5721. if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
  5722. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  5723. wdev->netdev, dst, next_hop,
  5724. &pinfo) < 0)
  5725. goto out;
  5726. path_idx++;
  5727. }
  5728. out:
  5729. cb->args[2] = path_idx;
  5730. err = skb->len;
  5731. out_err:
  5732. rtnl_unlock();
  5733. return err;
  5734. }
  5735. static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info)
  5736. {
  5737. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  5738. int err;
  5739. struct net_device *dev = info->user_ptr[1];
  5740. struct mpath_info pinfo;
  5741. struct sk_buff *msg;
  5742. u8 *dst = NULL;
  5743. u8 next_hop[ETH_ALEN];
  5744. memset(&pinfo, 0, sizeof(pinfo));
  5745. if (!info->attrs[NL80211_ATTR_MAC])
  5746. return -EINVAL;
  5747. dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
  5748. if (!rdev->ops->get_mpath)
  5749. return -EOPNOTSUPP;
  5750. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
  5751. return -EOPNOTSUPP;
  5752. err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo);
  5753. if (err)
  5754. return err;
  5755. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  5756. if (!msg)
  5757. return -ENOMEM;
  5758. if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
  5759. dev, dst, next_hop, &pinfo) < 0) {
  5760. nlmsg_free(msg);
  5761. return -ENOBUFS;
  5762. }
  5763. return genlmsg_reply(msg, info);
  5764. }
  5765. static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info)
  5766. {
  5767. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  5768. struct net_device *dev = info->user_ptr[1];
  5769. u8 *dst = NULL;
  5770. u8 *next_hop = NULL;
  5771. if (!info->attrs[NL80211_ATTR_MAC])
  5772. return -EINVAL;
  5773. if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
  5774. return -EINVAL;
  5775. dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
  5776. next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
  5777. if (!rdev->ops->change_mpath)
  5778. return -EOPNOTSUPP;
  5779. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
  5780. return -EOPNOTSUPP;
  5781. return rdev_change_mpath(rdev, dev, dst, next_hop);
  5782. }
  5783. static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info)
  5784. {
  5785. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  5786. struct net_device *dev = info->user_ptr[1];
  5787. u8 *dst = NULL;
  5788. u8 *next_hop = NULL;
  5789. if (!info->attrs[NL80211_ATTR_MAC])
  5790. return -EINVAL;
  5791. if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
  5792. return -EINVAL;
  5793. dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
  5794. next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
  5795. if (!rdev->ops->add_mpath)
  5796. return -EOPNOTSUPP;
  5797. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
  5798. return -EOPNOTSUPP;
  5799. return rdev_add_mpath(rdev, dev, dst, next_hop);
  5800. }
  5801. static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
  5802. {
  5803. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  5804. struct net_device *dev = info->user_ptr[1];
  5805. u8 *dst = NULL;
  5806. if (info->attrs[NL80211_ATTR_MAC])
  5807. dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
  5808. if (!rdev->ops->del_mpath)
  5809. return -EOPNOTSUPP;
  5810. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
  5811. return -EOPNOTSUPP;
  5812. return rdev_del_mpath(rdev, dev, dst);
  5813. }
  5814. static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info)
  5815. {
  5816. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  5817. int err;
  5818. struct net_device *dev = info->user_ptr[1];
  5819. struct mpath_info pinfo;
  5820. struct sk_buff *msg;
  5821. u8 *dst = NULL;
  5822. u8 mpp[ETH_ALEN];
  5823. memset(&pinfo, 0, sizeof(pinfo));
  5824. if (!info->attrs[NL80211_ATTR_MAC])
  5825. return -EINVAL;
  5826. dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
  5827. if (!rdev->ops->get_mpp)
  5828. return -EOPNOTSUPP;
  5829. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
  5830. return -EOPNOTSUPP;
  5831. err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo);
  5832. if (err)
  5833. return err;
  5834. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  5835. if (!msg)
  5836. return -ENOMEM;
  5837. if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
  5838. dev, dst, mpp, &pinfo) < 0) {
  5839. nlmsg_free(msg);
  5840. return -ENOBUFS;
  5841. }
  5842. return genlmsg_reply(msg, info);
  5843. }
  5844. static int nl80211_dump_mpp(struct sk_buff *skb,
  5845. struct netlink_callback *cb)
  5846. {
  5847. struct mpath_info pinfo;
  5848. struct cfg80211_registered_device *rdev;
  5849. struct wireless_dev *wdev;
  5850. u8 dst[ETH_ALEN];
  5851. u8 mpp[ETH_ALEN];
  5852. int path_idx = cb->args[2];
  5853. int err;
  5854. rtnl_lock();
  5855. err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
  5856. if (err)
  5857. goto out_err;
  5858. if (!rdev->ops->dump_mpp) {
  5859. err = -EOPNOTSUPP;
  5860. goto out_err;
  5861. }
  5862. if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) {
  5863. err = -EOPNOTSUPP;
  5864. goto out_err;
  5865. }
  5866. while (1) {
  5867. err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst,
  5868. mpp, &pinfo);
  5869. if (err == -ENOENT)
  5870. break;
  5871. if (err)
  5872. goto out_err;
  5873. if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid,
  5874. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  5875. wdev->netdev, dst, mpp,
  5876. &pinfo) < 0)
  5877. goto out;
  5878. path_idx++;
  5879. }
  5880. out:
  5881. cb->args[2] = path_idx;
  5882. err = skb->len;
  5883. out_err:
  5884. rtnl_unlock();
  5885. return err;
  5886. }
  5887. static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
  5888. {
  5889. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  5890. struct net_device *dev = info->user_ptr[1];
  5891. struct wireless_dev *wdev = dev->ieee80211_ptr;
  5892. struct bss_parameters params;
  5893. int err;
  5894. memset(&params, 0, sizeof(params));
  5895. /* default to not changing parameters */
  5896. params.use_cts_prot = -1;
  5897. params.use_short_preamble = -1;
  5898. params.use_short_slot_time = -1;
  5899. params.ap_isolate = -1;
  5900. params.ht_opmode = -1;
  5901. params.p2p_ctwindow = -1;
  5902. params.p2p_opp_ps = -1;
  5903. if (info->attrs[NL80211_ATTR_BSS_CTS_PROT])
  5904. params.use_cts_prot =
  5905. nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]);
  5906. if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE])
  5907. params.use_short_preamble =
  5908. nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]);
  5909. if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME])
  5910. params.use_short_slot_time =
  5911. nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]);
  5912. if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
  5913. params.basic_rates =
  5914. nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
  5915. params.basic_rates_len =
  5916. nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
  5917. }
  5918. if (info->attrs[NL80211_ATTR_AP_ISOLATE])
  5919. params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]);
  5920. if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE])
  5921. params.ht_opmode =
  5922. nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]);
  5923. if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
  5924. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  5925. return -EINVAL;
  5926. params.p2p_ctwindow =
  5927. nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
  5928. if (params.p2p_ctwindow != 0 &&
  5929. !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN))
  5930. return -EINVAL;
  5931. }
  5932. if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
  5933. u8 tmp;
  5934. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  5935. return -EINVAL;
  5936. tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
  5937. params.p2p_opp_ps = tmp;
  5938. if (params.p2p_opp_ps &&
  5939. !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS))
  5940. return -EINVAL;
  5941. }
  5942. if (!rdev->ops->change_bss)
  5943. return -EOPNOTSUPP;
  5944. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  5945. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  5946. return -EOPNOTSUPP;
  5947. wdev_lock(wdev);
  5948. err = rdev_change_bss(rdev, dev, &params);
  5949. wdev_unlock(wdev);
  5950. return err;
  5951. }
  5952. static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
  5953. {
  5954. char *data = NULL;
  5955. bool is_indoor;
  5956. enum nl80211_user_reg_hint_type user_reg_hint_type;
  5957. u32 owner_nlportid;
  5958. /*
  5959. * You should only get this when cfg80211 hasn't yet initialized
  5960. * completely when built-in to the kernel right between the time
  5961. * window between nl80211_init() and regulatory_init(), if that is
  5962. * even possible.
  5963. */
  5964. if (unlikely(!rcu_access_pointer(cfg80211_regdomain)))
  5965. return -EINPROGRESS;
  5966. if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE])
  5967. user_reg_hint_type =
  5968. nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]);
  5969. else
  5970. user_reg_hint_type = NL80211_USER_REG_HINT_USER;
  5971. switch (user_reg_hint_type) {
  5972. case NL80211_USER_REG_HINT_USER:
  5973. case NL80211_USER_REG_HINT_CELL_BASE:
  5974. if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
  5975. return -EINVAL;
  5976. data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
  5977. return regulatory_hint_user(data, user_reg_hint_type);
  5978. case NL80211_USER_REG_HINT_INDOOR:
  5979. if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
  5980. owner_nlportid = info->snd_portid;
  5981. is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR];
  5982. } else {
  5983. owner_nlportid = 0;
  5984. is_indoor = true;
  5985. }
  5986. return regulatory_hint_indoor(is_indoor, owner_nlportid);
  5987. default:
  5988. return -EINVAL;
  5989. }
  5990. }
  5991. static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info)
  5992. {
  5993. return reg_reload_regdb();
  5994. }
  5995. static int nl80211_get_mesh_config(struct sk_buff *skb,
  5996. struct genl_info *info)
  5997. {
  5998. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  5999. struct net_device *dev = info->user_ptr[1];
  6000. struct wireless_dev *wdev = dev->ieee80211_ptr;
  6001. struct mesh_config cur_params;
  6002. int err = 0;
  6003. void *hdr;
  6004. struct nlattr *pinfoattr;
  6005. struct sk_buff *msg;
  6006. if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
  6007. return -EOPNOTSUPP;
  6008. if (!rdev->ops->get_mesh_config)
  6009. return -EOPNOTSUPP;
  6010. wdev_lock(wdev);
  6011. /* If not connected, get default parameters */
  6012. if (!wdev->mesh_id_len)
  6013. memcpy(&cur_params, &default_mesh_config, sizeof(cur_params));
  6014. else
  6015. err = rdev_get_mesh_config(rdev, dev, &cur_params);
  6016. wdev_unlock(wdev);
  6017. if (err)
  6018. return err;
  6019. /* Draw up a netlink message to send back */
  6020. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  6021. if (!msg)
  6022. return -ENOMEM;
  6023. hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
  6024. NL80211_CMD_GET_MESH_CONFIG);
  6025. if (!hdr)
  6026. goto out;
  6027. pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MESH_CONFIG);
  6028. if (!pinfoattr)
  6029. goto nla_put_failure;
  6030. if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
  6031. nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT,
  6032. cur_params.dot11MeshRetryTimeout) ||
  6033. nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT,
  6034. cur_params.dot11MeshConfirmTimeout) ||
  6035. nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT,
  6036. cur_params.dot11MeshHoldingTimeout) ||
  6037. nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS,
  6038. cur_params.dot11MeshMaxPeerLinks) ||
  6039. nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES,
  6040. cur_params.dot11MeshMaxRetries) ||
  6041. nla_put_u8(msg, NL80211_MESHCONF_TTL,
  6042. cur_params.dot11MeshTTL) ||
  6043. nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL,
  6044. cur_params.element_ttl) ||
  6045. nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
  6046. cur_params.auto_open_plinks) ||
  6047. nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
  6048. cur_params.dot11MeshNbrOffsetMaxNeighbor) ||
  6049. nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
  6050. cur_params.dot11MeshHWMPmaxPREQretries) ||
  6051. nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME,
  6052. cur_params.path_refresh_time) ||
  6053. nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
  6054. cur_params.min_discovery_timeout) ||
  6055. nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
  6056. cur_params.dot11MeshHWMPactivePathTimeout) ||
  6057. nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
  6058. cur_params.dot11MeshHWMPpreqMinInterval) ||
  6059. nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
  6060. cur_params.dot11MeshHWMPperrMinInterval) ||
  6061. nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
  6062. cur_params.dot11MeshHWMPnetDiameterTraversalTime) ||
  6063. nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE,
  6064. cur_params.dot11MeshHWMPRootMode) ||
  6065. nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL,
  6066. cur_params.dot11MeshHWMPRannInterval) ||
  6067. nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
  6068. cur_params.dot11MeshGateAnnouncementProtocol) ||
  6069. nla_put_u8(msg, NL80211_MESHCONF_FORWARDING,
  6070. cur_params.dot11MeshForwarding) ||
  6071. nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD,
  6072. cur_params.rssi_threshold) ||
  6073. nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE,
  6074. cur_params.ht_opmode) ||
  6075. nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
  6076. cur_params.dot11MeshHWMPactivePathToRootTimeout) ||
  6077. nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
  6078. cur_params.dot11MeshHWMProotInterval) ||
  6079. nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
  6080. cur_params.dot11MeshHWMPconfirmationInterval) ||
  6081. nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE,
  6082. cur_params.power_mode) ||
  6083. nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW,
  6084. cur_params.dot11MeshAwakeWindowDuration) ||
  6085. nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT,
  6086. cur_params.plink_timeout) ||
  6087. nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE,
  6088. cur_params.dot11MeshConnectedToMeshGate) ||
  6089. nla_put_u8(msg, NL80211_MESHCONF_NOLEARN,
  6090. cur_params.dot11MeshNolearn) ||
  6091. nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_AS,
  6092. cur_params.dot11MeshConnectedToAuthServer))
  6093. goto nla_put_failure;
  6094. nla_nest_end(msg, pinfoattr);
  6095. genlmsg_end(msg, hdr);
  6096. return genlmsg_reply(msg, info);
  6097. nla_put_failure:
  6098. out:
  6099. nlmsg_free(msg);
  6100. return -ENOBUFS;
  6101. }
  6102. static const struct nla_policy
  6103. nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = {
  6104. [NL80211_MESHCONF_RETRY_TIMEOUT] =
  6105. NLA_POLICY_RANGE(NLA_U16, 1, 255),
  6106. [NL80211_MESHCONF_CONFIRM_TIMEOUT] =
  6107. NLA_POLICY_RANGE(NLA_U16, 1, 255),
  6108. [NL80211_MESHCONF_HOLDING_TIMEOUT] =
  6109. NLA_POLICY_RANGE(NLA_U16, 1, 255),
  6110. [NL80211_MESHCONF_MAX_PEER_LINKS] =
  6111. NLA_POLICY_RANGE(NLA_U16, 0, 255),
  6112. [NL80211_MESHCONF_MAX_RETRIES] = NLA_POLICY_MAX(NLA_U8, 16),
  6113. [NL80211_MESHCONF_TTL] = NLA_POLICY_MIN(NLA_U8, 1),
  6114. [NL80211_MESHCONF_ELEMENT_TTL] = NLA_POLICY_MIN(NLA_U8, 1),
  6115. [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = NLA_POLICY_MAX(NLA_U8, 1),
  6116. [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] =
  6117. NLA_POLICY_RANGE(NLA_U32, 1, 255),
  6118. [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 },
  6119. [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 },
  6120. [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = NLA_POLICY_MIN(NLA_U16, 1),
  6121. [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 },
  6122. [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] =
  6123. NLA_POLICY_MIN(NLA_U16, 1),
  6124. [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] =
  6125. NLA_POLICY_MIN(NLA_U16, 1),
  6126. [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] =
  6127. NLA_POLICY_MIN(NLA_U16, 1),
  6128. [NL80211_MESHCONF_HWMP_ROOTMODE] = NLA_POLICY_MAX(NLA_U8, 4),
  6129. [NL80211_MESHCONF_HWMP_RANN_INTERVAL] =
  6130. NLA_POLICY_MIN(NLA_U16, 1),
  6131. [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = NLA_POLICY_MAX(NLA_U8, 1),
  6132. [NL80211_MESHCONF_FORWARDING] = NLA_POLICY_MAX(NLA_U8, 1),
  6133. [NL80211_MESHCONF_RSSI_THRESHOLD] =
  6134. NLA_POLICY_RANGE(NLA_S32, -255, 0),
  6135. [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 },
  6136. [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 },
  6137. [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] =
  6138. NLA_POLICY_MIN(NLA_U16, 1),
  6139. [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] =
  6140. NLA_POLICY_MIN(NLA_U16, 1),
  6141. [NL80211_MESHCONF_POWER_MODE] =
  6142. NLA_POLICY_RANGE(NLA_U32,
  6143. NL80211_MESH_POWER_ACTIVE,
  6144. NL80211_MESH_POWER_MAX),
  6145. [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 },
  6146. [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 },
  6147. [NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
  6148. [NL80211_MESHCONF_NOLEARN] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
  6149. [NL80211_MESHCONF_CONNECTED_TO_AS] = NLA_POLICY_RANGE(NLA_U8, 0, 1),
  6150. };
  6151. static const struct nla_policy
  6152. nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = {
  6153. [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 },
  6154. [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 },
  6155. [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 },
  6156. [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG },
  6157. [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 },
  6158. [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG },
  6159. [NL80211_MESH_SETUP_IE] =
  6160. NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr,
  6161. IEEE80211_MAX_DATA_LEN),
  6162. [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG },
  6163. };
  6164. static int nl80211_parse_mesh_config(struct genl_info *info,
  6165. struct mesh_config *cfg,
  6166. u32 *mask_out)
  6167. {
  6168. struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1];
  6169. u32 mask = 0;
  6170. u16 ht_opmode;
  6171. #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, mask, attr, fn) \
  6172. do { \
  6173. if (tb[attr]) { \
  6174. cfg->param = fn(tb[attr]); \
  6175. mask |= BIT((attr) - 1); \
  6176. } \
  6177. } while (0)
  6178. if (!info->attrs[NL80211_ATTR_MESH_CONFIG])
  6179. return -EINVAL;
  6180. if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack))
  6181. return -EINVAL;
  6182. /* This makes sure that there aren't more than 32 mesh config
  6183. * parameters (otherwise our bitfield scheme would not work.) */
  6184. BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
  6185. /* Fill in the params struct */
  6186. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, mask,
  6187. NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16);
  6188. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, mask,
  6189. NL80211_MESHCONF_CONFIRM_TIMEOUT,
  6190. nla_get_u16);
  6191. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, mask,
  6192. NL80211_MESHCONF_HOLDING_TIMEOUT,
  6193. nla_get_u16);
  6194. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, mask,
  6195. NL80211_MESHCONF_MAX_PEER_LINKS,
  6196. nla_get_u16);
  6197. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, mask,
  6198. NL80211_MESHCONF_MAX_RETRIES, nla_get_u8);
  6199. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, mask,
  6200. NL80211_MESHCONF_TTL, nla_get_u8);
  6201. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, mask,
  6202. NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8);
  6203. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, mask,
  6204. NL80211_MESHCONF_AUTO_OPEN_PLINKS,
  6205. nla_get_u8);
  6206. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor,
  6207. mask,
  6208. NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
  6209. nla_get_u32);
  6210. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, mask,
  6211. NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
  6212. nla_get_u8);
  6213. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, mask,
  6214. NL80211_MESHCONF_PATH_REFRESH_TIME,
  6215. nla_get_u32);
  6216. if (mask & BIT(NL80211_MESHCONF_PATH_REFRESH_TIME) &&
  6217. (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535))
  6218. return -EINVAL;
  6219. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, mask,
  6220. NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
  6221. nla_get_u16);
  6222. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout,
  6223. mask,
  6224. NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
  6225. nla_get_u32);
  6226. if (mask & BIT(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT) &&
  6227. (cfg->dot11MeshHWMPactivePathTimeout < 1 ||
  6228. cfg->dot11MeshHWMPactivePathTimeout > 65535))
  6229. return -EINVAL;
  6230. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, mask,
  6231. NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
  6232. nla_get_u16);
  6233. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, mask,
  6234. NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
  6235. nla_get_u16);
  6236. FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
  6237. dot11MeshHWMPnetDiameterTraversalTime, mask,
  6238. NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
  6239. nla_get_u16);
  6240. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, mask,
  6241. NL80211_MESHCONF_HWMP_ROOTMODE, nla_get_u8);
  6242. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, mask,
  6243. NL80211_MESHCONF_HWMP_RANN_INTERVAL,
  6244. nla_get_u16);
  6245. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshGateAnnouncementProtocol,
  6246. mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
  6247. nla_get_u8);
  6248. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, mask,
  6249. NL80211_MESHCONF_FORWARDING, nla_get_u8);
  6250. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, mask,
  6251. NL80211_MESHCONF_RSSI_THRESHOLD,
  6252. nla_get_s32);
  6253. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask,
  6254. NL80211_MESHCONF_CONNECTED_TO_GATE,
  6255. nla_get_u8);
  6256. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToAuthServer, mask,
  6257. NL80211_MESHCONF_CONNECTED_TO_AS,
  6258. nla_get_u8);
  6259. /*
  6260. * Check HT operation mode based on
  6261. * IEEE 802.11-2016 9.4.2.57 HT Operation element.
  6262. */
  6263. if (tb[NL80211_MESHCONF_HT_OPMODE]) {
  6264. ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]);
  6265. if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION |
  6266. IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT |
  6267. IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT))
  6268. return -EINVAL;
  6269. /* NON_HT_STA bit is reserved, but some programs set it */
  6270. ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT;
  6271. cfg->ht_opmode = ht_opmode;
  6272. mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1));
  6273. }
  6274. FILL_IN_MESH_PARAM_IF_SET(tb, cfg,
  6275. dot11MeshHWMPactivePathToRootTimeout, mask,
  6276. NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
  6277. nla_get_u32);
  6278. if (mask & BIT(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT) &&
  6279. (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 ||
  6280. cfg->dot11MeshHWMPactivePathToRootTimeout > 65535))
  6281. return -EINVAL;
  6282. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, mask,
  6283. NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
  6284. nla_get_u16);
  6285. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPconfirmationInterval,
  6286. mask,
  6287. NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
  6288. nla_get_u16);
  6289. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, mask,
  6290. NL80211_MESHCONF_POWER_MODE, nla_get_u32);
  6291. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, mask,
  6292. NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16);
  6293. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, mask,
  6294. NL80211_MESHCONF_PLINK_TIMEOUT, nla_get_u32);
  6295. FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNolearn, mask,
  6296. NL80211_MESHCONF_NOLEARN, nla_get_u8);
  6297. if (mask_out)
  6298. *mask_out = mask;
  6299. return 0;
  6300. #undef FILL_IN_MESH_PARAM_IF_SET
  6301. }
  6302. static int nl80211_parse_mesh_setup(struct genl_info *info,
  6303. struct mesh_setup *setup)
  6304. {
  6305. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  6306. struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1];
  6307. if (!info->attrs[NL80211_ATTR_MESH_SETUP])
  6308. return -EINVAL;
  6309. if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack))
  6310. return -EINVAL;
  6311. if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])
  6312. setup->sync_method =
  6313. (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ?
  6314. IEEE80211_SYNC_METHOD_VENDOR :
  6315. IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET;
  6316. if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])
  6317. setup->path_sel_proto =
  6318. (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ?
  6319. IEEE80211_PATH_PROTOCOL_VENDOR :
  6320. IEEE80211_PATH_PROTOCOL_HWMP;
  6321. if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])
  6322. setup->path_metric =
  6323. (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ?
  6324. IEEE80211_PATH_METRIC_VENDOR :
  6325. IEEE80211_PATH_METRIC_AIRTIME;
  6326. if (tb[NL80211_MESH_SETUP_IE]) {
  6327. struct nlattr *ieattr =
  6328. tb[NL80211_MESH_SETUP_IE];
  6329. setup->ie = nla_data(ieattr);
  6330. setup->ie_len = nla_len(ieattr);
  6331. }
  6332. if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] &&
  6333. !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM))
  6334. return -EINVAL;
  6335. setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]);
  6336. setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]);
  6337. setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]);
  6338. if (setup->is_secure)
  6339. setup->user_mpm = true;
  6340. if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) {
  6341. if (!setup->user_mpm)
  6342. return -EINVAL;
  6343. setup->auth_id =
  6344. nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]);
  6345. }
  6346. return 0;
  6347. }
  6348. static int nl80211_update_mesh_config(struct sk_buff *skb,
  6349. struct genl_info *info)
  6350. {
  6351. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  6352. struct net_device *dev = info->user_ptr[1];
  6353. struct wireless_dev *wdev = dev->ieee80211_ptr;
  6354. struct mesh_config cfg;
  6355. u32 mask;
  6356. int err;
  6357. if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
  6358. return -EOPNOTSUPP;
  6359. if (!rdev->ops->update_mesh_config)
  6360. return -EOPNOTSUPP;
  6361. err = nl80211_parse_mesh_config(info, &cfg, &mask);
  6362. if (err)
  6363. return err;
  6364. wdev_lock(wdev);
  6365. if (!wdev->mesh_id_len)
  6366. err = -ENOLINK;
  6367. if (!err)
  6368. err = rdev_update_mesh_config(rdev, dev, mask, &cfg);
  6369. wdev_unlock(wdev);
  6370. return err;
  6371. }
  6372. static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom,
  6373. struct sk_buff *msg)
  6374. {
  6375. struct nlattr *nl_reg_rules;
  6376. unsigned int i;
  6377. if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) ||
  6378. (regdom->dfs_region &&
  6379. nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region)))
  6380. goto nla_put_failure;
  6381. nl_reg_rules = nla_nest_start_noflag(msg, NL80211_ATTR_REG_RULES);
  6382. if (!nl_reg_rules)
  6383. goto nla_put_failure;
  6384. for (i = 0; i < regdom->n_reg_rules; i++) {
  6385. struct nlattr *nl_reg_rule;
  6386. const struct ieee80211_reg_rule *reg_rule;
  6387. const struct ieee80211_freq_range *freq_range;
  6388. const struct ieee80211_power_rule *power_rule;
  6389. unsigned int max_bandwidth_khz;
  6390. reg_rule = &regdom->reg_rules[i];
  6391. freq_range = &reg_rule->freq_range;
  6392. power_rule = &reg_rule->power_rule;
  6393. nl_reg_rule = nla_nest_start_noflag(msg, i);
  6394. if (!nl_reg_rule)
  6395. goto nla_put_failure;
  6396. max_bandwidth_khz = freq_range->max_bandwidth_khz;
  6397. if (!max_bandwidth_khz)
  6398. max_bandwidth_khz = reg_get_max_bandwidth(regdom,
  6399. reg_rule);
  6400. if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS,
  6401. reg_rule->flags) ||
  6402. nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START,
  6403. freq_range->start_freq_khz) ||
  6404. nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END,
  6405. freq_range->end_freq_khz) ||
  6406. nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW,
  6407. max_bandwidth_khz) ||
  6408. nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN,
  6409. power_rule->max_antenna_gain) ||
  6410. nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP,
  6411. power_rule->max_eirp) ||
  6412. nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME,
  6413. reg_rule->dfs_cac_ms))
  6414. goto nla_put_failure;
  6415. nla_nest_end(msg, nl_reg_rule);
  6416. }
  6417. nla_nest_end(msg, nl_reg_rules);
  6418. return 0;
  6419. nla_put_failure:
  6420. return -EMSGSIZE;
  6421. }
  6422. static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info)
  6423. {
  6424. const struct ieee80211_regdomain *regdom = NULL;
  6425. struct cfg80211_registered_device *rdev;
  6426. struct wiphy *wiphy = NULL;
  6427. struct sk_buff *msg;
  6428. void *hdr;
  6429. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  6430. if (!msg)
  6431. return -ENOBUFS;
  6432. hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
  6433. NL80211_CMD_GET_REG);
  6434. if (!hdr)
  6435. goto put_failure;
  6436. if (info->attrs[NL80211_ATTR_WIPHY]) {
  6437. bool self_managed;
  6438. rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
  6439. if (IS_ERR(rdev)) {
  6440. nlmsg_free(msg);
  6441. return PTR_ERR(rdev);
  6442. }
  6443. wiphy = &rdev->wiphy;
  6444. self_managed = wiphy->regulatory_flags &
  6445. REGULATORY_WIPHY_SELF_MANAGED;
  6446. regdom = get_wiphy_regdom(wiphy);
  6447. /* a self-managed-reg device must have a private regdom */
  6448. if (WARN_ON(!regdom && self_managed)) {
  6449. nlmsg_free(msg);
  6450. return -EINVAL;
  6451. }
  6452. if (regdom &&
  6453. nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
  6454. goto nla_put_failure;
  6455. }
  6456. if (!wiphy && reg_last_request_cell_base() &&
  6457. nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
  6458. NL80211_USER_REG_HINT_CELL_BASE))
  6459. goto nla_put_failure;
  6460. rcu_read_lock();
  6461. if (!regdom)
  6462. regdom = rcu_dereference(cfg80211_regdomain);
  6463. if (nl80211_put_regdom(regdom, msg))
  6464. goto nla_put_failure_rcu;
  6465. rcu_read_unlock();
  6466. genlmsg_end(msg, hdr);
  6467. return genlmsg_reply(msg, info);
  6468. nla_put_failure_rcu:
  6469. rcu_read_unlock();
  6470. nla_put_failure:
  6471. put_failure:
  6472. nlmsg_free(msg);
  6473. return -EMSGSIZE;
  6474. }
  6475. static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb,
  6476. u32 seq, int flags, struct wiphy *wiphy,
  6477. const struct ieee80211_regdomain *regdom)
  6478. {
  6479. void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
  6480. NL80211_CMD_GET_REG);
  6481. if (!hdr)
  6482. return -1;
  6483. genl_dump_check_consistent(cb, hdr);
  6484. if (nl80211_put_regdom(regdom, msg))
  6485. goto nla_put_failure;
  6486. if (!wiphy && reg_last_request_cell_base() &&
  6487. nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE,
  6488. NL80211_USER_REG_HINT_CELL_BASE))
  6489. goto nla_put_failure;
  6490. if (wiphy &&
  6491. nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
  6492. goto nla_put_failure;
  6493. if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
  6494. nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
  6495. goto nla_put_failure;
  6496. genlmsg_end(msg, hdr);
  6497. return 0;
  6498. nla_put_failure:
  6499. genlmsg_cancel(msg, hdr);
  6500. return -EMSGSIZE;
  6501. }
  6502. static int nl80211_get_reg_dump(struct sk_buff *skb,
  6503. struct netlink_callback *cb)
  6504. {
  6505. const struct ieee80211_regdomain *regdom = NULL;
  6506. struct cfg80211_registered_device *rdev;
  6507. int err, reg_idx, start = cb->args[2];
  6508. rtnl_lock();
  6509. if (cfg80211_regdomain && start == 0) {
  6510. err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
  6511. NLM_F_MULTI, NULL,
  6512. rtnl_dereference(cfg80211_regdomain));
  6513. if (err < 0)
  6514. goto out_err;
  6515. }
  6516. /* the global regdom is idx 0 */
  6517. reg_idx = 1;
  6518. list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
  6519. regdom = get_wiphy_regdom(&rdev->wiphy);
  6520. if (!regdom)
  6521. continue;
  6522. if (++reg_idx <= start)
  6523. continue;
  6524. err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq,
  6525. NLM_F_MULTI, &rdev->wiphy, regdom);
  6526. if (err < 0) {
  6527. reg_idx--;
  6528. break;
  6529. }
  6530. }
  6531. cb->args[2] = reg_idx;
  6532. err = skb->len;
  6533. out_err:
  6534. rtnl_unlock();
  6535. return err;
  6536. }
  6537. #ifdef CONFIG_CFG80211_CRDA_SUPPORT
  6538. static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
  6539. [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 },
  6540. [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 },
  6541. [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 },
  6542. [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 },
  6543. [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 },
  6544. [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 },
  6545. [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 },
  6546. };
  6547. static int parse_reg_rule(struct nlattr *tb[],
  6548. struct ieee80211_reg_rule *reg_rule)
  6549. {
  6550. struct ieee80211_freq_range *freq_range = &reg_rule->freq_range;
  6551. struct ieee80211_power_rule *power_rule = &reg_rule->power_rule;
  6552. if (!tb[NL80211_ATTR_REG_RULE_FLAGS])
  6553. return -EINVAL;
  6554. if (!tb[NL80211_ATTR_FREQ_RANGE_START])
  6555. return -EINVAL;
  6556. if (!tb[NL80211_ATTR_FREQ_RANGE_END])
  6557. return -EINVAL;
  6558. if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW])
  6559. return -EINVAL;
  6560. if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP])
  6561. return -EINVAL;
  6562. reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]);
  6563. freq_range->start_freq_khz =
  6564. nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]);
  6565. freq_range->end_freq_khz =
  6566. nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]);
  6567. freq_range->max_bandwidth_khz =
  6568. nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]);
  6569. power_rule->max_eirp =
  6570. nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]);
  6571. if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN])
  6572. power_rule->max_antenna_gain =
  6573. nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]);
  6574. if (tb[NL80211_ATTR_DFS_CAC_TIME])
  6575. reg_rule->dfs_cac_ms =
  6576. nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]);
  6577. return 0;
  6578. }
  6579. static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
  6580. {
  6581. struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1];
  6582. struct nlattr *nl_reg_rule;
  6583. char *alpha2;
  6584. int rem_reg_rules, r;
  6585. u32 num_rules = 0, rule_idx = 0;
  6586. enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET;
  6587. struct ieee80211_regdomain *rd;
  6588. if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
  6589. return -EINVAL;
  6590. if (!info->attrs[NL80211_ATTR_REG_RULES])
  6591. return -EINVAL;
  6592. alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
  6593. if (info->attrs[NL80211_ATTR_DFS_REGION])
  6594. dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]);
  6595. nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
  6596. rem_reg_rules) {
  6597. num_rules++;
  6598. if (num_rules > NL80211_MAX_SUPP_REG_RULES)
  6599. return -EINVAL;
  6600. }
  6601. if (!reg_is_valid_request(alpha2))
  6602. return -EINVAL;
  6603. rd = kzalloc(struct_size(rd, reg_rules, num_rules), GFP_KERNEL);
  6604. if (!rd)
  6605. return -ENOMEM;
  6606. rd->n_reg_rules = num_rules;
  6607. rd->alpha2[0] = alpha2[0];
  6608. rd->alpha2[1] = alpha2[1];
  6609. /*
  6610. * Disable DFS master mode if the DFS region was
  6611. * not supported or known on this kernel.
  6612. */
  6613. if (reg_supported_dfs_region(dfs_region))
  6614. rd->dfs_region = dfs_region;
  6615. nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
  6616. rem_reg_rules) {
  6617. r = nla_parse_nested_deprecated(tb, NL80211_REG_RULE_ATTR_MAX,
  6618. nl_reg_rule, reg_rule_policy,
  6619. info->extack);
  6620. if (r)
  6621. goto bad_reg;
  6622. r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
  6623. if (r)
  6624. goto bad_reg;
  6625. rule_idx++;
  6626. if (rule_idx > NL80211_MAX_SUPP_REG_RULES) {
  6627. r = -EINVAL;
  6628. goto bad_reg;
  6629. }
  6630. }
  6631. /* set_regdom takes ownership of rd */
  6632. return set_regdom(rd, REGD_SOURCE_CRDA);
  6633. bad_reg:
  6634. kfree(rd);
  6635. return r;
  6636. }
  6637. #endif /* CONFIG_CFG80211_CRDA_SUPPORT */
  6638. static int validate_scan_freqs(struct nlattr *freqs)
  6639. {
  6640. struct nlattr *attr1, *attr2;
  6641. int n_channels = 0, tmp1, tmp2;
  6642. nla_for_each_nested(attr1, freqs, tmp1)
  6643. if (nla_len(attr1) != sizeof(u32))
  6644. return 0;
  6645. nla_for_each_nested(attr1, freqs, tmp1) {
  6646. n_channels++;
  6647. /*
  6648. * Some hardware has a limited channel list for
  6649. * scanning, and it is pretty much nonsensical
  6650. * to scan for a channel twice, so disallow that
  6651. * and don't require drivers to check that the
  6652. * channel list they get isn't longer than what
  6653. * they can scan, as long as they can scan all
  6654. * the channels they registered at once.
  6655. */
  6656. nla_for_each_nested(attr2, freqs, tmp2)
  6657. if (attr1 != attr2 &&
  6658. nla_get_u32(attr1) == nla_get_u32(attr2))
  6659. return 0;
  6660. }
  6661. return n_channels;
  6662. }
  6663. static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b)
  6664. {
  6665. return b < NUM_NL80211_BANDS && wiphy->bands[b];
  6666. }
  6667. static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy,
  6668. struct cfg80211_bss_selection *bss_select)
  6669. {
  6670. struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1];
  6671. struct nlattr *nest;
  6672. int err;
  6673. bool found = false;
  6674. int i;
  6675. /* only process one nested attribute */
  6676. nest = nla_data(nla);
  6677. if (!nla_ok(nest, nla_len(nest)))
  6678. return -EINVAL;
  6679. err = nla_parse_nested_deprecated(attr, NL80211_BSS_SELECT_ATTR_MAX,
  6680. nest, nl80211_bss_select_policy,
  6681. NULL);
  6682. if (err)
  6683. return err;
  6684. /* only one attribute may be given */
  6685. for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) {
  6686. if (attr[i]) {
  6687. if (found)
  6688. return -EINVAL;
  6689. found = true;
  6690. }
  6691. }
  6692. bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID;
  6693. if (attr[NL80211_BSS_SELECT_ATTR_RSSI])
  6694. bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI;
  6695. if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) {
  6696. bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF;
  6697. bss_select->param.band_pref =
  6698. nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]);
  6699. if (!is_band_valid(wiphy, bss_select->param.band_pref))
  6700. return -EINVAL;
  6701. }
  6702. if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) {
  6703. struct nl80211_bss_select_rssi_adjust *adj_param;
  6704. adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]);
  6705. bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST;
  6706. bss_select->param.adjust.band = adj_param->band;
  6707. bss_select->param.adjust.delta = adj_param->delta;
  6708. if (!is_band_valid(wiphy, bss_select->param.adjust.band))
  6709. return -EINVAL;
  6710. }
  6711. /* user-space did not provide behaviour attribute */
  6712. if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID)
  6713. return -EINVAL;
  6714. if (!(wiphy->bss_select_support & BIT(bss_select->behaviour)))
  6715. return -EINVAL;
  6716. return 0;
  6717. }
  6718. int nl80211_parse_random_mac(struct nlattr **attrs,
  6719. u8 *mac_addr, u8 *mac_addr_mask)
  6720. {
  6721. int i;
  6722. if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) {
  6723. eth_zero_addr(mac_addr);
  6724. eth_zero_addr(mac_addr_mask);
  6725. mac_addr[0] = 0x2;
  6726. mac_addr_mask[0] = 0x3;
  6727. return 0;
  6728. }
  6729. /* need both or none */
  6730. if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK])
  6731. return -EINVAL;
  6732. memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN);
  6733. memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN);
  6734. /* don't allow or configure an mcast address */
  6735. if (!is_multicast_ether_addr(mac_addr_mask) ||
  6736. is_multicast_ether_addr(mac_addr))
  6737. return -EINVAL;
  6738. /*
  6739. * allow users to pass a MAC address that has bits set outside
  6740. * of the mask, but don't bother drivers with having to deal
  6741. * with such bits
  6742. */
  6743. for (i = 0; i < ETH_ALEN; i++)
  6744. mac_addr[i] &= mac_addr_mask[i];
  6745. return 0;
  6746. }
  6747. static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev)
  6748. {
  6749. ASSERT_WDEV_LOCK(wdev);
  6750. if (!cfg80211_beaconing_iface_active(wdev))
  6751. return true;
  6752. if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR))
  6753. return true;
  6754. return regulatory_pre_cac_allowed(wdev->wiphy);
  6755. }
  6756. static bool nl80211_check_scan_feat(struct wiphy *wiphy, u32 flags, u32 flag,
  6757. enum nl80211_ext_feature_index feat)
  6758. {
  6759. if (!(flags & flag))
  6760. return true;
  6761. if (wiphy_ext_feature_isset(wiphy, feat))
  6762. return true;
  6763. return false;
  6764. }
  6765. static int
  6766. nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev,
  6767. void *request, struct nlattr **attrs,
  6768. bool is_sched_scan)
  6769. {
  6770. u8 *mac_addr, *mac_addr_mask;
  6771. u32 *flags;
  6772. enum nl80211_feature_flags randomness_flag;
  6773. if (!attrs[NL80211_ATTR_SCAN_FLAGS])
  6774. return 0;
  6775. if (is_sched_scan) {
  6776. struct cfg80211_sched_scan_request *req = request;
  6777. randomness_flag = wdev ?
  6778. NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR :
  6779. NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
  6780. flags = &req->flags;
  6781. mac_addr = req->mac_addr;
  6782. mac_addr_mask = req->mac_addr_mask;
  6783. } else {
  6784. struct cfg80211_scan_request *req = request;
  6785. randomness_flag = NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
  6786. flags = &req->flags;
  6787. mac_addr = req->mac_addr;
  6788. mac_addr_mask = req->mac_addr_mask;
  6789. }
  6790. *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]);
  6791. if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
  6792. !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) ||
  6793. !nl80211_check_scan_feat(wiphy, *flags,
  6794. NL80211_SCAN_FLAG_LOW_SPAN,
  6795. NL80211_EXT_FEATURE_LOW_SPAN_SCAN) ||
  6796. !nl80211_check_scan_feat(wiphy, *flags,
  6797. NL80211_SCAN_FLAG_LOW_POWER,
  6798. NL80211_EXT_FEATURE_LOW_POWER_SCAN) ||
  6799. !nl80211_check_scan_feat(wiphy, *flags,
  6800. NL80211_SCAN_FLAG_HIGH_ACCURACY,
  6801. NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN) ||
  6802. !nl80211_check_scan_feat(wiphy, *flags,
  6803. NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME,
  6804. NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME) ||
  6805. !nl80211_check_scan_feat(wiphy, *flags,
  6806. NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP,
  6807. NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP) ||
  6808. !nl80211_check_scan_feat(wiphy, *flags,
  6809. NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION,
  6810. NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) ||
  6811. !nl80211_check_scan_feat(wiphy, *flags,
  6812. NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE,
  6813. NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE) ||
  6814. !nl80211_check_scan_feat(wiphy, *flags,
  6815. NL80211_SCAN_FLAG_RANDOM_SN,
  6816. NL80211_EXT_FEATURE_SCAN_RANDOM_SN) ||
  6817. !nl80211_check_scan_feat(wiphy, *flags,
  6818. NL80211_SCAN_FLAG_MIN_PREQ_CONTENT,
  6819. NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT))
  6820. return -EOPNOTSUPP;
  6821. if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
  6822. int err;
  6823. if (!(wiphy->features & randomness_flag) ||
  6824. (wdev && wdev->current_bss))
  6825. return -EOPNOTSUPP;
  6826. err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask);
  6827. if (err)
  6828. return err;
  6829. }
  6830. return 0;
  6831. }
  6832. static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
  6833. {
  6834. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  6835. struct wireless_dev *wdev = info->user_ptr[1];
  6836. struct cfg80211_scan_request *request;
  6837. struct nlattr *scan_freqs = NULL;
  6838. bool scan_freqs_khz = false;
  6839. struct nlattr *attr;
  6840. struct wiphy *wiphy;
  6841. int err, tmp, n_ssids = 0, n_channels, i;
  6842. size_t ie_len;
  6843. wiphy = &rdev->wiphy;
  6844. if (wdev->iftype == NL80211_IFTYPE_NAN)
  6845. return -EOPNOTSUPP;
  6846. if (!rdev->ops->scan)
  6847. return -EOPNOTSUPP;
  6848. if (rdev->scan_req || rdev->scan_msg)
  6849. return -EBUSY;
  6850. if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) {
  6851. if (!wiphy_ext_feature_isset(wiphy,
  6852. NL80211_EXT_FEATURE_SCAN_FREQ_KHZ))
  6853. return -EOPNOTSUPP;
  6854. scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ];
  6855. scan_freqs_khz = true;
  6856. } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES])
  6857. scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES];
  6858. if (scan_freqs) {
  6859. n_channels = validate_scan_freqs(scan_freqs);
  6860. if (!n_channels)
  6861. return -EINVAL;
  6862. } else {
  6863. n_channels = ieee80211_get_num_supported_channels(wiphy);
  6864. }
  6865. if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
  6866. nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
  6867. n_ssids++;
  6868. if (n_ssids > wiphy->max_scan_ssids)
  6869. return -EINVAL;
  6870. if (info->attrs[NL80211_ATTR_IE])
  6871. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  6872. else
  6873. ie_len = 0;
  6874. if (ie_len > wiphy->max_scan_ie_len)
  6875. return -EINVAL;
  6876. request = kzalloc(sizeof(*request)
  6877. + sizeof(*request->ssids) * n_ssids
  6878. + sizeof(*request->channels) * n_channels
  6879. + ie_len, GFP_KERNEL);
  6880. if (!request)
  6881. return -ENOMEM;
  6882. if (n_ssids)
  6883. request->ssids = (void *)&request->channels[n_channels];
  6884. request->n_ssids = n_ssids;
  6885. if (ie_len) {
  6886. if (n_ssids)
  6887. request->ie = (void *)(request->ssids + n_ssids);
  6888. else
  6889. request->ie = (void *)(request->channels + n_channels);
  6890. }
  6891. i = 0;
  6892. if (scan_freqs) {
  6893. /* user specified, bail out if channel not found */
  6894. nla_for_each_nested(attr, scan_freqs, tmp) {
  6895. struct ieee80211_channel *chan;
  6896. int freq = nla_get_u32(attr);
  6897. if (!scan_freqs_khz)
  6898. freq = MHZ_TO_KHZ(freq);
  6899. chan = ieee80211_get_channel_khz(wiphy, freq);
  6900. if (!chan) {
  6901. err = -EINVAL;
  6902. goto out_free;
  6903. }
  6904. /* ignore disabled channels */
  6905. if (chan->flags & IEEE80211_CHAN_DISABLED)
  6906. continue;
  6907. request->channels[i] = chan;
  6908. i++;
  6909. }
  6910. } else {
  6911. enum nl80211_band band;
  6912. /* all channels */
  6913. for (band = 0; band < NUM_NL80211_BANDS; band++) {
  6914. int j;
  6915. if (!wiphy->bands[band])
  6916. continue;
  6917. for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
  6918. struct ieee80211_channel *chan;
  6919. chan = &wiphy->bands[band]->channels[j];
  6920. if (chan->flags & IEEE80211_CHAN_DISABLED)
  6921. continue;
  6922. request->channels[i] = chan;
  6923. i++;
  6924. }
  6925. }
  6926. }
  6927. if (!i) {
  6928. err = -EINVAL;
  6929. goto out_free;
  6930. }
  6931. request->n_channels = i;
  6932. wdev_lock(wdev);
  6933. if (!cfg80211_off_channel_oper_allowed(wdev)) {
  6934. struct ieee80211_channel *chan;
  6935. if (request->n_channels != 1) {
  6936. wdev_unlock(wdev);
  6937. err = -EBUSY;
  6938. goto out_free;
  6939. }
  6940. chan = request->channels[0];
  6941. if (chan->center_freq != wdev->chandef.chan->center_freq) {
  6942. wdev_unlock(wdev);
  6943. err = -EBUSY;
  6944. goto out_free;
  6945. }
  6946. }
  6947. wdev_unlock(wdev);
  6948. i = 0;
  6949. if (n_ssids) {
  6950. nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
  6951. if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
  6952. err = -EINVAL;
  6953. goto out_free;
  6954. }
  6955. request->ssids[i].ssid_len = nla_len(attr);
  6956. memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
  6957. i++;
  6958. }
  6959. }
  6960. if (info->attrs[NL80211_ATTR_IE]) {
  6961. request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  6962. memcpy((void *)request->ie,
  6963. nla_data(info->attrs[NL80211_ATTR_IE]),
  6964. request->ie_len);
  6965. }
  6966. for (i = 0; i < NUM_NL80211_BANDS; i++)
  6967. if (wiphy->bands[i])
  6968. request->rates[i] =
  6969. (1 << wiphy->bands[i]->n_bitrates) - 1;
  6970. if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) {
  6971. nla_for_each_nested(attr,
  6972. info->attrs[NL80211_ATTR_SCAN_SUPP_RATES],
  6973. tmp) {
  6974. enum nl80211_band band = nla_type(attr);
  6975. if (band < 0 || band >= NUM_NL80211_BANDS) {
  6976. err = -EINVAL;
  6977. goto out_free;
  6978. }
  6979. if (!wiphy->bands[band])
  6980. continue;
  6981. err = ieee80211_get_ratemask(wiphy->bands[band],
  6982. nla_data(attr),
  6983. nla_len(attr),
  6984. &request->rates[band]);
  6985. if (err)
  6986. goto out_free;
  6987. }
  6988. }
  6989. if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) {
  6990. if (!wiphy_ext_feature_isset(wiphy,
  6991. NL80211_EXT_FEATURE_SET_SCAN_DWELL)) {
  6992. err = -EOPNOTSUPP;
  6993. goto out_free;
  6994. }
  6995. request->duration =
  6996. nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]);
  6997. request->duration_mandatory =
  6998. nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]);
  6999. }
  7000. err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs,
  7001. false);
  7002. if (err)
  7003. goto out_free;
  7004. request->no_cck =
  7005. nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
  7006. /* Initial implementation used NL80211_ATTR_MAC to set the specific
  7007. * BSSID to scan for. This was problematic because that same attribute
  7008. * was already used for another purpose (local random MAC address). The
  7009. * NL80211_ATTR_BSSID attribute was added to fix this. For backwards
  7010. * compatibility with older userspace components, also use the
  7011. * NL80211_ATTR_MAC value here if it can be determined to be used for
  7012. * the specific BSSID use case instead of the random MAC address
  7013. * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use).
  7014. */
  7015. if (info->attrs[NL80211_ATTR_BSSID])
  7016. memcpy(request->bssid,
  7017. nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN);
  7018. else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) &&
  7019. info->attrs[NL80211_ATTR_MAC])
  7020. memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]),
  7021. ETH_ALEN);
  7022. else
  7023. eth_broadcast_addr(request->bssid);
  7024. request->wdev = wdev;
  7025. request->wiphy = &rdev->wiphy;
  7026. request->scan_start = jiffies;
  7027. rdev->scan_req = request;
  7028. err = cfg80211_scan(rdev);
  7029. if (err)
  7030. goto out_free;
  7031. nl80211_send_scan_start(rdev, wdev);
  7032. if (wdev->netdev)
  7033. dev_hold(wdev->netdev);
  7034. return 0;
  7035. out_free:
  7036. rdev->scan_req = NULL;
  7037. kfree(request);
  7038. return err;
  7039. }
  7040. static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info)
  7041. {
  7042. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  7043. struct wireless_dev *wdev = info->user_ptr[1];
  7044. if (!rdev->ops->abort_scan)
  7045. return -EOPNOTSUPP;
  7046. if (rdev->scan_msg)
  7047. return 0;
  7048. if (!rdev->scan_req)
  7049. return -ENOENT;
  7050. rdev_abort_scan(rdev, wdev);
  7051. return 0;
  7052. }
  7053. static int
  7054. nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans,
  7055. struct cfg80211_sched_scan_request *request,
  7056. struct nlattr **attrs)
  7057. {
  7058. int tmp, err, i = 0;
  7059. struct nlattr *attr;
  7060. if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
  7061. u32 interval;
  7062. /*
  7063. * If scan plans are not specified,
  7064. * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this
  7065. * case one scan plan will be set with the specified scan
  7066. * interval and infinite number of iterations.
  7067. */
  7068. interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]);
  7069. if (!interval)
  7070. return -EINVAL;
  7071. request->scan_plans[0].interval =
  7072. DIV_ROUND_UP(interval, MSEC_PER_SEC);
  7073. if (!request->scan_plans[0].interval)
  7074. return -EINVAL;
  7075. if (request->scan_plans[0].interval >
  7076. wiphy->max_sched_scan_plan_interval)
  7077. request->scan_plans[0].interval =
  7078. wiphy->max_sched_scan_plan_interval;
  7079. return 0;
  7080. }
  7081. nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) {
  7082. struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1];
  7083. if (WARN_ON(i >= n_plans))
  7084. return -EINVAL;
  7085. err = nla_parse_nested_deprecated(plan,
  7086. NL80211_SCHED_SCAN_PLAN_MAX,
  7087. attr, nl80211_plan_policy,
  7088. NULL);
  7089. if (err)
  7090. return err;
  7091. if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL])
  7092. return -EINVAL;
  7093. request->scan_plans[i].interval =
  7094. nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]);
  7095. if (!request->scan_plans[i].interval ||
  7096. request->scan_plans[i].interval >
  7097. wiphy->max_sched_scan_plan_interval)
  7098. return -EINVAL;
  7099. if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) {
  7100. request->scan_plans[i].iterations =
  7101. nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]);
  7102. if (!request->scan_plans[i].iterations ||
  7103. (request->scan_plans[i].iterations >
  7104. wiphy->max_sched_scan_plan_iterations))
  7105. return -EINVAL;
  7106. } else if (i < n_plans - 1) {
  7107. /*
  7108. * All scan plans but the last one must specify
  7109. * a finite number of iterations
  7110. */
  7111. return -EINVAL;
  7112. }
  7113. i++;
  7114. }
  7115. /*
  7116. * The last scan plan must not specify the number of
  7117. * iterations, it is supposed to run infinitely
  7118. */
  7119. if (request->scan_plans[n_plans - 1].iterations)
  7120. return -EINVAL;
  7121. return 0;
  7122. }
  7123. static int
  7124. nl80211_parse_sched_scan_per_band_rssi(struct wiphy *wiphy,
  7125. struct cfg80211_match_set *match_sets,
  7126. struct nlattr *tb_band_rssi,
  7127. s32 rssi_thold)
  7128. {
  7129. struct nlattr *attr;
  7130. int i, tmp, ret = 0;
  7131. if (!wiphy_ext_feature_isset(wiphy,
  7132. NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD)) {
  7133. if (tb_band_rssi)
  7134. ret = -EOPNOTSUPP;
  7135. else
  7136. for (i = 0; i < NUM_NL80211_BANDS; i++)
  7137. match_sets->per_band_rssi_thold[i] =
  7138. NL80211_SCAN_RSSI_THOLD_OFF;
  7139. return ret;
  7140. }
  7141. for (i = 0; i < NUM_NL80211_BANDS; i++)
  7142. match_sets->per_band_rssi_thold[i] = rssi_thold;
  7143. nla_for_each_nested(attr, tb_band_rssi, tmp) {
  7144. enum nl80211_band band = nla_type(attr);
  7145. if (band < 0 || band >= NUM_NL80211_BANDS)
  7146. return -EINVAL;
  7147. match_sets->per_band_rssi_thold[band] = nla_get_s32(attr);
  7148. }
  7149. return 0;
  7150. }
  7151. static struct cfg80211_sched_scan_request *
  7152. nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
  7153. struct nlattr **attrs, int max_match_sets)
  7154. {
  7155. struct cfg80211_sched_scan_request *request;
  7156. struct nlattr *attr;
  7157. int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0;
  7158. enum nl80211_band band;
  7159. size_t ie_len;
  7160. struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1];
  7161. s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF;
  7162. if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
  7163. n_channels = validate_scan_freqs(
  7164. attrs[NL80211_ATTR_SCAN_FREQUENCIES]);
  7165. if (!n_channels)
  7166. return ERR_PTR(-EINVAL);
  7167. } else {
  7168. n_channels = ieee80211_get_num_supported_channels(wiphy);
  7169. }
  7170. if (attrs[NL80211_ATTR_SCAN_SSIDS])
  7171. nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
  7172. tmp)
  7173. n_ssids++;
  7174. if (n_ssids > wiphy->max_sched_scan_ssids)
  7175. return ERR_PTR(-EINVAL);
  7176. /*
  7177. * First, count the number of 'real' matchsets. Due to an issue with
  7178. * the old implementation, matchsets containing only the RSSI attribute
  7179. * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default'
  7180. * RSSI for all matchsets, rather than their own matchset for reporting
  7181. * all APs with a strong RSSI. This is needed to be compatible with
  7182. * older userspace that treated a matchset with only the RSSI as the
  7183. * global RSSI for all other matchsets - if there are other matchsets.
  7184. */
  7185. if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
  7186. nla_for_each_nested(attr,
  7187. attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
  7188. tmp) {
  7189. struct nlattr *rssi;
  7190. err = nla_parse_nested_deprecated(tb,
  7191. NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
  7192. attr,
  7193. nl80211_match_policy,
  7194. NULL);
  7195. if (err)
  7196. return ERR_PTR(err);
  7197. /* SSID and BSSID are mutually exclusive */
  7198. if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] &&
  7199. tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID])
  7200. return ERR_PTR(-EINVAL);
  7201. /* add other standalone attributes here */
  7202. if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] ||
  7203. tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) {
  7204. n_match_sets++;
  7205. continue;
  7206. }
  7207. rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
  7208. if (rssi)
  7209. default_match_rssi = nla_get_s32(rssi);
  7210. }
  7211. }
  7212. /* However, if there's no other matchset, add the RSSI one */
  7213. if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
  7214. n_match_sets = 1;
  7215. if (n_match_sets > max_match_sets)
  7216. return ERR_PTR(-EINVAL);
  7217. if (attrs[NL80211_ATTR_IE])
  7218. ie_len = nla_len(attrs[NL80211_ATTR_IE]);
  7219. else
  7220. ie_len = 0;
  7221. if (ie_len > wiphy->max_sched_scan_ie_len)
  7222. return ERR_PTR(-EINVAL);
  7223. if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) {
  7224. /*
  7225. * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since
  7226. * each scan plan already specifies its own interval
  7227. */
  7228. if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
  7229. return ERR_PTR(-EINVAL);
  7230. nla_for_each_nested(attr,
  7231. attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp)
  7232. n_plans++;
  7233. } else {
  7234. /*
  7235. * The scan interval attribute is kept for backward
  7236. * compatibility. If no scan plans are specified and sched scan
  7237. * interval is specified, one scan plan will be set with this
  7238. * scan interval and infinite number of iterations.
  7239. */
  7240. if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL])
  7241. return ERR_PTR(-EINVAL);
  7242. n_plans = 1;
  7243. }
  7244. if (!n_plans || n_plans > wiphy->max_sched_scan_plans)
  7245. return ERR_PTR(-EINVAL);
  7246. if (!wiphy_ext_feature_isset(
  7247. wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) &&
  7248. (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] ||
  7249. attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]))
  7250. return ERR_PTR(-EINVAL);
  7251. request = kzalloc(sizeof(*request)
  7252. + sizeof(*request->ssids) * n_ssids
  7253. + sizeof(*request->match_sets) * n_match_sets
  7254. + sizeof(*request->scan_plans) * n_plans
  7255. + sizeof(*request->channels) * n_channels
  7256. + ie_len, GFP_KERNEL);
  7257. if (!request)
  7258. return ERR_PTR(-ENOMEM);
  7259. if (n_ssids)
  7260. request->ssids = (void *)&request->channels[n_channels];
  7261. request->n_ssids = n_ssids;
  7262. if (ie_len) {
  7263. if (n_ssids)
  7264. request->ie = (void *)(request->ssids + n_ssids);
  7265. else
  7266. request->ie = (void *)(request->channels + n_channels);
  7267. }
  7268. if (n_match_sets) {
  7269. if (request->ie)
  7270. request->match_sets = (void *)(request->ie + ie_len);
  7271. else if (n_ssids)
  7272. request->match_sets =
  7273. (void *)(request->ssids + n_ssids);
  7274. else
  7275. request->match_sets =
  7276. (void *)(request->channels + n_channels);
  7277. }
  7278. request->n_match_sets = n_match_sets;
  7279. if (n_match_sets)
  7280. request->scan_plans = (void *)(request->match_sets +
  7281. n_match_sets);
  7282. else if (request->ie)
  7283. request->scan_plans = (void *)(request->ie + ie_len);
  7284. else if (n_ssids)
  7285. request->scan_plans = (void *)(request->ssids + n_ssids);
  7286. else
  7287. request->scan_plans = (void *)(request->channels + n_channels);
  7288. request->n_scan_plans = n_plans;
  7289. i = 0;
  7290. if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
  7291. /* user specified, bail out if channel not found */
  7292. nla_for_each_nested(attr,
  7293. attrs[NL80211_ATTR_SCAN_FREQUENCIES],
  7294. tmp) {
  7295. struct ieee80211_channel *chan;
  7296. chan = ieee80211_get_channel(wiphy, nla_get_u32(attr));
  7297. if (!chan) {
  7298. err = -EINVAL;
  7299. goto out_free;
  7300. }
  7301. /* ignore disabled channels */
  7302. if (chan->flags & IEEE80211_CHAN_DISABLED)
  7303. continue;
  7304. request->channels[i] = chan;
  7305. i++;
  7306. }
  7307. } else {
  7308. /* all channels */
  7309. for (band = 0; band < NUM_NL80211_BANDS; band++) {
  7310. int j;
  7311. if (!wiphy->bands[band])
  7312. continue;
  7313. for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
  7314. struct ieee80211_channel *chan;
  7315. chan = &wiphy->bands[band]->channels[j];
  7316. if (chan->flags & IEEE80211_CHAN_DISABLED)
  7317. continue;
  7318. request->channels[i] = chan;
  7319. i++;
  7320. }
  7321. }
  7322. }
  7323. if (!i) {
  7324. err = -EINVAL;
  7325. goto out_free;
  7326. }
  7327. request->n_channels = i;
  7328. i = 0;
  7329. if (n_ssids) {
  7330. nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS],
  7331. tmp) {
  7332. if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) {
  7333. err = -EINVAL;
  7334. goto out_free;
  7335. }
  7336. request->ssids[i].ssid_len = nla_len(attr);
  7337. memcpy(request->ssids[i].ssid, nla_data(attr),
  7338. nla_len(attr));
  7339. i++;
  7340. }
  7341. }
  7342. i = 0;
  7343. if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
  7344. nla_for_each_nested(attr,
  7345. attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
  7346. tmp) {
  7347. struct nlattr *ssid, *bssid, *rssi;
  7348. err = nla_parse_nested_deprecated(tb,
  7349. NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
  7350. attr,
  7351. nl80211_match_policy,
  7352. NULL);
  7353. if (err)
  7354. goto out_free;
  7355. ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID];
  7356. bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID];
  7357. if (!ssid && !bssid) {
  7358. i++;
  7359. continue;
  7360. }
  7361. if (WARN_ON(i >= n_match_sets)) {
  7362. /* this indicates a programming error,
  7363. * the loop above should have verified
  7364. * things properly
  7365. */
  7366. err = -EINVAL;
  7367. goto out_free;
  7368. }
  7369. if (ssid) {
  7370. memcpy(request->match_sets[i].ssid.ssid,
  7371. nla_data(ssid), nla_len(ssid));
  7372. request->match_sets[i].ssid.ssid_len =
  7373. nla_len(ssid);
  7374. }
  7375. if (bssid)
  7376. memcpy(request->match_sets[i].bssid,
  7377. nla_data(bssid), ETH_ALEN);
  7378. /* special attribute - old implementation w/a */
  7379. request->match_sets[i].rssi_thold = default_match_rssi;
  7380. rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
  7381. if (rssi)
  7382. request->match_sets[i].rssi_thold =
  7383. nla_get_s32(rssi);
  7384. /* Parse per band RSSI attribute */
  7385. err = nl80211_parse_sched_scan_per_band_rssi(wiphy,
  7386. &request->match_sets[i],
  7387. tb[NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI],
  7388. request->match_sets[i].rssi_thold);
  7389. if (err)
  7390. goto out_free;
  7391. i++;
  7392. }
  7393. /* there was no other matchset, so the RSSI one is alone */
  7394. if (i == 0 && n_match_sets)
  7395. request->match_sets[0].rssi_thold = default_match_rssi;
  7396. request->min_rssi_thold = INT_MAX;
  7397. for (i = 0; i < n_match_sets; i++)
  7398. request->min_rssi_thold =
  7399. min(request->match_sets[i].rssi_thold,
  7400. request->min_rssi_thold);
  7401. } else {
  7402. request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF;
  7403. }
  7404. if (ie_len) {
  7405. request->ie_len = ie_len;
  7406. memcpy((void *)request->ie,
  7407. nla_data(attrs[NL80211_ATTR_IE]),
  7408. request->ie_len);
  7409. }
  7410. err = nl80211_check_scan_flags(wiphy, wdev, request, attrs, true);
  7411. if (err)
  7412. goto out_free;
  7413. if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY])
  7414. request->delay =
  7415. nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]);
  7416. if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) {
  7417. request->relative_rssi = nla_get_s8(
  7418. attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]);
  7419. request->relative_rssi_set = true;
  7420. }
  7421. if (request->relative_rssi_set &&
  7422. attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) {
  7423. struct nl80211_bss_select_rssi_adjust *rssi_adjust;
  7424. rssi_adjust = nla_data(
  7425. attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]);
  7426. request->rssi_adjust.band = rssi_adjust->band;
  7427. request->rssi_adjust.delta = rssi_adjust->delta;
  7428. if (!is_band_valid(wiphy, request->rssi_adjust.band)) {
  7429. err = -EINVAL;
  7430. goto out_free;
  7431. }
  7432. }
  7433. err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs);
  7434. if (err)
  7435. goto out_free;
  7436. request->scan_start = jiffies;
  7437. return request;
  7438. out_free:
  7439. kfree(request);
  7440. return ERR_PTR(err);
  7441. }
  7442. static int nl80211_start_sched_scan(struct sk_buff *skb,
  7443. struct genl_info *info)
  7444. {
  7445. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  7446. struct net_device *dev = info->user_ptr[1];
  7447. struct wireless_dev *wdev = dev->ieee80211_ptr;
  7448. struct cfg80211_sched_scan_request *sched_scan_req;
  7449. bool want_multi;
  7450. int err;
  7451. if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start)
  7452. return -EOPNOTSUPP;
  7453. want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI];
  7454. err = cfg80211_sched_scan_req_possible(rdev, want_multi);
  7455. if (err)
  7456. return err;
  7457. sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev,
  7458. info->attrs,
  7459. rdev->wiphy.max_match_sets);
  7460. err = PTR_ERR_OR_ZERO(sched_scan_req);
  7461. if (err)
  7462. goto out_err;
  7463. /* leave request id zero for legacy request
  7464. * or if driver does not support multi-scheduled scan
  7465. */
  7466. if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1)
  7467. sched_scan_req->reqid = cfg80211_assign_cookie(rdev);
  7468. err = rdev_sched_scan_start(rdev, dev, sched_scan_req);
  7469. if (err)
  7470. goto out_free;
  7471. sched_scan_req->dev = dev;
  7472. sched_scan_req->wiphy = &rdev->wiphy;
  7473. if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
  7474. sched_scan_req->owner_nlportid = info->snd_portid;
  7475. cfg80211_add_sched_scan_req(rdev, sched_scan_req);
  7476. nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN);
  7477. return 0;
  7478. out_free:
  7479. kfree(sched_scan_req);
  7480. out_err:
  7481. return err;
  7482. }
  7483. static int nl80211_stop_sched_scan(struct sk_buff *skb,
  7484. struct genl_info *info)
  7485. {
  7486. struct cfg80211_sched_scan_request *req;
  7487. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  7488. u64 cookie;
  7489. if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop)
  7490. return -EOPNOTSUPP;
  7491. if (info->attrs[NL80211_ATTR_COOKIE]) {
  7492. cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
  7493. return __cfg80211_stop_sched_scan(rdev, cookie, false);
  7494. }
  7495. req = list_first_or_null_rcu(&rdev->sched_scan_req_list,
  7496. struct cfg80211_sched_scan_request,
  7497. list);
  7498. if (!req || req->reqid ||
  7499. (req->owner_nlportid &&
  7500. req->owner_nlportid != info->snd_portid))
  7501. return -ENOENT;
  7502. return cfg80211_stop_sched_scan_req(rdev, req, false);
  7503. }
  7504. static int nl80211_start_radar_detection(struct sk_buff *skb,
  7505. struct genl_info *info)
  7506. {
  7507. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  7508. struct net_device *dev = info->user_ptr[1];
  7509. struct wireless_dev *wdev = dev->ieee80211_ptr;
  7510. struct wiphy *wiphy = wdev->wiphy;
  7511. struct cfg80211_chan_def chandef;
  7512. enum nl80211_dfs_regions dfs_region;
  7513. unsigned int cac_time_ms;
  7514. int err;
  7515. dfs_region = reg_get_dfs_region(wiphy);
  7516. if (dfs_region == NL80211_DFS_UNSET)
  7517. return -EINVAL;
  7518. err = nl80211_parse_chandef(rdev, info, &chandef);
  7519. if (err)
  7520. return err;
  7521. if (netif_carrier_ok(dev))
  7522. return -EBUSY;
  7523. if (wdev->cac_started)
  7524. return -EBUSY;
  7525. err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype);
  7526. if (err < 0)
  7527. return err;
  7528. if (err == 0)
  7529. return -EINVAL;
  7530. if (!cfg80211_chandef_dfs_usable(wiphy, &chandef))
  7531. return -EINVAL;
  7532. /* CAC start is offloaded to HW and can't be started manually */
  7533. if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD))
  7534. return -EOPNOTSUPP;
  7535. if (!rdev->ops->start_radar_detection)
  7536. return -EOPNOTSUPP;
  7537. cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef);
  7538. if (WARN_ON(!cac_time_ms))
  7539. cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
  7540. err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms);
  7541. if (!err) {
  7542. wdev->chandef = chandef;
  7543. wdev->cac_started = true;
  7544. wdev->cac_start_time = jiffies;
  7545. wdev->cac_time_ms = cac_time_ms;
  7546. }
  7547. return err;
  7548. }
  7549. static int nl80211_notify_radar_detection(struct sk_buff *skb,
  7550. struct genl_info *info)
  7551. {
  7552. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  7553. struct net_device *dev = info->user_ptr[1];
  7554. struct wireless_dev *wdev = dev->ieee80211_ptr;
  7555. struct wiphy *wiphy = wdev->wiphy;
  7556. struct cfg80211_chan_def chandef;
  7557. enum nl80211_dfs_regions dfs_region;
  7558. int err;
  7559. dfs_region = reg_get_dfs_region(wiphy);
  7560. if (dfs_region == NL80211_DFS_UNSET) {
  7561. GENL_SET_ERR_MSG(info,
  7562. "DFS Region is not set. Unexpected Radar indication");
  7563. return -EINVAL;
  7564. }
  7565. err = nl80211_parse_chandef(rdev, info, &chandef);
  7566. if (err) {
  7567. GENL_SET_ERR_MSG(info, "Unable to extract chandef info");
  7568. return err;
  7569. }
  7570. err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype);
  7571. if (err < 0) {
  7572. GENL_SET_ERR_MSG(info, "chandef is invalid");
  7573. return err;
  7574. }
  7575. if (err == 0) {
  7576. GENL_SET_ERR_MSG(info,
  7577. "Unexpected Radar indication for chandef/iftype");
  7578. return -EINVAL;
  7579. }
  7580. /* Do not process this notification if radar is already detected
  7581. * by kernel on this channel, and return success.
  7582. */
  7583. if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE)
  7584. return 0;
  7585. cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_UNAVAILABLE);
  7586. cfg80211_sched_dfs_chan_update(rdev);
  7587. rdev->radar_chandef = chandef;
  7588. /* Propagate this notification to other radios as well */
  7589. queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk);
  7590. return 0;
  7591. }
  7592. static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
  7593. {
  7594. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  7595. struct net_device *dev = info->user_ptr[1];
  7596. struct wireless_dev *wdev = dev->ieee80211_ptr;
  7597. struct cfg80211_csa_settings params;
  7598. /* csa_attrs is defined static to avoid waste of stack size - this
  7599. * function is called under RTNL lock, so this should not be a problem.
  7600. */
  7601. static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1];
  7602. int err;
  7603. bool need_new_beacon = false;
  7604. bool need_handle_dfs_flag = true;
  7605. int len, i;
  7606. u32 cs_count;
  7607. if (!rdev->ops->channel_switch ||
  7608. !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH))
  7609. return -EOPNOTSUPP;
  7610. switch (dev->ieee80211_ptr->iftype) {
  7611. case NL80211_IFTYPE_AP:
  7612. case NL80211_IFTYPE_P2P_GO:
  7613. need_new_beacon = true;
  7614. /* For all modes except AP the handle_dfs flag needs to be
  7615. * supplied to tell the kernel that userspace will handle radar
  7616. * events when they happen. Otherwise a switch to a channel
  7617. * requiring DFS will be rejected.
  7618. */
  7619. need_handle_dfs_flag = false;
  7620. /* useless if AP is not running */
  7621. if (!wdev->beacon_interval)
  7622. return -ENOTCONN;
  7623. break;
  7624. case NL80211_IFTYPE_ADHOC:
  7625. if (!wdev->ssid_len)
  7626. return -ENOTCONN;
  7627. break;
  7628. case NL80211_IFTYPE_MESH_POINT:
  7629. if (!wdev->mesh_id_len)
  7630. return -ENOTCONN;
  7631. break;
  7632. default:
  7633. return -EOPNOTSUPP;
  7634. }
  7635. memset(&params, 0, sizeof(params));
  7636. params.beacon_csa.ftm_responder = -1;
  7637. if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
  7638. !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT])
  7639. return -EINVAL;
  7640. /* only important for AP, IBSS and mesh create IEs internally */
  7641. if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES])
  7642. return -EINVAL;
  7643. /* Even though the attribute is u32, the specification says
  7644. * u8, so let's make sure we don't overflow.
  7645. */
  7646. cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]);
  7647. if (cs_count > 255)
  7648. return -EINVAL;
  7649. params.count = cs_count;
  7650. if (!need_new_beacon)
  7651. goto skip_beacons;
  7652. err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_after);
  7653. if (err)
  7654. return err;
  7655. err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX,
  7656. info->attrs[NL80211_ATTR_CSA_IES],
  7657. nl80211_policy, info->extack);
  7658. if (err)
  7659. return err;
  7660. err = nl80211_parse_beacon(rdev, csa_attrs, &params.beacon_csa);
  7661. if (err)
  7662. return err;
  7663. if (!csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON])
  7664. return -EINVAL;
  7665. len = nla_len(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]);
  7666. if (!len || (len % sizeof(u16)))
  7667. return -EINVAL;
  7668. params.n_counter_offsets_beacon = len / sizeof(u16);
  7669. if (rdev->wiphy.max_num_csa_counters &&
  7670. (params.n_counter_offsets_beacon >
  7671. rdev->wiphy.max_num_csa_counters))
  7672. return -EINVAL;
  7673. params.counter_offsets_beacon =
  7674. nla_data(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]);
  7675. /* sanity checks - counters should fit and be the same */
  7676. for (i = 0; i < params.n_counter_offsets_beacon; i++) {
  7677. u16 offset = params.counter_offsets_beacon[i];
  7678. if (offset >= params.beacon_csa.tail_len)
  7679. return -EINVAL;
  7680. if (params.beacon_csa.tail[offset] != params.count)
  7681. return -EINVAL;
  7682. }
  7683. if (csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP]) {
  7684. len = nla_len(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP]);
  7685. if (!len || (len % sizeof(u16)))
  7686. return -EINVAL;
  7687. params.n_counter_offsets_presp = len / sizeof(u16);
  7688. if (rdev->wiphy.max_num_csa_counters &&
  7689. (params.n_counter_offsets_presp >
  7690. rdev->wiphy.max_num_csa_counters))
  7691. return -EINVAL;
  7692. params.counter_offsets_presp =
  7693. nla_data(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP]);
  7694. /* sanity checks - counters should fit and be the same */
  7695. for (i = 0; i < params.n_counter_offsets_presp; i++) {
  7696. u16 offset = params.counter_offsets_presp[i];
  7697. if (offset >= params.beacon_csa.probe_resp_len)
  7698. return -EINVAL;
  7699. if (params.beacon_csa.probe_resp[offset] !=
  7700. params.count)
  7701. return -EINVAL;
  7702. }
  7703. }
  7704. skip_beacons:
  7705. err = nl80211_parse_chandef(rdev, info, &params.chandef);
  7706. if (err)
  7707. return err;
  7708. if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef,
  7709. wdev->iftype))
  7710. return -EINVAL;
  7711. err = cfg80211_chandef_dfs_required(wdev->wiphy,
  7712. &params.chandef,
  7713. wdev->iftype);
  7714. if (err < 0)
  7715. return err;
  7716. if (err > 0) {
  7717. params.radar_required = true;
  7718. if (need_handle_dfs_flag &&
  7719. !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) {
  7720. return -EINVAL;
  7721. }
  7722. }
  7723. if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
  7724. params.block_tx = true;
  7725. wdev_lock(wdev);
  7726. err = rdev_channel_switch(rdev, dev, &params);
  7727. wdev_unlock(wdev);
  7728. return err;
  7729. }
  7730. static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
  7731. u32 seq, int flags,
  7732. struct cfg80211_registered_device *rdev,
  7733. struct wireless_dev *wdev,
  7734. struct cfg80211_internal_bss *intbss)
  7735. {
  7736. struct cfg80211_bss *res = &intbss->pub;
  7737. const struct cfg80211_bss_ies *ies;
  7738. void *hdr;
  7739. struct nlattr *bss;
  7740. ASSERT_WDEV_LOCK(wdev);
  7741. hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags,
  7742. NL80211_CMD_NEW_SCAN_RESULTS);
  7743. if (!hdr)
  7744. return -1;
  7745. genl_dump_check_consistent(cb, hdr);
  7746. if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation))
  7747. goto nla_put_failure;
  7748. if (wdev->netdev &&
  7749. nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex))
  7750. goto nla_put_failure;
  7751. if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
  7752. NL80211_ATTR_PAD))
  7753. goto nla_put_failure;
  7754. bss = nla_nest_start_noflag(msg, NL80211_ATTR_BSS);
  7755. if (!bss)
  7756. goto nla_put_failure;
  7757. if ((!is_zero_ether_addr(res->bssid) &&
  7758. nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid)))
  7759. goto nla_put_failure;
  7760. rcu_read_lock();
  7761. /* indicate whether we have probe response data or not */
  7762. if (rcu_access_pointer(res->proberesp_ies) &&
  7763. nla_put_flag(msg, NL80211_BSS_PRESP_DATA))
  7764. goto fail_unlock_rcu;
  7765. /* this pointer prefers to be pointed to probe response data
  7766. * but is always valid
  7767. */
  7768. ies = rcu_dereference(res->ies);
  7769. if (ies) {
  7770. if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf,
  7771. NL80211_BSS_PAD))
  7772. goto fail_unlock_rcu;
  7773. if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS,
  7774. ies->len, ies->data))
  7775. goto fail_unlock_rcu;
  7776. }
  7777. /* and this pointer is always (unless driver didn't know) beacon data */
  7778. ies = rcu_dereference(res->beacon_ies);
  7779. if (ies && ies->from_beacon) {
  7780. if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf,
  7781. NL80211_BSS_PAD))
  7782. goto fail_unlock_rcu;
  7783. if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES,
  7784. ies->len, ies->data))
  7785. goto fail_unlock_rcu;
  7786. }
  7787. rcu_read_unlock();
  7788. if (res->beacon_interval &&
  7789. nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval))
  7790. goto nla_put_failure;
  7791. if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) ||
  7792. nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) ||
  7793. nla_put_u32(msg, NL80211_BSS_FREQUENCY_OFFSET,
  7794. res->channel->freq_offset) ||
  7795. nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) ||
  7796. nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO,
  7797. jiffies_to_msecs(jiffies - intbss->ts)))
  7798. goto nla_put_failure;
  7799. if (intbss->parent_tsf &&
  7800. (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF,
  7801. intbss->parent_tsf, NL80211_BSS_PAD) ||
  7802. nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN,
  7803. intbss->parent_bssid)))
  7804. goto nla_put_failure;
  7805. if (intbss->ts_boottime &&
  7806. nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME,
  7807. intbss->ts_boottime, NL80211_BSS_PAD))
  7808. goto nla_put_failure;
  7809. if (!nl80211_put_signal(msg, intbss->pub.chains,
  7810. intbss->pub.chain_signal,
  7811. NL80211_BSS_CHAIN_SIGNAL))
  7812. goto nla_put_failure;
  7813. switch (rdev->wiphy.signal_type) {
  7814. case CFG80211_SIGNAL_TYPE_MBM:
  7815. if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal))
  7816. goto nla_put_failure;
  7817. break;
  7818. case CFG80211_SIGNAL_TYPE_UNSPEC:
  7819. if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal))
  7820. goto nla_put_failure;
  7821. break;
  7822. default:
  7823. break;
  7824. }
  7825. switch (wdev->iftype) {
  7826. case NL80211_IFTYPE_P2P_CLIENT:
  7827. case NL80211_IFTYPE_STATION:
  7828. if (intbss == wdev->current_bss &&
  7829. nla_put_u32(msg, NL80211_BSS_STATUS,
  7830. NL80211_BSS_STATUS_ASSOCIATED))
  7831. goto nla_put_failure;
  7832. break;
  7833. case NL80211_IFTYPE_ADHOC:
  7834. if (intbss == wdev->current_bss &&
  7835. nla_put_u32(msg, NL80211_BSS_STATUS,
  7836. NL80211_BSS_STATUS_IBSS_JOINED))
  7837. goto nla_put_failure;
  7838. break;
  7839. default:
  7840. break;
  7841. }
  7842. nla_nest_end(msg, bss);
  7843. genlmsg_end(msg, hdr);
  7844. return 0;
  7845. fail_unlock_rcu:
  7846. rcu_read_unlock();
  7847. nla_put_failure:
  7848. genlmsg_cancel(msg, hdr);
  7849. return -EMSGSIZE;
  7850. }
  7851. static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb)
  7852. {
  7853. struct cfg80211_registered_device *rdev;
  7854. struct cfg80211_internal_bss *scan;
  7855. struct wireless_dev *wdev;
  7856. int start = cb->args[2], idx = 0;
  7857. int err;
  7858. rtnl_lock();
  7859. err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
  7860. if (err) {
  7861. rtnl_unlock();
  7862. return err;
  7863. }
  7864. wdev_lock(wdev);
  7865. spin_lock_bh(&rdev->bss_lock);
  7866. /*
  7867. * dump_scan will be called multiple times to break up the scan results
  7868. * into multiple messages. It is unlikely that any more bss-es will be
  7869. * expired after the first call, so only call only call this on the
  7870. * first dump_scan invocation.
  7871. */
  7872. if (start == 0)
  7873. cfg80211_bss_expire(rdev);
  7874. cb->seq = rdev->bss_generation;
  7875. list_for_each_entry(scan, &rdev->bss_list, list) {
  7876. if (++idx <= start)
  7877. continue;
  7878. if (nl80211_send_bss(skb, cb,
  7879. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  7880. rdev, wdev, scan) < 0) {
  7881. idx--;
  7882. break;
  7883. }
  7884. }
  7885. spin_unlock_bh(&rdev->bss_lock);
  7886. wdev_unlock(wdev);
  7887. cb->args[2] = idx;
  7888. rtnl_unlock();
  7889. return skb->len;
  7890. }
  7891. static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq,
  7892. int flags, struct net_device *dev,
  7893. bool allow_radio_stats,
  7894. struct survey_info *survey)
  7895. {
  7896. void *hdr;
  7897. struct nlattr *infoattr;
  7898. /* skip radio stats if userspace didn't request them */
  7899. if (!survey->channel && !allow_radio_stats)
  7900. return 0;
  7901. hdr = nl80211hdr_put(msg, portid, seq, flags,
  7902. NL80211_CMD_NEW_SURVEY_RESULTS);
  7903. if (!hdr)
  7904. return -ENOMEM;
  7905. if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
  7906. goto nla_put_failure;
  7907. infoattr = nla_nest_start_noflag(msg, NL80211_ATTR_SURVEY_INFO);
  7908. if (!infoattr)
  7909. goto nla_put_failure;
  7910. if (survey->channel &&
  7911. nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY,
  7912. survey->channel->center_freq))
  7913. goto nla_put_failure;
  7914. if (survey->channel && survey->channel->freq_offset &&
  7915. nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY_OFFSET,
  7916. survey->channel->freq_offset))
  7917. goto nla_put_failure;
  7918. if ((survey->filled & SURVEY_INFO_NOISE_DBM) &&
  7919. nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise))
  7920. goto nla_put_failure;
  7921. if ((survey->filled & SURVEY_INFO_IN_USE) &&
  7922. nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE))
  7923. goto nla_put_failure;
  7924. if ((survey->filled & SURVEY_INFO_TIME) &&
  7925. nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME,
  7926. survey->time, NL80211_SURVEY_INFO_PAD))
  7927. goto nla_put_failure;
  7928. if ((survey->filled & SURVEY_INFO_TIME_BUSY) &&
  7929. nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY,
  7930. survey->time_busy, NL80211_SURVEY_INFO_PAD))
  7931. goto nla_put_failure;
  7932. if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) &&
  7933. nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY,
  7934. survey->time_ext_busy, NL80211_SURVEY_INFO_PAD))
  7935. goto nla_put_failure;
  7936. if ((survey->filled & SURVEY_INFO_TIME_RX) &&
  7937. nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX,
  7938. survey->time_rx, NL80211_SURVEY_INFO_PAD))
  7939. goto nla_put_failure;
  7940. if ((survey->filled & SURVEY_INFO_TIME_TX) &&
  7941. nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX,
  7942. survey->time_tx, NL80211_SURVEY_INFO_PAD))
  7943. goto nla_put_failure;
  7944. if ((survey->filled & SURVEY_INFO_TIME_SCAN) &&
  7945. nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN,
  7946. survey->time_scan, NL80211_SURVEY_INFO_PAD))
  7947. goto nla_put_failure;
  7948. if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) &&
  7949. nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BSS_RX,
  7950. survey->time_bss_rx, NL80211_SURVEY_INFO_PAD))
  7951. goto nla_put_failure;
  7952. nla_nest_end(msg, infoattr);
  7953. genlmsg_end(msg, hdr);
  7954. return 0;
  7955. nla_put_failure:
  7956. genlmsg_cancel(msg, hdr);
  7957. return -EMSGSIZE;
  7958. }
  7959. static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb)
  7960. {
  7961. struct nlattr **attrbuf;
  7962. struct survey_info survey;
  7963. struct cfg80211_registered_device *rdev;
  7964. struct wireless_dev *wdev;
  7965. int survey_idx = cb->args[2];
  7966. int res;
  7967. bool radio_stats;
  7968. attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), GFP_KERNEL);
  7969. if (!attrbuf)
  7970. return -ENOMEM;
  7971. rtnl_lock();
  7972. res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
  7973. if (res)
  7974. goto out_err;
  7975. /* prepare_wdev_dump parsed the attributes */
  7976. radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS];
  7977. if (!wdev->netdev) {
  7978. res = -EINVAL;
  7979. goto out_err;
  7980. }
  7981. if (!rdev->ops->dump_survey) {
  7982. res = -EOPNOTSUPP;
  7983. goto out_err;
  7984. }
  7985. while (1) {
  7986. res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey);
  7987. if (res == -ENOENT)
  7988. break;
  7989. if (res)
  7990. goto out_err;
  7991. /* don't send disabled channels, but do send non-channel data */
  7992. if (survey.channel &&
  7993. survey.channel->flags & IEEE80211_CHAN_DISABLED) {
  7994. survey_idx++;
  7995. continue;
  7996. }
  7997. if (nl80211_send_survey(skb,
  7998. NETLINK_CB(cb->skb).portid,
  7999. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  8000. wdev->netdev, radio_stats, &survey) < 0)
  8001. goto out;
  8002. survey_idx++;
  8003. }
  8004. out:
  8005. cb->args[2] = survey_idx;
  8006. res = skb->len;
  8007. out_err:
  8008. kfree(attrbuf);
  8009. rtnl_unlock();
  8010. return res;
  8011. }
  8012. static bool nl80211_valid_wpa_versions(u32 wpa_versions)
  8013. {
  8014. return !(wpa_versions & ~(NL80211_WPA_VERSION_1 |
  8015. NL80211_WPA_VERSION_2 |
  8016. NL80211_WPA_VERSION_3));
  8017. }
  8018. static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
  8019. {
  8020. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  8021. struct net_device *dev = info->user_ptr[1];
  8022. struct ieee80211_channel *chan;
  8023. const u8 *bssid, *ssid, *ie = NULL, *auth_data = NULL;
  8024. int err, ssid_len, ie_len = 0, auth_data_len = 0;
  8025. enum nl80211_auth_type auth_type;
  8026. struct key_parse key;
  8027. bool local_state_change;
  8028. u32 freq;
  8029. if (!info->attrs[NL80211_ATTR_MAC])
  8030. return -EINVAL;
  8031. if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
  8032. return -EINVAL;
  8033. if (!info->attrs[NL80211_ATTR_SSID])
  8034. return -EINVAL;
  8035. if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
  8036. return -EINVAL;
  8037. err = nl80211_parse_key(info, &key);
  8038. if (err)
  8039. return err;
  8040. if (key.idx >= 0) {
  8041. if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP)
  8042. return -EINVAL;
  8043. if (!key.p.key || !key.p.key_len)
  8044. return -EINVAL;
  8045. if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 ||
  8046. key.p.key_len != WLAN_KEY_LEN_WEP40) &&
  8047. (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 ||
  8048. key.p.key_len != WLAN_KEY_LEN_WEP104))
  8049. return -EINVAL;
  8050. if (key.idx > 3)
  8051. return -EINVAL;
  8052. } else {
  8053. key.p.key_len = 0;
  8054. key.p.key = NULL;
  8055. }
  8056. if (key.idx >= 0) {
  8057. int i;
  8058. bool ok = false;
  8059. for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) {
  8060. if (key.p.cipher == rdev->wiphy.cipher_suites[i]) {
  8061. ok = true;
  8062. break;
  8063. }
  8064. }
  8065. if (!ok)
  8066. return -EINVAL;
  8067. }
  8068. if (!rdev->ops->auth)
  8069. return -EOPNOTSUPP;
  8070. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  8071. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  8072. return -EOPNOTSUPP;
  8073. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  8074. freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
  8075. if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
  8076. freq +=
  8077. nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
  8078. chan = nl80211_get_valid_chan(&rdev->wiphy, freq);
  8079. if (!chan)
  8080. return -EINVAL;
  8081. ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  8082. ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  8083. if (info->attrs[NL80211_ATTR_IE]) {
  8084. ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  8085. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  8086. }
  8087. auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
  8088. if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE))
  8089. return -EINVAL;
  8090. if ((auth_type == NL80211_AUTHTYPE_SAE ||
  8091. auth_type == NL80211_AUTHTYPE_FILS_SK ||
  8092. auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
  8093. auth_type == NL80211_AUTHTYPE_FILS_PK) &&
  8094. !info->attrs[NL80211_ATTR_AUTH_DATA])
  8095. return -EINVAL;
  8096. if (info->attrs[NL80211_ATTR_AUTH_DATA]) {
  8097. if (auth_type != NL80211_AUTHTYPE_SAE &&
  8098. auth_type != NL80211_AUTHTYPE_FILS_SK &&
  8099. auth_type != NL80211_AUTHTYPE_FILS_SK_PFS &&
  8100. auth_type != NL80211_AUTHTYPE_FILS_PK)
  8101. return -EINVAL;
  8102. auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]);
  8103. auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]);
  8104. }
  8105. local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
  8106. /*
  8107. * Since we no longer track auth state, ignore
  8108. * requests to only change local state.
  8109. */
  8110. if (local_state_change)
  8111. return 0;
  8112. wdev_lock(dev->ieee80211_ptr);
  8113. err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid,
  8114. ssid, ssid_len, ie, ie_len,
  8115. key.p.key, key.p.key_len, key.idx,
  8116. auth_data, auth_data_len);
  8117. wdev_unlock(dev->ieee80211_ptr);
  8118. return err;
  8119. }
  8120. static int validate_pae_over_nl80211(struct cfg80211_registered_device *rdev,
  8121. struct genl_info *info)
  8122. {
  8123. if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
  8124. GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set");
  8125. return -EINVAL;
  8126. }
  8127. if (!rdev->ops->tx_control_port ||
  8128. !wiphy_ext_feature_isset(&rdev->wiphy,
  8129. NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211))
  8130. return -EOPNOTSUPP;
  8131. return 0;
  8132. }
  8133. static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
  8134. struct genl_info *info,
  8135. struct cfg80211_crypto_settings *settings,
  8136. int cipher_limit)
  8137. {
  8138. memset(settings, 0, sizeof(*settings));
  8139. settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
  8140. if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
  8141. u16 proto;
  8142. proto = nla_get_u16(
  8143. info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
  8144. settings->control_port_ethertype = cpu_to_be16(proto);
  8145. if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
  8146. proto != ETH_P_PAE)
  8147. return -EINVAL;
  8148. if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT])
  8149. settings->control_port_no_encrypt = true;
  8150. } else
  8151. settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE);
  8152. if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
  8153. int r = validate_pae_over_nl80211(rdev, info);
  8154. if (r < 0)
  8155. return r;
  8156. settings->control_port_over_nl80211 = true;
  8157. if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH])
  8158. settings->control_port_no_preauth = true;
  8159. }
  8160. if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) {
  8161. void *data;
  8162. int len, i;
  8163. data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
  8164. len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
  8165. settings->n_ciphers_pairwise = len / sizeof(u32);
  8166. if (len % sizeof(u32))
  8167. return -EINVAL;
  8168. if (settings->n_ciphers_pairwise > cipher_limit)
  8169. return -EINVAL;
  8170. memcpy(settings->ciphers_pairwise, data, len);
  8171. for (i = 0; i < settings->n_ciphers_pairwise; i++)
  8172. if (!cfg80211_supported_cipher_suite(
  8173. &rdev->wiphy,
  8174. settings->ciphers_pairwise[i]))
  8175. return -EINVAL;
  8176. }
  8177. if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) {
  8178. settings->cipher_group =
  8179. nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]);
  8180. if (!cfg80211_supported_cipher_suite(&rdev->wiphy,
  8181. settings->cipher_group))
  8182. return -EINVAL;
  8183. }
  8184. if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) {
  8185. settings->wpa_versions =
  8186. nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]);
  8187. if (!nl80211_valid_wpa_versions(settings->wpa_versions))
  8188. return -EINVAL;
  8189. }
  8190. if (info->attrs[NL80211_ATTR_AKM_SUITES]) {
  8191. void *data;
  8192. int len;
  8193. data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]);
  8194. len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]);
  8195. settings->n_akm_suites = len / sizeof(u32);
  8196. if (len % sizeof(u32))
  8197. return -EINVAL;
  8198. if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES)
  8199. return -EINVAL;
  8200. memcpy(settings->akm_suites, data, len);
  8201. }
  8202. if (info->attrs[NL80211_ATTR_PMK]) {
  8203. if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN)
  8204. return -EINVAL;
  8205. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  8206. NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK) &&
  8207. !wiphy_ext_feature_isset(&rdev->wiphy,
  8208. NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK))
  8209. return -EINVAL;
  8210. settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]);
  8211. }
  8212. if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) {
  8213. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  8214. NL80211_EXT_FEATURE_SAE_OFFLOAD) &&
  8215. !wiphy_ext_feature_isset(&rdev->wiphy,
  8216. NL80211_EXT_FEATURE_SAE_OFFLOAD_AP))
  8217. return -EINVAL;
  8218. settings->sae_pwd =
  8219. nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]);
  8220. settings->sae_pwd_len =
  8221. nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]);
  8222. }
  8223. if (info->attrs[NL80211_ATTR_SAE_PWE])
  8224. settings->sae_pwe =
  8225. nla_get_u8(info->attrs[NL80211_ATTR_SAE_PWE]);
  8226. else
  8227. settings->sae_pwe = NL80211_SAE_PWE_UNSPECIFIED;
  8228. return 0;
  8229. }
  8230. static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
  8231. {
  8232. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  8233. struct net_device *dev = info->user_ptr[1];
  8234. struct ieee80211_channel *chan;
  8235. struct cfg80211_assoc_request req = {};
  8236. const u8 *bssid, *ssid;
  8237. int err, ssid_len = 0;
  8238. u32 freq;
  8239. if (dev->ieee80211_ptr->conn_owner_nlportid &&
  8240. dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
  8241. return -EPERM;
  8242. if (!info->attrs[NL80211_ATTR_MAC] ||
  8243. !info->attrs[NL80211_ATTR_SSID] ||
  8244. !info->attrs[NL80211_ATTR_WIPHY_FREQ])
  8245. return -EINVAL;
  8246. if (!rdev->ops->assoc)
  8247. return -EOPNOTSUPP;
  8248. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  8249. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  8250. return -EOPNOTSUPP;
  8251. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  8252. freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
  8253. if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
  8254. freq +=
  8255. nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
  8256. chan = nl80211_get_valid_chan(&rdev->wiphy, freq);
  8257. if (!chan)
  8258. return -EINVAL;
  8259. ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  8260. ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  8261. if (info->attrs[NL80211_ATTR_IE]) {
  8262. req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  8263. req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  8264. }
  8265. if (info->attrs[NL80211_ATTR_USE_MFP]) {
  8266. enum nl80211_mfp mfp =
  8267. nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
  8268. if (mfp == NL80211_MFP_REQUIRED)
  8269. req.use_mfp = true;
  8270. else if (mfp != NL80211_MFP_NO)
  8271. return -EINVAL;
  8272. }
  8273. if (info->attrs[NL80211_ATTR_PREV_BSSID])
  8274. req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
  8275. if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
  8276. req.flags |= ASSOC_REQ_DISABLE_HT;
  8277. if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
  8278. memcpy(&req.ht_capa_mask,
  8279. nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
  8280. sizeof(req.ht_capa_mask));
  8281. if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
  8282. if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
  8283. return -EINVAL;
  8284. memcpy(&req.ht_capa,
  8285. nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
  8286. sizeof(req.ht_capa));
  8287. }
  8288. if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
  8289. req.flags |= ASSOC_REQ_DISABLE_VHT;
  8290. if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
  8291. memcpy(&req.vht_capa_mask,
  8292. nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
  8293. sizeof(req.vht_capa_mask));
  8294. if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
  8295. if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
  8296. return -EINVAL;
  8297. memcpy(&req.vht_capa,
  8298. nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
  8299. sizeof(req.vht_capa));
  8300. }
  8301. if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
  8302. if (!((rdev->wiphy.features &
  8303. NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
  8304. (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
  8305. !wiphy_ext_feature_isset(&rdev->wiphy,
  8306. NL80211_EXT_FEATURE_RRM))
  8307. return -EINVAL;
  8308. req.flags |= ASSOC_REQ_USE_RRM;
  8309. }
  8310. if (info->attrs[NL80211_ATTR_FILS_KEK]) {
  8311. req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]);
  8312. req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]);
  8313. if (!info->attrs[NL80211_ATTR_FILS_NONCES])
  8314. return -EINVAL;
  8315. req.fils_nonces =
  8316. nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]);
  8317. }
  8318. if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) {
  8319. if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY])
  8320. return -EINVAL;
  8321. memcpy(&req.s1g_capa_mask,
  8322. nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]),
  8323. sizeof(req.s1g_capa_mask));
  8324. }
  8325. if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) {
  8326. if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK])
  8327. return -EINVAL;
  8328. memcpy(&req.s1g_capa,
  8329. nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]),
  8330. sizeof(req.s1g_capa));
  8331. }
  8332. err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
  8333. if (!err) {
  8334. wdev_lock(dev->ieee80211_ptr);
  8335. err = cfg80211_mlme_assoc(rdev, dev, chan, bssid,
  8336. ssid, ssid_len, &req);
  8337. if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
  8338. dev->ieee80211_ptr->conn_owner_nlportid =
  8339. info->snd_portid;
  8340. memcpy(dev->ieee80211_ptr->disconnect_bssid,
  8341. bssid, ETH_ALEN);
  8342. }
  8343. wdev_unlock(dev->ieee80211_ptr);
  8344. }
  8345. return err;
  8346. }
  8347. static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
  8348. {
  8349. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  8350. struct net_device *dev = info->user_ptr[1];
  8351. const u8 *ie = NULL, *bssid;
  8352. int ie_len = 0, err;
  8353. u16 reason_code;
  8354. bool local_state_change;
  8355. if (dev->ieee80211_ptr->conn_owner_nlportid &&
  8356. dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
  8357. return -EPERM;
  8358. if (!info->attrs[NL80211_ATTR_MAC])
  8359. return -EINVAL;
  8360. if (!info->attrs[NL80211_ATTR_REASON_CODE])
  8361. return -EINVAL;
  8362. if (!rdev->ops->deauth)
  8363. return -EOPNOTSUPP;
  8364. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  8365. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  8366. return -EOPNOTSUPP;
  8367. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  8368. reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
  8369. if (reason_code == 0) {
  8370. /* Reason Code 0 is reserved */
  8371. return -EINVAL;
  8372. }
  8373. if (info->attrs[NL80211_ATTR_IE]) {
  8374. ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  8375. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  8376. }
  8377. local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
  8378. wdev_lock(dev->ieee80211_ptr);
  8379. err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code,
  8380. local_state_change);
  8381. wdev_unlock(dev->ieee80211_ptr);
  8382. return err;
  8383. }
  8384. static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
  8385. {
  8386. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  8387. struct net_device *dev = info->user_ptr[1];
  8388. const u8 *ie = NULL, *bssid;
  8389. int ie_len = 0, err;
  8390. u16 reason_code;
  8391. bool local_state_change;
  8392. if (dev->ieee80211_ptr->conn_owner_nlportid &&
  8393. dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
  8394. return -EPERM;
  8395. if (!info->attrs[NL80211_ATTR_MAC])
  8396. return -EINVAL;
  8397. if (!info->attrs[NL80211_ATTR_REASON_CODE])
  8398. return -EINVAL;
  8399. if (!rdev->ops->disassoc)
  8400. return -EOPNOTSUPP;
  8401. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  8402. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  8403. return -EOPNOTSUPP;
  8404. bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  8405. reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
  8406. if (reason_code == 0) {
  8407. /* Reason Code 0 is reserved */
  8408. return -EINVAL;
  8409. }
  8410. if (info->attrs[NL80211_ATTR_IE]) {
  8411. ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  8412. ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  8413. }
  8414. local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
  8415. wdev_lock(dev->ieee80211_ptr);
  8416. err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code,
  8417. local_state_change);
  8418. wdev_unlock(dev->ieee80211_ptr);
  8419. return err;
  8420. }
  8421. static bool
  8422. nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev,
  8423. int mcast_rate[NUM_NL80211_BANDS],
  8424. int rateval)
  8425. {
  8426. struct wiphy *wiphy = &rdev->wiphy;
  8427. bool found = false;
  8428. int band, i;
  8429. for (band = 0; band < NUM_NL80211_BANDS; band++) {
  8430. struct ieee80211_supported_band *sband;
  8431. sband = wiphy->bands[band];
  8432. if (!sband)
  8433. continue;
  8434. for (i = 0; i < sband->n_bitrates; i++) {
  8435. if (sband->bitrates[i].bitrate == rateval) {
  8436. mcast_rate[band] = i + 1;
  8437. found = true;
  8438. break;
  8439. }
  8440. }
  8441. }
  8442. return found;
  8443. }
  8444. static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
  8445. {
  8446. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  8447. struct net_device *dev = info->user_ptr[1];
  8448. struct cfg80211_ibss_params ibss;
  8449. struct wiphy *wiphy;
  8450. struct cfg80211_cached_keys *connkeys = NULL;
  8451. int err;
  8452. memset(&ibss, 0, sizeof(ibss));
  8453. if (!info->attrs[NL80211_ATTR_SSID] ||
  8454. !nla_len(info->attrs[NL80211_ATTR_SSID]))
  8455. return -EINVAL;
  8456. ibss.beacon_interval = 100;
  8457. if (info->attrs[NL80211_ATTR_BEACON_INTERVAL])
  8458. ibss.beacon_interval =
  8459. nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
  8460. err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC,
  8461. ibss.beacon_interval);
  8462. if (err)
  8463. return err;
  8464. if (!rdev->ops->join_ibss)
  8465. return -EOPNOTSUPP;
  8466. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
  8467. return -EOPNOTSUPP;
  8468. wiphy = &rdev->wiphy;
  8469. if (info->attrs[NL80211_ATTR_MAC]) {
  8470. ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  8471. if (!is_valid_ether_addr(ibss.bssid))
  8472. return -EINVAL;
  8473. }
  8474. ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  8475. ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  8476. if (info->attrs[NL80211_ATTR_IE]) {
  8477. ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  8478. ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  8479. }
  8480. err = nl80211_parse_chandef(rdev, info, &ibss.chandef);
  8481. if (err)
  8482. return err;
  8483. if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef,
  8484. NL80211_IFTYPE_ADHOC))
  8485. return -EINVAL;
  8486. switch (ibss.chandef.width) {
  8487. case NL80211_CHAN_WIDTH_5:
  8488. case NL80211_CHAN_WIDTH_10:
  8489. case NL80211_CHAN_WIDTH_20_NOHT:
  8490. break;
  8491. case NL80211_CHAN_WIDTH_20:
  8492. case NL80211_CHAN_WIDTH_40:
  8493. if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
  8494. return -EINVAL;
  8495. break;
  8496. case NL80211_CHAN_WIDTH_80:
  8497. case NL80211_CHAN_WIDTH_80P80:
  8498. case NL80211_CHAN_WIDTH_160:
  8499. if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS))
  8500. return -EINVAL;
  8501. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  8502. NL80211_EXT_FEATURE_VHT_IBSS))
  8503. return -EINVAL;
  8504. break;
  8505. default:
  8506. return -EINVAL;
  8507. }
  8508. ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
  8509. ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
  8510. if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
  8511. u8 *rates =
  8512. nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
  8513. int n_rates =
  8514. nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
  8515. struct ieee80211_supported_band *sband =
  8516. wiphy->bands[ibss.chandef.chan->band];
  8517. err = ieee80211_get_ratemask(sband, rates, n_rates,
  8518. &ibss.basic_rates);
  8519. if (err)
  8520. return err;
  8521. }
  8522. if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
  8523. memcpy(&ibss.ht_capa_mask,
  8524. nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
  8525. sizeof(ibss.ht_capa_mask));
  8526. if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
  8527. if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
  8528. return -EINVAL;
  8529. memcpy(&ibss.ht_capa,
  8530. nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
  8531. sizeof(ibss.ht_capa));
  8532. }
  8533. if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
  8534. !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate,
  8535. nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
  8536. return -EINVAL;
  8537. if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
  8538. bool no_ht = false;
  8539. connkeys = nl80211_parse_connkeys(rdev, info, &no_ht);
  8540. if (IS_ERR(connkeys))
  8541. return PTR_ERR(connkeys);
  8542. if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) &&
  8543. no_ht) {
  8544. kfree_sensitive(connkeys);
  8545. return -EINVAL;
  8546. }
  8547. }
  8548. ibss.control_port =
  8549. nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]);
  8550. if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
  8551. int r = validate_pae_over_nl80211(rdev, info);
  8552. if (r < 0) {
  8553. kfree_sensitive(connkeys);
  8554. return r;
  8555. }
  8556. ibss.control_port_over_nl80211 = true;
  8557. }
  8558. ibss.userspace_handles_dfs =
  8559. nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
  8560. wdev_lock(dev->ieee80211_ptr);
  8561. err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
  8562. if (err)
  8563. kfree_sensitive(connkeys);
  8564. else if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
  8565. dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
  8566. wdev_unlock(dev->ieee80211_ptr);
  8567. return err;
  8568. }
  8569. static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
  8570. {
  8571. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  8572. struct net_device *dev = info->user_ptr[1];
  8573. if (!rdev->ops->leave_ibss)
  8574. return -EOPNOTSUPP;
  8575. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)
  8576. return -EOPNOTSUPP;
  8577. return cfg80211_leave_ibss(rdev, dev, false);
  8578. }
  8579. static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info)
  8580. {
  8581. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  8582. struct net_device *dev = info->user_ptr[1];
  8583. int mcast_rate[NUM_NL80211_BANDS];
  8584. u32 nla_rate;
  8585. int err;
  8586. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC &&
  8587. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT &&
  8588. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB)
  8589. return -EOPNOTSUPP;
  8590. if (!rdev->ops->set_mcast_rate)
  8591. return -EOPNOTSUPP;
  8592. memset(mcast_rate, 0, sizeof(mcast_rate));
  8593. if (!info->attrs[NL80211_ATTR_MCAST_RATE])
  8594. return -EINVAL;
  8595. nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]);
  8596. if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate))
  8597. return -EINVAL;
  8598. err = rdev_set_mcast_rate(rdev, dev, mcast_rate);
  8599. return err;
  8600. }
  8601. static struct sk_buff *
  8602. __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev,
  8603. struct wireless_dev *wdev, int approxlen,
  8604. u32 portid, u32 seq, enum nl80211_commands cmd,
  8605. enum nl80211_attrs attr,
  8606. const struct nl80211_vendor_cmd_info *info,
  8607. gfp_t gfp)
  8608. {
  8609. struct sk_buff *skb;
  8610. void *hdr;
  8611. struct nlattr *data;
  8612. skb = nlmsg_new(approxlen + 100, gfp);
  8613. if (!skb)
  8614. return NULL;
  8615. hdr = nl80211hdr_put(skb, portid, seq, 0, cmd);
  8616. if (!hdr) {
  8617. kfree_skb(skb);
  8618. return NULL;
  8619. }
  8620. if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
  8621. goto nla_put_failure;
  8622. if (info) {
  8623. if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID,
  8624. info->vendor_id))
  8625. goto nla_put_failure;
  8626. if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD,
  8627. info->subcmd))
  8628. goto nla_put_failure;
  8629. }
  8630. if (wdev) {
  8631. if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
  8632. wdev_id(wdev), NL80211_ATTR_PAD))
  8633. goto nla_put_failure;
  8634. if (wdev->netdev &&
  8635. nla_put_u32(skb, NL80211_ATTR_IFINDEX,
  8636. wdev->netdev->ifindex))
  8637. goto nla_put_failure;
  8638. }
  8639. data = nla_nest_start_noflag(skb, attr);
  8640. if (!data)
  8641. goto nla_put_failure;
  8642. ((void **)skb->cb)[0] = rdev;
  8643. ((void **)skb->cb)[1] = hdr;
  8644. ((void **)skb->cb)[2] = data;
  8645. return skb;
  8646. nla_put_failure:
  8647. kfree_skb(skb);
  8648. return NULL;
  8649. }
  8650. struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
  8651. struct wireless_dev *wdev,
  8652. enum nl80211_commands cmd,
  8653. enum nl80211_attrs attr,
  8654. unsigned int portid,
  8655. int vendor_event_idx,
  8656. int approxlen, gfp_t gfp)
  8657. {
  8658. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  8659. const struct nl80211_vendor_cmd_info *info;
  8660. switch (cmd) {
  8661. case NL80211_CMD_TESTMODE:
  8662. if (WARN_ON(vendor_event_idx != -1))
  8663. return NULL;
  8664. info = NULL;
  8665. break;
  8666. case NL80211_CMD_VENDOR:
  8667. if (WARN_ON(vendor_event_idx < 0 ||
  8668. vendor_event_idx >= wiphy->n_vendor_events))
  8669. return NULL;
  8670. info = &wiphy->vendor_events[vendor_event_idx];
  8671. break;
  8672. default:
  8673. WARN_ON(1);
  8674. return NULL;
  8675. }
  8676. return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, portid, 0,
  8677. cmd, attr, info, gfp);
  8678. }
  8679. EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
  8680. void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
  8681. {
  8682. struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
  8683. void *hdr = ((void **)skb->cb)[1];
  8684. struct nlmsghdr *nlhdr = nlmsg_hdr(skb);
  8685. struct nlattr *data = ((void **)skb->cb)[2];
  8686. enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
  8687. /* clear CB data for netlink core to own from now on */
  8688. memset(skb->cb, 0, sizeof(skb->cb));
  8689. nla_nest_end(skb, data);
  8690. genlmsg_end(skb, hdr);
  8691. if (nlhdr->nlmsg_pid) {
  8692. genlmsg_unicast(wiphy_net(&rdev->wiphy), skb,
  8693. nlhdr->nlmsg_pid);
  8694. } else {
  8695. if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
  8696. mcgrp = NL80211_MCGRP_VENDOR;
  8697. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
  8698. skb, 0, mcgrp, gfp);
  8699. }
  8700. }
  8701. EXPORT_SYMBOL(__cfg80211_send_event_skb);
  8702. #ifdef CONFIG_NL80211_TESTMODE
  8703. static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
  8704. {
  8705. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  8706. struct wireless_dev *wdev =
  8707. __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
  8708. int err;
  8709. if (!rdev->ops->testmode_cmd)
  8710. return -EOPNOTSUPP;
  8711. if (IS_ERR(wdev)) {
  8712. err = PTR_ERR(wdev);
  8713. if (err != -EINVAL)
  8714. return err;
  8715. wdev = NULL;
  8716. } else if (wdev->wiphy != &rdev->wiphy) {
  8717. return -EINVAL;
  8718. }
  8719. if (!info->attrs[NL80211_ATTR_TESTDATA])
  8720. return -EINVAL;
  8721. rdev->cur_cmd_info = info;
  8722. err = rdev_testmode_cmd(rdev, wdev,
  8723. nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
  8724. nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
  8725. rdev->cur_cmd_info = NULL;
  8726. return err;
  8727. }
  8728. static int nl80211_testmode_dump(struct sk_buff *skb,
  8729. struct netlink_callback *cb)
  8730. {
  8731. struct cfg80211_registered_device *rdev;
  8732. struct nlattr **attrbuf = NULL;
  8733. int err;
  8734. long phy_idx;
  8735. void *data = NULL;
  8736. int data_len = 0;
  8737. rtnl_lock();
  8738. if (cb->args[0]) {
  8739. /*
  8740. * 0 is a valid index, but not valid for args[0],
  8741. * so we need to offset by 1.
  8742. */
  8743. phy_idx = cb->args[0] - 1;
  8744. rdev = cfg80211_rdev_by_wiphy_idx(phy_idx);
  8745. if (!rdev) {
  8746. err = -ENOENT;
  8747. goto out_err;
  8748. }
  8749. } else {
  8750. attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf),
  8751. GFP_KERNEL);
  8752. if (!attrbuf) {
  8753. err = -ENOMEM;
  8754. goto out_err;
  8755. }
  8756. err = nlmsg_parse_deprecated(cb->nlh,
  8757. GENL_HDRLEN + nl80211_fam.hdrsize,
  8758. attrbuf, nl80211_fam.maxattr,
  8759. nl80211_policy, NULL);
  8760. if (err)
  8761. goto out_err;
  8762. rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
  8763. if (IS_ERR(rdev)) {
  8764. err = PTR_ERR(rdev);
  8765. goto out_err;
  8766. }
  8767. phy_idx = rdev->wiphy_idx;
  8768. if (attrbuf[NL80211_ATTR_TESTDATA])
  8769. cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA];
  8770. }
  8771. if (cb->args[1]) {
  8772. data = nla_data((void *)cb->args[1]);
  8773. data_len = nla_len((void *)cb->args[1]);
  8774. }
  8775. if (!rdev->ops->testmode_dump) {
  8776. err = -EOPNOTSUPP;
  8777. goto out_err;
  8778. }
  8779. while (1) {
  8780. void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
  8781. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  8782. NL80211_CMD_TESTMODE);
  8783. struct nlattr *tmdata;
  8784. if (!hdr)
  8785. break;
  8786. if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) {
  8787. genlmsg_cancel(skb, hdr);
  8788. break;
  8789. }
  8790. tmdata = nla_nest_start_noflag(skb, NL80211_ATTR_TESTDATA);
  8791. if (!tmdata) {
  8792. genlmsg_cancel(skb, hdr);
  8793. break;
  8794. }
  8795. err = rdev_testmode_dump(rdev, skb, cb, data, data_len);
  8796. nla_nest_end(skb, tmdata);
  8797. if (err == -ENOBUFS || err == -ENOENT) {
  8798. genlmsg_cancel(skb, hdr);
  8799. break;
  8800. } else if (err) {
  8801. genlmsg_cancel(skb, hdr);
  8802. goto out_err;
  8803. }
  8804. genlmsg_end(skb, hdr);
  8805. }
  8806. err = skb->len;
  8807. /* see above */
  8808. cb->args[0] = phy_idx + 1;
  8809. out_err:
  8810. kfree(attrbuf);
  8811. rtnl_unlock();
  8812. return err;
  8813. }
  8814. #endif
  8815. static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
  8816. {
  8817. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  8818. struct net_device *dev = info->user_ptr[1];
  8819. struct cfg80211_connect_params connect;
  8820. struct wiphy *wiphy;
  8821. struct cfg80211_cached_keys *connkeys = NULL;
  8822. u32 freq = 0;
  8823. int err;
  8824. memset(&connect, 0, sizeof(connect));
  8825. if (!info->attrs[NL80211_ATTR_SSID] ||
  8826. !nla_len(info->attrs[NL80211_ATTR_SSID]))
  8827. return -EINVAL;
  8828. if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
  8829. connect.auth_type =
  8830. nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
  8831. if (!nl80211_valid_auth_type(rdev, connect.auth_type,
  8832. NL80211_CMD_CONNECT))
  8833. return -EINVAL;
  8834. } else
  8835. connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
  8836. connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
  8837. if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] &&
  8838. !wiphy_ext_feature_isset(&rdev->wiphy,
  8839. NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
  8840. return -EINVAL;
  8841. connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS];
  8842. err = nl80211_crypto_settings(rdev, info, &connect.crypto,
  8843. NL80211_MAX_NR_CIPHER_SUITES);
  8844. if (err)
  8845. return err;
  8846. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  8847. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  8848. return -EOPNOTSUPP;
  8849. wiphy = &rdev->wiphy;
  8850. connect.bg_scan_period = -1;
  8851. if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] &&
  8852. (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) {
  8853. connect.bg_scan_period =
  8854. nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]);
  8855. }
  8856. if (info->attrs[NL80211_ATTR_MAC])
  8857. connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  8858. else if (info->attrs[NL80211_ATTR_MAC_HINT])
  8859. connect.bssid_hint =
  8860. nla_data(info->attrs[NL80211_ATTR_MAC_HINT]);
  8861. connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  8862. connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  8863. if (info->attrs[NL80211_ATTR_IE]) {
  8864. connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  8865. connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  8866. }
  8867. if (info->attrs[NL80211_ATTR_USE_MFP]) {
  8868. connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
  8869. if (connect.mfp == NL80211_MFP_OPTIONAL &&
  8870. !wiphy_ext_feature_isset(&rdev->wiphy,
  8871. NL80211_EXT_FEATURE_MFP_OPTIONAL))
  8872. return -EOPNOTSUPP;
  8873. } else {
  8874. connect.mfp = NL80211_MFP_NO;
  8875. }
  8876. if (info->attrs[NL80211_ATTR_PREV_BSSID])
  8877. connect.prev_bssid =
  8878. nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
  8879. if (info->attrs[NL80211_ATTR_WIPHY_FREQ])
  8880. freq = MHZ_TO_KHZ(nla_get_u32(
  8881. info->attrs[NL80211_ATTR_WIPHY_FREQ]));
  8882. if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
  8883. freq +=
  8884. nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
  8885. if (freq) {
  8886. connect.channel = nl80211_get_valid_chan(wiphy, freq);
  8887. if (!connect.channel)
  8888. return -EINVAL;
  8889. } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) {
  8890. freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]);
  8891. freq = MHZ_TO_KHZ(freq);
  8892. connect.channel_hint = nl80211_get_valid_chan(wiphy, freq);
  8893. if (!connect.channel_hint)
  8894. return -EINVAL;
  8895. }
  8896. if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) {
  8897. connect.edmg.channels =
  8898. nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]);
  8899. if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG])
  8900. connect.edmg.bw_config =
  8901. nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]);
  8902. }
  8903. if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
  8904. connkeys = nl80211_parse_connkeys(rdev, info, NULL);
  8905. if (IS_ERR(connkeys))
  8906. return PTR_ERR(connkeys);
  8907. }
  8908. if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
  8909. connect.flags |= ASSOC_REQ_DISABLE_HT;
  8910. if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
  8911. memcpy(&connect.ht_capa_mask,
  8912. nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
  8913. sizeof(connect.ht_capa_mask));
  8914. if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
  8915. if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
  8916. kfree_sensitive(connkeys);
  8917. return -EINVAL;
  8918. }
  8919. memcpy(&connect.ht_capa,
  8920. nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
  8921. sizeof(connect.ht_capa));
  8922. }
  8923. if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
  8924. connect.flags |= ASSOC_REQ_DISABLE_VHT;
  8925. if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
  8926. memcpy(&connect.vht_capa_mask,
  8927. nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
  8928. sizeof(connect.vht_capa_mask));
  8929. if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
  8930. if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) {
  8931. kfree_sensitive(connkeys);
  8932. return -EINVAL;
  8933. }
  8934. memcpy(&connect.vht_capa,
  8935. nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
  8936. sizeof(connect.vht_capa));
  8937. }
  8938. if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
  8939. if (!((rdev->wiphy.features &
  8940. NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
  8941. (rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
  8942. !wiphy_ext_feature_isset(&rdev->wiphy,
  8943. NL80211_EXT_FEATURE_RRM)) {
  8944. kfree_sensitive(connkeys);
  8945. return -EINVAL;
  8946. }
  8947. connect.flags |= ASSOC_REQ_USE_RRM;
  8948. }
  8949. connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
  8950. if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) {
  8951. kfree_sensitive(connkeys);
  8952. return -EOPNOTSUPP;
  8953. }
  8954. if (info->attrs[NL80211_ATTR_BSS_SELECT]) {
  8955. /* bss selection makes no sense if bssid is set */
  8956. if (connect.bssid) {
  8957. kfree_sensitive(connkeys);
  8958. return -EINVAL;
  8959. }
  8960. err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT],
  8961. wiphy, &connect.bss_select);
  8962. if (err) {
  8963. kfree_sensitive(connkeys);
  8964. return err;
  8965. }
  8966. }
  8967. if (wiphy_ext_feature_isset(&rdev->wiphy,
  8968. NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) &&
  8969. info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] &&
  8970. info->attrs[NL80211_ATTR_FILS_ERP_REALM] &&
  8971. info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] &&
  8972. info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
  8973. connect.fils_erp_username =
  8974. nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
  8975. connect.fils_erp_username_len =
  8976. nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
  8977. connect.fils_erp_realm =
  8978. nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
  8979. connect.fils_erp_realm_len =
  8980. nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
  8981. connect.fils_erp_next_seq_num =
  8982. nla_get_u16(
  8983. info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]);
  8984. connect.fils_erp_rrk =
  8985. nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
  8986. connect.fils_erp_rrk_len =
  8987. nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
  8988. } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] ||
  8989. info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
  8990. info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
  8991. info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
  8992. kfree_sensitive(connkeys);
  8993. return -EINVAL;
  8994. }
  8995. if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) {
  8996. if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
  8997. kfree_sensitive(connkeys);
  8998. GENL_SET_ERR_MSG(info,
  8999. "external auth requires connection ownership");
  9000. return -EINVAL;
  9001. }
  9002. connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT;
  9003. }
  9004. wdev_lock(dev->ieee80211_ptr);
  9005. err = cfg80211_connect(rdev, dev, &connect, connkeys,
  9006. connect.prev_bssid);
  9007. if (err)
  9008. kfree_sensitive(connkeys);
  9009. if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
  9010. dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
  9011. if (connect.bssid)
  9012. memcpy(dev->ieee80211_ptr->disconnect_bssid,
  9013. connect.bssid, ETH_ALEN);
  9014. else
  9015. eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid);
  9016. }
  9017. wdev_unlock(dev->ieee80211_ptr);
  9018. return err;
  9019. }
  9020. static int nl80211_update_connect_params(struct sk_buff *skb,
  9021. struct genl_info *info)
  9022. {
  9023. struct cfg80211_connect_params connect = {};
  9024. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9025. struct net_device *dev = info->user_ptr[1];
  9026. struct wireless_dev *wdev = dev->ieee80211_ptr;
  9027. bool fils_sk_offload;
  9028. u32 auth_type;
  9029. u32 changed = 0;
  9030. int ret;
  9031. if (!rdev->ops->update_connect_params)
  9032. return -EOPNOTSUPP;
  9033. if (info->attrs[NL80211_ATTR_IE]) {
  9034. connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  9035. connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  9036. changed |= UPDATE_ASSOC_IES;
  9037. }
  9038. fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy,
  9039. NL80211_EXT_FEATURE_FILS_SK_OFFLOAD);
  9040. /*
  9041. * when driver supports fils-sk offload all attributes must be
  9042. * provided. So the else covers "fils-sk-not-all" and
  9043. * "no-fils-sk-any".
  9044. */
  9045. if (fils_sk_offload &&
  9046. info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] &&
  9047. info->attrs[NL80211_ATTR_FILS_ERP_REALM] &&
  9048. info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] &&
  9049. info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
  9050. connect.fils_erp_username =
  9051. nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
  9052. connect.fils_erp_username_len =
  9053. nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
  9054. connect.fils_erp_realm =
  9055. nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
  9056. connect.fils_erp_realm_len =
  9057. nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
  9058. connect.fils_erp_next_seq_num =
  9059. nla_get_u16(
  9060. info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]);
  9061. connect.fils_erp_rrk =
  9062. nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
  9063. connect.fils_erp_rrk_len =
  9064. nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
  9065. changed |= UPDATE_FILS_ERP_INFO;
  9066. } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] ||
  9067. info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
  9068. info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
  9069. info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
  9070. return -EINVAL;
  9071. }
  9072. if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
  9073. auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
  9074. if (!nl80211_valid_auth_type(rdev, auth_type,
  9075. NL80211_CMD_CONNECT))
  9076. return -EINVAL;
  9077. if (auth_type == NL80211_AUTHTYPE_FILS_SK &&
  9078. fils_sk_offload && !(changed & UPDATE_FILS_ERP_INFO))
  9079. return -EINVAL;
  9080. connect.auth_type = auth_type;
  9081. changed |= UPDATE_AUTH_TYPE;
  9082. }
  9083. wdev_lock(dev->ieee80211_ptr);
  9084. if (!wdev->current_bss)
  9085. ret = -ENOLINK;
  9086. else
  9087. ret = rdev_update_connect_params(rdev, dev, &connect, changed);
  9088. wdev_unlock(dev->ieee80211_ptr);
  9089. return ret;
  9090. }
  9091. static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
  9092. {
  9093. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9094. struct net_device *dev = info->user_ptr[1];
  9095. u16 reason;
  9096. int ret;
  9097. if (dev->ieee80211_ptr->conn_owner_nlportid &&
  9098. dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
  9099. return -EPERM;
  9100. if (!info->attrs[NL80211_ATTR_REASON_CODE])
  9101. reason = WLAN_REASON_DEAUTH_LEAVING;
  9102. else
  9103. reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
  9104. if (reason == 0)
  9105. return -EINVAL;
  9106. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  9107. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  9108. return -EOPNOTSUPP;
  9109. wdev_lock(dev->ieee80211_ptr);
  9110. ret = cfg80211_disconnect(rdev, dev, reason, true);
  9111. wdev_unlock(dev->ieee80211_ptr);
  9112. return ret;
  9113. }
  9114. static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
  9115. {
  9116. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9117. struct net *net;
  9118. int err;
  9119. if (info->attrs[NL80211_ATTR_PID]) {
  9120. u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
  9121. net = get_net_ns_by_pid(pid);
  9122. } else if (info->attrs[NL80211_ATTR_NETNS_FD]) {
  9123. u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]);
  9124. net = get_net_ns_by_fd(fd);
  9125. } else {
  9126. return -EINVAL;
  9127. }
  9128. if (IS_ERR(net))
  9129. return PTR_ERR(net);
  9130. err = 0;
  9131. /* check if anything to do */
  9132. if (!net_eq(wiphy_net(&rdev->wiphy), net))
  9133. err = cfg80211_switch_netns(rdev, net);
  9134. put_net(net);
  9135. return err;
  9136. }
  9137. static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info)
  9138. {
  9139. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9140. int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev,
  9141. struct cfg80211_pmksa *pmksa) = NULL;
  9142. struct net_device *dev = info->user_ptr[1];
  9143. struct cfg80211_pmksa pmksa;
  9144. memset(&pmksa, 0, sizeof(struct cfg80211_pmksa));
  9145. if (!info->attrs[NL80211_ATTR_PMKID])
  9146. return -EINVAL;
  9147. pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
  9148. if (info->attrs[NL80211_ATTR_MAC]) {
  9149. pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
  9150. } else if (info->attrs[NL80211_ATTR_SSID] &&
  9151. info->attrs[NL80211_ATTR_FILS_CACHE_ID] &&
  9152. (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA ||
  9153. info->attrs[NL80211_ATTR_PMK])) {
  9154. pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
  9155. pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  9156. pmksa.cache_id =
  9157. nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]);
  9158. } else {
  9159. return -EINVAL;
  9160. }
  9161. if (info->attrs[NL80211_ATTR_PMK]) {
  9162. pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
  9163. pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
  9164. }
  9165. if (info->attrs[NL80211_ATTR_PMK_LIFETIME])
  9166. pmksa.pmk_lifetime =
  9167. nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]);
  9168. if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD])
  9169. pmksa.pmk_reauth_threshold =
  9170. nla_get_u8(
  9171. info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]);
  9172. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  9173. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT &&
  9174. !(dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP &&
  9175. wiphy_ext_feature_isset(&rdev->wiphy,
  9176. NL80211_EXT_FEATURE_AP_PMKSA_CACHING)))
  9177. return -EOPNOTSUPP;
  9178. switch (info->genlhdr->cmd) {
  9179. case NL80211_CMD_SET_PMKSA:
  9180. rdev_ops = rdev->ops->set_pmksa;
  9181. break;
  9182. case NL80211_CMD_DEL_PMKSA:
  9183. rdev_ops = rdev->ops->del_pmksa;
  9184. break;
  9185. default:
  9186. WARN_ON(1);
  9187. break;
  9188. }
  9189. if (!rdev_ops)
  9190. return -EOPNOTSUPP;
  9191. return rdev_ops(&rdev->wiphy, dev, &pmksa);
  9192. }
  9193. static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info)
  9194. {
  9195. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9196. struct net_device *dev = info->user_ptr[1];
  9197. if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
  9198. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT)
  9199. return -EOPNOTSUPP;
  9200. if (!rdev->ops->flush_pmksa)
  9201. return -EOPNOTSUPP;
  9202. return rdev_flush_pmksa(rdev, dev);
  9203. }
  9204. static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
  9205. {
  9206. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9207. struct net_device *dev = info->user_ptr[1];
  9208. u8 action_code, dialog_token;
  9209. u32 peer_capability = 0;
  9210. u16 status_code;
  9211. u8 *peer;
  9212. bool initiator;
  9213. if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
  9214. !rdev->ops->tdls_mgmt)
  9215. return -EOPNOTSUPP;
  9216. if (!info->attrs[NL80211_ATTR_TDLS_ACTION] ||
  9217. !info->attrs[NL80211_ATTR_STATUS_CODE] ||
  9218. !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] ||
  9219. !info->attrs[NL80211_ATTR_IE] ||
  9220. !info->attrs[NL80211_ATTR_MAC])
  9221. return -EINVAL;
  9222. peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
  9223. action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
  9224. status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
  9225. dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
  9226. initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]);
  9227. if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY])
  9228. peer_capability =
  9229. nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]);
  9230. return rdev_tdls_mgmt(rdev, dev, peer, action_code,
  9231. dialog_token, status_code, peer_capability,
  9232. initiator,
  9233. nla_data(info->attrs[NL80211_ATTR_IE]),
  9234. nla_len(info->attrs[NL80211_ATTR_IE]));
  9235. }
  9236. static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info)
  9237. {
  9238. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9239. struct net_device *dev = info->user_ptr[1];
  9240. enum nl80211_tdls_operation operation;
  9241. u8 *peer;
  9242. if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
  9243. !rdev->ops->tdls_oper)
  9244. return -EOPNOTSUPP;
  9245. if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] ||
  9246. !info->attrs[NL80211_ATTR_MAC])
  9247. return -EINVAL;
  9248. operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]);
  9249. peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
  9250. return rdev_tdls_oper(rdev, dev, peer, operation);
  9251. }
  9252. static int nl80211_remain_on_channel(struct sk_buff *skb,
  9253. struct genl_info *info)
  9254. {
  9255. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9256. struct wireless_dev *wdev = info->user_ptr[1];
  9257. struct cfg80211_chan_def chandef;
  9258. const struct cfg80211_chan_def *compat_chandef;
  9259. struct sk_buff *msg;
  9260. void *hdr;
  9261. u64 cookie;
  9262. u32 duration;
  9263. int err;
  9264. if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
  9265. !info->attrs[NL80211_ATTR_DURATION])
  9266. return -EINVAL;
  9267. duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
  9268. if (!rdev->ops->remain_on_channel ||
  9269. !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL))
  9270. return -EOPNOTSUPP;
  9271. /*
  9272. * We should be on that channel for at least a minimum amount of
  9273. * time (10ms) but no longer than the driver supports.
  9274. */
  9275. if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
  9276. duration > rdev->wiphy.max_remain_on_channel_duration)
  9277. return -EINVAL;
  9278. err = nl80211_parse_chandef(rdev, info, &chandef);
  9279. if (err)
  9280. return err;
  9281. wdev_lock(wdev);
  9282. if (!cfg80211_off_channel_oper_allowed(wdev) &&
  9283. !cfg80211_chandef_identical(&wdev->chandef, &chandef)) {
  9284. compat_chandef = cfg80211_chandef_compatible(&wdev->chandef,
  9285. &chandef);
  9286. if (compat_chandef != &chandef) {
  9287. wdev_unlock(wdev);
  9288. return -EBUSY;
  9289. }
  9290. }
  9291. wdev_unlock(wdev);
  9292. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  9293. if (!msg)
  9294. return -ENOMEM;
  9295. hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
  9296. NL80211_CMD_REMAIN_ON_CHANNEL);
  9297. if (!hdr) {
  9298. err = -ENOBUFS;
  9299. goto free_msg;
  9300. }
  9301. err = rdev_remain_on_channel(rdev, wdev, chandef.chan,
  9302. duration, &cookie);
  9303. if (err)
  9304. goto free_msg;
  9305. if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
  9306. NL80211_ATTR_PAD))
  9307. goto nla_put_failure;
  9308. genlmsg_end(msg, hdr);
  9309. return genlmsg_reply(msg, info);
  9310. nla_put_failure:
  9311. err = -ENOBUFS;
  9312. free_msg:
  9313. nlmsg_free(msg);
  9314. return err;
  9315. }
  9316. static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
  9317. struct genl_info *info)
  9318. {
  9319. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9320. struct wireless_dev *wdev = info->user_ptr[1];
  9321. u64 cookie;
  9322. if (!info->attrs[NL80211_ATTR_COOKIE])
  9323. return -EINVAL;
  9324. if (!rdev->ops->cancel_remain_on_channel)
  9325. return -EOPNOTSUPP;
  9326. cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
  9327. return rdev_cancel_remain_on_channel(rdev, wdev, cookie);
  9328. }
  9329. static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
  9330. struct genl_info *info)
  9331. {
  9332. struct cfg80211_bitrate_mask mask;
  9333. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9334. struct net_device *dev = info->user_ptr[1];
  9335. int err;
  9336. if (!rdev->ops->set_bitrate_mask)
  9337. return -EOPNOTSUPP;
  9338. err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
  9339. NL80211_ATTR_TX_RATES, &mask,
  9340. dev);
  9341. if (err)
  9342. return err;
  9343. return rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
  9344. }
  9345. static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
  9346. {
  9347. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9348. struct wireless_dev *wdev = info->user_ptr[1];
  9349. u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
  9350. if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
  9351. return -EINVAL;
  9352. if (info->attrs[NL80211_ATTR_FRAME_TYPE])
  9353. frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
  9354. switch (wdev->iftype) {
  9355. case NL80211_IFTYPE_STATION:
  9356. case NL80211_IFTYPE_ADHOC:
  9357. case NL80211_IFTYPE_P2P_CLIENT:
  9358. case NL80211_IFTYPE_AP:
  9359. case NL80211_IFTYPE_AP_VLAN:
  9360. case NL80211_IFTYPE_MESH_POINT:
  9361. case NL80211_IFTYPE_P2P_GO:
  9362. case NL80211_IFTYPE_P2P_DEVICE:
  9363. break;
  9364. case NL80211_IFTYPE_NAN:
  9365. default:
  9366. return -EOPNOTSUPP;
  9367. }
  9368. /* not much point in registering if we can't reply */
  9369. if (!rdev->ops->mgmt_tx)
  9370. return -EOPNOTSUPP;
  9371. if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] &&
  9372. !wiphy_ext_feature_isset(&rdev->wiphy,
  9373. NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS)) {
  9374. GENL_SET_ERR_MSG(info,
  9375. "multicast RX registrations are not supported");
  9376. return -EOPNOTSUPP;
  9377. }
  9378. return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type,
  9379. nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
  9380. nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]),
  9381. info->attrs[NL80211_ATTR_RECEIVE_MULTICAST],
  9382. info->extack);
  9383. }
  9384. static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
  9385. {
  9386. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9387. struct wireless_dev *wdev = info->user_ptr[1];
  9388. struct cfg80211_chan_def chandef;
  9389. int err;
  9390. void *hdr = NULL;
  9391. u64 cookie;
  9392. struct sk_buff *msg = NULL;
  9393. struct cfg80211_mgmt_tx_params params = {
  9394. .dont_wait_for_ack =
  9395. info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK],
  9396. };
  9397. if (!info->attrs[NL80211_ATTR_FRAME])
  9398. return -EINVAL;
  9399. if (!rdev->ops->mgmt_tx)
  9400. return -EOPNOTSUPP;
  9401. switch (wdev->iftype) {
  9402. case NL80211_IFTYPE_P2P_DEVICE:
  9403. if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
  9404. return -EINVAL;
  9405. case NL80211_IFTYPE_STATION:
  9406. case NL80211_IFTYPE_ADHOC:
  9407. case NL80211_IFTYPE_P2P_CLIENT:
  9408. case NL80211_IFTYPE_AP:
  9409. case NL80211_IFTYPE_AP_VLAN:
  9410. case NL80211_IFTYPE_MESH_POINT:
  9411. case NL80211_IFTYPE_P2P_GO:
  9412. break;
  9413. case NL80211_IFTYPE_NAN:
  9414. default:
  9415. return -EOPNOTSUPP;
  9416. }
  9417. if (info->attrs[NL80211_ATTR_DURATION]) {
  9418. if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
  9419. return -EINVAL;
  9420. params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
  9421. /*
  9422. * We should wait on the channel for at least a minimum amount
  9423. * of time (10ms) but no longer than the driver supports.
  9424. */
  9425. if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME ||
  9426. params.wait > rdev->wiphy.max_remain_on_channel_duration)
  9427. return -EINVAL;
  9428. }
  9429. params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
  9430. if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
  9431. return -EINVAL;
  9432. params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
  9433. /* get the channel if any has been specified, otherwise pass NULL to
  9434. * the driver. The latter will use the current one
  9435. */
  9436. chandef.chan = NULL;
  9437. if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
  9438. err = nl80211_parse_chandef(rdev, info, &chandef);
  9439. if (err)
  9440. return err;
  9441. }
  9442. if (!chandef.chan && params.offchan)
  9443. return -EINVAL;
  9444. wdev_lock(wdev);
  9445. if (params.offchan && !cfg80211_off_channel_oper_allowed(wdev)) {
  9446. wdev_unlock(wdev);
  9447. return -EBUSY;
  9448. }
  9449. wdev_unlock(wdev);
  9450. params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
  9451. params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
  9452. if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) {
  9453. int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
  9454. int i;
  9455. if (len % sizeof(u16))
  9456. return -EINVAL;
  9457. params.n_csa_offsets = len / sizeof(u16);
  9458. params.csa_offsets =
  9459. nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
  9460. /* check that all the offsets fit the frame */
  9461. for (i = 0; i < params.n_csa_offsets; i++) {
  9462. if (params.csa_offsets[i] >= params.len)
  9463. return -EINVAL;
  9464. }
  9465. }
  9466. if (!params.dont_wait_for_ack) {
  9467. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  9468. if (!msg)
  9469. return -ENOMEM;
  9470. hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
  9471. NL80211_CMD_FRAME);
  9472. if (!hdr) {
  9473. err = -ENOBUFS;
  9474. goto free_msg;
  9475. }
  9476. }
  9477. params.chan = chandef.chan;
  9478. err = cfg80211_mlme_mgmt_tx(rdev, wdev, &params, &cookie);
  9479. if (err)
  9480. goto free_msg;
  9481. if (msg) {
  9482. if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
  9483. NL80211_ATTR_PAD))
  9484. goto nla_put_failure;
  9485. genlmsg_end(msg, hdr);
  9486. return genlmsg_reply(msg, info);
  9487. }
  9488. return 0;
  9489. nla_put_failure:
  9490. err = -ENOBUFS;
  9491. free_msg:
  9492. nlmsg_free(msg);
  9493. return err;
  9494. }
  9495. static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
  9496. {
  9497. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9498. struct wireless_dev *wdev = info->user_ptr[1];
  9499. u64 cookie;
  9500. if (!info->attrs[NL80211_ATTR_COOKIE])
  9501. return -EINVAL;
  9502. if (!rdev->ops->mgmt_tx_cancel_wait)
  9503. return -EOPNOTSUPP;
  9504. switch (wdev->iftype) {
  9505. case NL80211_IFTYPE_STATION:
  9506. case NL80211_IFTYPE_ADHOC:
  9507. case NL80211_IFTYPE_P2P_CLIENT:
  9508. case NL80211_IFTYPE_AP:
  9509. case NL80211_IFTYPE_AP_VLAN:
  9510. case NL80211_IFTYPE_P2P_GO:
  9511. case NL80211_IFTYPE_P2P_DEVICE:
  9512. break;
  9513. case NL80211_IFTYPE_NAN:
  9514. default:
  9515. return -EOPNOTSUPP;
  9516. }
  9517. cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
  9518. return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie);
  9519. }
  9520. static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
  9521. {
  9522. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9523. struct wireless_dev *wdev;
  9524. struct net_device *dev = info->user_ptr[1];
  9525. u8 ps_state;
  9526. bool state;
  9527. int err;
  9528. if (!info->attrs[NL80211_ATTR_PS_STATE])
  9529. return -EINVAL;
  9530. ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]);
  9531. wdev = dev->ieee80211_ptr;
  9532. if (!rdev->ops->set_power_mgmt)
  9533. return -EOPNOTSUPP;
  9534. state = (ps_state == NL80211_PS_ENABLED) ? true : false;
  9535. if (state == wdev->ps)
  9536. return 0;
  9537. err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout);
  9538. if (!err)
  9539. wdev->ps = state;
  9540. return err;
  9541. }
  9542. static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info)
  9543. {
  9544. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9545. enum nl80211_ps_state ps_state;
  9546. struct wireless_dev *wdev;
  9547. struct net_device *dev = info->user_ptr[1];
  9548. struct sk_buff *msg;
  9549. void *hdr;
  9550. int err;
  9551. wdev = dev->ieee80211_ptr;
  9552. if (!rdev->ops->set_power_mgmt)
  9553. return -EOPNOTSUPP;
  9554. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  9555. if (!msg)
  9556. return -ENOMEM;
  9557. hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
  9558. NL80211_CMD_GET_POWER_SAVE);
  9559. if (!hdr) {
  9560. err = -ENOBUFS;
  9561. goto free_msg;
  9562. }
  9563. if (wdev->ps)
  9564. ps_state = NL80211_PS_ENABLED;
  9565. else
  9566. ps_state = NL80211_PS_DISABLED;
  9567. if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state))
  9568. goto nla_put_failure;
  9569. genlmsg_end(msg, hdr);
  9570. return genlmsg_reply(msg, info);
  9571. nla_put_failure:
  9572. err = -ENOBUFS;
  9573. free_msg:
  9574. nlmsg_free(msg);
  9575. return err;
  9576. }
  9577. static const struct nla_policy
  9578. nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
  9579. [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY },
  9580. [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 },
  9581. [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
  9582. [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 },
  9583. [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
  9584. [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 },
  9585. [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 },
  9586. };
  9587. static int nl80211_set_cqm_txe(struct genl_info *info,
  9588. u32 rate, u32 pkts, u32 intvl)
  9589. {
  9590. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9591. struct net_device *dev = info->user_ptr[1];
  9592. struct wireless_dev *wdev = dev->ieee80211_ptr;
  9593. if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL)
  9594. return -EINVAL;
  9595. if (!rdev->ops->set_cqm_txe_config)
  9596. return -EOPNOTSUPP;
  9597. if (wdev->iftype != NL80211_IFTYPE_STATION &&
  9598. wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
  9599. return -EOPNOTSUPP;
  9600. return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl);
  9601. }
  9602. static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev,
  9603. struct net_device *dev)
  9604. {
  9605. struct wireless_dev *wdev = dev->ieee80211_ptr;
  9606. s32 last, low, high;
  9607. u32 hyst;
  9608. int i, n, low_index;
  9609. int err;
  9610. /* RSSI reporting disabled? */
  9611. if (!wdev->cqm_config)
  9612. return rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0);
  9613. /*
  9614. * Obtain current RSSI value if possible, if not and no RSSI threshold
  9615. * event has been received yet, we should receive an event after a
  9616. * connection is established and enough beacons received to calculate
  9617. * the average.
  9618. */
  9619. if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss &&
  9620. rdev->ops->get_station) {
  9621. struct station_info sinfo = {};
  9622. u8 *mac_addr;
  9623. mac_addr = wdev->current_bss->pub.bssid;
  9624. err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
  9625. if (err)
  9626. return err;
  9627. cfg80211_sinfo_release_content(&sinfo);
  9628. if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG))
  9629. wdev->cqm_config->last_rssi_event_value =
  9630. (s8) sinfo.rx_beacon_signal_avg;
  9631. }
  9632. last = wdev->cqm_config->last_rssi_event_value;
  9633. hyst = wdev->cqm_config->rssi_hyst;
  9634. n = wdev->cqm_config->n_rssi_thresholds;
  9635. for (i = 0; i < n; i++) {
  9636. i = array_index_nospec(i, n);
  9637. if (last < wdev->cqm_config->rssi_thresholds[i])
  9638. break;
  9639. }
  9640. low_index = i - 1;
  9641. if (low_index >= 0) {
  9642. low_index = array_index_nospec(low_index, n);
  9643. low = wdev->cqm_config->rssi_thresholds[low_index] - hyst;
  9644. } else {
  9645. low = S32_MIN;
  9646. }
  9647. if (i < n) {
  9648. i = array_index_nospec(i, n);
  9649. high = wdev->cqm_config->rssi_thresholds[i] + hyst - 1;
  9650. } else {
  9651. high = S32_MAX;
  9652. }
  9653. return rdev_set_cqm_rssi_range_config(rdev, dev, low, high);
  9654. }
  9655. static int nl80211_set_cqm_rssi(struct genl_info *info,
  9656. const s32 *thresholds, int n_thresholds,
  9657. u32 hysteresis)
  9658. {
  9659. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9660. struct net_device *dev = info->user_ptr[1];
  9661. struct wireless_dev *wdev = dev->ieee80211_ptr;
  9662. int i, err;
  9663. s32 prev = S32_MIN;
  9664. /* Check all values negative and sorted */
  9665. for (i = 0; i < n_thresholds; i++) {
  9666. if (thresholds[i] > 0 || thresholds[i] <= prev)
  9667. return -EINVAL;
  9668. prev = thresholds[i];
  9669. }
  9670. if (wdev->iftype != NL80211_IFTYPE_STATION &&
  9671. wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
  9672. return -EOPNOTSUPP;
  9673. wdev_lock(wdev);
  9674. cfg80211_cqm_config_free(wdev);
  9675. wdev_unlock(wdev);
  9676. if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) {
  9677. if (n_thresholds == 0 || thresholds[0] == 0) /* Disabling */
  9678. return rdev_set_cqm_rssi_config(rdev, dev, 0, 0);
  9679. return rdev_set_cqm_rssi_config(rdev, dev,
  9680. thresholds[0], hysteresis);
  9681. }
  9682. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  9683. NL80211_EXT_FEATURE_CQM_RSSI_LIST))
  9684. return -EOPNOTSUPP;
  9685. if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */
  9686. n_thresholds = 0;
  9687. wdev_lock(wdev);
  9688. if (n_thresholds) {
  9689. struct cfg80211_cqm_config *cqm_config;
  9690. cqm_config = kzalloc(sizeof(struct cfg80211_cqm_config) +
  9691. n_thresholds * sizeof(s32), GFP_KERNEL);
  9692. if (!cqm_config) {
  9693. err = -ENOMEM;
  9694. goto unlock;
  9695. }
  9696. cqm_config->rssi_hyst = hysteresis;
  9697. cqm_config->n_rssi_thresholds = n_thresholds;
  9698. memcpy(cqm_config->rssi_thresholds, thresholds,
  9699. n_thresholds * sizeof(s32));
  9700. wdev->cqm_config = cqm_config;
  9701. }
  9702. err = cfg80211_cqm_rssi_update(rdev, dev);
  9703. unlock:
  9704. wdev_unlock(wdev);
  9705. return err;
  9706. }
  9707. static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
  9708. {
  9709. struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1];
  9710. struct nlattr *cqm;
  9711. int err;
  9712. cqm = info->attrs[NL80211_ATTR_CQM];
  9713. if (!cqm)
  9714. return -EINVAL;
  9715. err = nla_parse_nested_deprecated(attrs, NL80211_ATTR_CQM_MAX, cqm,
  9716. nl80211_attr_cqm_policy,
  9717. info->extack);
  9718. if (err)
  9719. return err;
  9720. if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] &&
  9721. attrs[NL80211_ATTR_CQM_RSSI_HYST]) {
  9722. const s32 *thresholds =
  9723. nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
  9724. int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
  9725. u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
  9726. if (len % 4)
  9727. return -EINVAL;
  9728. return nl80211_set_cqm_rssi(info, thresholds, len / 4,
  9729. hysteresis);
  9730. }
  9731. if (attrs[NL80211_ATTR_CQM_TXE_RATE] &&
  9732. attrs[NL80211_ATTR_CQM_TXE_PKTS] &&
  9733. attrs[NL80211_ATTR_CQM_TXE_INTVL]) {
  9734. u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]);
  9735. u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]);
  9736. u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]);
  9737. return nl80211_set_cqm_txe(info, rate, pkts, intvl);
  9738. }
  9739. return -EINVAL;
  9740. }
  9741. static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info)
  9742. {
  9743. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9744. struct net_device *dev = info->user_ptr[1];
  9745. struct ocb_setup setup = {};
  9746. int err;
  9747. err = nl80211_parse_chandef(rdev, info, &setup.chandef);
  9748. if (err)
  9749. return err;
  9750. return cfg80211_join_ocb(rdev, dev, &setup);
  9751. }
  9752. static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info)
  9753. {
  9754. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9755. struct net_device *dev = info->user_ptr[1];
  9756. return cfg80211_leave_ocb(rdev, dev);
  9757. }
  9758. static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
  9759. {
  9760. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9761. struct net_device *dev = info->user_ptr[1];
  9762. struct mesh_config cfg;
  9763. struct mesh_setup setup;
  9764. int err;
  9765. /* start with default */
  9766. memcpy(&cfg, &default_mesh_config, sizeof(cfg));
  9767. memcpy(&setup, &default_mesh_setup, sizeof(setup));
  9768. if (info->attrs[NL80211_ATTR_MESH_CONFIG]) {
  9769. /* and parse parameters if given */
  9770. err = nl80211_parse_mesh_config(info, &cfg, NULL);
  9771. if (err)
  9772. return err;
  9773. }
  9774. if (!info->attrs[NL80211_ATTR_MESH_ID] ||
  9775. !nla_len(info->attrs[NL80211_ATTR_MESH_ID]))
  9776. return -EINVAL;
  9777. setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
  9778. setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
  9779. if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
  9780. !nl80211_parse_mcast_rate(rdev, setup.mcast_rate,
  9781. nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
  9782. return -EINVAL;
  9783. if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
  9784. setup.beacon_interval =
  9785. nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
  9786. err = cfg80211_validate_beacon_int(rdev,
  9787. NL80211_IFTYPE_MESH_POINT,
  9788. setup.beacon_interval);
  9789. if (err)
  9790. return err;
  9791. }
  9792. if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
  9793. setup.dtim_period =
  9794. nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
  9795. if (setup.dtim_period < 1 || setup.dtim_period > 100)
  9796. return -EINVAL;
  9797. }
  9798. if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
  9799. /* parse additional setup parameters if given */
  9800. err = nl80211_parse_mesh_setup(info, &setup);
  9801. if (err)
  9802. return err;
  9803. }
  9804. if (setup.user_mpm)
  9805. cfg.auto_open_plinks = false;
  9806. if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
  9807. err = nl80211_parse_chandef(rdev, info, &setup.chandef);
  9808. if (err)
  9809. return err;
  9810. } else {
  9811. /* __cfg80211_join_mesh() will sort it out */
  9812. setup.chandef.chan = NULL;
  9813. }
  9814. if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
  9815. u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
  9816. int n_rates =
  9817. nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
  9818. struct ieee80211_supported_band *sband;
  9819. if (!setup.chandef.chan)
  9820. return -EINVAL;
  9821. sband = rdev->wiphy.bands[setup.chandef.chan->band];
  9822. err = ieee80211_get_ratemask(sband, rates, n_rates,
  9823. &setup.basic_rates);
  9824. if (err)
  9825. return err;
  9826. }
  9827. if (info->attrs[NL80211_ATTR_TX_RATES]) {
  9828. err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
  9829. NL80211_ATTR_TX_RATES,
  9830. &setup.beacon_rate,
  9831. dev);
  9832. if (err)
  9833. return err;
  9834. if (!setup.chandef.chan)
  9835. return -EINVAL;
  9836. err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band,
  9837. &setup.beacon_rate);
  9838. if (err)
  9839. return err;
  9840. }
  9841. setup.userspace_handles_dfs =
  9842. nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
  9843. if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
  9844. int r = validate_pae_over_nl80211(rdev, info);
  9845. if (r < 0)
  9846. return r;
  9847. setup.control_port_over_nl80211 = true;
  9848. }
  9849. wdev_lock(dev->ieee80211_ptr);
  9850. err = __cfg80211_join_mesh(rdev, dev, &setup, &cfg);
  9851. if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER])
  9852. dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
  9853. wdev_unlock(dev->ieee80211_ptr);
  9854. return err;
  9855. }
  9856. static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
  9857. {
  9858. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  9859. struct net_device *dev = info->user_ptr[1];
  9860. return cfg80211_leave_mesh(rdev, dev);
  9861. }
  9862. #ifdef CONFIG_PM
  9863. static int nl80211_send_wowlan_patterns(struct sk_buff *msg,
  9864. struct cfg80211_registered_device *rdev)
  9865. {
  9866. struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config;
  9867. struct nlattr *nl_pats, *nl_pat;
  9868. int i, pat_len;
  9869. if (!wowlan->n_patterns)
  9870. return 0;
  9871. nl_pats = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN);
  9872. if (!nl_pats)
  9873. return -ENOBUFS;
  9874. for (i = 0; i < wowlan->n_patterns; i++) {
  9875. nl_pat = nla_nest_start_noflag(msg, i + 1);
  9876. if (!nl_pat)
  9877. return -ENOBUFS;
  9878. pat_len = wowlan->patterns[i].pattern_len;
  9879. if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8),
  9880. wowlan->patterns[i].mask) ||
  9881. nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
  9882. wowlan->patterns[i].pattern) ||
  9883. nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
  9884. wowlan->patterns[i].pkt_offset))
  9885. return -ENOBUFS;
  9886. nla_nest_end(msg, nl_pat);
  9887. }
  9888. nla_nest_end(msg, nl_pats);
  9889. return 0;
  9890. }
  9891. static int nl80211_send_wowlan_tcp(struct sk_buff *msg,
  9892. struct cfg80211_wowlan_tcp *tcp)
  9893. {
  9894. struct nlattr *nl_tcp;
  9895. if (!tcp)
  9896. return 0;
  9897. nl_tcp = nla_nest_start_noflag(msg,
  9898. NL80211_WOWLAN_TRIG_TCP_CONNECTION);
  9899. if (!nl_tcp)
  9900. return -ENOBUFS;
  9901. if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) ||
  9902. nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) ||
  9903. nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) ||
  9904. nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) ||
  9905. nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) ||
  9906. nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
  9907. tcp->payload_len, tcp->payload) ||
  9908. nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
  9909. tcp->data_interval) ||
  9910. nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
  9911. tcp->wake_len, tcp->wake_data) ||
  9912. nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK,
  9913. DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask))
  9914. return -ENOBUFS;
  9915. if (tcp->payload_seq.len &&
  9916. nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ,
  9917. sizeof(tcp->payload_seq), &tcp->payload_seq))
  9918. return -ENOBUFS;
  9919. if (tcp->payload_tok.len &&
  9920. nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
  9921. sizeof(tcp->payload_tok) + tcp->tokens_size,
  9922. &tcp->payload_tok))
  9923. return -ENOBUFS;
  9924. nla_nest_end(msg, nl_tcp);
  9925. return 0;
  9926. }
  9927. static int nl80211_send_wowlan_nd(struct sk_buff *msg,
  9928. struct cfg80211_sched_scan_request *req)
  9929. {
  9930. struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan;
  9931. int i;
  9932. if (!req)
  9933. return 0;
  9934. nd = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_NET_DETECT);
  9935. if (!nd)
  9936. return -ENOBUFS;
  9937. if (req->n_scan_plans == 1 &&
  9938. nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL,
  9939. req->scan_plans[0].interval * 1000))
  9940. return -ENOBUFS;
  9941. if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay))
  9942. return -ENOBUFS;
  9943. if (req->relative_rssi_set) {
  9944. struct nl80211_bss_select_rssi_adjust rssi_adjust;
  9945. if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI,
  9946. req->relative_rssi))
  9947. return -ENOBUFS;
  9948. rssi_adjust.band = req->rssi_adjust.band;
  9949. rssi_adjust.delta = req->rssi_adjust.delta;
  9950. if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST,
  9951. sizeof(rssi_adjust), &rssi_adjust))
  9952. return -ENOBUFS;
  9953. }
  9954. freqs = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES);
  9955. if (!freqs)
  9956. return -ENOBUFS;
  9957. for (i = 0; i < req->n_channels; i++) {
  9958. if (nla_put_u32(msg, i, req->channels[i]->center_freq))
  9959. return -ENOBUFS;
  9960. }
  9961. nla_nest_end(msg, freqs);
  9962. if (req->n_match_sets) {
  9963. matches = nla_nest_start_noflag(msg,
  9964. NL80211_ATTR_SCHED_SCAN_MATCH);
  9965. if (!matches)
  9966. return -ENOBUFS;
  9967. for (i = 0; i < req->n_match_sets; i++) {
  9968. match = nla_nest_start_noflag(msg, i);
  9969. if (!match)
  9970. return -ENOBUFS;
  9971. if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
  9972. req->match_sets[i].ssid.ssid_len,
  9973. req->match_sets[i].ssid.ssid))
  9974. return -ENOBUFS;
  9975. nla_nest_end(msg, match);
  9976. }
  9977. nla_nest_end(msg, matches);
  9978. }
  9979. scan_plans = nla_nest_start_noflag(msg, NL80211_ATTR_SCHED_SCAN_PLANS);
  9980. if (!scan_plans)
  9981. return -ENOBUFS;
  9982. for (i = 0; i < req->n_scan_plans; i++) {
  9983. scan_plan = nla_nest_start_noflag(msg, i + 1);
  9984. if (!scan_plan)
  9985. return -ENOBUFS;
  9986. if (nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL,
  9987. req->scan_plans[i].interval) ||
  9988. (req->scan_plans[i].iterations &&
  9989. nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS,
  9990. req->scan_plans[i].iterations)))
  9991. return -ENOBUFS;
  9992. nla_nest_end(msg, scan_plan);
  9993. }
  9994. nla_nest_end(msg, scan_plans);
  9995. nla_nest_end(msg, nd);
  9996. return 0;
  9997. }
  9998. static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
  9999. {
  10000. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  10001. struct sk_buff *msg;
  10002. void *hdr;
  10003. u32 size = NLMSG_DEFAULT_SIZE;
  10004. if (!rdev->wiphy.wowlan)
  10005. return -EOPNOTSUPP;
  10006. if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) {
  10007. /* adjust size to have room for all the data */
  10008. size += rdev->wiphy.wowlan_config->tcp->tokens_size +
  10009. rdev->wiphy.wowlan_config->tcp->payload_len +
  10010. rdev->wiphy.wowlan_config->tcp->wake_len +
  10011. rdev->wiphy.wowlan_config->tcp->wake_len / 8;
  10012. }
  10013. msg = nlmsg_new(size, GFP_KERNEL);
  10014. if (!msg)
  10015. return -ENOMEM;
  10016. hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
  10017. NL80211_CMD_GET_WOWLAN);
  10018. if (!hdr)
  10019. goto nla_put_failure;
  10020. if (rdev->wiphy.wowlan_config) {
  10021. struct nlattr *nl_wowlan;
  10022. nl_wowlan = nla_nest_start_noflag(msg,
  10023. NL80211_ATTR_WOWLAN_TRIGGERS);
  10024. if (!nl_wowlan)
  10025. goto nla_put_failure;
  10026. if ((rdev->wiphy.wowlan_config->any &&
  10027. nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) ||
  10028. (rdev->wiphy.wowlan_config->disconnect &&
  10029. nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) ||
  10030. (rdev->wiphy.wowlan_config->magic_pkt &&
  10031. nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) ||
  10032. (rdev->wiphy.wowlan_config->gtk_rekey_failure &&
  10033. nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) ||
  10034. (rdev->wiphy.wowlan_config->eap_identity_req &&
  10035. nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) ||
  10036. (rdev->wiphy.wowlan_config->four_way_handshake &&
  10037. nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) ||
  10038. (rdev->wiphy.wowlan_config->rfkill_release &&
  10039. nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)))
  10040. goto nla_put_failure;
  10041. if (nl80211_send_wowlan_patterns(msg, rdev))
  10042. goto nla_put_failure;
  10043. if (nl80211_send_wowlan_tcp(msg,
  10044. rdev->wiphy.wowlan_config->tcp))
  10045. goto nla_put_failure;
  10046. if (nl80211_send_wowlan_nd(
  10047. msg,
  10048. rdev->wiphy.wowlan_config->nd_config))
  10049. goto nla_put_failure;
  10050. nla_nest_end(msg, nl_wowlan);
  10051. }
  10052. genlmsg_end(msg, hdr);
  10053. return genlmsg_reply(msg, info);
  10054. nla_put_failure:
  10055. nlmsg_free(msg);
  10056. return -ENOBUFS;
  10057. }
  10058. static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev,
  10059. struct nlattr *attr,
  10060. struct cfg80211_wowlan *trig)
  10061. {
  10062. struct nlattr *tb[NUM_NL80211_WOWLAN_TCP];
  10063. struct cfg80211_wowlan_tcp *cfg;
  10064. struct nl80211_wowlan_tcp_data_token *tok = NULL;
  10065. struct nl80211_wowlan_tcp_data_seq *seq = NULL;
  10066. u32 size;
  10067. u32 data_size, wake_size, tokens_size = 0, wake_mask_size;
  10068. int err, port;
  10069. if (!rdev->wiphy.wowlan->tcp)
  10070. return -EINVAL;
  10071. err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TCP, attr,
  10072. nl80211_wowlan_tcp_policy, NULL);
  10073. if (err)
  10074. return err;
  10075. if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] ||
  10076. !tb[NL80211_WOWLAN_TCP_DST_IPV4] ||
  10077. !tb[NL80211_WOWLAN_TCP_DST_MAC] ||
  10078. !tb[NL80211_WOWLAN_TCP_DST_PORT] ||
  10079. !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] ||
  10080. !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] ||
  10081. !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] ||
  10082. !tb[NL80211_WOWLAN_TCP_WAKE_MASK])
  10083. return -EINVAL;
  10084. data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]);
  10085. if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max)
  10086. return -EINVAL;
  10087. if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) >
  10088. rdev->wiphy.wowlan->tcp->data_interval_max ||
  10089. nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0)
  10090. return -EINVAL;
  10091. wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]);
  10092. if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max)
  10093. return -EINVAL;
  10094. wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]);
  10095. if (wake_mask_size != DIV_ROUND_UP(wake_size, 8))
  10096. return -EINVAL;
  10097. if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) {
  10098. u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
  10099. tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]);
  10100. tokens_size = tokln - sizeof(*tok);
  10101. if (!tok->len || tokens_size % tok->len)
  10102. return -EINVAL;
  10103. if (!rdev->wiphy.wowlan->tcp->tok)
  10104. return -EINVAL;
  10105. if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len)
  10106. return -EINVAL;
  10107. if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len)
  10108. return -EINVAL;
  10109. if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize)
  10110. return -EINVAL;
  10111. if (tok->offset + tok->len > data_size)
  10112. return -EINVAL;
  10113. }
  10114. if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) {
  10115. seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]);
  10116. if (!rdev->wiphy.wowlan->tcp->seq)
  10117. return -EINVAL;
  10118. if (seq->len == 0 || seq->len > 4)
  10119. return -EINVAL;
  10120. if (seq->len + seq->offset > data_size)
  10121. return -EINVAL;
  10122. }
  10123. size = sizeof(*cfg);
  10124. size += data_size;
  10125. size += wake_size + wake_mask_size;
  10126. size += tokens_size;
  10127. cfg = kzalloc(size, GFP_KERNEL);
  10128. if (!cfg)
  10129. return -ENOMEM;
  10130. cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]);
  10131. cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]);
  10132. memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]),
  10133. ETH_ALEN);
  10134. if (tb[NL80211_WOWLAN_TCP_SRC_PORT])
  10135. port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]);
  10136. else
  10137. port = 0;
  10138. #ifdef CONFIG_INET
  10139. /* allocate a socket and port for it and use it */
  10140. err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM,
  10141. IPPROTO_TCP, &cfg->sock, 1);
  10142. if (err) {
  10143. kfree(cfg);
  10144. return err;
  10145. }
  10146. if (inet_csk_get_port(cfg->sock->sk, port)) {
  10147. sock_release(cfg->sock);
  10148. kfree(cfg);
  10149. return -EADDRINUSE;
  10150. }
  10151. cfg->src_port = inet_sk(cfg->sock->sk)->inet_num;
  10152. #else
  10153. if (!port) {
  10154. kfree(cfg);
  10155. return -EINVAL;
  10156. }
  10157. cfg->src_port = port;
  10158. #endif
  10159. cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]);
  10160. cfg->payload_len = data_size;
  10161. cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size;
  10162. memcpy((void *)cfg->payload,
  10163. nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]),
  10164. data_size);
  10165. if (seq)
  10166. cfg->payload_seq = *seq;
  10167. cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]);
  10168. cfg->wake_len = wake_size;
  10169. cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size;
  10170. memcpy((void *)cfg->wake_data,
  10171. nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]),
  10172. wake_size);
  10173. cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size +
  10174. data_size + wake_size;
  10175. memcpy((void *)cfg->wake_mask,
  10176. nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]),
  10177. wake_mask_size);
  10178. if (tok) {
  10179. cfg->tokens_size = tokens_size;
  10180. memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size);
  10181. }
  10182. trig->tcp = cfg;
  10183. return 0;
  10184. }
  10185. static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev,
  10186. const struct wiphy_wowlan_support *wowlan,
  10187. struct nlattr *attr,
  10188. struct cfg80211_wowlan *trig)
  10189. {
  10190. struct nlattr **tb;
  10191. int err;
  10192. tb = kcalloc(NUM_NL80211_ATTR, sizeof(*tb), GFP_KERNEL);
  10193. if (!tb)
  10194. return -ENOMEM;
  10195. if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) {
  10196. err = -EOPNOTSUPP;
  10197. goto out;
  10198. }
  10199. err = nla_parse_nested_deprecated(tb, NL80211_ATTR_MAX, attr,
  10200. nl80211_policy, NULL);
  10201. if (err)
  10202. goto out;
  10203. trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb,
  10204. wowlan->max_nd_match_sets);
  10205. err = PTR_ERR_OR_ZERO(trig->nd_config);
  10206. if (err)
  10207. trig->nd_config = NULL;
  10208. out:
  10209. kfree(tb);
  10210. return err;
  10211. }
  10212. static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
  10213. {
  10214. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  10215. struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG];
  10216. struct cfg80211_wowlan new_triggers = {};
  10217. struct cfg80211_wowlan *ntrig;
  10218. const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan;
  10219. int err, i;
  10220. bool prev_enabled = rdev->wiphy.wowlan_config;
  10221. bool regular = false;
  10222. if (!wowlan)
  10223. return -EOPNOTSUPP;
  10224. if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) {
  10225. cfg80211_rdev_free_wowlan(rdev);
  10226. rdev->wiphy.wowlan_config = NULL;
  10227. goto set_wakeup;
  10228. }
  10229. err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TRIG,
  10230. info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS],
  10231. nl80211_wowlan_policy, info->extack);
  10232. if (err)
  10233. return err;
  10234. if (tb[NL80211_WOWLAN_TRIG_ANY]) {
  10235. if (!(wowlan->flags & WIPHY_WOWLAN_ANY))
  10236. return -EINVAL;
  10237. new_triggers.any = true;
  10238. }
  10239. if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) {
  10240. if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT))
  10241. return -EINVAL;
  10242. new_triggers.disconnect = true;
  10243. regular = true;
  10244. }
  10245. if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) {
  10246. if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT))
  10247. return -EINVAL;
  10248. new_triggers.magic_pkt = true;
  10249. regular = true;
  10250. }
  10251. if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED])
  10252. return -EINVAL;
  10253. if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) {
  10254. if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE))
  10255. return -EINVAL;
  10256. new_triggers.gtk_rekey_failure = true;
  10257. regular = true;
  10258. }
  10259. if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) {
  10260. if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ))
  10261. return -EINVAL;
  10262. new_triggers.eap_identity_req = true;
  10263. regular = true;
  10264. }
  10265. if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) {
  10266. if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE))
  10267. return -EINVAL;
  10268. new_triggers.four_way_handshake = true;
  10269. regular = true;
  10270. }
  10271. if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) {
  10272. if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE))
  10273. return -EINVAL;
  10274. new_triggers.rfkill_release = true;
  10275. regular = true;
  10276. }
  10277. if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) {
  10278. struct nlattr *pat;
  10279. int n_patterns = 0;
  10280. int rem, pat_len, mask_len, pkt_offset;
  10281. struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
  10282. regular = true;
  10283. nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
  10284. rem)
  10285. n_patterns++;
  10286. if (n_patterns > wowlan->n_patterns)
  10287. return -EINVAL;
  10288. new_triggers.patterns = kcalloc(n_patterns,
  10289. sizeof(new_triggers.patterns[0]),
  10290. GFP_KERNEL);
  10291. if (!new_triggers.patterns)
  10292. return -ENOMEM;
  10293. new_triggers.n_patterns = n_patterns;
  10294. i = 0;
  10295. nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
  10296. rem) {
  10297. u8 *mask_pat;
  10298. err = nla_parse_nested_deprecated(pat_tb,
  10299. MAX_NL80211_PKTPAT,
  10300. pat,
  10301. nl80211_packet_pattern_policy,
  10302. info->extack);
  10303. if (err)
  10304. goto error;
  10305. err = -EINVAL;
  10306. if (!pat_tb[NL80211_PKTPAT_MASK] ||
  10307. !pat_tb[NL80211_PKTPAT_PATTERN])
  10308. goto error;
  10309. pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
  10310. mask_len = DIV_ROUND_UP(pat_len, 8);
  10311. if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
  10312. goto error;
  10313. if (pat_len > wowlan->pattern_max_len ||
  10314. pat_len < wowlan->pattern_min_len)
  10315. goto error;
  10316. if (!pat_tb[NL80211_PKTPAT_OFFSET])
  10317. pkt_offset = 0;
  10318. else
  10319. pkt_offset = nla_get_u32(
  10320. pat_tb[NL80211_PKTPAT_OFFSET]);
  10321. if (pkt_offset > wowlan->max_pkt_offset)
  10322. goto error;
  10323. new_triggers.patterns[i].pkt_offset = pkt_offset;
  10324. mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
  10325. if (!mask_pat) {
  10326. err = -ENOMEM;
  10327. goto error;
  10328. }
  10329. new_triggers.patterns[i].mask = mask_pat;
  10330. memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
  10331. mask_len);
  10332. mask_pat += mask_len;
  10333. new_triggers.patterns[i].pattern = mask_pat;
  10334. new_triggers.patterns[i].pattern_len = pat_len;
  10335. memcpy(mask_pat,
  10336. nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
  10337. pat_len);
  10338. i++;
  10339. }
  10340. }
  10341. if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) {
  10342. regular = true;
  10343. err = nl80211_parse_wowlan_tcp(
  10344. rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION],
  10345. &new_triggers);
  10346. if (err)
  10347. goto error;
  10348. }
  10349. if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) {
  10350. regular = true;
  10351. err = nl80211_parse_wowlan_nd(
  10352. rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT],
  10353. &new_triggers);
  10354. if (err)
  10355. goto error;
  10356. }
  10357. /* The 'any' trigger means the device continues operating more or less
  10358. * as in its normal operation mode and wakes up the host on most of the
  10359. * normal interrupts (like packet RX, ...)
  10360. * It therefore makes little sense to combine with the more constrained
  10361. * wakeup trigger modes.
  10362. */
  10363. if (new_triggers.any && regular) {
  10364. err = -EINVAL;
  10365. goto error;
  10366. }
  10367. ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL);
  10368. if (!ntrig) {
  10369. err = -ENOMEM;
  10370. goto error;
  10371. }
  10372. cfg80211_rdev_free_wowlan(rdev);
  10373. rdev->wiphy.wowlan_config = ntrig;
  10374. set_wakeup:
  10375. if (rdev->ops->set_wakeup &&
  10376. prev_enabled != !!rdev->wiphy.wowlan_config)
  10377. rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config);
  10378. return 0;
  10379. error:
  10380. for (i = 0; i < new_triggers.n_patterns; i++)
  10381. kfree(new_triggers.patterns[i].mask);
  10382. kfree(new_triggers.patterns);
  10383. if (new_triggers.tcp && new_triggers.tcp->sock)
  10384. sock_release(new_triggers.tcp->sock);
  10385. kfree(new_triggers.tcp);
  10386. kfree(new_triggers.nd_config);
  10387. return err;
  10388. }
  10389. #endif
  10390. static int nl80211_send_coalesce_rules(struct sk_buff *msg,
  10391. struct cfg80211_registered_device *rdev)
  10392. {
  10393. struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules;
  10394. int i, j, pat_len;
  10395. struct cfg80211_coalesce_rules *rule;
  10396. if (!rdev->coalesce->n_rules)
  10397. return 0;
  10398. nl_rules = nla_nest_start_noflag(msg, NL80211_ATTR_COALESCE_RULE);
  10399. if (!nl_rules)
  10400. return -ENOBUFS;
  10401. for (i = 0; i < rdev->coalesce->n_rules; i++) {
  10402. nl_rule = nla_nest_start_noflag(msg, i + 1);
  10403. if (!nl_rule)
  10404. return -ENOBUFS;
  10405. rule = &rdev->coalesce->rules[i];
  10406. if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY,
  10407. rule->delay))
  10408. return -ENOBUFS;
  10409. if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION,
  10410. rule->condition))
  10411. return -ENOBUFS;
  10412. nl_pats = nla_nest_start_noflag(msg,
  10413. NL80211_ATTR_COALESCE_RULE_PKT_PATTERN);
  10414. if (!nl_pats)
  10415. return -ENOBUFS;
  10416. for (j = 0; j < rule->n_patterns; j++) {
  10417. nl_pat = nla_nest_start_noflag(msg, j + 1);
  10418. if (!nl_pat)
  10419. return -ENOBUFS;
  10420. pat_len = rule->patterns[j].pattern_len;
  10421. if (nla_put(msg, NL80211_PKTPAT_MASK,
  10422. DIV_ROUND_UP(pat_len, 8),
  10423. rule->patterns[j].mask) ||
  10424. nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
  10425. rule->patterns[j].pattern) ||
  10426. nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
  10427. rule->patterns[j].pkt_offset))
  10428. return -ENOBUFS;
  10429. nla_nest_end(msg, nl_pat);
  10430. }
  10431. nla_nest_end(msg, nl_pats);
  10432. nla_nest_end(msg, nl_rule);
  10433. }
  10434. nla_nest_end(msg, nl_rules);
  10435. return 0;
  10436. }
  10437. static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info)
  10438. {
  10439. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  10440. struct sk_buff *msg;
  10441. void *hdr;
  10442. if (!rdev->wiphy.coalesce)
  10443. return -EOPNOTSUPP;
  10444. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  10445. if (!msg)
  10446. return -ENOMEM;
  10447. hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
  10448. NL80211_CMD_GET_COALESCE);
  10449. if (!hdr)
  10450. goto nla_put_failure;
  10451. if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev))
  10452. goto nla_put_failure;
  10453. genlmsg_end(msg, hdr);
  10454. return genlmsg_reply(msg, info);
  10455. nla_put_failure:
  10456. nlmsg_free(msg);
  10457. return -ENOBUFS;
  10458. }
  10459. void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev)
  10460. {
  10461. struct cfg80211_coalesce *coalesce = rdev->coalesce;
  10462. int i, j;
  10463. struct cfg80211_coalesce_rules *rule;
  10464. if (!coalesce)
  10465. return;
  10466. for (i = 0; i < coalesce->n_rules; i++) {
  10467. rule = &coalesce->rules[i];
  10468. for (j = 0; j < rule->n_patterns; j++)
  10469. kfree(rule->patterns[j].mask);
  10470. kfree(rule->patterns);
  10471. }
  10472. kfree(coalesce->rules);
  10473. kfree(coalesce);
  10474. rdev->coalesce = NULL;
  10475. }
  10476. static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev,
  10477. struct nlattr *rule,
  10478. struct cfg80211_coalesce_rules *new_rule)
  10479. {
  10480. int err, i;
  10481. const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
  10482. struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat;
  10483. int rem, pat_len, mask_len, pkt_offset, n_patterns = 0;
  10484. struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
  10485. err = nla_parse_nested_deprecated(tb, NL80211_ATTR_COALESCE_RULE_MAX,
  10486. rule, nl80211_coalesce_policy, NULL);
  10487. if (err)
  10488. return err;
  10489. if (tb[NL80211_ATTR_COALESCE_RULE_DELAY])
  10490. new_rule->delay =
  10491. nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]);
  10492. if (new_rule->delay > coalesce->max_delay)
  10493. return -EINVAL;
  10494. if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION])
  10495. new_rule->condition =
  10496. nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]);
  10497. if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN])
  10498. return -EINVAL;
  10499. nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
  10500. rem)
  10501. n_patterns++;
  10502. if (n_patterns > coalesce->n_patterns)
  10503. return -EINVAL;
  10504. new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]),
  10505. GFP_KERNEL);
  10506. if (!new_rule->patterns)
  10507. return -ENOMEM;
  10508. new_rule->n_patterns = n_patterns;
  10509. i = 0;
  10510. nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
  10511. rem) {
  10512. u8 *mask_pat;
  10513. err = nla_parse_nested_deprecated(pat_tb, MAX_NL80211_PKTPAT,
  10514. pat,
  10515. nl80211_packet_pattern_policy,
  10516. NULL);
  10517. if (err)
  10518. return err;
  10519. if (!pat_tb[NL80211_PKTPAT_MASK] ||
  10520. !pat_tb[NL80211_PKTPAT_PATTERN])
  10521. return -EINVAL;
  10522. pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
  10523. mask_len = DIV_ROUND_UP(pat_len, 8);
  10524. if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
  10525. return -EINVAL;
  10526. if (pat_len > coalesce->pattern_max_len ||
  10527. pat_len < coalesce->pattern_min_len)
  10528. return -EINVAL;
  10529. if (!pat_tb[NL80211_PKTPAT_OFFSET])
  10530. pkt_offset = 0;
  10531. else
  10532. pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]);
  10533. if (pkt_offset > coalesce->max_pkt_offset)
  10534. return -EINVAL;
  10535. new_rule->patterns[i].pkt_offset = pkt_offset;
  10536. mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
  10537. if (!mask_pat)
  10538. return -ENOMEM;
  10539. new_rule->patterns[i].mask = mask_pat;
  10540. memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
  10541. mask_len);
  10542. mask_pat += mask_len;
  10543. new_rule->patterns[i].pattern = mask_pat;
  10544. new_rule->patterns[i].pattern_len = pat_len;
  10545. memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
  10546. pat_len);
  10547. i++;
  10548. }
  10549. return 0;
  10550. }
  10551. static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info)
  10552. {
  10553. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  10554. const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce;
  10555. struct cfg80211_coalesce new_coalesce = {};
  10556. struct cfg80211_coalesce *n_coalesce;
  10557. int err, rem_rule, n_rules = 0, i, j;
  10558. struct nlattr *rule;
  10559. struct cfg80211_coalesce_rules *tmp_rule;
  10560. if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce)
  10561. return -EOPNOTSUPP;
  10562. if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) {
  10563. cfg80211_rdev_free_coalesce(rdev);
  10564. rdev_set_coalesce(rdev, NULL);
  10565. return 0;
  10566. }
  10567. nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
  10568. rem_rule)
  10569. n_rules++;
  10570. if (n_rules > coalesce->n_rules)
  10571. return -EINVAL;
  10572. new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]),
  10573. GFP_KERNEL);
  10574. if (!new_coalesce.rules)
  10575. return -ENOMEM;
  10576. new_coalesce.n_rules = n_rules;
  10577. i = 0;
  10578. nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
  10579. rem_rule) {
  10580. err = nl80211_parse_coalesce_rule(rdev, rule,
  10581. &new_coalesce.rules[i]);
  10582. if (err)
  10583. goto error;
  10584. i++;
  10585. }
  10586. err = rdev_set_coalesce(rdev, &new_coalesce);
  10587. if (err)
  10588. goto error;
  10589. n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL);
  10590. if (!n_coalesce) {
  10591. err = -ENOMEM;
  10592. goto error;
  10593. }
  10594. cfg80211_rdev_free_coalesce(rdev);
  10595. rdev->coalesce = n_coalesce;
  10596. return 0;
  10597. error:
  10598. for (i = 0; i < new_coalesce.n_rules; i++) {
  10599. tmp_rule = &new_coalesce.rules[i];
  10600. for (j = 0; j < tmp_rule->n_patterns; j++)
  10601. kfree(tmp_rule->patterns[j].mask);
  10602. kfree(tmp_rule->patterns);
  10603. }
  10604. kfree(new_coalesce.rules);
  10605. return err;
  10606. }
  10607. static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
  10608. {
  10609. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  10610. struct net_device *dev = info->user_ptr[1];
  10611. struct wireless_dev *wdev = dev->ieee80211_ptr;
  10612. struct nlattr *tb[NUM_NL80211_REKEY_DATA];
  10613. struct cfg80211_gtk_rekey_data rekey_data = {};
  10614. int err;
  10615. if (!info->attrs[NL80211_ATTR_REKEY_DATA])
  10616. return -EINVAL;
  10617. err = nla_parse_nested_deprecated(tb, MAX_NL80211_REKEY_DATA,
  10618. info->attrs[NL80211_ATTR_REKEY_DATA],
  10619. nl80211_rekey_policy, info->extack);
  10620. if (err)
  10621. return err;
  10622. if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] ||
  10623. !tb[NL80211_REKEY_DATA_KCK])
  10624. return -EINVAL;
  10625. if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN &&
  10626. !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK &&
  10627. nla_len(tb[NL80211_REKEY_DATA_KEK]) == NL80211_KEK_EXT_LEN))
  10628. return -ERANGE;
  10629. if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN &&
  10630. !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK &&
  10631. nla_len(tb[NL80211_REKEY_DATA_KEK]) == NL80211_KCK_EXT_LEN))
  10632. return -ERANGE;
  10633. rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]);
  10634. rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]);
  10635. rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]);
  10636. rekey_data.kek_len = nla_len(tb[NL80211_REKEY_DATA_KEK]);
  10637. rekey_data.kck_len = nla_len(tb[NL80211_REKEY_DATA_KCK]);
  10638. if (tb[NL80211_REKEY_DATA_AKM])
  10639. rekey_data.akm = nla_get_u32(tb[NL80211_REKEY_DATA_AKM]);
  10640. wdev_lock(wdev);
  10641. if (!wdev->current_bss) {
  10642. err = -ENOTCONN;
  10643. goto out;
  10644. }
  10645. if (!rdev->ops->set_rekey_data) {
  10646. err = -EOPNOTSUPP;
  10647. goto out;
  10648. }
  10649. err = rdev_set_rekey_data(rdev, dev, &rekey_data);
  10650. out:
  10651. wdev_unlock(wdev);
  10652. return err;
  10653. }
  10654. static int nl80211_register_unexpected_frame(struct sk_buff *skb,
  10655. struct genl_info *info)
  10656. {
  10657. struct net_device *dev = info->user_ptr[1];
  10658. struct wireless_dev *wdev = dev->ieee80211_ptr;
  10659. if (wdev->iftype != NL80211_IFTYPE_AP &&
  10660. wdev->iftype != NL80211_IFTYPE_P2P_GO)
  10661. return -EINVAL;
  10662. if (wdev->ap_unexpected_nlportid)
  10663. return -EBUSY;
  10664. wdev->ap_unexpected_nlportid = info->snd_portid;
  10665. return 0;
  10666. }
  10667. static int nl80211_probe_client(struct sk_buff *skb,
  10668. struct genl_info *info)
  10669. {
  10670. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  10671. struct net_device *dev = info->user_ptr[1];
  10672. struct wireless_dev *wdev = dev->ieee80211_ptr;
  10673. struct sk_buff *msg;
  10674. void *hdr;
  10675. const u8 *addr;
  10676. u64 cookie;
  10677. int err;
  10678. if (wdev->iftype != NL80211_IFTYPE_AP &&
  10679. wdev->iftype != NL80211_IFTYPE_P2P_GO)
  10680. return -EOPNOTSUPP;
  10681. if (!info->attrs[NL80211_ATTR_MAC])
  10682. return -EINVAL;
  10683. if (!rdev->ops->probe_client)
  10684. return -EOPNOTSUPP;
  10685. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  10686. if (!msg)
  10687. return -ENOMEM;
  10688. hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
  10689. NL80211_CMD_PROBE_CLIENT);
  10690. if (!hdr) {
  10691. err = -ENOBUFS;
  10692. goto free_msg;
  10693. }
  10694. addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  10695. err = rdev_probe_client(rdev, dev, addr, &cookie);
  10696. if (err)
  10697. goto free_msg;
  10698. if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
  10699. NL80211_ATTR_PAD))
  10700. goto nla_put_failure;
  10701. genlmsg_end(msg, hdr);
  10702. return genlmsg_reply(msg, info);
  10703. nla_put_failure:
  10704. err = -ENOBUFS;
  10705. free_msg:
  10706. nlmsg_free(msg);
  10707. return err;
  10708. }
  10709. static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info)
  10710. {
  10711. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  10712. struct cfg80211_beacon_registration *reg, *nreg;
  10713. int rv;
  10714. if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS))
  10715. return -EOPNOTSUPP;
  10716. nreg = kzalloc(sizeof(*nreg), GFP_KERNEL);
  10717. if (!nreg)
  10718. return -ENOMEM;
  10719. /* First, check if already registered. */
  10720. spin_lock_bh(&rdev->beacon_registrations_lock);
  10721. list_for_each_entry(reg, &rdev->beacon_registrations, list) {
  10722. if (reg->nlportid == info->snd_portid) {
  10723. rv = -EALREADY;
  10724. goto out_err;
  10725. }
  10726. }
  10727. /* Add it to the list */
  10728. nreg->nlportid = info->snd_portid;
  10729. list_add(&nreg->list, &rdev->beacon_registrations);
  10730. spin_unlock_bh(&rdev->beacon_registrations_lock);
  10731. return 0;
  10732. out_err:
  10733. spin_unlock_bh(&rdev->beacon_registrations_lock);
  10734. kfree(nreg);
  10735. return rv;
  10736. }
  10737. static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
  10738. {
  10739. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  10740. struct wireless_dev *wdev = info->user_ptr[1];
  10741. int err;
  10742. if (!rdev->ops->start_p2p_device)
  10743. return -EOPNOTSUPP;
  10744. if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
  10745. return -EOPNOTSUPP;
  10746. if (wdev_running(wdev))
  10747. return 0;
  10748. if (rfkill_blocked(rdev->rfkill))
  10749. return -ERFKILL;
  10750. err = rdev_start_p2p_device(rdev, wdev);
  10751. if (err)
  10752. return err;
  10753. wdev->is_running = true;
  10754. rdev->opencount++;
  10755. return 0;
  10756. }
  10757. static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info)
  10758. {
  10759. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  10760. struct wireless_dev *wdev = info->user_ptr[1];
  10761. if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
  10762. return -EOPNOTSUPP;
  10763. if (!rdev->ops->stop_p2p_device)
  10764. return -EOPNOTSUPP;
  10765. cfg80211_stop_p2p_device(rdev, wdev);
  10766. return 0;
  10767. }
  10768. static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info)
  10769. {
  10770. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  10771. struct wireless_dev *wdev = info->user_ptr[1];
  10772. struct cfg80211_nan_conf conf = {};
  10773. int err;
  10774. if (wdev->iftype != NL80211_IFTYPE_NAN)
  10775. return -EOPNOTSUPP;
  10776. if (wdev_running(wdev))
  10777. return -EEXIST;
  10778. if (rfkill_blocked(rdev->rfkill))
  10779. return -ERFKILL;
  10780. if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF])
  10781. return -EINVAL;
  10782. conf.master_pref =
  10783. nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
  10784. if (info->attrs[NL80211_ATTR_BANDS]) {
  10785. u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
  10786. if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
  10787. return -EOPNOTSUPP;
  10788. if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
  10789. return -EINVAL;
  10790. conf.bands = bands;
  10791. }
  10792. err = rdev_start_nan(rdev, wdev, &conf);
  10793. if (err)
  10794. return err;
  10795. wdev->is_running = true;
  10796. rdev->opencount++;
  10797. return 0;
  10798. }
  10799. static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info)
  10800. {
  10801. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  10802. struct wireless_dev *wdev = info->user_ptr[1];
  10803. if (wdev->iftype != NL80211_IFTYPE_NAN)
  10804. return -EOPNOTSUPP;
  10805. cfg80211_stop_nan(rdev, wdev);
  10806. return 0;
  10807. }
  10808. static int validate_nan_filter(struct nlattr *filter_attr)
  10809. {
  10810. struct nlattr *attr;
  10811. int len = 0, n_entries = 0, rem;
  10812. nla_for_each_nested(attr, filter_attr, rem) {
  10813. len += nla_len(attr);
  10814. n_entries++;
  10815. }
  10816. if (len >= U8_MAX)
  10817. return -EINVAL;
  10818. return n_entries;
  10819. }
  10820. static int handle_nan_filter(struct nlattr *attr_filter,
  10821. struct cfg80211_nan_func *func,
  10822. bool tx)
  10823. {
  10824. struct nlattr *attr;
  10825. int n_entries, rem, i;
  10826. struct cfg80211_nan_func_filter *filter;
  10827. n_entries = validate_nan_filter(attr_filter);
  10828. if (n_entries < 0)
  10829. return n_entries;
  10830. BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters));
  10831. filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL);
  10832. if (!filter)
  10833. return -ENOMEM;
  10834. i = 0;
  10835. nla_for_each_nested(attr, attr_filter, rem) {
  10836. filter[i].filter = nla_memdup(attr, GFP_KERNEL);
  10837. if (!filter[i].filter)
  10838. goto err;
  10839. filter[i].len = nla_len(attr);
  10840. i++;
  10841. }
  10842. if (tx) {
  10843. func->num_tx_filters = n_entries;
  10844. func->tx_filters = filter;
  10845. } else {
  10846. func->num_rx_filters = n_entries;
  10847. func->rx_filters = filter;
  10848. }
  10849. return 0;
  10850. err:
  10851. i = 0;
  10852. nla_for_each_nested(attr, attr_filter, rem) {
  10853. kfree(filter[i].filter);
  10854. i++;
  10855. }
  10856. kfree(filter);
  10857. return -ENOMEM;
  10858. }
  10859. static int nl80211_nan_add_func(struct sk_buff *skb,
  10860. struct genl_info *info)
  10861. {
  10862. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  10863. struct wireless_dev *wdev = info->user_ptr[1];
  10864. struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr;
  10865. struct cfg80211_nan_func *func;
  10866. struct sk_buff *msg = NULL;
  10867. void *hdr = NULL;
  10868. int err = 0;
  10869. if (wdev->iftype != NL80211_IFTYPE_NAN)
  10870. return -EOPNOTSUPP;
  10871. if (!wdev_running(wdev))
  10872. return -ENOTCONN;
  10873. if (!info->attrs[NL80211_ATTR_NAN_FUNC])
  10874. return -EINVAL;
  10875. err = nla_parse_nested_deprecated(tb, NL80211_NAN_FUNC_ATTR_MAX,
  10876. info->attrs[NL80211_ATTR_NAN_FUNC],
  10877. nl80211_nan_func_policy,
  10878. info->extack);
  10879. if (err)
  10880. return err;
  10881. func = kzalloc(sizeof(*func), GFP_KERNEL);
  10882. if (!func)
  10883. return -ENOMEM;
  10884. func->cookie = cfg80211_assign_cookie(rdev);
  10885. if (!tb[NL80211_NAN_FUNC_TYPE]) {
  10886. err = -EINVAL;
  10887. goto out;
  10888. }
  10889. func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]);
  10890. if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) {
  10891. err = -EINVAL;
  10892. goto out;
  10893. }
  10894. memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]),
  10895. sizeof(func->service_id));
  10896. func->close_range =
  10897. nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]);
  10898. if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) {
  10899. func->serv_spec_info_len =
  10900. nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]);
  10901. func->serv_spec_info =
  10902. kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]),
  10903. func->serv_spec_info_len,
  10904. GFP_KERNEL);
  10905. if (!func->serv_spec_info) {
  10906. err = -ENOMEM;
  10907. goto out;
  10908. }
  10909. }
  10910. if (tb[NL80211_NAN_FUNC_TTL])
  10911. func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]);
  10912. switch (func->type) {
  10913. case NL80211_NAN_FUNC_PUBLISH:
  10914. if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) {
  10915. err = -EINVAL;
  10916. goto out;
  10917. }
  10918. func->publish_type =
  10919. nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]);
  10920. func->publish_bcast =
  10921. nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]);
  10922. if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) &&
  10923. func->publish_bcast) {
  10924. err = -EINVAL;
  10925. goto out;
  10926. }
  10927. break;
  10928. case NL80211_NAN_FUNC_SUBSCRIBE:
  10929. func->subscribe_active =
  10930. nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]);
  10931. break;
  10932. case NL80211_NAN_FUNC_FOLLOW_UP:
  10933. if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] ||
  10934. !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] ||
  10935. !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) {
  10936. err = -EINVAL;
  10937. goto out;
  10938. }
  10939. func->followup_id =
  10940. nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]);
  10941. func->followup_reqid =
  10942. nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]);
  10943. memcpy(func->followup_dest.addr,
  10944. nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]),
  10945. sizeof(func->followup_dest.addr));
  10946. if (func->ttl) {
  10947. err = -EINVAL;
  10948. goto out;
  10949. }
  10950. break;
  10951. default:
  10952. err = -EINVAL;
  10953. goto out;
  10954. }
  10955. if (tb[NL80211_NAN_FUNC_SRF]) {
  10956. struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR];
  10957. err = nla_parse_nested_deprecated(srf_tb,
  10958. NL80211_NAN_SRF_ATTR_MAX,
  10959. tb[NL80211_NAN_FUNC_SRF],
  10960. nl80211_nan_srf_policy,
  10961. info->extack);
  10962. if (err)
  10963. goto out;
  10964. func->srf_include =
  10965. nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]);
  10966. if (srf_tb[NL80211_NAN_SRF_BF]) {
  10967. if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] ||
  10968. !srf_tb[NL80211_NAN_SRF_BF_IDX]) {
  10969. err = -EINVAL;
  10970. goto out;
  10971. }
  10972. func->srf_bf_len =
  10973. nla_len(srf_tb[NL80211_NAN_SRF_BF]);
  10974. func->srf_bf =
  10975. kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]),
  10976. func->srf_bf_len, GFP_KERNEL);
  10977. if (!func->srf_bf) {
  10978. err = -ENOMEM;
  10979. goto out;
  10980. }
  10981. func->srf_bf_idx =
  10982. nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]);
  10983. } else {
  10984. struct nlattr *attr, *mac_attr =
  10985. srf_tb[NL80211_NAN_SRF_MAC_ADDRS];
  10986. int n_entries, rem, i = 0;
  10987. if (!mac_attr) {
  10988. err = -EINVAL;
  10989. goto out;
  10990. }
  10991. n_entries = validate_acl_mac_addrs(mac_attr);
  10992. if (n_entries <= 0) {
  10993. err = -EINVAL;
  10994. goto out;
  10995. }
  10996. func->srf_num_macs = n_entries;
  10997. func->srf_macs =
  10998. kcalloc(n_entries, sizeof(*func->srf_macs),
  10999. GFP_KERNEL);
  11000. if (!func->srf_macs) {
  11001. err = -ENOMEM;
  11002. goto out;
  11003. }
  11004. nla_for_each_nested(attr, mac_attr, rem)
  11005. memcpy(func->srf_macs[i++].addr, nla_data(attr),
  11006. sizeof(*func->srf_macs));
  11007. }
  11008. }
  11009. if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) {
  11010. err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER],
  11011. func, true);
  11012. if (err)
  11013. goto out;
  11014. }
  11015. if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) {
  11016. err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER],
  11017. func, false);
  11018. if (err)
  11019. goto out;
  11020. }
  11021. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  11022. if (!msg) {
  11023. err = -ENOMEM;
  11024. goto out;
  11025. }
  11026. hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
  11027. NL80211_CMD_ADD_NAN_FUNCTION);
  11028. /* This can't really happen - we just allocated 4KB */
  11029. if (WARN_ON(!hdr)) {
  11030. err = -ENOMEM;
  11031. goto out;
  11032. }
  11033. err = rdev_add_nan_func(rdev, wdev, func);
  11034. out:
  11035. if (err < 0) {
  11036. cfg80211_free_nan_func(func);
  11037. nlmsg_free(msg);
  11038. return err;
  11039. }
  11040. /* propagate the instance id and cookie to userspace */
  11041. if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie,
  11042. NL80211_ATTR_PAD))
  11043. goto nla_put_failure;
  11044. func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC);
  11045. if (!func_attr)
  11046. goto nla_put_failure;
  11047. if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID,
  11048. func->instance_id))
  11049. goto nla_put_failure;
  11050. nla_nest_end(msg, func_attr);
  11051. genlmsg_end(msg, hdr);
  11052. return genlmsg_reply(msg, info);
  11053. nla_put_failure:
  11054. nlmsg_free(msg);
  11055. return -ENOBUFS;
  11056. }
  11057. static int nl80211_nan_del_func(struct sk_buff *skb,
  11058. struct genl_info *info)
  11059. {
  11060. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11061. struct wireless_dev *wdev = info->user_ptr[1];
  11062. u64 cookie;
  11063. if (wdev->iftype != NL80211_IFTYPE_NAN)
  11064. return -EOPNOTSUPP;
  11065. if (!wdev_running(wdev))
  11066. return -ENOTCONN;
  11067. if (!info->attrs[NL80211_ATTR_COOKIE])
  11068. return -EINVAL;
  11069. cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
  11070. rdev_del_nan_func(rdev, wdev, cookie);
  11071. return 0;
  11072. }
  11073. static int nl80211_nan_change_config(struct sk_buff *skb,
  11074. struct genl_info *info)
  11075. {
  11076. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11077. struct wireless_dev *wdev = info->user_ptr[1];
  11078. struct cfg80211_nan_conf conf = {};
  11079. u32 changed = 0;
  11080. if (wdev->iftype != NL80211_IFTYPE_NAN)
  11081. return -EOPNOTSUPP;
  11082. if (!wdev_running(wdev))
  11083. return -ENOTCONN;
  11084. if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) {
  11085. conf.master_pref =
  11086. nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
  11087. if (conf.master_pref <= 1 || conf.master_pref == 255)
  11088. return -EINVAL;
  11089. changed |= CFG80211_NAN_CONF_CHANGED_PREF;
  11090. }
  11091. if (info->attrs[NL80211_ATTR_BANDS]) {
  11092. u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
  11093. if (bands & ~(u32)wdev->wiphy->nan_supported_bands)
  11094. return -EOPNOTSUPP;
  11095. if (bands && !(bands & BIT(NL80211_BAND_2GHZ)))
  11096. return -EINVAL;
  11097. conf.bands = bands;
  11098. changed |= CFG80211_NAN_CONF_CHANGED_BANDS;
  11099. }
  11100. if (!changed)
  11101. return -EINVAL;
  11102. return rdev_nan_change_conf(rdev, wdev, &conf, changed);
  11103. }
  11104. void cfg80211_nan_match(struct wireless_dev *wdev,
  11105. struct cfg80211_nan_match_params *match, gfp_t gfp)
  11106. {
  11107. struct wiphy *wiphy = wdev->wiphy;
  11108. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  11109. struct nlattr *match_attr, *local_func_attr, *peer_func_attr;
  11110. struct sk_buff *msg;
  11111. void *hdr;
  11112. if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr))
  11113. return;
  11114. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  11115. if (!msg)
  11116. return;
  11117. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH);
  11118. if (!hdr) {
  11119. nlmsg_free(msg);
  11120. return;
  11121. }
  11122. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  11123. (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
  11124. wdev->netdev->ifindex)) ||
  11125. nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
  11126. NL80211_ATTR_PAD))
  11127. goto nla_put_failure;
  11128. if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie,
  11129. NL80211_ATTR_PAD) ||
  11130. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr))
  11131. goto nla_put_failure;
  11132. match_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_MATCH);
  11133. if (!match_attr)
  11134. goto nla_put_failure;
  11135. local_func_attr = nla_nest_start_noflag(msg,
  11136. NL80211_NAN_MATCH_FUNC_LOCAL);
  11137. if (!local_func_attr)
  11138. goto nla_put_failure;
  11139. if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id))
  11140. goto nla_put_failure;
  11141. nla_nest_end(msg, local_func_attr);
  11142. peer_func_attr = nla_nest_start_noflag(msg,
  11143. NL80211_NAN_MATCH_FUNC_PEER);
  11144. if (!peer_func_attr)
  11145. goto nla_put_failure;
  11146. if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) ||
  11147. nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id))
  11148. goto nla_put_failure;
  11149. if (match->info && match->info_len &&
  11150. nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len,
  11151. match->info))
  11152. goto nla_put_failure;
  11153. nla_nest_end(msg, peer_func_attr);
  11154. nla_nest_end(msg, match_attr);
  11155. genlmsg_end(msg, hdr);
  11156. if (!wdev->owner_nlportid)
  11157. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
  11158. msg, 0, NL80211_MCGRP_NAN, gfp);
  11159. else
  11160. genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
  11161. wdev->owner_nlportid);
  11162. return;
  11163. nla_put_failure:
  11164. nlmsg_free(msg);
  11165. }
  11166. EXPORT_SYMBOL(cfg80211_nan_match);
  11167. void cfg80211_nan_func_terminated(struct wireless_dev *wdev,
  11168. u8 inst_id,
  11169. enum nl80211_nan_func_term_reason reason,
  11170. u64 cookie, gfp_t gfp)
  11171. {
  11172. struct wiphy *wiphy = wdev->wiphy;
  11173. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  11174. struct sk_buff *msg;
  11175. struct nlattr *func_attr;
  11176. void *hdr;
  11177. if (WARN_ON(!inst_id))
  11178. return;
  11179. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  11180. if (!msg)
  11181. return;
  11182. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION);
  11183. if (!hdr) {
  11184. nlmsg_free(msg);
  11185. return;
  11186. }
  11187. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  11188. (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
  11189. wdev->netdev->ifindex)) ||
  11190. nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
  11191. NL80211_ATTR_PAD))
  11192. goto nla_put_failure;
  11193. if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
  11194. NL80211_ATTR_PAD))
  11195. goto nla_put_failure;
  11196. func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC);
  11197. if (!func_attr)
  11198. goto nla_put_failure;
  11199. if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) ||
  11200. nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason))
  11201. goto nla_put_failure;
  11202. nla_nest_end(msg, func_attr);
  11203. genlmsg_end(msg, hdr);
  11204. if (!wdev->owner_nlportid)
  11205. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy),
  11206. msg, 0, NL80211_MCGRP_NAN, gfp);
  11207. else
  11208. genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
  11209. wdev->owner_nlportid);
  11210. return;
  11211. nla_put_failure:
  11212. nlmsg_free(msg);
  11213. }
  11214. EXPORT_SYMBOL(cfg80211_nan_func_terminated);
  11215. static int nl80211_get_protocol_features(struct sk_buff *skb,
  11216. struct genl_info *info)
  11217. {
  11218. void *hdr;
  11219. struct sk_buff *msg;
  11220. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  11221. if (!msg)
  11222. return -ENOMEM;
  11223. hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
  11224. NL80211_CMD_GET_PROTOCOL_FEATURES);
  11225. if (!hdr)
  11226. goto nla_put_failure;
  11227. if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES,
  11228. NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP))
  11229. goto nla_put_failure;
  11230. genlmsg_end(msg, hdr);
  11231. return genlmsg_reply(msg, info);
  11232. nla_put_failure:
  11233. kfree_skb(msg);
  11234. return -ENOBUFS;
  11235. }
  11236. static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info)
  11237. {
  11238. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11239. struct cfg80211_update_ft_ies_params ft_params;
  11240. struct net_device *dev = info->user_ptr[1];
  11241. if (!rdev->ops->update_ft_ies)
  11242. return -EOPNOTSUPP;
  11243. if (!info->attrs[NL80211_ATTR_MDID] ||
  11244. !info->attrs[NL80211_ATTR_IE])
  11245. return -EINVAL;
  11246. memset(&ft_params, 0, sizeof(ft_params));
  11247. ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]);
  11248. ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  11249. ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  11250. return rdev_update_ft_ies(rdev, dev, &ft_params);
  11251. }
  11252. static int nl80211_crit_protocol_start(struct sk_buff *skb,
  11253. struct genl_info *info)
  11254. {
  11255. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11256. struct wireless_dev *wdev = info->user_ptr[1];
  11257. enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC;
  11258. u16 duration;
  11259. int ret;
  11260. if (!rdev->ops->crit_proto_start)
  11261. return -EOPNOTSUPP;
  11262. if (WARN_ON(!rdev->ops->crit_proto_stop))
  11263. return -EINVAL;
  11264. if (rdev->crit_proto_nlportid)
  11265. return -EBUSY;
  11266. /* determine protocol if provided */
  11267. if (info->attrs[NL80211_ATTR_CRIT_PROT_ID])
  11268. proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]);
  11269. if (proto >= NUM_NL80211_CRIT_PROTO)
  11270. return -EINVAL;
  11271. /* timeout must be provided */
  11272. if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION])
  11273. return -EINVAL;
  11274. duration =
  11275. nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]);
  11276. ret = rdev_crit_proto_start(rdev, wdev, proto, duration);
  11277. if (!ret)
  11278. rdev->crit_proto_nlportid = info->snd_portid;
  11279. return ret;
  11280. }
  11281. static int nl80211_crit_protocol_stop(struct sk_buff *skb,
  11282. struct genl_info *info)
  11283. {
  11284. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11285. struct wireless_dev *wdev = info->user_ptr[1];
  11286. if (!rdev->ops->crit_proto_stop)
  11287. return -EOPNOTSUPP;
  11288. if (rdev->crit_proto_nlportid) {
  11289. rdev->crit_proto_nlportid = 0;
  11290. rdev_crit_proto_stop(rdev, wdev);
  11291. }
  11292. return 0;
  11293. }
  11294. static int nl80211_vendor_check_policy(const struct wiphy_vendor_command *vcmd,
  11295. struct nlattr *attr,
  11296. struct netlink_ext_ack *extack)
  11297. {
  11298. if (vcmd->policy == VENDOR_CMD_RAW_DATA) {
  11299. if (attr->nla_type & NLA_F_NESTED) {
  11300. NL_SET_ERR_MSG_ATTR(extack, attr,
  11301. "unexpected nested data");
  11302. return -EINVAL;
  11303. }
  11304. return 0;
  11305. }
  11306. if (!(attr->nla_type & NLA_F_NESTED)) {
  11307. NL_SET_ERR_MSG_ATTR(extack, attr, "expected nested data");
  11308. return -EINVAL;
  11309. }
  11310. return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack);
  11311. }
  11312. static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
  11313. {
  11314. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11315. struct wireless_dev *wdev =
  11316. __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
  11317. int i, err;
  11318. u32 vid, subcmd;
  11319. if (!rdev->wiphy.vendor_commands)
  11320. return -EOPNOTSUPP;
  11321. if (IS_ERR(wdev)) {
  11322. err = PTR_ERR(wdev);
  11323. if (err != -EINVAL)
  11324. return err;
  11325. wdev = NULL;
  11326. } else if (wdev->wiphy != &rdev->wiphy) {
  11327. return -EINVAL;
  11328. }
  11329. if (!info->attrs[NL80211_ATTR_VENDOR_ID] ||
  11330. !info->attrs[NL80211_ATTR_VENDOR_SUBCMD])
  11331. return -EINVAL;
  11332. vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]);
  11333. subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]);
  11334. for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
  11335. const struct wiphy_vendor_command *vcmd;
  11336. void *data = NULL;
  11337. int len = 0;
  11338. vcmd = &rdev->wiphy.vendor_commands[i];
  11339. if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
  11340. continue;
  11341. if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
  11342. WIPHY_VENDOR_CMD_NEED_NETDEV)) {
  11343. if (!wdev)
  11344. return -EINVAL;
  11345. if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
  11346. !wdev->netdev)
  11347. return -EINVAL;
  11348. if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
  11349. if (!wdev_running(wdev))
  11350. return -ENETDOWN;
  11351. }
  11352. } else {
  11353. wdev = NULL;
  11354. }
  11355. if (!vcmd->doit)
  11356. return -EOPNOTSUPP;
  11357. if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
  11358. data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
  11359. len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);
  11360. err = nl80211_vendor_check_policy(vcmd,
  11361. info->attrs[NL80211_ATTR_VENDOR_DATA],
  11362. info->extack);
  11363. if (err)
  11364. return err;
  11365. }
  11366. rdev->cur_cmd_info = info;
  11367. err = vcmd->doit(&rdev->wiphy, wdev, data, len);
  11368. rdev->cur_cmd_info = NULL;
  11369. return err;
  11370. }
  11371. return -EOPNOTSUPP;
  11372. }
  11373. static int nl80211_prepare_vendor_dump(struct sk_buff *skb,
  11374. struct netlink_callback *cb,
  11375. struct cfg80211_registered_device **rdev,
  11376. struct wireless_dev **wdev)
  11377. {
  11378. struct nlattr **attrbuf;
  11379. u32 vid, subcmd;
  11380. unsigned int i;
  11381. int vcmd_idx = -1;
  11382. int err;
  11383. void *data = NULL;
  11384. unsigned int data_len = 0;
  11385. if (cb->args[0]) {
  11386. /* subtract the 1 again here */
  11387. struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1);
  11388. struct wireless_dev *tmp;
  11389. if (!wiphy)
  11390. return -ENODEV;
  11391. *rdev = wiphy_to_rdev(wiphy);
  11392. *wdev = NULL;
  11393. if (cb->args[1]) {
  11394. list_for_each_entry(tmp, &wiphy->wdev_list, list) {
  11395. if (tmp->identifier == cb->args[1] - 1) {
  11396. *wdev = tmp;
  11397. break;
  11398. }
  11399. }
  11400. }
  11401. /* keep rtnl locked in successful case */
  11402. return 0;
  11403. }
  11404. attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), GFP_KERNEL);
  11405. if (!attrbuf)
  11406. return -ENOMEM;
  11407. err = nlmsg_parse_deprecated(cb->nlh,
  11408. GENL_HDRLEN + nl80211_fam.hdrsize,
  11409. attrbuf, nl80211_fam.maxattr,
  11410. nl80211_policy, NULL);
  11411. if (err)
  11412. goto out;
  11413. if (!attrbuf[NL80211_ATTR_VENDOR_ID] ||
  11414. !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) {
  11415. err = -EINVAL;
  11416. goto out;
  11417. }
  11418. *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf);
  11419. if (IS_ERR(*wdev))
  11420. *wdev = NULL;
  11421. *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf);
  11422. if (IS_ERR(*rdev)) {
  11423. err = PTR_ERR(*rdev);
  11424. goto out;
  11425. }
  11426. vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]);
  11427. subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]);
  11428. for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) {
  11429. const struct wiphy_vendor_command *vcmd;
  11430. vcmd = &(*rdev)->wiphy.vendor_commands[i];
  11431. if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
  11432. continue;
  11433. if (!vcmd->dumpit) {
  11434. err = -EOPNOTSUPP;
  11435. goto out;
  11436. }
  11437. vcmd_idx = i;
  11438. break;
  11439. }
  11440. if (vcmd_idx < 0) {
  11441. err = -EOPNOTSUPP;
  11442. goto out;
  11443. }
  11444. if (attrbuf[NL80211_ATTR_VENDOR_DATA]) {
  11445. data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]);
  11446. data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]);
  11447. err = nl80211_vendor_check_policy(
  11448. &(*rdev)->wiphy.vendor_commands[vcmd_idx],
  11449. attrbuf[NL80211_ATTR_VENDOR_DATA],
  11450. cb->extack);
  11451. if (err)
  11452. goto out;
  11453. }
  11454. /* 0 is the first index - add 1 to parse only once */
  11455. cb->args[0] = (*rdev)->wiphy_idx + 1;
  11456. /* add 1 to know if it was NULL */
  11457. cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0;
  11458. cb->args[2] = vcmd_idx;
  11459. cb->args[3] = (unsigned long)data;
  11460. cb->args[4] = data_len;
  11461. /* keep rtnl locked in successful case */
  11462. err = 0;
  11463. out:
  11464. kfree(attrbuf);
  11465. return err;
  11466. }
  11467. static int nl80211_vendor_cmd_dump(struct sk_buff *skb,
  11468. struct netlink_callback *cb)
  11469. {
  11470. struct cfg80211_registered_device *rdev;
  11471. struct wireless_dev *wdev;
  11472. unsigned int vcmd_idx;
  11473. const struct wiphy_vendor_command *vcmd;
  11474. void *data;
  11475. int data_len;
  11476. int err;
  11477. struct nlattr *vendor_data;
  11478. rtnl_lock();
  11479. err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev);
  11480. if (err)
  11481. goto out;
  11482. vcmd_idx = cb->args[2];
  11483. data = (void *)cb->args[3];
  11484. data_len = cb->args[4];
  11485. vcmd = &rdev->wiphy.vendor_commands[vcmd_idx];
  11486. if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV |
  11487. WIPHY_VENDOR_CMD_NEED_NETDEV)) {
  11488. if (!wdev) {
  11489. err = -EINVAL;
  11490. goto out;
  11491. }
  11492. if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV &&
  11493. !wdev->netdev) {
  11494. err = -EINVAL;
  11495. goto out;
  11496. }
  11497. if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
  11498. if (!wdev_running(wdev)) {
  11499. err = -ENETDOWN;
  11500. goto out;
  11501. }
  11502. }
  11503. }
  11504. while (1) {
  11505. void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid,
  11506. cb->nlh->nlmsg_seq, NLM_F_MULTI,
  11507. NL80211_CMD_VENDOR);
  11508. if (!hdr)
  11509. break;
  11510. if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  11511. (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV,
  11512. wdev_id(wdev),
  11513. NL80211_ATTR_PAD))) {
  11514. genlmsg_cancel(skb, hdr);
  11515. break;
  11516. }
  11517. vendor_data = nla_nest_start_noflag(skb,
  11518. NL80211_ATTR_VENDOR_DATA);
  11519. if (!vendor_data) {
  11520. genlmsg_cancel(skb, hdr);
  11521. break;
  11522. }
  11523. err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len,
  11524. (unsigned long *)&cb->args[5]);
  11525. nla_nest_end(skb, vendor_data);
  11526. if (err == -ENOBUFS || err == -ENOENT) {
  11527. genlmsg_cancel(skb, hdr);
  11528. break;
  11529. } else if (err <= 0) {
  11530. genlmsg_cancel(skb, hdr);
  11531. goto out;
  11532. }
  11533. genlmsg_end(skb, hdr);
  11534. }
  11535. err = skb->len;
  11536. out:
  11537. rtnl_unlock();
  11538. return err;
  11539. }
  11540. struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy,
  11541. enum nl80211_commands cmd,
  11542. enum nl80211_attrs attr,
  11543. int approxlen)
  11544. {
  11545. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  11546. if (WARN_ON(!rdev->cur_cmd_info))
  11547. return NULL;
  11548. return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen,
  11549. rdev->cur_cmd_info->snd_portid,
  11550. rdev->cur_cmd_info->snd_seq,
  11551. cmd, attr, NULL, GFP_KERNEL);
  11552. }
  11553. EXPORT_SYMBOL(__cfg80211_alloc_reply_skb);
  11554. int cfg80211_vendor_cmd_reply(struct sk_buff *skb)
  11555. {
  11556. struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
  11557. void *hdr = ((void **)skb->cb)[1];
  11558. struct nlattr *data = ((void **)skb->cb)[2];
  11559. /* clear CB data for netlink core to own from now on */
  11560. memset(skb->cb, 0, sizeof(skb->cb));
  11561. if (WARN_ON(!rdev->cur_cmd_info)) {
  11562. kfree_skb(skb);
  11563. return -EINVAL;
  11564. }
  11565. nla_nest_end(skb, data);
  11566. genlmsg_end(skb, hdr);
  11567. return genlmsg_reply(skb, rdev->cur_cmd_info);
  11568. }
  11569. EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply);
  11570. unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy)
  11571. {
  11572. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  11573. if (WARN_ON(!rdev->cur_cmd_info))
  11574. return 0;
  11575. return rdev->cur_cmd_info->snd_portid;
  11576. }
  11577. EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_get_sender);
  11578. static int nl80211_set_qos_map(struct sk_buff *skb,
  11579. struct genl_info *info)
  11580. {
  11581. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11582. struct cfg80211_qos_map *qos_map = NULL;
  11583. struct net_device *dev = info->user_ptr[1];
  11584. u8 *pos, len, num_des, des_len, des;
  11585. int ret;
  11586. if (!rdev->ops->set_qos_map)
  11587. return -EOPNOTSUPP;
  11588. if (info->attrs[NL80211_ATTR_QOS_MAP]) {
  11589. pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]);
  11590. len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]);
  11591. if (len % 2)
  11592. return -EINVAL;
  11593. qos_map = kzalloc(sizeof(struct cfg80211_qos_map), GFP_KERNEL);
  11594. if (!qos_map)
  11595. return -ENOMEM;
  11596. num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1;
  11597. if (num_des) {
  11598. des_len = num_des *
  11599. sizeof(struct cfg80211_dscp_exception);
  11600. memcpy(qos_map->dscp_exception, pos, des_len);
  11601. qos_map->num_des = num_des;
  11602. for (des = 0; des < num_des; des++) {
  11603. if (qos_map->dscp_exception[des].up > 7) {
  11604. kfree(qos_map);
  11605. return -EINVAL;
  11606. }
  11607. }
  11608. pos += des_len;
  11609. }
  11610. memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN);
  11611. }
  11612. wdev_lock(dev->ieee80211_ptr);
  11613. ret = nl80211_key_allowed(dev->ieee80211_ptr);
  11614. if (!ret)
  11615. ret = rdev_set_qos_map(rdev, dev, qos_map);
  11616. wdev_unlock(dev->ieee80211_ptr);
  11617. kfree(qos_map);
  11618. return ret;
  11619. }
  11620. static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info)
  11621. {
  11622. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11623. struct net_device *dev = info->user_ptr[1];
  11624. struct wireless_dev *wdev = dev->ieee80211_ptr;
  11625. const u8 *peer;
  11626. u8 tsid, up;
  11627. u16 admitted_time = 0;
  11628. int err;
  11629. if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION))
  11630. return -EOPNOTSUPP;
  11631. if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] ||
  11632. !info->attrs[NL80211_ATTR_USER_PRIO])
  11633. return -EINVAL;
  11634. tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
  11635. up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]);
  11636. /* WMM uses TIDs 0-7 even for TSPEC */
  11637. if (tsid >= IEEE80211_FIRST_TSPEC_TSID) {
  11638. /* TODO: handle 802.11 TSPEC/admission control
  11639. * need more attributes for that (e.g. BA session requirement);
  11640. * change the WMM adminssion test above to allow both then
  11641. */
  11642. return -EINVAL;
  11643. }
  11644. peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
  11645. if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) {
  11646. admitted_time =
  11647. nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]);
  11648. if (!admitted_time)
  11649. return -EINVAL;
  11650. }
  11651. wdev_lock(wdev);
  11652. switch (wdev->iftype) {
  11653. case NL80211_IFTYPE_STATION:
  11654. case NL80211_IFTYPE_P2P_CLIENT:
  11655. if (wdev->current_bss)
  11656. break;
  11657. err = -ENOTCONN;
  11658. goto out;
  11659. default:
  11660. err = -EOPNOTSUPP;
  11661. goto out;
  11662. }
  11663. err = rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time);
  11664. out:
  11665. wdev_unlock(wdev);
  11666. return err;
  11667. }
  11668. static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info)
  11669. {
  11670. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11671. struct net_device *dev = info->user_ptr[1];
  11672. struct wireless_dev *wdev = dev->ieee80211_ptr;
  11673. const u8 *peer;
  11674. u8 tsid;
  11675. int err;
  11676. if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC])
  11677. return -EINVAL;
  11678. tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
  11679. peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
  11680. wdev_lock(wdev);
  11681. err = rdev_del_tx_ts(rdev, dev, tsid, peer);
  11682. wdev_unlock(wdev);
  11683. return err;
  11684. }
  11685. static int nl80211_tdls_channel_switch(struct sk_buff *skb,
  11686. struct genl_info *info)
  11687. {
  11688. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11689. struct net_device *dev = info->user_ptr[1];
  11690. struct wireless_dev *wdev = dev->ieee80211_ptr;
  11691. struct cfg80211_chan_def chandef = {};
  11692. const u8 *addr;
  11693. u8 oper_class;
  11694. int err;
  11695. if (!rdev->ops->tdls_channel_switch ||
  11696. !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
  11697. return -EOPNOTSUPP;
  11698. switch (dev->ieee80211_ptr->iftype) {
  11699. case NL80211_IFTYPE_STATION:
  11700. case NL80211_IFTYPE_P2P_CLIENT:
  11701. break;
  11702. default:
  11703. return -EOPNOTSUPP;
  11704. }
  11705. if (!info->attrs[NL80211_ATTR_MAC] ||
  11706. !info->attrs[NL80211_ATTR_OPER_CLASS])
  11707. return -EINVAL;
  11708. err = nl80211_parse_chandef(rdev, info, &chandef);
  11709. if (err)
  11710. return err;
  11711. /*
  11712. * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012
  11713. * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the
  11714. * specification is not defined for them.
  11715. */
  11716. if (chandef.chan->band == NL80211_BAND_2GHZ &&
  11717. chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
  11718. chandef.width != NL80211_CHAN_WIDTH_20)
  11719. return -EINVAL;
  11720. /* we will be active on the TDLS link */
  11721. if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef,
  11722. wdev->iftype))
  11723. return -EINVAL;
  11724. /* don't allow switching to DFS channels */
  11725. if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype))
  11726. return -EINVAL;
  11727. addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  11728. oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]);
  11729. wdev_lock(wdev);
  11730. err = rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef);
  11731. wdev_unlock(wdev);
  11732. return err;
  11733. }
  11734. static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb,
  11735. struct genl_info *info)
  11736. {
  11737. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11738. struct net_device *dev = info->user_ptr[1];
  11739. struct wireless_dev *wdev = dev->ieee80211_ptr;
  11740. const u8 *addr;
  11741. if (!rdev->ops->tdls_channel_switch ||
  11742. !rdev->ops->tdls_cancel_channel_switch ||
  11743. !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH))
  11744. return -EOPNOTSUPP;
  11745. switch (dev->ieee80211_ptr->iftype) {
  11746. case NL80211_IFTYPE_STATION:
  11747. case NL80211_IFTYPE_P2P_CLIENT:
  11748. break;
  11749. default:
  11750. return -EOPNOTSUPP;
  11751. }
  11752. if (!info->attrs[NL80211_ATTR_MAC])
  11753. return -EINVAL;
  11754. addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
  11755. wdev_lock(wdev);
  11756. rdev_tdls_cancel_channel_switch(rdev, dev, addr);
  11757. wdev_unlock(wdev);
  11758. return 0;
  11759. }
  11760. static int nl80211_set_multicast_to_unicast(struct sk_buff *skb,
  11761. struct genl_info *info)
  11762. {
  11763. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11764. struct net_device *dev = info->user_ptr[1];
  11765. struct wireless_dev *wdev = dev->ieee80211_ptr;
  11766. const struct nlattr *nla;
  11767. bool enabled;
  11768. if (!rdev->ops->set_multicast_to_unicast)
  11769. return -EOPNOTSUPP;
  11770. if (wdev->iftype != NL80211_IFTYPE_AP &&
  11771. wdev->iftype != NL80211_IFTYPE_P2P_GO)
  11772. return -EOPNOTSUPP;
  11773. nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED];
  11774. enabled = nla_get_flag(nla);
  11775. return rdev_set_multicast_to_unicast(rdev, dev, enabled);
  11776. }
  11777. static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info)
  11778. {
  11779. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11780. struct net_device *dev = info->user_ptr[1];
  11781. struct wireless_dev *wdev = dev->ieee80211_ptr;
  11782. struct cfg80211_pmk_conf pmk_conf = {};
  11783. int ret;
  11784. if (wdev->iftype != NL80211_IFTYPE_STATION &&
  11785. wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
  11786. return -EOPNOTSUPP;
  11787. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  11788. NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
  11789. return -EOPNOTSUPP;
  11790. if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK])
  11791. return -EINVAL;
  11792. wdev_lock(wdev);
  11793. if (!wdev->current_bss) {
  11794. ret = -ENOTCONN;
  11795. goto out;
  11796. }
  11797. pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
  11798. if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) {
  11799. ret = -EINVAL;
  11800. goto out;
  11801. }
  11802. pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
  11803. pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
  11804. if (pmk_conf.pmk_len != WLAN_PMK_LEN &&
  11805. pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) {
  11806. ret = -EINVAL;
  11807. goto out;
  11808. }
  11809. if (info->attrs[NL80211_ATTR_PMKR0_NAME])
  11810. pmk_conf.pmk_r0_name =
  11811. nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]);
  11812. ret = rdev_set_pmk(rdev, dev, &pmk_conf);
  11813. out:
  11814. wdev_unlock(wdev);
  11815. return ret;
  11816. }
  11817. static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info)
  11818. {
  11819. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11820. struct net_device *dev = info->user_ptr[1];
  11821. struct wireless_dev *wdev = dev->ieee80211_ptr;
  11822. const u8 *aa;
  11823. int ret;
  11824. if (wdev->iftype != NL80211_IFTYPE_STATION &&
  11825. wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
  11826. return -EOPNOTSUPP;
  11827. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  11828. NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X))
  11829. return -EOPNOTSUPP;
  11830. if (!info->attrs[NL80211_ATTR_MAC])
  11831. return -EINVAL;
  11832. wdev_lock(wdev);
  11833. aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
  11834. ret = rdev_del_pmk(rdev, dev, aa);
  11835. wdev_unlock(wdev);
  11836. return ret;
  11837. }
  11838. static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info)
  11839. {
  11840. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11841. struct net_device *dev = info->user_ptr[1];
  11842. struct cfg80211_external_auth_params params;
  11843. if (!rdev->ops->external_auth)
  11844. return -EOPNOTSUPP;
  11845. if (!info->attrs[NL80211_ATTR_SSID] &&
  11846. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  11847. dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  11848. return -EINVAL;
  11849. if (!info->attrs[NL80211_ATTR_BSSID])
  11850. return -EINVAL;
  11851. if (!info->attrs[NL80211_ATTR_STATUS_CODE])
  11852. return -EINVAL;
  11853. memset(&params, 0, sizeof(params));
  11854. if (info->attrs[NL80211_ATTR_SSID]) {
  11855. params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
  11856. if (params.ssid.ssid_len == 0)
  11857. return -EINVAL;
  11858. memcpy(params.ssid.ssid,
  11859. nla_data(info->attrs[NL80211_ATTR_SSID]),
  11860. params.ssid.ssid_len);
  11861. }
  11862. memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]),
  11863. ETH_ALEN);
  11864. params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
  11865. if (info->attrs[NL80211_ATTR_PMKID])
  11866. params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
  11867. return rdev_external_auth(rdev, dev, &params);
  11868. }
  11869. static int nl80211_tx_control_port(struct sk_buff *skb, struct genl_info *info)
  11870. {
  11871. bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK];
  11872. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11873. struct net_device *dev = info->user_ptr[1];
  11874. struct wireless_dev *wdev = dev->ieee80211_ptr;
  11875. const u8 *buf;
  11876. size_t len;
  11877. u8 *dest;
  11878. u16 proto;
  11879. bool noencrypt;
  11880. u64 cookie = 0;
  11881. int err;
  11882. if (!wiphy_ext_feature_isset(&rdev->wiphy,
  11883. NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211))
  11884. return -EOPNOTSUPP;
  11885. if (!rdev->ops->tx_control_port)
  11886. return -EOPNOTSUPP;
  11887. if (!info->attrs[NL80211_ATTR_FRAME] ||
  11888. !info->attrs[NL80211_ATTR_MAC] ||
  11889. !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
  11890. GENL_SET_ERR_MSG(info, "Frame, MAC or ethertype missing");
  11891. return -EINVAL;
  11892. }
  11893. wdev_lock(wdev);
  11894. switch (wdev->iftype) {
  11895. case NL80211_IFTYPE_AP:
  11896. case NL80211_IFTYPE_P2P_GO:
  11897. case NL80211_IFTYPE_MESH_POINT:
  11898. break;
  11899. case NL80211_IFTYPE_ADHOC:
  11900. case NL80211_IFTYPE_STATION:
  11901. case NL80211_IFTYPE_P2P_CLIENT:
  11902. if (wdev->current_bss)
  11903. break;
  11904. err = -ENOTCONN;
  11905. goto out;
  11906. default:
  11907. err = -EOPNOTSUPP;
  11908. goto out;
  11909. }
  11910. wdev_unlock(wdev);
  11911. buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
  11912. len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
  11913. dest = nla_data(info->attrs[NL80211_ATTR_MAC]);
  11914. proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
  11915. noencrypt =
  11916. nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]);
  11917. err = rdev_tx_control_port(rdev, dev, buf, len,
  11918. dest, cpu_to_be16(proto), noencrypt,
  11919. dont_wait_for_ack ? NULL : &cookie);
  11920. if (!err && !dont_wait_for_ack)
  11921. nl_set_extack_cookie_u64(info->extack, cookie);
  11922. return err;
  11923. out:
  11924. wdev_unlock(wdev);
  11925. return err;
  11926. }
  11927. static int nl80211_get_ftm_responder_stats(struct sk_buff *skb,
  11928. struct genl_info *info)
  11929. {
  11930. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11931. struct net_device *dev = info->user_ptr[1];
  11932. struct wireless_dev *wdev = dev->ieee80211_ptr;
  11933. struct cfg80211_ftm_responder_stats ftm_stats = {};
  11934. struct sk_buff *msg;
  11935. void *hdr;
  11936. struct nlattr *ftm_stats_attr;
  11937. int err;
  11938. if (wdev->iftype != NL80211_IFTYPE_AP || !wdev->beacon_interval)
  11939. return -EOPNOTSUPP;
  11940. err = rdev_get_ftm_responder_stats(rdev, dev, &ftm_stats);
  11941. if (err)
  11942. return err;
  11943. if (!ftm_stats.filled)
  11944. return -ENODATA;
  11945. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  11946. if (!msg)
  11947. return -ENOMEM;
  11948. hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
  11949. NL80211_CMD_GET_FTM_RESPONDER_STATS);
  11950. if (!hdr)
  11951. goto nla_put_failure;
  11952. if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
  11953. goto nla_put_failure;
  11954. ftm_stats_attr = nla_nest_start_noflag(msg,
  11955. NL80211_ATTR_FTM_RESPONDER_STATS);
  11956. if (!ftm_stats_attr)
  11957. goto nla_put_failure;
  11958. #define SET_FTM(field, name, type) \
  11959. do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \
  11960. nla_put_ ## type(msg, NL80211_FTM_STATS_ ## name, \
  11961. ftm_stats.field)) \
  11962. goto nla_put_failure; } while (0)
  11963. #define SET_FTM_U64(field, name) \
  11964. do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \
  11965. nla_put_u64_64bit(msg, NL80211_FTM_STATS_ ## name, \
  11966. ftm_stats.field, NL80211_FTM_STATS_PAD)) \
  11967. goto nla_put_failure; } while (0)
  11968. SET_FTM(success_num, SUCCESS_NUM, u32);
  11969. SET_FTM(partial_num, PARTIAL_NUM, u32);
  11970. SET_FTM(failed_num, FAILED_NUM, u32);
  11971. SET_FTM(asap_num, ASAP_NUM, u32);
  11972. SET_FTM(non_asap_num, NON_ASAP_NUM, u32);
  11973. SET_FTM_U64(total_duration_ms, TOTAL_DURATION_MSEC);
  11974. SET_FTM(unknown_triggers_num, UNKNOWN_TRIGGERS_NUM, u32);
  11975. SET_FTM(reschedule_requests_num, RESCHEDULE_REQUESTS_NUM, u32);
  11976. SET_FTM(out_of_window_triggers_num, OUT_OF_WINDOW_TRIGGERS_NUM, u32);
  11977. #undef SET_FTM
  11978. nla_nest_end(msg, ftm_stats_attr);
  11979. genlmsg_end(msg, hdr);
  11980. return genlmsg_reply(msg, info);
  11981. nla_put_failure:
  11982. nlmsg_free(msg);
  11983. return -ENOBUFS;
  11984. }
  11985. static int nl80211_update_owe_info(struct sk_buff *skb, struct genl_info *info)
  11986. {
  11987. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  11988. struct cfg80211_update_owe_info owe_info;
  11989. struct net_device *dev = info->user_ptr[1];
  11990. if (!rdev->ops->update_owe_info)
  11991. return -EOPNOTSUPP;
  11992. if (!info->attrs[NL80211_ATTR_STATUS_CODE] ||
  11993. !info->attrs[NL80211_ATTR_MAC])
  11994. return -EINVAL;
  11995. memset(&owe_info, 0, sizeof(owe_info));
  11996. owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
  11997. nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN);
  11998. if (info->attrs[NL80211_ATTR_IE]) {
  11999. owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
  12000. owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
  12001. }
  12002. return rdev_update_owe_info(rdev, dev, &owe_info);
  12003. }
  12004. static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info)
  12005. {
  12006. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  12007. struct net_device *dev = info->user_ptr[1];
  12008. struct wireless_dev *wdev = dev->ieee80211_ptr;
  12009. struct station_info sinfo = {};
  12010. const u8 *buf;
  12011. size_t len;
  12012. u8 *dest;
  12013. int err;
  12014. if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station)
  12015. return -EOPNOTSUPP;
  12016. if (!info->attrs[NL80211_ATTR_MAC] ||
  12017. !info->attrs[NL80211_ATTR_FRAME]) {
  12018. GENL_SET_ERR_MSG(info, "Frame or MAC missing");
  12019. return -EINVAL;
  12020. }
  12021. if (wdev->iftype != NL80211_IFTYPE_MESH_POINT)
  12022. return -EOPNOTSUPP;
  12023. dest = nla_data(info->attrs[NL80211_ATTR_MAC]);
  12024. buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
  12025. len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
  12026. if (len < sizeof(struct ethhdr))
  12027. return -EINVAL;
  12028. if (!ether_addr_equal(buf, dest) || is_multicast_ether_addr(buf) ||
  12029. !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr))
  12030. return -EINVAL;
  12031. err = rdev_get_station(rdev, dev, dest, &sinfo);
  12032. if (err)
  12033. return err;
  12034. cfg80211_sinfo_release_content(&sinfo);
  12035. return rdev_probe_mesh_link(rdev, dev, dest, buf, len);
  12036. }
  12037. static int parse_tid_conf(struct cfg80211_registered_device *rdev,
  12038. struct nlattr *attrs[], struct net_device *dev,
  12039. struct cfg80211_tid_cfg *tid_conf,
  12040. struct genl_info *info, const u8 *peer)
  12041. {
  12042. struct netlink_ext_ack *extack = info->extack;
  12043. u64 mask;
  12044. int err;
  12045. if (!attrs[NL80211_TID_CONFIG_ATTR_TIDS])
  12046. return -EINVAL;
  12047. tid_conf->config_override =
  12048. nla_get_flag(attrs[NL80211_TID_CONFIG_ATTR_OVERRIDE]);
  12049. tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]);
  12050. if (tid_conf->config_override) {
  12051. if (rdev->ops->reset_tid_config) {
  12052. err = rdev_reset_tid_config(rdev, dev, peer,
  12053. tid_conf->tids);
  12054. if (err)
  12055. return err;
  12056. } else {
  12057. return -EINVAL;
  12058. }
  12059. }
  12060. if (attrs[NL80211_TID_CONFIG_ATTR_NOACK]) {
  12061. tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK);
  12062. tid_conf->noack =
  12063. nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_NOACK]);
  12064. }
  12065. if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]) {
  12066. tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT);
  12067. tid_conf->retry_short =
  12068. nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]);
  12069. if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count)
  12070. return -EINVAL;
  12071. }
  12072. if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]) {
  12073. tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG);
  12074. tid_conf->retry_long =
  12075. nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]);
  12076. if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count)
  12077. return -EINVAL;
  12078. }
  12079. if (attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]) {
  12080. tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL);
  12081. tid_conf->ampdu =
  12082. nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]);
  12083. }
  12084. if (attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]) {
  12085. tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL);
  12086. tid_conf->rtscts =
  12087. nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]);
  12088. }
  12089. if (attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]) {
  12090. tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL);
  12091. tid_conf->amsdu =
  12092. nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]);
  12093. }
  12094. if (attrs[NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE]) {
  12095. u32 idx = NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE, attr;
  12096. tid_conf->txrate_type = nla_get_u8(attrs[idx]);
  12097. if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) {
  12098. attr = NL80211_TID_CONFIG_ATTR_TX_RATE;
  12099. err = nl80211_parse_tx_bitrate_mask(info, attrs, attr,
  12100. &tid_conf->txrate_mask, dev);
  12101. if (err)
  12102. return err;
  12103. tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE);
  12104. }
  12105. tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE);
  12106. }
  12107. if (peer)
  12108. mask = rdev->wiphy.tid_config_support.peer;
  12109. else
  12110. mask = rdev->wiphy.tid_config_support.vif;
  12111. if (tid_conf->mask & ~mask) {
  12112. NL_SET_ERR_MSG(extack, "unsupported TID configuration");
  12113. return -ENOTSUPP;
  12114. }
  12115. return 0;
  12116. }
  12117. static int nl80211_set_tid_config(struct sk_buff *skb,
  12118. struct genl_info *info)
  12119. {
  12120. struct cfg80211_registered_device *rdev = info->user_ptr[0];
  12121. struct nlattr *attrs[NL80211_TID_CONFIG_ATTR_MAX + 1];
  12122. struct net_device *dev = info->user_ptr[1];
  12123. struct cfg80211_tid_config *tid_config;
  12124. struct nlattr *tid;
  12125. int conf_idx = 0, rem_conf;
  12126. int ret = -EINVAL;
  12127. u32 num_conf = 0;
  12128. if (!info->attrs[NL80211_ATTR_TID_CONFIG])
  12129. return -EINVAL;
  12130. if (!rdev->ops->set_tid_config)
  12131. return -EOPNOTSUPP;
  12132. nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG],
  12133. rem_conf)
  12134. num_conf++;
  12135. tid_config = kzalloc(struct_size(tid_config, tid_conf, num_conf),
  12136. GFP_KERNEL);
  12137. if (!tid_config)
  12138. return -ENOMEM;
  12139. tid_config->n_tid_conf = num_conf;
  12140. if (info->attrs[NL80211_ATTR_MAC])
  12141. tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
  12142. nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG],
  12143. rem_conf) {
  12144. ret = nla_parse_nested(attrs, NL80211_TID_CONFIG_ATTR_MAX,
  12145. tid, NULL, NULL);
  12146. if (ret)
  12147. goto bad_tid_conf;
  12148. ret = parse_tid_conf(rdev, attrs, dev,
  12149. &tid_config->tid_conf[conf_idx],
  12150. info, tid_config->peer);
  12151. if (ret)
  12152. goto bad_tid_conf;
  12153. conf_idx++;
  12154. }
  12155. ret = rdev_set_tid_config(rdev, dev, tid_config);
  12156. bad_tid_conf:
  12157. kfree(tid_config);
  12158. return ret;
  12159. }
  12160. #define NL80211_FLAG_NEED_WIPHY 0x01
  12161. #define NL80211_FLAG_NEED_NETDEV 0x02
  12162. #define NL80211_FLAG_NEED_RTNL 0x04
  12163. #define NL80211_FLAG_CHECK_NETDEV_UP 0x08
  12164. #define NL80211_FLAG_NEED_NETDEV_UP (NL80211_FLAG_NEED_NETDEV |\
  12165. NL80211_FLAG_CHECK_NETDEV_UP)
  12166. #define NL80211_FLAG_NEED_WDEV 0x10
  12167. /* If a netdev is associated, it must be UP, P2P must be started */
  12168. #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\
  12169. NL80211_FLAG_CHECK_NETDEV_UP)
  12170. #define NL80211_FLAG_CLEAR_SKB 0x20
  12171. static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
  12172. struct genl_info *info)
  12173. {
  12174. struct cfg80211_registered_device *rdev;
  12175. struct wireless_dev *wdev;
  12176. struct net_device *dev;
  12177. bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL;
  12178. if (rtnl)
  12179. rtnl_lock();
  12180. if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) {
  12181. rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
  12182. if (IS_ERR(rdev)) {
  12183. if (rtnl)
  12184. rtnl_unlock();
  12185. return PTR_ERR(rdev);
  12186. }
  12187. info->user_ptr[0] = rdev;
  12188. } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV ||
  12189. ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
  12190. ASSERT_RTNL();
  12191. wdev = __cfg80211_wdev_from_attrs(genl_info_net(info),
  12192. info->attrs);
  12193. if (IS_ERR(wdev)) {
  12194. if (rtnl)
  12195. rtnl_unlock();
  12196. return PTR_ERR(wdev);
  12197. }
  12198. dev = wdev->netdev;
  12199. rdev = wiphy_to_rdev(wdev->wiphy);
  12200. if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) {
  12201. if (!dev) {
  12202. if (rtnl)
  12203. rtnl_unlock();
  12204. return -EINVAL;
  12205. }
  12206. info->user_ptr[1] = dev;
  12207. } else {
  12208. info->user_ptr[1] = wdev;
  12209. }
  12210. if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
  12211. !wdev_running(wdev)) {
  12212. if (rtnl)
  12213. rtnl_unlock();
  12214. return -ENETDOWN;
  12215. }
  12216. if (dev)
  12217. dev_hold(dev);
  12218. info->user_ptr[0] = rdev;
  12219. }
  12220. return 0;
  12221. }
  12222. static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
  12223. struct genl_info *info)
  12224. {
  12225. if (info->user_ptr[1]) {
  12226. if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) {
  12227. struct wireless_dev *wdev = info->user_ptr[1];
  12228. if (wdev->netdev)
  12229. dev_put(wdev->netdev);
  12230. } else {
  12231. dev_put(info->user_ptr[1]);
  12232. }
  12233. }
  12234. if (ops->internal_flags & NL80211_FLAG_NEED_RTNL)
  12235. rtnl_unlock();
  12236. /* If needed, clear the netlink message payload from the SKB
  12237. * as it might contain key data that shouldn't stick around on
  12238. * the heap after the SKB is freed. The netlink message header
  12239. * is still needed for further processing, so leave it intact.
  12240. */
  12241. if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) {
  12242. struct nlmsghdr *nlh = nlmsg_hdr(skb);
  12243. memset(nlmsg_data(nlh), 0, nlmsg_len(nlh));
  12244. }
  12245. }
  12246. static const struct genl_ops nl80211_ops[] = {
  12247. {
  12248. .cmd = NL80211_CMD_GET_WIPHY,
  12249. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12250. .doit = nl80211_get_wiphy,
  12251. .dumpit = nl80211_dump_wiphy,
  12252. .done = nl80211_dump_wiphy_done,
  12253. /* can be retrieved by unprivileged users */
  12254. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  12255. NL80211_FLAG_NEED_RTNL,
  12256. },
  12257. };
  12258. static const struct genl_small_ops nl80211_small_ops[] = {
  12259. {
  12260. .cmd = NL80211_CMD_SET_WIPHY,
  12261. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12262. .doit = nl80211_set_wiphy,
  12263. .flags = GENL_UNS_ADMIN_PERM,
  12264. .internal_flags = NL80211_FLAG_NEED_RTNL,
  12265. },
  12266. {
  12267. .cmd = NL80211_CMD_GET_INTERFACE,
  12268. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12269. .doit = nl80211_get_interface,
  12270. .dumpit = nl80211_dump_interface,
  12271. /* can be retrieved by unprivileged users */
  12272. .internal_flags = NL80211_FLAG_NEED_WDEV |
  12273. NL80211_FLAG_NEED_RTNL,
  12274. },
  12275. {
  12276. .cmd = NL80211_CMD_SET_INTERFACE,
  12277. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12278. .doit = nl80211_set_interface,
  12279. .flags = GENL_UNS_ADMIN_PERM,
  12280. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  12281. NL80211_FLAG_NEED_RTNL,
  12282. },
  12283. {
  12284. .cmd = NL80211_CMD_NEW_INTERFACE,
  12285. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12286. .doit = nl80211_new_interface,
  12287. .flags = GENL_UNS_ADMIN_PERM,
  12288. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  12289. NL80211_FLAG_NEED_RTNL,
  12290. },
  12291. {
  12292. .cmd = NL80211_CMD_DEL_INTERFACE,
  12293. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12294. .doit = nl80211_del_interface,
  12295. .flags = GENL_UNS_ADMIN_PERM,
  12296. .internal_flags = NL80211_FLAG_NEED_WDEV |
  12297. NL80211_FLAG_NEED_RTNL,
  12298. },
  12299. {
  12300. .cmd = NL80211_CMD_GET_KEY,
  12301. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12302. .doit = nl80211_get_key,
  12303. .flags = GENL_UNS_ADMIN_PERM,
  12304. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12305. NL80211_FLAG_NEED_RTNL,
  12306. },
  12307. {
  12308. .cmd = NL80211_CMD_SET_KEY,
  12309. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12310. .doit = nl80211_set_key,
  12311. .flags = GENL_UNS_ADMIN_PERM,
  12312. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12313. NL80211_FLAG_NEED_RTNL |
  12314. NL80211_FLAG_CLEAR_SKB,
  12315. },
  12316. {
  12317. .cmd = NL80211_CMD_NEW_KEY,
  12318. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12319. .doit = nl80211_new_key,
  12320. .flags = GENL_UNS_ADMIN_PERM,
  12321. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12322. NL80211_FLAG_NEED_RTNL |
  12323. NL80211_FLAG_CLEAR_SKB,
  12324. },
  12325. {
  12326. .cmd = NL80211_CMD_DEL_KEY,
  12327. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12328. .doit = nl80211_del_key,
  12329. .flags = GENL_UNS_ADMIN_PERM,
  12330. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12331. NL80211_FLAG_NEED_RTNL,
  12332. },
  12333. {
  12334. .cmd = NL80211_CMD_SET_BEACON,
  12335. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12336. .flags = GENL_UNS_ADMIN_PERM,
  12337. .doit = nl80211_set_beacon,
  12338. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12339. NL80211_FLAG_NEED_RTNL,
  12340. },
  12341. {
  12342. .cmd = NL80211_CMD_START_AP,
  12343. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12344. .flags = GENL_UNS_ADMIN_PERM,
  12345. .doit = nl80211_start_ap,
  12346. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12347. NL80211_FLAG_NEED_RTNL,
  12348. },
  12349. {
  12350. .cmd = NL80211_CMD_STOP_AP,
  12351. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12352. .flags = GENL_UNS_ADMIN_PERM,
  12353. .doit = nl80211_stop_ap,
  12354. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12355. NL80211_FLAG_NEED_RTNL,
  12356. },
  12357. {
  12358. .cmd = NL80211_CMD_GET_STATION,
  12359. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12360. .doit = nl80211_get_station,
  12361. .dumpit = nl80211_dump_station,
  12362. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  12363. NL80211_FLAG_NEED_RTNL,
  12364. },
  12365. {
  12366. .cmd = NL80211_CMD_SET_STATION,
  12367. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12368. .doit = nl80211_set_station,
  12369. .flags = GENL_UNS_ADMIN_PERM,
  12370. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12371. NL80211_FLAG_NEED_RTNL,
  12372. },
  12373. {
  12374. .cmd = NL80211_CMD_NEW_STATION,
  12375. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12376. .doit = nl80211_new_station,
  12377. .flags = GENL_UNS_ADMIN_PERM,
  12378. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12379. NL80211_FLAG_NEED_RTNL,
  12380. },
  12381. {
  12382. .cmd = NL80211_CMD_DEL_STATION,
  12383. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12384. .doit = nl80211_del_station,
  12385. .flags = GENL_UNS_ADMIN_PERM,
  12386. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12387. NL80211_FLAG_NEED_RTNL,
  12388. },
  12389. {
  12390. .cmd = NL80211_CMD_GET_MPATH,
  12391. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12392. .doit = nl80211_get_mpath,
  12393. .dumpit = nl80211_dump_mpath,
  12394. .flags = GENL_UNS_ADMIN_PERM,
  12395. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12396. NL80211_FLAG_NEED_RTNL,
  12397. },
  12398. {
  12399. .cmd = NL80211_CMD_GET_MPP,
  12400. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12401. .doit = nl80211_get_mpp,
  12402. .dumpit = nl80211_dump_mpp,
  12403. .flags = GENL_UNS_ADMIN_PERM,
  12404. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12405. NL80211_FLAG_NEED_RTNL,
  12406. },
  12407. {
  12408. .cmd = NL80211_CMD_SET_MPATH,
  12409. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12410. .doit = nl80211_set_mpath,
  12411. .flags = GENL_UNS_ADMIN_PERM,
  12412. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12413. NL80211_FLAG_NEED_RTNL,
  12414. },
  12415. {
  12416. .cmd = NL80211_CMD_NEW_MPATH,
  12417. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12418. .doit = nl80211_new_mpath,
  12419. .flags = GENL_UNS_ADMIN_PERM,
  12420. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12421. NL80211_FLAG_NEED_RTNL,
  12422. },
  12423. {
  12424. .cmd = NL80211_CMD_DEL_MPATH,
  12425. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12426. .doit = nl80211_del_mpath,
  12427. .flags = GENL_UNS_ADMIN_PERM,
  12428. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12429. NL80211_FLAG_NEED_RTNL,
  12430. },
  12431. {
  12432. .cmd = NL80211_CMD_SET_BSS,
  12433. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12434. .doit = nl80211_set_bss,
  12435. .flags = GENL_UNS_ADMIN_PERM,
  12436. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12437. NL80211_FLAG_NEED_RTNL,
  12438. },
  12439. {
  12440. .cmd = NL80211_CMD_GET_REG,
  12441. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12442. .doit = nl80211_get_reg_do,
  12443. .dumpit = nl80211_get_reg_dump,
  12444. .internal_flags = NL80211_FLAG_NEED_RTNL,
  12445. /* can be retrieved by unprivileged users */
  12446. },
  12447. #ifdef CONFIG_CFG80211_CRDA_SUPPORT
  12448. {
  12449. .cmd = NL80211_CMD_SET_REG,
  12450. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12451. .doit = nl80211_set_reg,
  12452. .flags = GENL_ADMIN_PERM,
  12453. .internal_flags = NL80211_FLAG_NEED_RTNL,
  12454. },
  12455. #endif
  12456. {
  12457. .cmd = NL80211_CMD_REQ_SET_REG,
  12458. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12459. .doit = nl80211_req_set_reg,
  12460. .flags = GENL_ADMIN_PERM,
  12461. },
  12462. {
  12463. .cmd = NL80211_CMD_RELOAD_REGDB,
  12464. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12465. .doit = nl80211_reload_regdb,
  12466. .flags = GENL_ADMIN_PERM,
  12467. },
  12468. {
  12469. .cmd = NL80211_CMD_GET_MESH_CONFIG,
  12470. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12471. .doit = nl80211_get_mesh_config,
  12472. /* can be retrieved by unprivileged users */
  12473. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12474. NL80211_FLAG_NEED_RTNL,
  12475. },
  12476. {
  12477. .cmd = NL80211_CMD_SET_MESH_CONFIG,
  12478. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12479. .doit = nl80211_update_mesh_config,
  12480. .flags = GENL_UNS_ADMIN_PERM,
  12481. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12482. NL80211_FLAG_NEED_RTNL,
  12483. },
  12484. {
  12485. .cmd = NL80211_CMD_TRIGGER_SCAN,
  12486. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12487. .doit = nl80211_trigger_scan,
  12488. .flags = GENL_UNS_ADMIN_PERM,
  12489. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  12490. NL80211_FLAG_NEED_RTNL,
  12491. },
  12492. {
  12493. .cmd = NL80211_CMD_ABORT_SCAN,
  12494. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12495. .doit = nl80211_abort_scan,
  12496. .flags = GENL_UNS_ADMIN_PERM,
  12497. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  12498. NL80211_FLAG_NEED_RTNL,
  12499. },
  12500. {
  12501. .cmd = NL80211_CMD_GET_SCAN,
  12502. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12503. .dumpit = nl80211_dump_scan,
  12504. },
  12505. {
  12506. .cmd = NL80211_CMD_START_SCHED_SCAN,
  12507. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12508. .doit = nl80211_start_sched_scan,
  12509. .flags = GENL_UNS_ADMIN_PERM,
  12510. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12511. NL80211_FLAG_NEED_RTNL,
  12512. },
  12513. {
  12514. .cmd = NL80211_CMD_STOP_SCHED_SCAN,
  12515. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12516. .doit = nl80211_stop_sched_scan,
  12517. .flags = GENL_UNS_ADMIN_PERM,
  12518. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12519. NL80211_FLAG_NEED_RTNL,
  12520. },
  12521. {
  12522. .cmd = NL80211_CMD_AUTHENTICATE,
  12523. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12524. .doit = nl80211_authenticate,
  12525. .flags = GENL_UNS_ADMIN_PERM,
  12526. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12527. NL80211_FLAG_NEED_RTNL |
  12528. NL80211_FLAG_CLEAR_SKB,
  12529. },
  12530. {
  12531. .cmd = NL80211_CMD_ASSOCIATE,
  12532. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12533. .doit = nl80211_associate,
  12534. .flags = GENL_UNS_ADMIN_PERM,
  12535. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12536. NL80211_FLAG_NEED_RTNL |
  12537. NL80211_FLAG_CLEAR_SKB,
  12538. },
  12539. {
  12540. .cmd = NL80211_CMD_DEAUTHENTICATE,
  12541. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12542. .doit = nl80211_deauthenticate,
  12543. .flags = GENL_UNS_ADMIN_PERM,
  12544. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12545. NL80211_FLAG_NEED_RTNL,
  12546. },
  12547. {
  12548. .cmd = NL80211_CMD_DISASSOCIATE,
  12549. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12550. .doit = nl80211_disassociate,
  12551. .flags = GENL_UNS_ADMIN_PERM,
  12552. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12553. NL80211_FLAG_NEED_RTNL,
  12554. },
  12555. {
  12556. .cmd = NL80211_CMD_JOIN_IBSS,
  12557. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12558. .doit = nl80211_join_ibss,
  12559. .flags = GENL_UNS_ADMIN_PERM,
  12560. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12561. NL80211_FLAG_NEED_RTNL,
  12562. },
  12563. {
  12564. .cmd = NL80211_CMD_LEAVE_IBSS,
  12565. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12566. .doit = nl80211_leave_ibss,
  12567. .flags = GENL_UNS_ADMIN_PERM,
  12568. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12569. NL80211_FLAG_NEED_RTNL,
  12570. },
  12571. #ifdef CONFIG_NL80211_TESTMODE
  12572. {
  12573. .cmd = NL80211_CMD_TESTMODE,
  12574. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12575. .doit = nl80211_testmode_do,
  12576. .dumpit = nl80211_testmode_dump,
  12577. .flags = GENL_UNS_ADMIN_PERM,
  12578. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  12579. NL80211_FLAG_NEED_RTNL,
  12580. },
  12581. #endif
  12582. {
  12583. .cmd = NL80211_CMD_CONNECT,
  12584. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12585. .doit = nl80211_connect,
  12586. .flags = GENL_UNS_ADMIN_PERM,
  12587. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12588. NL80211_FLAG_NEED_RTNL |
  12589. NL80211_FLAG_CLEAR_SKB,
  12590. },
  12591. {
  12592. .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS,
  12593. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12594. .doit = nl80211_update_connect_params,
  12595. .flags = GENL_ADMIN_PERM,
  12596. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12597. NL80211_FLAG_NEED_RTNL |
  12598. NL80211_FLAG_CLEAR_SKB,
  12599. },
  12600. {
  12601. .cmd = NL80211_CMD_DISCONNECT,
  12602. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12603. .doit = nl80211_disconnect,
  12604. .flags = GENL_UNS_ADMIN_PERM,
  12605. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12606. NL80211_FLAG_NEED_RTNL,
  12607. },
  12608. {
  12609. .cmd = NL80211_CMD_SET_WIPHY_NETNS,
  12610. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12611. .doit = nl80211_wiphy_netns,
  12612. .flags = GENL_UNS_ADMIN_PERM,
  12613. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  12614. NL80211_FLAG_NEED_RTNL,
  12615. },
  12616. {
  12617. .cmd = NL80211_CMD_GET_SURVEY,
  12618. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12619. .dumpit = nl80211_dump_survey,
  12620. },
  12621. {
  12622. .cmd = NL80211_CMD_SET_PMKSA,
  12623. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12624. .doit = nl80211_setdel_pmksa,
  12625. .flags = GENL_UNS_ADMIN_PERM,
  12626. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12627. NL80211_FLAG_NEED_RTNL |
  12628. NL80211_FLAG_CLEAR_SKB,
  12629. },
  12630. {
  12631. .cmd = NL80211_CMD_DEL_PMKSA,
  12632. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12633. .doit = nl80211_setdel_pmksa,
  12634. .flags = GENL_UNS_ADMIN_PERM,
  12635. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12636. NL80211_FLAG_NEED_RTNL,
  12637. },
  12638. {
  12639. .cmd = NL80211_CMD_FLUSH_PMKSA,
  12640. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12641. .doit = nl80211_flush_pmksa,
  12642. .flags = GENL_UNS_ADMIN_PERM,
  12643. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12644. NL80211_FLAG_NEED_RTNL,
  12645. },
  12646. {
  12647. .cmd = NL80211_CMD_REMAIN_ON_CHANNEL,
  12648. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12649. .doit = nl80211_remain_on_channel,
  12650. .flags = GENL_UNS_ADMIN_PERM,
  12651. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  12652. NL80211_FLAG_NEED_RTNL,
  12653. },
  12654. {
  12655. .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
  12656. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12657. .doit = nl80211_cancel_remain_on_channel,
  12658. .flags = GENL_UNS_ADMIN_PERM,
  12659. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  12660. NL80211_FLAG_NEED_RTNL,
  12661. },
  12662. {
  12663. .cmd = NL80211_CMD_SET_TX_BITRATE_MASK,
  12664. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12665. .doit = nl80211_set_tx_bitrate_mask,
  12666. .flags = GENL_UNS_ADMIN_PERM,
  12667. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  12668. NL80211_FLAG_NEED_RTNL,
  12669. },
  12670. {
  12671. .cmd = NL80211_CMD_REGISTER_FRAME,
  12672. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12673. .doit = nl80211_register_mgmt,
  12674. .flags = GENL_UNS_ADMIN_PERM,
  12675. .internal_flags = NL80211_FLAG_NEED_WDEV |
  12676. NL80211_FLAG_NEED_RTNL,
  12677. },
  12678. {
  12679. .cmd = NL80211_CMD_FRAME,
  12680. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12681. .doit = nl80211_tx_mgmt,
  12682. .flags = GENL_UNS_ADMIN_PERM,
  12683. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  12684. NL80211_FLAG_NEED_RTNL,
  12685. },
  12686. {
  12687. .cmd = NL80211_CMD_FRAME_WAIT_CANCEL,
  12688. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12689. .doit = nl80211_tx_mgmt_cancel_wait,
  12690. .flags = GENL_UNS_ADMIN_PERM,
  12691. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  12692. NL80211_FLAG_NEED_RTNL,
  12693. },
  12694. {
  12695. .cmd = NL80211_CMD_SET_POWER_SAVE,
  12696. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12697. .doit = nl80211_set_power_save,
  12698. .flags = GENL_UNS_ADMIN_PERM,
  12699. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  12700. NL80211_FLAG_NEED_RTNL,
  12701. },
  12702. {
  12703. .cmd = NL80211_CMD_GET_POWER_SAVE,
  12704. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12705. .doit = nl80211_get_power_save,
  12706. /* can be retrieved by unprivileged users */
  12707. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  12708. NL80211_FLAG_NEED_RTNL,
  12709. },
  12710. {
  12711. .cmd = NL80211_CMD_SET_CQM,
  12712. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12713. .doit = nl80211_set_cqm,
  12714. .flags = GENL_UNS_ADMIN_PERM,
  12715. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  12716. NL80211_FLAG_NEED_RTNL,
  12717. },
  12718. {
  12719. .cmd = NL80211_CMD_SET_CHANNEL,
  12720. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12721. .doit = nl80211_set_channel,
  12722. .flags = GENL_UNS_ADMIN_PERM,
  12723. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  12724. NL80211_FLAG_NEED_RTNL,
  12725. },
  12726. {
  12727. .cmd = NL80211_CMD_SET_WDS_PEER,
  12728. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12729. .doit = nl80211_set_wds_peer,
  12730. .flags = GENL_UNS_ADMIN_PERM,
  12731. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  12732. NL80211_FLAG_NEED_RTNL,
  12733. },
  12734. {
  12735. .cmd = NL80211_CMD_JOIN_MESH,
  12736. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12737. .doit = nl80211_join_mesh,
  12738. .flags = GENL_UNS_ADMIN_PERM,
  12739. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12740. NL80211_FLAG_NEED_RTNL,
  12741. },
  12742. {
  12743. .cmd = NL80211_CMD_LEAVE_MESH,
  12744. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12745. .doit = nl80211_leave_mesh,
  12746. .flags = GENL_UNS_ADMIN_PERM,
  12747. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12748. NL80211_FLAG_NEED_RTNL,
  12749. },
  12750. {
  12751. .cmd = NL80211_CMD_JOIN_OCB,
  12752. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12753. .doit = nl80211_join_ocb,
  12754. .flags = GENL_UNS_ADMIN_PERM,
  12755. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12756. NL80211_FLAG_NEED_RTNL,
  12757. },
  12758. {
  12759. .cmd = NL80211_CMD_LEAVE_OCB,
  12760. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12761. .doit = nl80211_leave_ocb,
  12762. .flags = GENL_UNS_ADMIN_PERM,
  12763. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12764. NL80211_FLAG_NEED_RTNL,
  12765. },
  12766. #ifdef CONFIG_PM
  12767. {
  12768. .cmd = NL80211_CMD_GET_WOWLAN,
  12769. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12770. .doit = nl80211_get_wowlan,
  12771. /* can be retrieved by unprivileged users */
  12772. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  12773. NL80211_FLAG_NEED_RTNL,
  12774. },
  12775. {
  12776. .cmd = NL80211_CMD_SET_WOWLAN,
  12777. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12778. .doit = nl80211_set_wowlan,
  12779. .flags = GENL_UNS_ADMIN_PERM,
  12780. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  12781. NL80211_FLAG_NEED_RTNL,
  12782. },
  12783. #endif
  12784. {
  12785. .cmd = NL80211_CMD_SET_REKEY_OFFLOAD,
  12786. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12787. .doit = nl80211_set_rekey_data,
  12788. .flags = GENL_UNS_ADMIN_PERM,
  12789. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12790. NL80211_FLAG_NEED_RTNL |
  12791. NL80211_FLAG_CLEAR_SKB,
  12792. },
  12793. {
  12794. .cmd = NL80211_CMD_TDLS_MGMT,
  12795. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12796. .doit = nl80211_tdls_mgmt,
  12797. .flags = GENL_UNS_ADMIN_PERM,
  12798. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12799. NL80211_FLAG_NEED_RTNL,
  12800. },
  12801. {
  12802. .cmd = NL80211_CMD_TDLS_OPER,
  12803. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12804. .doit = nl80211_tdls_oper,
  12805. .flags = GENL_UNS_ADMIN_PERM,
  12806. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12807. NL80211_FLAG_NEED_RTNL,
  12808. },
  12809. {
  12810. .cmd = NL80211_CMD_UNEXPECTED_FRAME,
  12811. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12812. .doit = nl80211_register_unexpected_frame,
  12813. .flags = GENL_UNS_ADMIN_PERM,
  12814. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  12815. NL80211_FLAG_NEED_RTNL,
  12816. },
  12817. {
  12818. .cmd = NL80211_CMD_PROBE_CLIENT,
  12819. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12820. .doit = nl80211_probe_client,
  12821. .flags = GENL_UNS_ADMIN_PERM,
  12822. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12823. NL80211_FLAG_NEED_RTNL,
  12824. },
  12825. {
  12826. .cmd = NL80211_CMD_REGISTER_BEACONS,
  12827. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12828. .doit = nl80211_register_beacons,
  12829. .flags = GENL_UNS_ADMIN_PERM,
  12830. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  12831. NL80211_FLAG_NEED_RTNL,
  12832. },
  12833. {
  12834. .cmd = NL80211_CMD_SET_NOACK_MAP,
  12835. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12836. .doit = nl80211_set_noack_map,
  12837. .flags = GENL_UNS_ADMIN_PERM,
  12838. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  12839. NL80211_FLAG_NEED_RTNL,
  12840. },
  12841. {
  12842. .cmd = NL80211_CMD_START_P2P_DEVICE,
  12843. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12844. .doit = nl80211_start_p2p_device,
  12845. .flags = GENL_UNS_ADMIN_PERM,
  12846. .internal_flags = NL80211_FLAG_NEED_WDEV |
  12847. NL80211_FLAG_NEED_RTNL,
  12848. },
  12849. {
  12850. .cmd = NL80211_CMD_STOP_P2P_DEVICE,
  12851. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12852. .doit = nl80211_stop_p2p_device,
  12853. .flags = GENL_UNS_ADMIN_PERM,
  12854. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  12855. NL80211_FLAG_NEED_RTNL,
  12856. },
  12857. {
  12858. .cmd = NL80211_CMD_START_NAN,
  12859. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12860. .doit = nl80211_start_nan,
  12861. .flags = GENL_ADMIN_PERM,
  12862. .internal_flags = NL80211_FLAG_NEED_WDEV |
  12863. NL80211_FLAG_NEED_RTNL,
  12864. },
  12865. {
  12866. .cmd = NL80211_CMD_STOP_NAN,
  12867. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12868. .doit = nl80211_stop_nan,
  12869. .flags = GENL_ADMIN_PERM,
  12870. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  12871. NL80211_FLAG_NEED_RTNL,
  12872. },
  12873. {
  12874. .cmd = NL80211_CMD_ADD_NAN_FUNCTION,
  12875. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12876. .doit = nl80211_nan_add_func,
  12877. .flags = GENL_ADMIN_PERM,
  12878. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  12879. NL80211_FLAG_NEED_RTNL,
  12880. },
  12881. {
  12882. .cmd = NL80211_CMD_DEL_NAN_FUNCTION,
  12883. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12884. .doit = nl80211_nan_del_func,
  12885. .flags = GENL_ADMIN_PERM,
  12886. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  12887. NL80211_FLAG_NEED_RTNL,
  12888. },
  12889. {
  12890. .cmd = NL80211_CMD_CHANGE_NAN_CONFIG,
  12891. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12892. .doit = nl80211_nan_change_config,
  12893. .flags = GENL_ADMIN_PERM,
  12894. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  12895. NL80211_FLAG_NEED_RTNL,
  12896. },
  12897. {
  12898. .cmd = NL80211_CMD_SET_MCAST_RATE,
  12899. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12900. .doit = nl80211_set_mcast_rate,
  12901. .flags = GENL_UNS_ADMIN_PERM,
  12902. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  12903. NL80211_FLAG_NEED_RTNL,
  12904. },
  12905. {
  12906. .cmd = NL80211_CMD_SET_MAC_ACL,
  12907. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12908. .doit = nl80211_set_mac_acl,
  12909. .flags = GENL_UNS_ADMIN_PERM,
  12910. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  12911. NL80211_FLAG_NEED_RTNL,
  12912. },
  12913. {
  12914. .cmd = NL80211_CMD_RADAR_DETECT,
  12915. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12916. .doit = nl80211_start_radar_detection,
  12917. .flags = GENL_UNS_ADMIN_PERM,
  12918. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12919. NL80211_FLAG_NEED_RTNL,
  12920. },
  12921. {
  12922. .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
  12923. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12924. .doit = nl80211_get_protocol_features,
  12925. },
  12926. {
  12927. .cmd = NL80211_CMD_UPDATE_FT_IES,
  12928. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12929. .doit = nl80211_update_ft_ies,
  12930. .flags = GENL_UNS_ADMIN_PERM,
  12931. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12932. NL80211_FLAG_NEED_RTNL,
  12933. },
  12934. {
  12935. .cmd = NL80211_CMD_CRIT_PROTOCOL_START,
  12936. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12937. .doit = nl80211_crit_protocol_start,
  12938. .flags = GENL_UNS_ADMIN_PERM,
  12939. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  12940. NL80211_FLAG_NEED_RTNL,
  12941. },
  12942. {
  12943. .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP,
  12944. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12945. .doit = nl80211_crit_protocol_stop,
  12946. .flags = GENL_UNS_ADMIN_PERM,
  12947. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  12948. NL80211_FLAG_NEED_RTNL,
  12949. },
  12950. {
  12951. .cmd = NL80211_CMD_GET_COALESCE,
  12952. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12953. .doit = nl80211_get_coalesce,
  12954. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  12955. NL80211_FLAG_NEED_RTNL,
  12956. },
  12957. {
  12958. .cmd = NL80211_CMD_SET_COALESCE,
  12959. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12960. .doit = nl80211_set_coalesce,
  12961. .flags = GENL_UNS_ADMIN_PERM,
  12962. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  12963. NL80211_FLAG_NEED_RTNL,
  12964. },
  12965. {
  12966. .cmd = NL80211_CMD_CHANNEL_SWITCH,
  12967. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12968. .doit = nl80211_channel_switch,
  12969. .flags = GENL_UNS_ADMIN_PERM,
  12970. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12971. NL80211_FLAG_NEED_RTNL,
  12972. },
  12973. {
  12974. .cmd = NL80211_CMD_VENDOR,
  12975. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12976. .doit = nl80211_vendor_cmd,
  12977. .dumpit = nl80211_vendor_cmd_dump,
  12978. .flags = GENL_UNS_ADMIN_PERM,
  12979. .internal_flags = NL80211_FLAG_NEED_WIPHY |
  12980. NL80211_FLAG_NEED_RTNL |
  12981. NL80211_FLAG_CLEAR_SKB,
  12982. },
  12983. {
  12984. .cmd = NL80211_CMD_SET_QOS_MAP,
  12985. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12986. .doit = nl80211_set_qos_map,
  12987. .flags = GENL_UNS_ADMIN_PERM,
  12988. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12989. NL80211_FLAG_NEED_RTNL,
  12990. },
  12991. {
  12992. .cmd = NL80211_CMD_ADD_TX_TS,
  12993. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  12994. .doit = nl80211_add_tx_ts,
  12995. .flags = GENL_UNS_ADMIN_PERM,
  12996. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  12997. NL80211_FLAG_NEED_RTNL,
  12998. },
  12999. {
  13000. .cmd = NL80211_CMD_DEL_TX_TS,
  13001. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  13002. .doit = nl80211_del_tx_ts,
  13003. .flags = GENL_UNS_ADMIN_PERM,
  13004. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  13005. NL80211_FLAG_NEED_RTNL,
  13006. },
  13007. {
  13008. .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH,
  13009. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  13010. .doit = nl80211_tdls_channel_switch,
  13011. .flags = GENL_UNS_ADMIN_PERM,
  13012. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  13013. NL80211_FLAG_NEED_RTNL,
  13014. },
  13015. {
  13016. .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
  13017. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  13018. .doit = nl80211_tdls_cancel_channel_switch,
  13019. .flags = GENL_UNS_ADMIN_PERM,
  13020. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  13021. NL80211_FLAG_NEED_RTNL,
  13022. },
  13023. {
  13024. .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST,
  13025. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  13026. .doit = nl80211_set_multicast_to_unicast,
  13027. .flags = GENL_UNS_ADMIN_PERM,
  13028. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  13029. NL80211_FLAG_NEED_RTNL,
  13030. },
  13031. {
  13032. .cmd = NL80211_CMD_SET_PMK,
  13033. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  13034. .doit = nl80211_set_pmk,
  13035. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  13036. NL80211_FLAG_NEED_RTNL |
  13037. NL80211_FLAG_CLEAR_SKB,
  13038. },
  13039. {
  13040. .cmd = NL80211_CMD_DEL_PMK,
  13041. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  13042. .doit = nl80211_del_pmk,
  13043. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  13044. NL80211_FLAG_NEED_RTNL,
  13045. },
  13046. {
  13047. .cmd = NL80211_CMD_EXTERNAL_AUTH,
  13048. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  13049. .doit = nl80211_external_auth,
  13050. .flags = GENL_ADMIN_PERM,
  13051. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  13052. NL80211_FLAG_NEED_RTNL,
  13053. },
  13054. {
  13055. .cmd = NL80211_CMD_CONTROL_PORT_FRAME,
  13056. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  13057. .doit = nl80211_tx_control_port,
  13058. .flags = GENL_UNS_ADMIN_PERM,
  13059. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  13060. NL80211_FLAG_NEED_RTNL,
  13061. },
  13062. {
  13063. .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS,
  13064. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  13065. .doit = nl80211_get_ftm_responder_stats,
  13066. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  13067. NL80211_FLAG_NEED_RTNL,
  13068. },
  13069. {
  13070. .cmd = NL80211_CMD_PEER_MEASUREMENT_START,
  13071. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  13072. .doit = nl80211_pmsr_start,
  13073. .flags = GENL_UNS_ADMIN_PERM,
  13074. .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
  13075. NL80211_FLAG_NEED_RTNL,
  13076. },
  13077. {
  13078. .cmd = NL80211_CMD_NOTIFY_RADAR,
  13079. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  13080. .doit = nl80211_notify_radar_detection,
  13081. .flags = GENL_UNS_ADMIN_PERM,
  13082. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  13083. NL80211_FLAG_NEED_RTNL,
  13084. },
  13085. {
  13086. .cmd = NL80211_CMD_UPDATE_OWE_INFO,
  13087. .doit = nl80211_update_owe_info,
  13088. .flags = GENL_ADMIN_PERM,
  13089. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  13090. NL80211_FLAG_NEED_RTNL,
  13091. },
  13092. {
  13093. .cmd = NL80211_CMD_PROBE_MESH_LINK,
  13094. .doit = nl80211_probe_mesh_link,
  13095. .flags = GENL_UNS_ADMIN_PERM,
  13096. .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
  13097. NL80211_FLAG_NEED_RTNL,
  13098. },
  13099. {
  13100. .cmd = NL80211_CMD_SET_TID_CONFIG,
  13101. .doit = nl80211_set_tid_config,
  13102. .flags = GENL_UNS_ADMIN_PERM,
  13103. .internal_flags = NL80211_FLAG_NEED_NETDEV |
  13104. NL80211_FLAG_NEED_RTNL,
  13105. },
  13106. };
  13107. static struct genl_family nl80211_fam __ro_after_init = {
  13108. .name = NL80211_GENL_NAME, /* have users key off the name instead */
  13109. .hdrsize = 0, /* no private header */
  13110. .version = 1, /* no particular meaning now */
  13111. .maxattr = NL80211_ATTR_MAX,
  13112. .policy = nl80211_policy,
  13113. .netnsok = true,
  13114. .pre_doit = nl80211_pre_doit,
  13115. .post_doit = nl80211_post_doit,
  13116. .module = THIS_MODULE,
  13117. .ops = nl80211_ops,
  13118. .n_ops = ARRAY_SIZE(nl80211_ops),
  13119. .small_ops = nl80211_small_ops,
  13120. .n_small_ops = ARRAY_SIZE(nl80211_small_ops),
  13121. .mcgrps = nl80211_mcgrps,
  13122. .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps),
  13123. .parallel_ops = true,
  13124. };
  13125. /* notification functions */
  13126. void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev,
  13127. enum nl80211_commands cmd)
  13128. {
  13129. struct sk_buff *msg;
  13130. struct nl80211_dump_wiphy_state state = {};
  13131. WARN_ON(cmd != NL80211_CMD_NEW_WIPHY &&
  13132. cmd != NL80211_CMD_DEL_WIPHY);
  13133. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  13134. if (!msg)
  13135. return;
  13136. if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) {
  13137. nlmsg_free(msg);
  13138. return;
  13139. }
  13140. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13141. NL80211_MCGRP_CONFIG, GFP_KERNEL);
  13142. }
  13143. void nl80211_notify_iface(struct cfg80211_registered_device *rdev,
  13144. struct wireless_dev *wdev,
  13145. enum nl80211_commands cmd)
  13146. {
  13147. struct sk_buff *msg;
  13148. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  13149. if (!msg)
  13150. return;
  13151. if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, cmd) < 0) {
  13152. nlmsg_free(msg);
  13153. return;
  13154. }
  13155. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13156. NL80211_MCGRP_CONFIG, GFP_KERNEL);
  13157. }
  13158. static int nl80211_add_scan_req(struct sk_buff *msg,
  13159. struct cfg80211_registered_device *rdev)
  13160. {
  13161. struct cfg80211_scan_request *req = rdev->scan_req;
  13162. struct nlattr *nest;
  13163. int i;
  13164. struct cfg80211_scan_info *info;
  13165. if (WARN_ON(!req))
  13166. return 0;
  13167. nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS);
  13168. if (!nest)
  13169. goto nla_put_failure;
  13170. for (i = 0; i < req->n_ssids; i++) {
  13171. if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid))
  13172. goto nla_put_failure;
  13173. }
  13174. nla_nest_end(msg, nest);
  13175. if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) {
  13176. nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQ_KHZ);
  13177. if (!nest)
  13178. goto nla_put_failure;
  13179. for (i = 0; i < req->n_channels; i++) {
  13180. if (nla_put_u32(msg, i,
  13181. ieee80211_channel_to_khz(req->channels[i])))
  13182. goto nla_put_failure;
  13183. }
  13184. nla_nest_end(msg, nest);
  13185. } else {
  13186. nest = nla_nest_start_noflag(msg,
  13187. NL80211_ATTR_SCAN_FREQUENCIES);
  13188. if (!nest)
  13189. goto nla_put_failure;
  13190. for (i = 0; i < req->n_channels; i++) {
  13191. if (nla_put_u32(msg, i, req->channels[i]->center_freq))
  13192. goto nla_put_failure;
  13193. }
  13194. nla_nest_end(msg, nest);
  13195. }
  13196. if (req->ie &&
  13197. nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie))
  13198. goto nla_put_failure;
  13199. if (req->flags &&
  13200. nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags))
  13201. goto nla_put_failure;
  13202. info = rdev->int_scan_req ? &rdev->int_scan_req->info :
  13203. &rdev->scan_req->info;
  13204. if (info->scan_start_tsf &&
  13205. (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF,
  13206. info->scan_start_tsf, NL80211_BSS_PAD) ||
  13207. nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN,
  13208. info->tsf_bssid)))
  13209. goto nla_put_failure;
  13210. return 0;
  13211. nla_put_failure:
  13212. return -ENOBUFS;
  13213. }
  13214. static int nl80211_prep_scan_msg(struct sk_buff *msg,
  13215. struct cfg80211_registered_device *rdev,
  13216. struct wireless_dev *wdev,
  13217. u32 portid, u32 seq, int flags,
  13218. u32 cmd)
  13219. {
  13220. void *hdr;
  13221. hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
  13222. if (!hdr)
  13223. return -1;
  13224. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  13225. (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
  13226. wdev->netdev->ifindex)) ||
  13227. nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
  13228. NL80211_ATTR_PAD))
  13229. goto nla_put_failure;
  13230. /* ignore errors and send incomplete event anyway */
  13231. nl80211_add_scan_req(msg, rdev);
  13232. genlmsg_end(msg, hdr);
  13233. return 0;
  13234. nla_put_failure:
  13235. genlmsg_cancel(msg, hdr);
  13236. return -EMSGSIZE;
  13237. }
  13238. static int
  13239. nl80211_prep_sched_scan_msg(struct sk_buff *msg,
  13240. struct cfg80211_sched_scan_request *req, u32 cmd)
  13241. {
  13242. void *hdr;
  13243. hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
  13244. if (!hdr)
  13245. return -1;
  13246. if (nla_put_u32(msg, NL80211_ATTR_WIPHY,
  13247. wiphy_to_rdev(req->wiphy)->wiphy_idx) ||
  13248. nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) ||
  13249. nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid,
  13250. NL80211_ATTR_PAD))
  13251. goto nla_put_failure;
  13252. genlmsg_end(msg, hdr);
  13253. return 0;
  13254. nla_put_failure:
  13255. genlmsg_cancel(msg, hdr);
  13256. return -EMSGSIZE;
  13257. }
  13258. void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
  13259. struct wireless_dev *wdev)
  13260. {
  13261. struct sk_buff *msg;
  13262. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  13263. if (!msg)
  13264. return;
  13265. if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
  13266. NL80211_CMD_TRIGGER_SCAN) < 0) {
  13267. nlmsg_free(msg);
  13268. return;
  13269. }
  13270. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13271. NL80211_MCGRP_SCAN, GFP_KERNEL);
  13272. }
  13273. struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
  13274. struct wireless_dev *wdev, bool aborted)
  13275. {
  13276. struct sk_buff *msg;
  13277. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  13278. if (!msg)
  13279. return NULL;
  13280. if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0,
  13281. aborted ? NL80211_CMD_SCAN_ABORTED :
  13282. NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
  13283. nlmsg_free(msg);
  13284. return NULL;
  13285. }
  13286. return msg;
  13287. }
  13288. /* send message created by nl80211_build_scan_msg() */
  13289. void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev,
  13290. struct sk_buff *msg)
  13291. {
  13292. if (!msg)
  13293. return;
  13294. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13295. NL80211_MCGRP_SCAN, GFP_KERNEL);
  13296. }
  13297. void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd)
  13298. {
  13299. struct sk_buff *msg;
  13300. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  13301. if (!msg)
  13302. return;
  13303. if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) {
  13304. nlmsg_free(msg);
  13305. return;
  13306. }
  13307. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0,
  13308. NL80211_MCGRP_SCAN, GFP_KERNEL);
  13309. }
  13310. static bool nl80211_reg_change_event_fill(struct sk_buff *msg,
  13311. struct regulatory_request *request)
  13312. {
  13313. /* Userspace can always count this one always being set */
  13314. if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator))
  13315. goto nla_put_failure;
  13316. if (request->alpha2[0] == '0' && request->alpha2[1] == '0') {
  13317. if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
  13318. NL80211_REGDOM_TYPE_WORLD))
  13319. goto nla_put_failure;
  13320. } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') {
  13321. if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
  13322. NL80211_REGDOM_TYPE_CUSTOM_WORLD))
  13323. goto nla_put_failure;
  13324. } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') ||
  13325. request->intersect) {
  13326. if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
  13327. NL80211_REGDOM_TYPE_INTERSECTION))
  13328. goto nla_put_failure;
  13329. } else {
  13330. if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE,
  13331. NL80211_REGDOM_TYPE_COUNTRY) ||
  13332. nla_put_string(msg, NL80211_ATTR_REG_ALPHA2,
  13333. request->alpha2))
  13334. goto nla_put_failure;
  13335. }
  13336. if (request->wiphy_idx != WIPHY_IDX_INVALID) {
  13337. struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx);
  13338. if (wiphy &&
  13339. nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx))
  13340. goto nla_put_failure;
  13341. if (wiphy &&
  13342. wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
  13343. nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
  13344. goto nla_put_failure;
  13345. }
  13346. return true;
  13347. nla_put_failure:
  13348. return false;
  13349. }
  13350. /*
  13351. * This can happen on global regulatory changes or device specific settings
  13352. * based on custom regulatory domains.
  13353. */
  13354. void nl80211_common_reg_change_event(enum nl80211_commands cmd_id,
  13355. struct regulatory_request *request)
  13356. {
  13357. struct sk_buff *msg;
  13358. void *hdr;
  13359. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  13360. if (!msg)
  13361. return;
  13362. hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id);
  13363. if (!hdr)
  13364. goto nla_put_failure;
  13365. if (!nl80211_reg_change_event_fill(msg, request))
  13366. goto nla_put_failure;
  13367. genlmsg_end(msg, hdr);
  13368. rcu_read_lock();
  13369. genlmsg_multicast_allns(&nl80211_fam, msg, 0,
  13370. NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
  13371. rcu_read_unlock();
  13372. return;
  13373. nla_put_failure:
  13374. nlmsg_free(msg);
  13375. }
  13376. static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
  13377. struct net_device *netdev,
  13378. const u8 *buf, size_t len,
  13379. enum nl80211_commands cmd, gfp_t gfp,
  13380. int uapsd_queues, const u8 *req_ies,
  13381. size_t req_ies_len)
  13382. {
  13383. struct sk_buff *msg;
  13384. void *hdr;
  13385. msg = nlmsg_new(100 + len + req_ies_len, gfp);
  13386. if (!msg)
  13387. return;
  13388. hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
  13389. if (!hdr) {
  13390. nlmsg_free(msg);
  13391. return;
  13392. }
  13393. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  13394. nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
  13395. nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
  13396. (req_ies &&
  13397. nla_put(msg, NL80211_ATTR_REQ_IE, req_ies_len, req_ies)))
  13398. goto nla_put_failure;
  13399. if (uapsd_queues >= 0) {
  13400. struct nlattr *nla_wmm =
  13401. nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME);
  13402. if (!nla_wmm)
  13403. goto nla_put_failure;
  13404. if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES,
  13405. uapsd_queues))
  13406. goto nla_put_failure;
  13407. nla_nest_end(msg, nla_wmm);
  13408. }
  13409. genlmsg_end(msg, hdr);
  13410. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13411. NL80211_MCGRP_MLME, gfp);
  13412. return;
  13413. nla_put_failure:
  13414. nlmsg_free(msg);
  13415. }
  13416. void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
  13417. struct net_device *netdev, const u8 *buf,
  13418. size_t len, gfp_t gfp)
  13419. {
  13420. nl80211_send_mlme_event(rdev, netdev, buf, len,
  13421. NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0);
  13422. }
  13423. void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
  13424. struct net_device *netdev, const u8 *buf,
  13425. size_t len, gfp_t gfp, int uapsd_queues,
  13426. const u8 *req_ies, size_t req_ies_len)
  13427. {
  13428. nl80211_send_mlme_event(rdev, netdev, buf, len,
  13429. NL80211_CMD_ASSOCIATE, gfp, uapsd_queues,
  13430. req_ies, req_ies_len);
  13431. }
  13432. void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
  13433. struct net_device *netdev, const u8 *buf,
  13434. size_t len, gfp_t gfp)
  13435. {
  13436. nl80211_send_mlme_event(rdev, netdev, buf, len,
  13437. NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0);
  13438. }
  13439. void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
  13440. struct net_device *netdev, const u8 *buf,
  13441. size_t len, gfp_t gfp)
  13442. {
  13443. nl80211_send_mlme_event(rdev, netdev, buf, len,
  13444. NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0);
  13445. }
  13446. void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
  13447. size_t len)
  13448. {
  13449. struct wireless_dev *wdev = dev->ieee80211_ptr;
  13450. struct wiphy *wiphy = wdev->wiphy;
  13451. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  13452. const struct ieee80211_mgmt *mgmt = (void *)buf;
  13453. u32 cmd;
  13454. if (WARN_ON(len < 2))
  13455. return;
  13456. if (ieee80211_is_deauth(mgmt->frame_control)) {
  13457. cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE;
  13458. } else if (ieee80211_is_disassoc(mgmt->frame_control)) {
  13459. cmd = NL80211_CMD_UNPROT_DISASSOCIATE;
  13460. } else if (ieee80211_is_beacon(mgmt->frame_control)) {
  13461. if (wdev->unprot_beacon_reported &&
  13462. elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000)
  13463. return;
  13464. cmd = NL80211_CMD_UNPROT_BEACON;
  13465. wdev->unprot_beacon_reported = jiffies;
  13466. } else {
  13467. return;
  13468. }
  13469. trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
  13470. nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1,
  13471. NULL, 0);
  13472. }
  13473. EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
  13474. static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
  13475. struct net_device *netdev, int cmd,
  13476. const u8 *addr, gfp_t gfp)
  13477. {
  13478. struct sk_buff *msg;
  13479. void *hdr;
  13480. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  13481. if (!msg)
  13482. return;
  13483. hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
  13484. if (!hdr) {
  13485. nlmsg_free(msg);
  13486. return;
  13487. }
  13488. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  13489. nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
  13490. nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
  13491. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
  13492. goto nla_put_failure;
  13493. genlmsg_end(msg, hdr);
  13494. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13495. NL80211_MCGRP_MLME, gfp);
  13496. return;
  13497. nla_put_failure:
  13498. nlmsg_free(msg);
  13499. }
  13500. void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
  13501. struct net_device *netdev, const u8 *addr,
  13502. gfp_t gfp)
  13503. {
  13504. nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE,
  13505. addr, gfp);
  13506. }
  13507. void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
  13508. struct net_device *netdev, const u8 *addr,
  13509. gfp_t gfp)
  13510. {
  13511. nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE,
  13512. addr, gfp);
  13513. }
  13514. void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
  13515. struct net_device *netdev,
  13516. struct cfg80211_connect_resp_params *cr,
  13517. gfp_t gfp)
  13518. {
  13519. struct sk_buff *msg;
  13520. void *hdr;
  13521. msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len +
  13522. cr->fils.kek_len + cr->fils.pmk_len +
  13523. (cr->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp);
  13524. if (!msg)
  13525. return;
  13526. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT);
  13527. if (!hdr) {
  13528. nlmsg_free(msg);
  13529. return;
  13530. }
  13531. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  13532. nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
  13533. (cr->bssid &&
  13534. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) ||
  13535. nla_put_u16(msg, NL80211_ATTR_STATUS_CODE,
  13536. cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE :
  13537. cr->status) ||
  13538. (cr->status < 0 &&
  13539. (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
  13540. nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON,
  13541. cr->timeout_reason))) ||
  13542. (cr->req_ie &&
  13543. nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) ||
  13544. (cr->resp_ie &&
  13545. nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len,
  13546. cr->resp_ie)) ||
  13547. (cr->fils.update_erp_next_seq_num &&
  13548. nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM,
  13549. cr->fils.erp_next_seq_num)) ||
  13550. (cr->status == WLAN_STATUS_SUCCESS &&
  13551. ((cr->fils.kek &&
  13552. nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len,
  13553. cr->fils.kek)) ||
  13554. (cr->fils.pmk &&
  13555. nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) ||
  13556. (cr->fils.pmkid &&
  13557. nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid)))))
  13558. goto nla_put_failure;
  13559. genlmsg_end(msg, hdr);
  13560. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13561. NL80211_MCGRP_MLME, gfp);
  13562. return;
  13563. nla_put_failure:
  13564. nlmsg_free(msg);
  13565. }
  13566. void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
  13567. struct net_device *netdev,
  13568. struct cfg80211_roam_info *info, gfp_t gfp)
  13569. {
  13570. struct sk_buff *msg;
  13571. void *hdr;
  13572. const u8 *bssid = info->bss ? info->bss->bssid : info->bssid;
  13573. msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len +
  13574. info->fils.kek_len + info->fils.pmk_len +
  13575. (info->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp);
  13576. if (!msg)
  13577. return;
  13578. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM);
  13579. if (!hdr) {
  13580. nlmsg_free(msg);
  13581. return;
  13582. }
  13583. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  13584. nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
  13585. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) ||
  13586. (info->req_ie &&
  13587. nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len,
  13588. info->req_ie)) ||
  13589. (info->resp_ie &&
  13590. nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len,
  13591. info->resp_ie)) ||
  13592. (info->fils.update_erp_next_seq_num &&
  13593. nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM,
  13594. info->fils.erp_next_seq_num)) ||
  13595. (info->fils.kek &&
  13596. nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len,
  13597. info->fils.kek)) ||
  13598. (info->fils.pmk &&
  13599. nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) ||
  13600. (info->fils.pmkid &&
  13601. nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid)))
  13602. goto nla_put_failure;
  13603. genlmsg_end(msg, hdr);
  13604. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13605. NL80211_MCGRP_MLME, gfp);
  13606. return;
  13607. nla_put_failure:
  13608. nlmsg_free(msg);
  13609. }
  13610. void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
  13611. struct net_device *netdev, const u8 *bssid)
  13612. {
  13613. struct sk_buff *msg;
  13614. void *hdr;
  13615. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  13616. if (!msg)
  13617. return;
  13618. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED);
  13619. if (!hdr) {
  13620. nlmsg_free(msg);
  13621. return;
  13622. }
  13623. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  13624. nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
  13625. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
  13626. goto nla_put_failure;
  13627. genlmsg_end(msg, hdr);
  13628. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13629. NL80211_MCGRP_MLME, GFP_KERNEL);
  13630. return;
  13631. nla_put_failure:
  13632. nlmsg_free(msg);
  13633. }
  13634. void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
  13635. struct net_device *netdev, u16 reason,
  13636. const u8 *ie, size_t ie_len, bool from_ap)
  13637. {
  13638. struct sk_buff *msg;
  13639. void *hdr;
  13640. msg = nlmsg_new(100 + ie_len, GFP_KERNEL);
  13641. if (!msg)
  13642. return;
  13643. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT);
  13644. if (!hdr) {
  13645. nlmsg_free(msg);
  13646. return;
  13647. }
  13648. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  13649. nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
  13650. (reason &&
  13651. nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) ||
  13652. (from_ap &&
  13653. nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) ||
  13654. (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie)))
  13655. goto nla_put_failure;
  13656. genlmsg_end(msg, hdr);
  13657. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13658. NL80211_MCGRP_MLME, GFP_KERNEL);
  13659. return;
  13660. nla_put_failure:
  13661. nlmsg_free(msg);
  13662. }
  13663. void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
  13664. struct net_device *netdev, const u8 *bssid,
  13665. gfp_t gfp)
  13666. {
  13667. struct sk_buff *msg;
  13668. void *hdr;
  13669. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  13670. if (!msg)
  13671. return;
  13672. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS);
  13673. if (!hdr) {
  13674. nlmsg_free(msg);
  13675. return;
  13676. }
  13677. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  13678. nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
  13679. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
  13680. goto nla_put_failure;
  13681. genlmsg_end(msg, hdr);
  13682. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13683. NL80211_MCGRP_MLME, gfp);
  13684. return;
  13685. nla_put_failure:
  13686. nlmsg_free(msg);
  13687. }
  13688. void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
  13689. const u8 *ie, u8 ie_len,
  13690. int sig_dbm, gfp_t gfp)
  13691. {
  13692. struct wireless_dev *wdev = dev->ieee80211_ptr;
  13693. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  13694. struct sk_buff *msg;
  13695. void *hdr;
  13696. if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
  13697. return;
  13698. trace_cfg80211_notify_new_peer_candidate(dev, addr);
  13699. msg = nlmsg_new(100 + ie_len, gfp);
  13700. if (!msg)
  13701. return;
  13702. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE);
  13703. if (!hdr) {
  13704. nlmsg_free(msg);
  13705. return;
  13706. }
  13707. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  13708. nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
  13709. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
  13710. (ie_len && ie &&
  13711. nla_put(msg, NL80211_ATTR_IE, ie_len, ie)) ||
  13712. (sig_dbm &&
  13713. nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)))
  13714. goto nla_put_failure;
  13715. genlmsg_end(msg, hdr);
  13716. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13717. NL80211_MCGRP_MLME, gfp);
  13718. return;
  13719. nla_put_failure:
  13720. nlmsg_free(msg);
  13721. }
  13722. EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
  13723. void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
  13724. struct net_device *netdev, const u8 *addr,
  13725. enum nl80211_key_type key_type, int key_id,
  13726. const u8 *tsc, gfp_t gfp)
  13727. {
  13728. struct sk_buff *msg;
  13729. void *hdr;
  13730. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  13731. if (!msg)
  13732. return;
  13733. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE);
  13734. if (!hdr) {
  13735. nlmsg_free(msg);
  13736. return;
  13737. }
  13738. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  13739. nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
  13740. (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) ||
  13741. nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) ||
  13742. (key_id != -1 &&
  13743. nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) ||
  13744. (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc)))
  13745. goto nla_put_failure;
  13746. genlmsg_end(msg, hdr);
  13747. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13748. NL80211_MCGRP_MLME, gfp);
  13749. return;
  13750. nla_put_failure:
  13751. nlmsg_free(msg);
  13752. }
  13753. void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
  13754. struct ieee80211_channel *channel_before,
  13755. struct ieee80211_channel *channel_after)
  13756. {
  13757. struct sk_buff *msg;
  13758. void *hdr;
  13759. struct nlattr *nl_freq;
  13760. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
  13761. if (!msg)
  13762. return;
  13763. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT);
  13764. if (!hdr) {
  13765. nlmsg_free(msg);
  13766. return;
  13767. }
  13768. /*
  13769. * Since we are applying the beacon hint to a wiphy we know its
  13770. * wiphy_idx is valid
  13771. */
  13772. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy)))
  13773. goto nla_put_failure;
  13774. /* Before */
  13775. nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_BEFORE);
  13776. if (!nl_freq)
  13777. goto nla_put_failure;
  13778. if (nl80211_msg_put_channel(msg, wiphy, channel_before, false))
  13779. goto nla_put_failure;
  13780. nla_nest_end(msg, nl_freq);
  13781. /* After */
  13782. nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_AFTER);
  13783. if (!nl_freq)
  13784. goto nla_put_failure;
  13785. if (nl80211_msg_put_channel(msg, wiphy, channel_after, false))
  13786. goto nla_put_failure;
  13787. nla_nest_end(msg, nl_freq);
  13788. genlmsg_end(msg, hdr);
  13789. rcu_read_lock();
  13790. genlmsg_multicast_allns(&nl80211_fam, msg, 0,
  13791. NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
  13792. rcu_read_unlock();
  13793. return;
  13794. nla_put_failure:
  13795. nlmsg_free(msg);
  13796. }
  13797. static void nl80211_send_remain_on_chan_event(
  13798. int cmd, struct cfg80211_registered_device *rdev,
  13799. struct wireless_dev *wdev, u64 cookie,
  13800. struct ieee80211_channel *chan,
  13801. unsigned int duration, gfp_t gfp)
  13802. {
  13803. struct sk_buff *msg;
  13804. void *hdr;
  13805. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  13806. if (!msg)
  13807. return;
  13808. hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
  13809. if (!hdr) {
  13810. nlmsg_free(msg);
  13811. return;
  13812. }
  13813. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  13814. (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
  13815. wdev->netdev->ifindex)) ||
  13816. nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
  13817. NL80211_ATTR_PAD) ||
  13818. nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) ||
  13819. nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
  13820. NL80211_CHAN_NO_HT) ||
  13821. nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
  13822. NL80211_ATTR_PAD))
  13823. goto nla_put_failure;
  13824. if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL &&
  13825. nla_put_u32(msg, NL80211_ATTR_DURATION, duration))
  13826. goto nla_put_failure;
  13827. genlmsg_end(msg, hdr);
  13828. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13829. NL80211_MCGRP_MLME, gfp);
  13830. return;
  13831. nla_put_failure:
  13832. nlmsg_free(msg);
  13833. }
  13834. void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
  13835. struct ieee80211_channel *chan,
  13836. unsigned int duration, gfp_t gfp)
  13837. {
  13838. struct wiphy *wiphy = wdev->wiphy;
  13839. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  13840. trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration);
  13841. nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
  13842. rdev, wdev, cookie, chan,
  13843. duration, gfp);
  13844. }
  13845. EXPORT_SYMBOL(cfg80211_ready_on_channel);
  13846. void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
  13847. struct ieee80211_channel *chan,
  13848. gfp_t gfp)
  13849. {
  13850. struct wiphy *wiphy = wdev->wiphy;
  13851. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  13852. trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan);
  13853. nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
  13854. rdev, wdev, cookie, chan, 0, gfp);
  13855. }
  13856. EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
  13857. void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie,
  13858. struct ieee80211_channel *chan,
  13859. gfp_t gfp)
  13860. {
  13861. struct wiphy *wiphy = wdev->wiphy;
  13862. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  13863. trace_cfg80211_tx_mgmt_expired(wdev, cookie, chan);
  13864. nl80211_send_remain_on_chan_event(NL80211_CMD_FRAME_WAIT_CANCEL,
  13865. rdev, wdev, cookie, chan, 0, gfp);
  13866. }
  13867. EXPORT_SYMBOL(cfg80211_tx_mgmt_expired);
  13868. void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
  13869. struct station_info *sinfo, gfp_t gfp)
  13870. {
  13871. struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
  13872. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  13873. struct sk_buff *msg;
  13874. trace_cfg80211_new_sta(dev, mac_addr, sinfo);
  13875. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  13876. if (!msg)
  13877. return;
  13878. if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0,
  13879. rdev, dev, mac_addr, sinfo) < 0) {
  13880. nlmsg_free(msg);
  13881. return;
  13882. }
  13883. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13884. NL80211_MCGRP_MLME, gfp);
  13885. }
  13886. EXPORT_SYMBOL(cfg80211_new_sta);
  13887. void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
  13888. struct station_info *sinfo, gfp_t gfp)
  13889. {
  13890. struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
  13891. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  13892. struct sk_buff *msg;
  13893. struct station_info empty_sinfo = {};
  13894. if (!sinfo)
  13895. sinfo = &empty_sinfo;
  13896. trace_cfg80211_del_sta(dev, mac_addr);
  13897. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  13898. if (!msg) {
  13899. cfg80211_sinfo_release_content(sinfo);
  13900. return;
  13901. }
  13902. if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0,
  13903. rdev, dev, mac_addr, sinfo) < 0) {
  13904. nlmsg_free(msg);
  13905. return;
  13906. }
  13907. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13908. NL80211_MCGRP_MLME, gfp);
  13909. }
  13910. EXPORT_SYMBOL(cfg80211_del_sta_sinfo);
  13911. void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
  13912. enum nl80211_connect_failed_reason reason,
  13913. gfp_t gfp)
  13914. {
  13915. struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
  13916. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  13917. struct sk_buff *msg;
  13918. void *hdr;
  13919. msg = nlmsg_new(NLMSG_GOODSIZE, gfp);
  13920. if (!msg)
  13921. return;
  13922. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED);
  13923. if (!hdr) {
  13924. nlmsg_free(msg);
  13925. return;
  13926. }
  13927. if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
  13928. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
  13929. nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason))
  13930. goto nla_put_failure;
  13931. genlmsg_end(msg, hdr);
  13932. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  13933. NL80211_MCGRP_MLME, gfp);
  13934. return;
  13935. nla_put_failure:
  13936. nlmsg_free(msg);
  13937. }
  13938. EXPORT_SYMBOL(cfg80211_conn_failed);
  13939. static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
  13940. const u8 *addr, gfp_t gfp)
  13941. {
  13942. struct wireless_dev *wdev = dev->ieee80211_ptr;
  13943. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  13944. struct sk_buff *msg;
  13945. void *hdr;
  13946. u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid);
  13947. if (!nlportid)
  13948. return false;
  13949. msg = nlmsg_new(100, gfp);
  13950. if (!msg)
  13951. return true;
  13952. hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
  13953. if (!hdr) {
  13954. nlmsg_free(msg);
  13955. return true;
  13956. }
  13957. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  13958. nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
  13959. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
  13960. goto nla_put_failure;
  13961. genlmsg_end(msg, hdr);
  13962. genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
  13963. return true;
  13964. nla_put_failure:
  13965. nlmsg_free(msg);
  13966. return true;
  13967. }
  13968. bool cfg80211_rx_spurious_frame(struct net_device *dev,
  13969. const u8 *addr, gfp_t gfp)
  13970. {
  13971. struct wireless_dev *wdev = dev->ieee80211_ptr;
  13972. bool ret;
  13973. trace_cfg80211_rx_spurious_frame(dev, addr);
  13974. if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
  13975. wdev->iftype != NL80211_IFTYPE_P2P_GO)) {
  13976. trace_cfg80211_return_bool(false);
  13977. return false;
  13978. }
  13979. ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME,
  13980. addr, gfp);
  13981. trace_cfg80211_return_bool(ret);
  13982. return ret;
  13983. }
  13984. EXPORT_SYMBOL(cfg80211_rx_spurious_frame);
  13985. bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
  13986. const u8 *addr, gfp_t gfp)
  13987. {
  13988. struct wireless_dev *wdev = dev->ieee80211_ptr;
  13989. bool ret;
  13990. trace_cfg80211_rx_unexpected_4addr_frame(dev, addr);
  13991. if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
  13992. wdev->iftype != NL80211_IFTYPE_P2P_GO &&
  13993. wdev->iftype != NL80211_IFTYPE_AP_VLAN)) {
  13994. trace_cfg80211_return_bool(false);
  13995. return false;
  13996. }
  13997. ret = __nl80211_unexpected_frame(dev,
  13998. NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
  13999. addr, gfp);
  14000. trace_cfg80211_return_bool(ret);
  14001. return ret;
  14002. }
  14003. EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
  14004. int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
  14005. struct wireless_dev *wdev, u32 nlportid,
  14006. int freq, int sig_dbm,
  14007. const u8 *buf, size_t len, u32 flags, gfp_t gfp)
  14008. {
  14009. struct net_device *netdev = wdev->netdev;
  14010. struct sk_buff *msg;
  14011. void *hdr;
  14012. msg = nlmsg_new(100 + len, gfp);
  14013. if (!msg)
  14014. return -ENOMEM;
  14015. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
  14016. if (!hdr) {
  14017. nlmsg_free(msg);
  14018. return -ENOMEM;
  14019. }
  14020. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14021. (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
  14022. netdev->ifindex)) ||
  14023. nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
  14024. NL80211_ATTR_PAD) ||
  14025. nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(freq)) ||
  14026. nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, freq % 1000) ||
  14027. (sig_dbm &&
  14028. nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
  14029. nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
  14030. (flags &&
  14031. nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags)))
  14032. goto nla_put_failure;
  14033. genlmsg_end(msg, hdr);
  14034. return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
  14035. nla_put_failure:
  14036. nlmsg_free(msg);
  14037. return -ENOBUFS;
  14038. }
  14039. static void nl80211_frame_tx_status(struct wireless_dev *wdev, u64 cookie,
  14040. const u8 *buf, size_t len, bool ack,
  14041. gfp_t gfp, enum nl80211_commands command)
  14042. {
  14043. struct wiphy *wiphy = wdev->wiphy;
  14044. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  14045. struct net_device *netdev = wdev->netdev;
  14046. struct sk_buff *msg;
  14047. void *hdr;
  14048. if (command == NL80211_CMD_FRAME_TX_STATUS)
  14049. trace_cfg80211_mgmt_tx_status(wdev, cookie, ack);
  14050. else
  14051. trace_cfg80211_control_port_tx_status(wdev, cookie, ack);
  14052. msg = nlmsg_new(100 + len, gfp);
  14053. if (!msg)
  14054. return;
  14055. hdr = nl80211hdr_put(msg, 0, 0, 0, command);
  14056. if (!hdr) {
  14057. nlmsg_free(msg);
  14058. return;
  14059. }
  14060. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14061. (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
  14062. netdev->ifindex)) ||
  14063. nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
  14064. NL80211_ATTR_PAD) ||
  14065. nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
  14066. nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
  14067. NL80211_ATTR_PAD) ||
  14068. (ack && nla_put_flag(msg, NL80211_ATTR_ACK)))
  14069. goto nla_put_failure;
  14070. genlmsg_end(msg, hdr);
  14071. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  14072. NL80211_MCGRP_MLME, gfp);
  14073. return;
  14074. nla_put_failure:
  14075. nlmsg_free(msg);
  14076. }
  14077. void cfg80211_control_port_tx_status(struct wireless_dev *wdev, u64 cookie,
  14078. const u8 *buf, size_t len, bool ack,
  14079. gfp_t gfp)
  14080. {
  14081. nl80211_frame_tx_status(wdev, cookie, buf, len, ack, gfp,
  14082. NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS);
  14083. }
  14084. EXPORT_SYMBOL(cfg80211_control_port_tx_status);
  14085. void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
  14086. const u8 *buf, size_t len, bool ack, gfp_t gfp)
  14087. {
  14088. nl80211_frame_tx_status(wdev, cookie, buf, len, ack, gfp,
  14089. NL80211_CMD_FRAME_TX_STATUS);
  14090. }
  14091. EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
  14092. static int __nl80211_rx_control_port(struct net_device *dev,
  14093. struct sk_buff *skb,
  14094. bool unencrypted, gfp_t gfp)
  14095. {
  14096. struct wireless_dev *wdev = dev->ieee80211_ptr;
  14097. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  14098. struct ethhdr *ehdr = eth_hdr(skb);
  14099. const u8 *addr = ehdr->h_source;
  14100. u16 proto = be16_to_cpu(skb->protocol);
  14101. struct sk_buff *msg;
  14102. void *hdr;
  14103. struct nlattr *frame;
  14104. u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid);
  14105. if (!nlportid)
  14106. return -ENOENT;
  14107. msg = nlmsg_new(100 + skb->len, gfp);
  14108. if (!msg)
  14109. return -ENOMEM;
  14110. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONTROL_PORT_FRAME);
  14111. if (!hdr) {
  14112. nlmsg_free(msg);
  14113. return -ENOBUFS;
  14114. }
  14115. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14116. nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
  14117. nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
  14118. NL80211_ATTR_PAD) ||
  14119. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
  14120. nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) ||
  14121. (unencrypted && nla_put_flag(msg,
  14122. NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT)))
  14123. goto nla_put_failure;
  14124. frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len);
  14125. if (!frame)
  14126. goto nla_put_failure;
  14127. skb_copy_bits(skb, 0, nla_data(frame), skb->len);
  14128. genlmsg_end(msg, hdr);
  14129. return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
  14130. nla_put_failure:
  14131. nlmsg_free(msg);
  14132. return -ENOBUFS;
  14133. }
  14134. bool cfg80211_rx_control_port(struct net_device *dev,
  14135. struct sk_buff *skb, bool unencrypted)
  14136. {
  14137. int ret;
  14138. trace_cfg80211_rx_control_port(dev, skb, unencrypted);
  14139. ret = __nl80211_rx_control_port(dev, skb, unencrypted, GFP_ATOMIC);
  14140. trace_cfg80211_return_bool(ret == 0);
  14141. return ret == 0;
  14142. }
  14143. EXPORT_SYMBOL(cfg80211_rx_control_port);
  14144. static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev,
  14145. const char *mac, gfp_t gfp)
  14146. {
  14147. struct wireless_dev *wdev = dev->ieee80211_ptr;
  14148. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  14149. struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  14150. void **cb;
  14151. if (!msg)
  14152. return NULL;
  14153. cb = (void **)msg->cb;
  14154. cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM);
  14155. if (!cb[0]) {
  14156. nlmsg_free(msg);
  14157. return NULL;
  14158. }
  14159. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14160. nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
  14161. goto nla_put_failure;
  14162. if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
  14163. goto nla_put_failure;
  14164. cb[1] = nla_nest_start_noflag(msg, NL80211_ATTR_CQM);
  14165. if (!cb[1])
  14166. goto nla_put_failure;
  14167. cb[2] = rdev;
  14168. return msg;
  14169. nla_put_failure:
  14170. nlmsg_free(msg);
  14171. return NULL;
  14172. }
  14173. static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp)
  14174. {
  14175. void **cb = (void **)msg->cb;
  14176. struct cfg80211_registered_device *rdev = cb[2];
  14177. nla_nest_end(msg, cb[1]);
  14178. genlmsg_end(msg, cb[0]);
  14179. memset(msg->cb, 0, sizeof(msg->cb));
  14180. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  14181. NL80211_MCGRP_MLME, gfp);
  14182. }
  14183. void cfg80211_cqm_rssi_notify(struct net_device *dev,
  14184. enum nl80211_cqm_rssi_threshold_event rssi_event,
  14185. s32 rssi_level, gfp_t gfp)
  14186. {
  14187. struct sk_buff *msg;
  14188. struct wireless_dev *wdev = dev->ieee80211_ptr;
  14189. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  14190. trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level);
  14191. if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW &&
  14192. rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
  14193. return;
  14194. if (wdev->cqm_config) {
  14195. wdev->cqm_config->last_rssi_event_value = rssi_level;
  14196. cfg80211_cqm_rssi_update(rdev, dev);
  14197. if (rssi_level == 0)
  14198. rssi_level = wdev->cqm_config->last_rssi_event_value;
  14199. }
  14200. msg = cfg80211_prepare_cqm(dev, NULL, gfp);
  14201. if (!msg)
  14202. return;
  14203. if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
  14204. rssi_event))
  14205. goto nla_put_failure;
  14206. if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL,
  14207. rssi_level))
  14208. goto nla_put_failure;
  14209. cfg80211_send_cqm(msg, gfp);
  14210. return;
  14211. nla_put_failure:
  14212. nlmsg_free(msg);
  14213. }
  14214. EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
  14215. void cfg80211_cqm_txe_notify(struct net_device *dev,
  14216. const u8 *peer, u32 num_packets,
  14217. u32 rate, u32 intvl, gfp_t gfp)
  14218. {
  14219. struct sk_buff *msg;
  14220. msg = cfg80211_prepare_cqm(dev, peer, gfp);
  14221. if (!msg)
  14222. return;
  14223. if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets))
  14224. goto nla_put_failure;
  14225. if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate))
  14226. goto nla_put_failure;
  14227. if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl))
  14228. goto nla_put_failure;
  14229. cfg80211_send_cqm(msg, gfp);
  14230. return;
  14231. nla_put_failure:
  14232. nlmsg_free(msg);
  14233. }
  14234. EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
  14235. void cfg80211_cqm_pktloss_notify(struct net_device *dev,
  14236. const u8 *peer, u32 num_packets, gfp_t gfp)
  14237. {
  14238. struct sk_buff *msg;
  14239. trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets);
  14240. msg = cfg80211_prepare_cqm(dev, peer, gfp);
  14241. if (!msg)
  14242. return;
  14243. if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets))
  14244. goto nla_put_failure;
  14245. cfg80211_send_cqm(msg, gfp);
  14246. return;
  14247. nla_put_failure:
  14248. nlmsg_free(msg);
  14249. }
  14250. EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
  14251. void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp)
  14252. {
  14253. struct sk_buff *msg;
  14254. msg = cfg80211_prepare_cqm(dev, NULL, gfp);
  14255. if (!msg)
  14256. return;
  14257. if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT))
  14258. goto nla_put_failure;
  14259. cfg80211_send_cqm(msg, gfp);
  14260. return;
  14261. nla_put_failure:
  14262. nlmsg_free(msg);
  14263. }
  14264. EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify);
  14265. static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
  14266. struct net_device *netdev, const u8 *bssid,
  14267. const u8 *replay_ctr, gfp_t gfp)
  14268. {
  14269. struct sk_buff *msg;
  14270. struct nlattr *rekey_attr;
  14271. void *hdr;
  14272. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  14273. if (!msg)
  14274. return;
  14275. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD);
  14276. if (!hdr) {
  14277. nlmsg_free(msg);
  14278. return;
  14279. }
  14280. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14281. nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
  14282. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
  14283. goto nla_put_failure;
  14284. rekey_attr = nla_nest_start_noflag(msg, NL80211_ATTR_REKEY_DATA);
  14285. if (!rekey_attr)
  14286. goto nla_put_failure;
  14287. if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR,
  14288. NL80211_REPLAY_CTR_LEN, replay_ctr))
  14289. goto nla_put_failure;
  14290. nla_nest_end(msg, rekey_attr);
  14291. genlmsg_end(msg, hdr);
  14292. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  14293. NL80211_MCGRP_MLME, gfp);
  14294. return;
  14295. nla_put_failure:
  14296. nlmsg_free(msg);
  14297. }
  14298. void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
  14299. const u8 *replay_ctr, gfp_t gfp)
  14300. {
  14301. struct wireless_dev *wdev = dev->ieee80211_ptr;
  14302. struct wiphy *wiphy = wdev->wiphy;
  14303. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  14304. trace_cfg80211_gtk_rekey_notify(dev, bssid);
  14305. nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
  14306. }
  14307. EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);
  14308. static void
  14309. nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
  14310. struct net_device *netdev, int index,
  14311. const u8 *bssid, bool preauth, gfp_t gfp)
  14312. {
  14313. struct sk_buff *msg;
  14314. struct nlattr *attr;
  14315. void *hdr;
  14316. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  14317. if (!msg)
  14318. return;
  14319. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE);
  14320. if (!hdr) {
  14321. nlmsg_free(msg);
  14322. return;
  14323. }
  14324. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14325. nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
  14326. goto nla_put_failure;
  14327. attr = nla_nest_start_noflag(msg, NL80211_ATTR_PMKSA_CANDIDATE);
  14328. if (!attr)
  14329. goto nla_put_failure;
  14330. if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) ||
  14331. nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) ||
  14332. (preauth &&
  14333. nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH)))
  14334. goto nla_put_failure;
  14335. nla_nest_end(msg, attr);
  14336. genlmsg_end(msg, hdr);
  14337. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  14338. NL80211_MCGRP_MLME, gfp);
  14339. return;
  14340. nla_put_failure:
  14341. nlmsg_free(msg);
  14342. }
  14343. void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
  14344. const u8 *bssid, bool preauth, gfp_t gfp)
  14345. {
  14346. struct wireless_dev *wdev = dev->ieee80211_ptr;
  14347. struct wiphy *wiphy = wdev->wiphy;
  14348. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  14349. trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth);
  14350. nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp);
  14351. }
  14352. EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
  14353. static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
  14354. struct net_device *netdev,
  14355. struct cfg80211_chan_def *chandef,
  14356. gfp_t gfp,
  14357. enum nl80211_commands notif,
  14358. u8 count)
  14359. {
  14360. struct sk_buff *msg;
  14361. void *hdr;
  14362. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  14363. if (!msg)
  14364. return;
  14365. hdr = nl80211hdr_put(msg, 0, 0, 0, notif);
  14366. if (!hdr) {
  14367. nlmsg_free(msg);
  14368. return;
  14369. }
  14370. if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
  14371. goto nla_put_failure;
  14372. if (nl80211_send_chandef(msg, chandef))
  14373. goto nla_put_failure;
  14374. if ((notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) &&
  14375. (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)))
  14376. goto nla_put_failure;
  14377. genlmsg_end(msg, hdr);
  14378. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  14379. NL80211_MCGRP_MLME, gfp);
  14380. return;
  14381. nla_put_failure:
  14382. nlmsg_free(msg);
  14383. }
  14384. void cfg80211_ch_switch_notify(struct net_device *dev,
  14385. struct cfg80211_chan_def *chandef)
  14386. {
  14387. struct wireless_dev *wdev = dev->ieee80211_ptr;
  14388. struct wiphy *wiphy = wdev->wiphy;
  14389. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  14390. ASSERT_WDEV_LOCK(wdev);
  14391. trace_cfg80211_ch_switch_notify(dev, chandef);
  14392. wdev->chandef = *chandef;
  14393. wdev->preset_chandef = *chandef;
  14394. if ((wdev->iftype == NL80211_IFTYPE_STATION ||
  14395. wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) &&
  14396. !WARN_ON(!wdev->current_bss))
  14397. cfg80211_update_assoc_bss_entry(wdev, chandef->chan);
  14398. cfg80211_sched_dfs_chan_update(rdev);
  14399. nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
  14400. NL80211_CMD_CH_SWITCH_NOTIFY, 0);
  14401. }
  14402. EXPORT_SYMBOL(cfg80211_ch_switch_notify);
  14403. void cfg80211_ch_switch_started_notify(struct net_device *dev,
  14404. struct cfg80211_chan_def *chandef,
  14405. u8 count)
  14406. {
  14407. struct wireless_dev *wdev = dev->ieee80211_ptr;
  14408. struct wiphy *wiphy = wdev->wiphy;
  14409. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  14410. trace_cfg80211_ch_switch_started_notify(dev, chandef);
  14411. nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
  14412. NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, count);
  14413. }
  14414. EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
  14415. void
  14416. nl80211_radar_notify(struct cfg80211_registered_device *rdev,
  14417. const struct cfg80211_chan_def *chandef,
  14418. enum nl80211_radar_event event,
  14419. struct net_device *netdev, gfp_t gfp)
  14420. {
  14421. struct sk_buff *msg;
  14422. void *hdr;
  14423. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  14424. if (!msg)
  14425. return;
  14426. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT);
  14427. if (!hdr) {
  14428. nlmsg_free(msg);
  14429. return;
  14430. }
  14431. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
  14432. goto nla_put_failure;
  14433. /* NOP and radar events don't need a netdev parameter */
  14434. if (netdev) {
  14435. struct wireless_dev *wdev = netdev->ieee80211_ptr;
  14436. if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
  14437. nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
  14438. NL80211_ATTR_PAD))
  14439. goto nla_put_failure;
  14440. }
  14441. if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event))
  14442. goto nla_put_failure;
  14443. if (nl80211_send_chandef(msg, chandef))
  14444. goto nla_put_failure;
  14445. genlmsg_end(msg, hdr);
  14446. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  14447. NL80211_MCGRP_MLME, gfp);
  14448. return;
  14449. nla_put_failure:
  14450. nlmsg_free(msg);
  14451. }
  14452. void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac,
  14453. struct sta_opmode_info *sta_opmode,
  14454. gfp_t gfp)
  14455. {
  14456. struct sk_buff *msg;
  14457. struct wireless_dev *wdev = dev->ieee80211_ptr;
  14458. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  14459. void *hdr;
  14460. if (WARN_ON(!mac))
  14461. return;
  14462. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  14463. if (!msg)
  14464. return;
  14465. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED);
  14466. if (!hdr) {
  14467. nlmsg_free(msg);
  14468. return;
  14469. }
  14470. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
  14471. goto nla_put_failure;
  14472. if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
  14473. goto nla_put_failure;
  14474. if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac))
  14475. goto nla_put_failure;
  14476. if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) &&
  14477. nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode))
  14478. goto nla_put_failure;
  14479. if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) &&
  14480. nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw))
  14481. goto nla_put_failure;
  14482. if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) &&
  14483. nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss))
  14484. goto nla_put_failure;
  14485. genlmsg_end(msg, hdr);
  14486. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  14487. NL80211_MCGRP_MLME, gfp);
  14488. return;
  14489. nla_put_failure:
  14490. nlmsg_free(msg);
  14491. }
  14492. EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify);
  14493. void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
  14494. u64 cookie, bool acked, s32 ack_signal,
  14495. bool is_valid_ack_signal, gfp_t gfp)
  14496. {
  14497. struct wireless_dev *wdev = dev->ieee80211_ptr;
  14498. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  14499. struct sk_buff *msg;
  14500. void *hdr;
  14501. trace_cfg80211_probe_status(dev, addr, cookie, acked);
  14502. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  14503. if (!msg)
  14504. return;
  14505. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT);
  14506. if (!hdr) {
  14507. nlmsg_free(msg);
  14508. return;
  14509. }
  14510. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14511. nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
  14512. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
  14513. nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
  14514. NL80211_ATTR_PAD) ||
  14515. (acked && nla_put_flag(msg, NL80211_ATTR_ACK)) ||
  14516. (is_valid_ack_signal && nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL,
  14517. ack_signal)))
  14518. goto nla_put_failure;
  14519. genlmsg_end(msg, hdr);
  14520. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  14521. NL80211_MCGRP_MLME, gfp);
  14522. return;
  14523. nla_put_failure:
  14524. nlmsg_free(msg);
  14525. }
  14526. EXPORT_SYMBOL(cfg80211_probe_status);
  14527. void cfg80211_report_obss_beacon_khz(struct wiphy *wiphy, const u8 *frame,
  14528. size_t len, int freq, int sig_dbm)
  14529. {
  14530. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  14531. struct sk_buff *msg;
  14532. void *hdr;
  14533. struct cfg80211_beacon_registration *reg;
  14534. trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm);
  14535. spin_lock_bh(&rdev->beacon_registrations_lock);
  14536. list_for_each_entry(reg, &rdev->beacon_registrations, list) {
  14537. msg = nlmsg_new(len + 100, GFP_ATOMIC);
  14538. if (!msg) {
  14539. spin_unlock_bh(&rdev->beacon_registrations_lock);
  14540. return;
  14541. }
  14542. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME);
  14543. if (!hdr)
  14544. goto nla_put_failure;
  14545. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14546. (freq &&
  14547. (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ,
  14548. KHZ_TO_MHZ(freq)) ||
  14549. nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET,
  14550. freq % 1000))) ||
  14551. (sig_dbm &&
  14552. nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
  14553. nla_put(msg, NL80211_ATTR_FRAME, len, frame))
  14554. goto nla_put_failure;
  14555. genlmsg_end(msg, hdr);
  14556. genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid);
  14557. }
  14558. spin_unlock_bh(&rdev->beacon_registrations_lock);
  14559. return;
  14560. nla_put_failure:
  14561. spin_unlock_bh(&rdev->beacon_registrations_lock);
  14562. nlmsg_free(msg);
  14563. }
  14564. EXPORT_SYMBOL(cfg80211_report_obss_beacon_khz);
  14565. #ifdef CONFIG_PM
  14566. static int cfg80211_net_detect_results(struct sk_buff *msg,
  14567. struct cfg80211_wowlan_wakeup *wakeup)
  14568. {
  14569. struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect;
  14570. struct nlattr *nl_results, *nl_match, *nl_freqs;
  14571. int i, j;
  14572. nl_results = nla_nest_start_noflag(msg,
  14573. NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS);
  14574. if (!nl_results)
  14575. return -EMSGSIZE;
  14576. for (i = 0; i < nd->n_matches; i++) {
  14577. struct cfg80211_wowlan_nd_match *match = nd->matches[i];
  14578. nl_match = nla_nest_start_noflag(msg, i);
  14579. if (!nl_match)
  14580. break;
  14581. /* The SSID attribute is optional in nl80211, but for
  14582. * simplicity reasons it's always present in the
  14583. * cfg80211 structure. If a driver can't pass the
  14584. * SSID, that needs to be changed. A zero length SSID
  14585. * is still a valid SSID (wildcard), so it cannot be
  14586. * used for this purpose.
  14587. */
  14588. if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len,
  14589. match->ssid.ssid)) {
  14590. nla_nest_cancel(msg, nl_match);
  14591. goto out;
  14592. }
  14593. if (match->n_channels) {
  14594. nl_freqs = nla_nest_start_noflag(msg,
  14595. NL80211_ATTR_SCAN_FREQUENCIES);
  14596. if (!nl_freqs) {
  14597. nla_nest_cancel(msg, nl_match);
  14598. goto out;
  14599. }
  14600. for (j = 0; j < match->n_channels; j++) {
  14601. if (nla_put_u32(msg, j, match->channels[j])) {
  14602. nla_nest_cancel(msg, nl_freqs);
  14603. nla_nest_cancel(msg, nl_match);
  14604. goto out;
  14605. }
  14606. }
  14607. nla_nest_end(msg, nl_freqs);
  14608. }
  14609. nla_nest_end(msg, nl_match);
  14610. }
  14611. out:
  14612. nla_nest_end(msg, nl_results);
  14613. return 0;
  14614. }
  14615. void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
  14616. struct cfg80211_wowlan_wakeup *wakeup,
  14617. gfp_t gfp)
  14618. {
  14619. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  14620. struct sk_buff *msg;
  14621. void *hdr;
  14622. int size = 200;
  14623. trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup);
  14624. if (wakeup)
  14625. size += wakeup->packet_present_len;
  14626. msg = nlmsg_new(size, gfp);
  14627. if (!msg)
  14628. return;
  14629. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN);
  14630. if (!hdr)
  14631. goto free_msg;
  14632. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14633. nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
  14634. NL80211_ATTR_PAD))
  14635. goto free_msg;
  14636. if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
  14637. wdev->netdev->ifindex))
  14638. goto free_msg;
  14639. if (wakeup) {
  14640. struct nlattr *reasons;
  14641. reasons = nla_nest_start_noflag(msg,
  14642. NL80211_ATTR_WOWLAN_TRIGGERS);
  14643. if (!reasons)
  14644. goto free_msg;
  14645. if (wakeup->disconnect &&
  14646. nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT))
  14647. goto free_msg;
  14648. if (wakeup->magic_pkt &&
  14649. nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT))
  14650. goto free_msg;
  14651. if (wakeup->gtk_rekey_failure &&
  14652. nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE))
  14653. goto free_msg;
  14654. if (wakeup->eap_identity_req &&
  14655. nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST))
  14656. goto free_msg;
  14657. if (wakeup->four_way_handshake &&
  14658. nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE))
  14659. goto free_msg;
  14660. if (wakeup->rfkill_release &&
  14661. nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))
  14662. goto free_msg;
  14663. if (wakeup->pattern_idx >= 0 &&
  14664. nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN,
  14665. wakeup->pattern_idx))
  14666. goto free_msg;
  14667. if (wakeup->tcp_match &&
  14668. nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH))
  14669. goto free_msg;
  14670. if (wakeup->tcp_connlost &&
  14671. nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST))
  14672. goto free_msg;
  14673. if (wakeup->tcp_nomoretokens &&
  14674. nla_put_flag(msg,
  14675. NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS))
  14676. goto free_msg;
  14677. if (wakeup->packet) {
  14678. u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211;
  14679. u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN;
  14680. if (!wakeup->packet_80211) {
  14681. pkt_attr =
  14682. NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023;
  14683. len_attr =
  14684. NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN;
  14685. }
  14686. if (wakeup->packet_len &&
  14687. nla_put_u32(msg, len_attr, wakeup->packet_len))
  14688. goto free_msg;
  14689. if (nla_put(msg, pkt_attr, wakeup->packet_present_len,
  14690. wakeup->packet))
  14691. goto free_msg;
  14692. }
  14693. if (wakeup->net_detect &&
  14694. cfg80211_net_detect_results(msg, wakeup))
  14695. goto free_msg;
  14696. nla_nest_end(msg, reasons);
  14697. }
  14698. genlmsg_end(msg, hdr);
  14699. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  14700. NL80211_MCGRP_MLME, gfp);
  14701. return;
  14702. free_msg:
  14703. nlmsg_free(msg);
  14704. }
  14705. EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup);
  14706. #endif
  14707. void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
  14708. enum nl80211_tdls_operation oper,
  14709. u16 reason_code, gfp_t gfp)
  14710. {
  14711. struct wireless_dev *wdev = dev->ieee80211_ptr;
  14712. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  14713. struct sk_buff *msg;
  14714. void *hdr;
  14715. trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper,
  14716. reason_code);
  14717. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  14718. if (!msg)
  14719. return;
  14720. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER);
  14721. if (!hdr) {
  14722. nlmsg_free(msg);
  14723. return;
  14724. }
  14725. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14726. nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
  14727. nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) ||
  14728. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) ||
  14729. (reason_code > 0 &&
  14730. nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code)))
  14731. goto nla_put_failure;
  14732. genlmsg_end(msg, hdr);
  14733. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  14734. NL80211_MCGRP_MLME, gfp);
  14735. return;
  14736. nla_put_failure:
  14737. nlmsg_free(msg);
  14738. }
  14739. EXPORT_SYMBOL(cfg80211_tdls_oper_request);
  14740. static int nl80211_netlink_notify(struct notifier_block * nb,
  14741. unsigned long state,
  14742. void *_notify)
  14743. {
  14744. struct netlink_notify *notify = _notify;
  14745. struct cfg80211_registered_device *rdev;
  14746. struct wireless_dev *wdev;
  14747. struct cfg80211_beacon_registration *reg, *tmp;
  14748. if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC)
  14749. return NOTIFY_DONE;
  14750. rcu_read_lock();
  14751. list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
  14752. struct cfg80211_sched_scan_request *sched_scan_req;
  14753. list_for_each_entry_rcu(sched_scan_req,
  14754. &rdev->sched_scan_req_list,
  14755. list) {
  14756. if (sched_scan_req->owner_nlportid == notify->portid) {
  14757. sched_scan_req->nl_owner_dead = true;
  14758. schedule_work(&rdev->sched_scan_stop_wk);
  14759. }
  14760. }
  14761. list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) {
  14762. cfg80211_mlme_unregister_socket(wdev, notify->portid);
  14763. if (wdev->owner_nlportid == notify->portid) {
  14764. wdev->nl_owner_dead = true;
  14765. schedule_work(&rdev->destroy_work);
  14766. } else if (wdev->conn_owner_nlportid == notify->portid) {
  14767. schedule_work(&wdev->disconnect_wk);
  14768. }
  14769. cfg80211_release_pmsr(wdev, notify->portid);
  14770. }
  14771. spin_lock_bh(&rdev->beacon_registrations_lock);
  14772. list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations,
  14773. list) {
  14774. if (reg->nlportid == notify->portid) {
  14775. list_del(&reg->list);
  14776. kfree(reg);
  14777. break;
  14778. }
  14779. }
  14780. spin_unlock_bh(&rdev->beacon_registrations_lock);
  14781. }
  14782. rcu_read_unlock();
  14783. /*
  14784. * It is possible that the user space process that is controlling the
  14785. * indoor setting disappeared, so notify the regulatory core.
  14786. */
  14787. regulatory_netlink_notify(notify->portid);
  14788. return NOTIFY_OK;
  14789. }
  14790. static struct notifier_block nl80211_netlink_notifier = {
  14791. .notifier_call = nl80211_netlink_notify,
  14792. };
  14793. void cfg80211_ft_event(struct net_device *netdev,
  14794. struct cfg80211_ft_event_params *ft_event)
  14795. {
  14796. struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
  14797. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  14798. struct sk_buff *msg;
  14799. void *hdr;
  14800. trace_cfg80211_ft_event(wiphy, netdev, ft_event);
  14801. if (!ft_event->target_ap)
  14802. return;
  14803. msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len,
  14804. GFP_KERNEL);
  14805. if (!msg)
  14806. return;
  14807. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT);
  14808. if (!hdr)
  14809. goto out;
  14810. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14811. nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
  14812. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap))
  14813. goto out;
  14814. if (ft_event->ies &&
  14815. nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies))
  14816. goto out;
  14817. if (ft_event->ric_ies &&
  14818. nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len,
  14819. ft_event->ric_ies))
  14820. goto out;
  14821. genlmsg_end(msg, hdr);
  14822. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  14823. NL80211_MCGRP_MLME, GFP_KERNEL);
  14824. return;
  14825. out:
  14826. nlmsg_free(msg);
  14827. }
  14828. EXPORT_SYMBOL(cfg80211_ft_event);
  14829. void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp)
  14830. {
  14831. struct cfg80211_registered_device *rdev;
  14832. struct sk_buff *msg;
  14833. void *hdr;
  14834. u32 nlportid;
  14835. rdev = wiphy_to_rdev(wdev->wiphy);
  14836. if (!rdev->crit_proto_nlportid)
  14837. return;
  14838. nlportid = rdev->crit_proto_nlportid;
  14839. rdev->crit_proto_nlportid = 0;
  14840. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  14841. if (!msg)
  14842. return;
  14843. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP);
  14844. if (!hdr)
  14845. goto nla_put_failure;
  14846. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14847. nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
  14848. NL80211_ATTR_PAD))
  14849. goto nla_put_failure;
  14850. genlmsg_end(msg, hdr);
  14851. genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid);
  14852. return;
  14853. nla_put_failure:
  14854. nlmsg_free(msg);
  14855. }
  14856. EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
  14857. void nl80211_send_ap_stopped(struct wireless_dev *wdev)
  14858. {
  14859. struct wiphy *wiphy = wdev->wiphy;
  14860. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  14861. struct sk_buff *msg;
  14862. void *hdr;
  14863. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  14864. if (!msg)
  14865. return;
  14866. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP);
  14867. if (!hdr)
  14868. goto out;
  14869. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14870. nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) ||
  14871. nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
  14872. NL80211_ATTR_PAD))
  14873. goto out;
  14874. genlmsg_end(msg, hdr);
  14875. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0,
  14876. NL80211_MCGRP_MLME, GFP_KERNEL);
  14877. return;
  14878. out:
  14879. nlmsg_free(msg);
  14880. }
  14881. int cfg80211_external_auth_request(struct net_device *dev,
  14882. struct cfg80211_external_auth_params *params,
  14883. gfp_t gfp)
  14884. {
  14885. struct wireless_dev *wdev = dev->ieee80211_ptr;
  14886. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  14887. struct sk_buff *msg;
  14888. void *hdr;
  14889. if (!wdev->conn_owner_nlportid)
  14890. return -EINVAL;
  14891. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  14892. if (!msg)
  14893. return -ENOMEM;
  14894. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH);
  14895. if (!hdr)
  14896. goto nla_put_failure;
  14897. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14898. nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
  14899. nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) ||
  14900. nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION,
  14901. params->action) ||
  14902. nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) ||
  14903. nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len,
  14904. params->ssid.ssid))
  14905. goto nla_put_failure;
  14906. genlmsg_end(msg, hdr);
  14907. genlmsg_unicast(wiphy_net(&rdev->wiphy), msg,
  14908. wdev->conn_owner_nlportid);
  14909. return 0;
  14910. nla_put_failure:
  14911. nlmsg_free(msg);
  14912. return -ENOBUFS;
  14913. }
  14914. EXPORT_SYMBOL(cfg80211_external_auth_request);
  14915. void cfg80211_update_owe_info_event(struct net_device *netdev,
  14916. struct cfg80211_update_owe_info *owe_info,
  14917. gfp_t gfp)
  14918. {
  14919. struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy;
  14920. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  14921. struct sk_buff *msg;
  14922. void *hdr;
  14923. trace_cfg80211_update_owe_info_event(wiphy, netdev, owe_info);
  14924. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  14925. if (!msg)
  14926. return;
  14927. hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_UPDATE_OWE_INFO);
  14928. if (!hdr)
  14929. goto nla_put_failure;
  14930. if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  14931. nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
  14932. nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer))
  14933. goto nla_put_failure;
  14934. if (!owe_info->ie_len ||
  14935. nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie))
  14936. goto nla_put_failure;
  14937. genlmsg_end(msg, hdr);
  14938. genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  14939. NL80211_MCGRP_MLME, gfp);
  14940. return;
  14941. nla_put_failure:
  14942. genlmsg_cancel(msg, hdr);
  14943. nlmsg_free(msg);
  14944. }
  14945. EXPORT_SYMBOL(cfg80211_update_owe_info_event);
  14946. /* initialisation/exit functions */
  14947. int __init nl80211_init(void)
  14948. {
  14949. int err;
  14950. err = genl_register_family(&nl80211_fam);
  14951. if (err)
  14952. return err;
  14953. err = netlink_register_notifier(&nl80211_netlink_notifier);
  14954. if (err)
  14955. goto err_out;
  14956. return 0;
  14957. err_out:
  14958. genl_unregister_family(&nl80211_fam);
  14959. return err;
  14960. }
  14961. void nl80211_exit(void)
  14962. {
  14963. netlink_unregister_notifier(&nl80211_netlink_notifier);
  14964. genl_unregister_family(&nl80211_fam);
  14965. }