mgmt.c 223 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935
  1. /*
  2. BlueZ - Bluetooth protocol stack for Linux
  3. Copyright (C) 2010 Nokia Corporation
  4. Copyright (C) 2011-2012 Intel Corporation
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License version 2 as
  7. published by the Free Software Foundation;
  8. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  9. OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  10. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
  11. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
  12. CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
  13. WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  14. ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  15. OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  16. ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
  17. COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
  18. SOFTWARE IS DISCLAIMED.
  19. */
  20. /* Bluetooth HCI Management interface */
  21. #include <linux/module.h>
  22. #include <asm/unaligned.h>
  23. #include <net/bluetooth/bluetooth.h>
  24. #include <net/bluetooth/hci_core.h>
  25. #include <net/bluetooth/hci_sock.h>
  26. #include <net/bluetooth/l2cap.h>
  27. #include <net/bluetooth/mgmt.h>
  28. #include "hci_request.h"
  29. #include "smp.h"
  30. #include "mgmt_util.h"
  31. #include "mgmt_config.h"
  32. #include "msft.h"
  33. #define MGMT_VERSION 1
  34. #define MGMT_REVISION 18
  35. static const u16 mgmt_commands[] = {
  36. MGMT_OP_READ_INDEX_LIST,
  37. MGMT_OP_READ_INFO,
  38. MGMT_OP_SET_POWERED,
  39. MGMT_OP_SET_DISCOVERABLE,
  40. MGMT_OP_SET_CONNECTABLE,
  41. MGMT_OP_SET_FAST_CONNECTABLE,
  42. MGMT_OP_SET_BONDABLE,
  43. MGMT_OP_SET_LINK_SECURITY,
  44. MGMT_OP_SET_SSP,
  45. MGMT_OP_SET_HS,
  46. MGMT_OP_SET_LE,
  47. MGMT_OP_SET_DEV_CLASS,
  48. MGMT_OP_SET_LOCAL_NAME,
  49. MGMT_OP_ADD_UUID,
  50. MGMT_OP_REMOVE_UUID,
  51. MGMT_OP_LOAD_LINK_KEYS,
  52. MGMT_OP_LOAD_LONG_TERM_KEYS,
  53. MGMT_OP_DISCONNECT,
  54. MGMT_OP_GET_CONNECTIONS,
  55. MGMT_OP_PIN_CODE_REPLY,
  56. MGMT_OP_PIN_CODE_NEG_REPLY,
  57. MGMT_OP_SET_IO_CAPABILITY,
  58. MGMT_OP_PAIR_DEVICE,
  59. MGMT_OP_CANCEL_PAIR_DEVICE,
  60. MGMT_OP_UNPAIR_DEVICE,
  61. MGMT_OP_USER_CONFIRM_REPLY,
  62. MGMT_OP_USER_CONFIRM_NEG_REPLY,
  63. MGMT_OP_USER_PASSKEY_REPLY,
  64. MGMT_OP_USER_PASSKEY_NEG_REPLY,
  65. MGMT_OP_READ_LOCAL_OOB_DATA,
  66. MGMT_OP_ADD_REMOTE_OOB_DATA,
  67. MGMT_OP_REMOVE_REMOTE_OOB_DATA,
  68. MGMT_OP_START_DISCOVERY,
  69. MGMT_OP_STOP_DISCOVERY,
  70. MGMT_OP_CONFIRM_NAME,
  71. MGMT_OP_BLOCK_DEVICE,
  72. MGMT_OP_UNBLOCK_DEVICE,
  73. MGMT_OP_SET_DEVICE_ID,
  74. MGMT_OP_SET_ADVERTISING,
  75. MGMT_OP_SET_BREDR,
  76. MGMT_OP_SET_STATIC_ADDRESS,
  77. MGMT_OP_SET_SCAN_PARAMS,
  78. MGMT_OP_SET_SECURE_CONN,
  79. MGMT_OP_SET_DEBUG_KEYS,
  80. MGMT_OP_SET_PRIVACY,
  81. MGMT_OP_LOAD_IRKS,
  82. MGMT_OP_GET_CONN_INFO,
  83. MGMT_OP_GET_CLOCK_INFO,
  84. MGMT_OP_ADD_DEVICE,
  85. MGMT_OP_REMOVE_DEVICE,
  86. MGMT_OP_LOAD_CONN_PARAM,
  87. MGMT_OP_READ_UNCONF_INDEX_LIST,
  88. MGMT_OP_READ_CONFIG_INFO,
  89. MGMT_OP_SET_EXTERNAL_CONFIG,
  90. MGMT_OP_SET_PUBLIC_ADDRESS,
  91. MGMT_OP_START_SERVICE_DISCOVERY,
  92. MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
  93. MGMT_OP_READ_EXT_INDEX_LIST,
  94. MGMT_OP_READ_ADV_FEATURES,
  95. MGMT_OP_ADD_ADVERTISING,
  96. MGMT_OP_REMOVE_ADVERTISING,
  97. MGMT_OP_GET_ADV_SIZE_INFO,
  98. MGMT_OP_START_LIMITED_DISCOVERY,
  99. MGMT_OP_READ_EXT_INFO,
  100. MGMT_OP_SET_APPEARANCE,
  101. MGMT_OP_SET_BLOCKED_KEYS,
  102. MGMT_OP_SET_WIDEBAND_SPEECH,
  103. MGMT_OP_READ_SECURITY_INFO,
  104. MGMT_OP_READ_EXP_FEATURES_INFO,
  105. MGMT_OP_SET_EXP_FEATURE,
  106. MGMT_OP_READ_DEF_SYSTEM_CONFIG,
  107. MGMT_OP_SET_DEF_SYSTEM_CONFIG,
  108. MGMT_OP_READ_DEF_RUNTIME_CONFIG,
  109. MGMT_OP_SET_DEF_RUNTIME_CONFIG,
  110. MGMT_OP_GET_DEVICE_FLAGS,
  111. MGMT_OP_SET_DEVICE_FLAGS,
  112. MGMT_OP_READ_ADV_MONITOR_FEATURES,
  113. MGMT_OP_ADD_ADV_PATTERNS_MONITOR,
  114. MGMT_OP_REMOVE_ADV_MONITOR,
  115. };
  116. static const u16 mgmt_events[] = {
  117. MGMT_EV_CONTROLLER_ERROR,
  118. MGMT_EV_INDEX_ADDED,
  119. MGMT_EV_INDEX_REMOVED,
  120. MGMT_EV_NEW_SETTINGS,
  121. MGMT_EV_CLASS_OF_DEV_CHANGED,
  122. MGMT_EV_LOCAL_NAME_CHANGED,
  123. MGMT_EV_NEW_LINK_KEY,
  124. MGMT_EV_NEW_LONG_TERM_KEY,
  125. MGMT_EV_DEVICE_CONNECTED,
  126. MGMT_EV_DEVICE_DISCONNECTED,
  127. MGMT_EV_CONNECT_FAILED,
  128. MGMT_EV_PIN_CODE_REQUEST,
  129. MGMT_EV_USER_CONFIRM_REQUEST,
  130. MGMT_EV_USER_PASSKEY_REQUEST,
  131. MGMT_EV_AUTH_FAILED,
  132. MGMT_EV_DEVICE_FOUND,
  133. MGMT_EV_DISCOVERING,
  134. MGMT_EV_DEVICE_BLOCKED,
  135. MGMT_EV_DEVICE_UNBLOCKED,
  136. MGMT_EV_DEVICE_UNPAIRED,
  137. MGMT_EV_PASSKEY_NOTIFY,
  138. MGMT_EV_NEW_IRK,
  139. MGMT_EV_NEW_CSRK,
  140. MGMT_EV_DEVICE_ADDED,
  141. MGMT_EV_DEVICE_REMOVED,
  142. MGMT_EV_NEW_CONN_PARAM,
  143. MGMT_EV_UNCONF_INDEX_ADDED,
  144. MGMT_EV_UNCONF_INDEX_REMOVED,
  145. MGMT_EV_NEW_CONFIG_OPTIONS,
  146. MGMT_EV_EXT_INDEX_ADDED,
  147. MGMT_EV_EXT_INDEX_REMOVED,
  148. MGMT_EV_LOCAL_OOB_DATA_UPDATED,
  149. MGMT_EV_ADVERTISING_ADDED,
  150. MGMT_EV_ADVERTISING_REMOVED,
  151. MGMT_EV_EXT_INFO_CHANGED,
  152. MGMT_EV_PHY_CONFIGURATION_CHANGED,
  153. MGMT_EV_EXP_FEATURE_CHANGED,
  154. MGMT_EV_DEVICE_FLAGS_CHANGED,
  155. MGMT_EV_CONTROLLER_SUSPEND,
  156. MGMT_EV_CONTROLLER_RESUME,
  157. };
  158. static const u16 mgmt_untrusted_commands[] = {
  159. MGMT_OP_READ_INDEX_LIST,
  160. MGMT_OP_READ_INFO,
  161. MGMT_OP_READ_UNCONF_INDEX_LIST,
  162. MGMT_OP_READ_CONFIG_INFO,
  163. MGMT_OP_READ_EXT_INDEX_LIST,
  164. MGMT_OP_READ_EXT_INFO,
  165. MGMT_OP_READ_SECURITY_INFO,
  166. MGMT_OP_READ_EXP_FEATURES_INFO,
  167. MGMT_OP_READ_DEF_SYSTEM_CONFIG,
  168. MGMT_OP_READ_DEF_RUNTIME_CONFIG,
  169. };
  170. static const u16 mgmt_untrusted_events[] = {
  171. MGMT_EV_INDEX_ADDED,
  172. MGMT_EV_INDEX_REMOVED,
  173. MGMT_EV_NEW_SETTINGS,
  174. MGMT_EV_CLASS_OF_DEV_CHANGED,
  175. MGMT_EV_LOCAL_NAME_CHANGED,
  176. MGMT_EV_UNCONF_INDEX_ADDED,
  177. MGMT_EV_UNCONF_INDEX_REMOVED,
  178. MGMT_EV_NEW_CONFIG_OPTIONS,
  179. MGMT_EV_EXT_INDEX_ADDED,
  180. MGMT_EV_EXT_INDEX_REMOVED,
  181. MGMT_EV_EXT_INFO_CHANGED,
  182. MGMT_EV_EXP_FEATURE_CHANGED,
  183. MGMT_EV_ADV_MONITOR_ADDED,
  184. MGMT_EV_ADV_MONITOR_REMOVED,
  185. };
  186. #define CACHE_TIMEOUT msecs_to_jiffies(2 * 1000)
  187. #define ZERO_KEY "\x00\x00\x00\x00\x00\x00\x00\x00" \
  188. "\x00\x00\x00\x00\x00\x00\x00\x00"
  189. /* HCI to MGMT error code conversion table */
  190. static const u8 mgmt_status_table[] = {
  191. MGMT_STATUS_SUCCESS,
  192. MGMT_STATUS_UNKNOWN_COMMAND, /* Unknown Command */
  193. MGMT_STATUS_NOT_CONNECTED, /* No Connection */
  194. MGMT_STATUS_FAILED, /* Hardware Failure */
  195. MGMT_STATUS_CONNECT_FAILED, /* Page Timeout */
  196. MGMT_STATUS_AUTH_FAILED, /* Authentication Failed */
  197. MGMT_STATUS_AUTH_FAILED, /* PIN or Key Missing */
  198. MGMT_STATUS_NO_RESOURCES, /* Memory Full */
  199. MGMT_STATUS_TIMEOUT, /* Connection Timeout */
  200. MGMT_STATUS_NO_RESOURCES, /* Max Number of Connections */
  201. MGMT_STATUS_NO_RESOURCES, /* Max Number of SCO Connections */
  202. MGMT_STATUS_ALREADY_CONNECTED, /* ACL Connection Exists */
  203. MGMT_STATUS_BUSY, /* Command Disallowed */
  204. MGMT_STATUS_NO_RESOURCES, /* Rejected Limited Resources */
  205. MGMT_STATUS_REJECTED, /* Rejected Security */
  206. MGMT_STATUS_REJECTED, /* Rejected Personal */
  207. MGMT_STATUS_TIMEOUT, /* Host Timeout */
  208. MGMT_STATUS_NOT_SUPPORTED, /* Unsupported Feature */
  209. MGMT_STATUS_INVALID_PARAMS, /* Invalid Parameters */
  210. MGMT_STATUS_DISCONNECTED, /* OE User Ended Connection */
  211. MGMT_STATUS_NO_RESOURCES, /* OE Low Resources */
  212. MGMT_STATUS_DISCONNECTED, /* OE Power Off */
  213. MGMT_STATUS_DISCONNECTED, /* Connection Terminated */
  214. MGMT_STATUS_BUSY, /* Repeated Attempts */
  215. MGMT_STATUS_REJECTED, /* Pairing Not Allowed */
  216. MGMT_STATUS_FAILED, /* Unknown LMP PDU */
  217. MGMT_STATUS_NOT_SUPPORTED, /* Unsupported Remote Feature */
  218. MGMT_STATUS_REJECTED, /* SCO Offset Rejected */
  219. MGMT_STATUS_REJECTED, /* SCO Interval Rejected */
  220. MGMT_STATUS_REJECTED, /* Air Mode Rejected */
  221. MGMT_STATUS_INVALID_PARAMS, /* Invalid LMP Parameters */
  222. MGMT_STATUS_FAILED, /* Unspecified Error */
  223. MGMT_STATUS_NOT_SUPPORTED, /* Unsupported LMP Parameter Value */
  224. MGMT_STATUS_FAILED, /* Role Change Not Allowed */
  225. MGMT_STATUS_TIMEOUT, /* LMP Response Timeout */
  226. MGMT_STATUS_FAILED, /* LMP Error Transaction Collision */
  227. MGMT_STATUS_FAILED, /* LMP PDU Not Allowed */
  228. MGMT_STATUS_REJECTED, /* Encryption Mode Not Accepted */
  229. MGMT_STATUS_FAILED, /* Unit Link Key Used */
  230. MGMT_STATUS_NOT_SUPPORTED, /* QoS Not Supported */
  231. MGMT_STATUS_TIMEOUT, /* Instant Passed */
  232. MGMT_STATUS_NOT_SUPPORTED, /* Pairing Not Supported */
  233. MGMT_STATUS_FAILED, /* Transaction Collision */
  234. MGMT_STATUS_FAILED, /* Reserved for future use */
  235. MGMT_STATUS_INVALID_PARAMS, /* Unacceptable Parameter */
  236. MGMT_STATUS_REJECTED, /* QoS Rejected */
  237. MGMT_STATUS_NOT_SUPPORTED, /* Classification Not Supported */
  238. MGMT_STATUS_REJECTED, /* Insufficient Security */
  239. MGMT_STATUS_INVALID_PARAMS, /* Parameter Out Of Range */
  240. MGMT_STATUS_FAILED, /* Reserved for future use */
  241. MGMT_STATUS_BUSY, /* Role Switch Pending */
  242. MGMT_STATUS_FAILED, /* Reserved for future use */
  243. MGMT_STATUS_FAILED, /* Slot Violation */
  244. MGMT_STATUS_FAILED, /* Role Switch Failed */
  245. MGMT_STATUS_INVALID_PARAMS, /* EIR Too Large */
  246. MGMT_STATUS_NOT_SUPPORTED, /* Simple Pairing Not Supported */
  247. MGMT_STATUS_BUSY, /* Host Busy Pairing */
  248. MGMT_STATUS_REJECTED, /* Rejected, No Suitable Channel */
  249. MGMT_STATUS_BUSY, /* Controller Busy */
  250. MGMT_STATUS_INVALID_PARAMS, /* Unsuitable Connection Interval */
  251. MGMT_STATUS_TIMEOUT, /* Directed Advertising Timeout */
  252. MGMT_STATUS_AUTH_FAILED, /* Terminated Due to MIC Failure */
  253. MGMT_STATUS_CONNECT_FAILED, /* Connection Establishment Failed */
  254. MGMT_STATUS_CONNECT_FAILED, /* MAC Connection Failed */
  255. };
  256. static u8 mgmt_status(u8 hci_status)
  257. {
  258. if (hci_status < ARRAY_SIZE(mgmt_status_table))
  259. return mgmt_status_table[hci_status];
  260. return MGMT_STATUS_FAILED;
  261. }
  262. static int mgmt_index_event(u16 event, struct hci_dev *hdev, void *data,
  263. u16 len, int flag)
  264. {
  265. return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
  266. flag, NULL);
  267. }
  268. static int mgmt_limited_event(u16 event, struct hci_dev *hdev, void *data,
  269. u16 len, int flag, struct sock *skip_sk)
  270. {
  271. return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
  272. flag, skip_sk);
  273. }
  274. static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 len,
  275. struct sock *skip_sk)
  276. {
  277. return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
  278. HCI_SOCK_TRUSTED, skip_sk);
  279. }
  280. static u8 le_addr_type(u8 mgmt_addr_type)
  281. {
  282. if (mgmt_addr_type == BDADDR_LE_PUBLIC)
  283. return ADDR_LE_DEV_PUBLIC;
  284. else
  285. return ADDR_LE_DEV_RANDOM;
  286. }
  287. void mgmt_fill_version_info(void *ver)
  288. {
  289. struct mgmt_rp_read_version *rp = ver;
  290. rp->version = MGMT_VERSION;
  291. rp->revision = cpu_to_le16(MGMT_REVISION);
  292. }
  293. static int read_version(struct sock *sk, struct hci_dev *hdev, void *data,
  294. u16 data_len)
  295. {
  296. struct mgmt_rp_read_version rp;
  297. bt_dev_dbg(hdev, "sock %p", sk);
  298. mgmt_fill_version_info(&rp);
  299. return mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, 0,
  300. &rp, sizeof(rp));
  301. }
  302. static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
  303. u16 data_len)
  304. {
  305. struct mgmt_rp_read_commands *rp;
  306. u16 num_commands, num_events;
  307. size_t rp_size;
  308. int i, err;
  309. bt_dev_dbg(hdev, "sock %p", sk);
  310. if (hci_sock_test_flag(sk, HCI_SOCK_TRUSTED)) {
  311. num_commands = ARRAY_SIZE(mgmt_commands);
  312. num_events = ARRAY_SIZE(mgmt_events);
  313. } else {
  314. num_commands = ARRAY_SIZE(mgmt_untrusted_commands);
  315. num_events = ARRAY_SIZE(mgmt_untrusted_events);
  316. }
  317. rp_size = sizeof(*rp) + ((num_commands + num_events) * sizeof(u16));
  318. rp = kmalloc(rp_size, GFP_KERNEL);
  319. if (!rp)
  320. return -ENOMEM;
  321. rp->num_commands = cpu_to_le16(num_commands);
  322. rp->num_events = cpu_to_le16(num_events);
  323. if (hci_sock_test_flag(sk, HCI_SOCK_TRUSTED)) {
  324. __le16 *opcode = rp->opcodes;
  325. for (i = 0; i < num_commands; i++, opcode++)
  326. put_unaligned_le16(mgmt_commands[i], opcode);
  327. for (i = 0; i < num_events; i++, opcode++)
  328. put_unaligned_le16(mgmt_events[i], opcode);
  329. } else {
  330. __le16 *opcode = rp->opcodes;
  331. for (i = 0; i < num_commands; i++, opcode++)
  332. put_unaligned_le16(mgmt_untrusted_commands[i], opcode);
  333. for (i = 0; i < num_events; i++, opcode++)
  334. put_unaligned_le16(mgmt_untrusted_events[i], opcode);
  335. }
  336. err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, 0,
  337. rp, rp_size);
  338. kfree(rp);
  339. return err;
  340. }
  341. static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data,
  342. u16 data_len)
  343. {
  344. struct mgmt_rp_read_index_list *rp;
  345. struct hci_dev *d;
  346. size_t rp_len;
  347. u16 count;
  348. int err;
  349. bt_dev_dbg(hdev, "sock %p", sk);
  350. read_lock(&hci_dev_list_lock);
  351. count = 0;
  352. list_for_each_entry(d, &hci_dev_list, list) {
  353. if (d->dev_type == HCI_PRIMARY &&
  354. !hci_dev_test_flag(d, HCI_UNCONFIGURED))
  355. count++;
  356. }
  357. rp_len = sizeof(*rp) + (2 * count);
  358. rp = kmalloc(rp_len, GFP_ATOMIC);
  359. if (!rp) {
  360. read_unlock(&hci_dev_list_lock);
  361. return -ENOMEM;
  362. }
  363. count = 0;
  364. list_for_each_entry(d, &hci_dev_list, list) {
  365. if (hci_dev_test_flag(d, HCI_SETUP) ||
  366. hci_dev_test_flag(d, HCI_CONFIG) ||
  367. hci_dev_test_flag(d, HCI_USER_CHANNEL))
  368. continue;
  369. /* Devices marked as raw-only are neither configured
  370. * nor unconfigured controllers.
  371. */
  372. if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks))
  373. continue;
  374. if (d->dev_type == HCI_PRIMARY &&
  375. !hci_dev_test_flag(d, HCI_UNCONFIGURED)) {
  376. rp->index[count++] = cpu_to_le16(d->id);
  377. bt_dev_dbg(hdev, "Added hci%u", d->id);
  378. }
  379. }
  380. rp->num_controllers = cpu_to_le16(count);
  381. rp_len = sizeof(*rp) + (2 * count);
  382. read_unlock(&hci_dev_list_lock);
  383. err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST,
  384. 0, rp, rp_len);
  385. kfree(rp);
  386. return err;
  387. }
  388. static int read_unconf_index_list(struct sock *sk, struct hci_dev *hdev,
  389. void *data, u16 data_len)
  390. {
  391. struct mgmt_rp_read_unconf_index_list *rp;
  392. struct hci_dev *d;
  393. size_t rp_len;
  394. u16 count;
  395. int err;
  396. bt_dev_dbg(hdev, "sock %p", sk);
  397. read_lock(&hci_dev_list_lock);
  398. count = 0;
  399. list_for_each_entry(d, &hci_dev_list, list) {
  400. if (d->dev_type == HCI_PRIMARY &&
  401. hci_dev_test_flag(d, HCI_UNCONFIGURED))
  402. count++;
  403. }
  404. rp_len = sizeof(*rp) + (2 * count);
  405. rp = kmalloc(rp_len, GFP_ATOMIC);
  406. if (!rp) {
  407. read_unlock(&hci_dev_list_lock);
  408. return -ENOMEM;
  409. }
  410. count = 0;
  411. list_for_each_entry(d, &hci_dev_list, list) {
  412. if (hci_dev_test_flag(d, HCI_SETUP) ||
  413. hci_dev_test_flag(d, HCI_CONFIG) ||
  414. hci_dev_test_flag(d, HCI_USER_CHANNEL))
  415. continue;
  416. /* Devices marked as raw-only are neither configured
  417. * nor unconfigured controllers.
  418. */
  419. if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks))
  420. continue;
  421. if (d->dev_type == HCI_PRIMARY &&
  422. hci_dev_test_flag(d, HCI_UNCONFIGURED)) {
  423. rp->index[count++] = cpu_to_le16(d->id);
  424. bt_dev_dbg(hdev, "Added hci%u", d->id);
  425. }
  426. }
  427. rp->num_controllers = cpu_to_le16(count);
  428. rp_len = sizeof(*rp) + (2 * count);
  429. read_unlock(&hci_dev_list_lock);
  430. err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE,
  431. MGMT_OP_READ_UNCONF_INDEX_LIST, 0, rp, rp_len);
  432. kfree(rp);
  433. return err;
  434. }
  435. static int read_ext_index_list(struct sock *sk, struct hci_dev *hdev,
  436. void *data, u16 data_len)
  437. {
  438. struct mgmt_rp_read_ext_index_list *rp;
  439. struct hci_dev *d;
  440. u16 count;
  441. int err;
  442. bt_dev_dbg(hdev, "sock %p", sk);
  443. read_lock(&hci_dev_list_lock);
  444. count = 0;
  445. list_for_each_entry(d, &hci_dev_list, list) {
  446. if (d->dev_type == HCI_PRIMARY || d->dev_type == HCI_AMP)
  447. count++;
  448. }
  449. rp = kmalloc(struct_size(rp, entry, count), GFP_ATOMIC);
  450. if (!rp) {
  451. read_unlock(&hci_dev_list_lock);
  452. return -ENOMEM;
  453. }
  454. count = 0;
  455. list_for_each_entry(d, &hci_dev_list, list) {
  456. if (hci_dev_test_flag(d, HCI_SETUP) ||
  457. hci_dev_test_flag(d, HCI_CONFIG) ||
  458. hci_dev_test_flag(d, HCI_USER_CHANNEL))
  459. continue;
  460. /* Devices marked as raw-only are neither configured
  461. * nor unconfigured controllers.
  462. */
  463. if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks))
  464. continue;
  465. if (d->dev_type == HCI_PRIMARY) {
  466. if (hci_dev_test_flag(d, HCI_UNCONFIGURED))
  467. rp->entry[count].type = 0x01;
  468. else
  469. rp->entry[count].type = 0x00;
  470. } else if (d->dev_type == HCI_AMP) {
  471. rp->entry[count].type = 0x02;
  472. } else {
  473. continue;
  474. }
  475. rp->entry[count].bus = d->bus;
  476. rp->entry[count++].index = cpu_to_le16(d->id);
  477. bt_dev_dbg(hdev, "Added hci%u", d->id);
  478. }
  479. rp->num_controllers = cpu_to_le16(count);
  480. read_unlock(&hci_dev_list_lock);
  481. /* If this command is called at least once, then all the
  482. * default index and unconfigured index events are disabled
  483. * and from now on only extended index events are used.
  484. */
  485. hci_sock_set_flag(sk, HCI_MGMT_EXT_INDEX_EVENTS);
  486. hci_sock_clear_flag(sk, HCI_MGMT_INDEX_EVENTS);
  487. hci_sock_clear_flag(sk, HCI_MGMT_UNCONF_INDEX_EVENTS);
  488. err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE,
  489. MGMT_OP_READ_EXT_INDEX_LIST, 0, rp,
  490. struct_size(rp, entry, count));
  491. kfree(rp);
  492. return err;
  493. }
  494. static bool is_configured(struct hci_dev *hdev)
  495. {
  496. if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) &&
  497. !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED))
  498. return false;
  499. if ((test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) ||
  500. test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) &&
  501. !bacmp(&hdev->public_addr, BDADDR_ANY))
  502. return false;
  503. return true;
  504. }
  505. static __le32 get_missing_options(struct hci_dev *hdev)
  506. {
  507. u32 options = 0;
  508. if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) &&
  509. !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED))
  510. options |= MGMT_OPTION_EXTERNAL_CONFIG;
  511. if ((test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) ||
  512. test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) &&
  513. !bacmp(&hdev->public_addr, BDADDR_ANY))
  514. options |= MGMT_OPTION_PUBLIC_ADDRESS;
  515. return cpu_to_le32(options);
  516. }
  517. static int new_options(struct hci_dev *hdev, struct sock *skip)
  518. {
  519. __le32 options = get_missing_options(hdev);
  520. return mgmt_limited_event(MGMT_EV_NEW_CONFIG_OPTIONS, hdev, &options,
  521. sizeof(options), HCI_MGMT_OPTION_EVENTS, skip);
  522. }
  523. static int send_options_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
  524. {
  525. __le32 options = get_missing_options(hdev);
  526. return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &options,
  527. sizeof(options));
  528. }
  529. static int read_config_info(struct sock *sk, struct hci_dev *hdev,
  530. void *data, u16 data_len)
  531. {
  532. struct mgmt_rp_read_config_info rp;
  533. u32 options = 0;
  534. bt_dev_dbg(hdev, "sock %p", sk);
  535. hci_dev_lock(hdev);
  536. memset(&rp, 0, sizeof(rp));
  537. rp.manufacturer = cpu_to_le16(hdev->manufacturer);
  538. if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks))
  539. options |= MGMT_OPTION_EXTERNAL_CONFIG;
  540. if (hdev->set_bdaddr)
  541. options |= MGMT_OPTION_PUBLIC_ADDRESS;
  542. rp.supported_options = cpu_to_le32(options);
  543. rp.missing_options = get_missing_options(hdev);
  544. hci_dev_unlock(hdev);
  545. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_CONFIG_INFO, 0,
  546. &rp, sizeof(rp));
  547. }
  548. static u32 get_supported_phys(struct hci_dev *hdev)
  549. {
  550. u32 supported_phys = 0;
  551. if (lmp_bredr_capable(hdev)) {
  552. supported_phys |= MGMT_PHY_BR_1M_1SLOT;
  553. if (hdev->features[0][0] & LMP_3SLOT)
  554. supported_phys |= MGMT_PHY_BR_1M_3SLOT;
  555. if (hdev->features[0][0] & LMP_5SLOT)
  556. supported_phys |= MGMT_PHY_BR_1M_5SLOT;
  557. if (lmp_edr_2m_capable(hdev)) {
  558. supported_phys |= MGMT_PHY_EDR_2M_1SLOT;
  559. if (lmp_edr_3slot_capable(hdev))
  560. supported_phys |= MGMT_PHY_EDR_2M_3SLOT;
  561. if (lmp_edr_5slot_capable(hdev))
  562. supported_phys |= MGMT_PHY_EDR_2M_5SLOT;
  563. if (lmp_edr_3m_capable(hdev)) {
  564. supported_phys |= MGMT_PHY_EDR_3M_1SLOT;
  565. if (lmp_edr_3slot_capable(hdev))
  566. supported_phys |= MGMT_PHY_EDR_3M_3SLOT;
  567. if (lmp_edr_5slot_capable(hdev))
  568. supported_phys |= MGMT_PHY_EDR_3M_5SLOT;
  569. }
  570. }
  571. }
  572. if (lmp_le_capable(hdev)) {
  573. supported_phys |= MGMT_PHY_LE_1M_TX;
  574. supported_phys |= MGMT_PHY_LE_1M_RX;
  575. if (hdev->le_features[1] & HCI_LE_PHY_2M) {
  576. supported_phys |= MGMT_PHY_LE_2M_TX;
  577. supported_phys |= MGMT_PHY_LE_2M_RX;
  578. }
  579. if (hdev->le_features[1] & HCI_LE_PHY_CODED) {
  580. supported_phys |= MGMT_PHY_LE_CODED_TX;
  581. supported_phys |= MGMT_PHY_LE_CODED_RX;
  582. }
  583. }
  584. return supported_phys;
  585. }
  586. static u32 get_selected_phys(struct hci_dev *hdev)
  587. {
  588. u32 selected_phys = 0;
  589. if (lmp_bredr_capable(hdev)) {
  590. selected_phys |= MGMT_PHY_BR_1M_1SLOT;
  591. if (hdev->pkt_type & (HCI_DM3 | HCI_DH3))
  592. selected_phys |= MGMT_PHY_BR_1M_3SLOT;
  593. if (hdev->pkt_type & (HCI_DM5 | HCI_DH5))
  594. selected_phys |= MGMT_PHY_BR_1M_5SLOT;
  595. if (lmp_edr_2m_capable(hdev)) {
  596. if (!(hdev->pkt_type & HCI_2DH1))
  597. selected_phys |= MGMT_PHY_EDR_2M_1SLOT;
  598. if (lmp_edr_3slot_capable(hdev) &&
  599. !(hdev->pkt_type & HCI_2DH3))
  600. selected_phys |= MGMT_PHY_EDR_2M_3SLOT;
  601. if (lmp_edr_5slot_capable(hdev) &&
  602. !(hdev->pkt_type & HCI_2DH5))
  603. selected_phys |= MGMT_PHY_EDR_2M_5SLOT;
  604. if (lmp_edr_3m_capable(hdev)) {
  605. if (!(hdev->pkt_type & HCI_3DH1))
  606. selected_phys |= MGMT_PHY_EDR_3M_1SLOT;
  607. if (lmp_edr_3slot_capable(hdev) &&
  608. !(hdev->pkt_type & HCI_3DH3))
  609. selected_phys |= MGMT_PHY_EDR_3M_3SLOT;
  610. if (lmp_edr_5slot_capable(hdev) &&
  611. !(hdev->pkt_type & HCI_3DH5))
  612. selected_phys |= MGMT_PHY_EDR_3M_5SLOT;
  613. }
  614. }
  615. }
  616. if (lmp_le_capable(hdev)) {
  617. if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_1M)
  618. selected_phys |= MGMT_PHY_LE_1M_TX;
  619. if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_1M)
  620. selected_phys |= MGMT_PHY_LE_1M_RX;
  621. if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_2M)
  622. selected_phys |= MGMT_PHY_LE_2M_TX;
  623. if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_2M)
  624. selected_phys |= MGMT_PHY_LE_2M_RX;
  625. if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_CODED)
  626. selected_phys |= MGMT_PHY_LE_CODED_TX;
  627. if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_CODED)
  628. selected_phys |= MGMT_PHY_LE_CODED_RX;
  629. }
  630. return selected_phys;
  631. }
  632. static u32 get_configurable_phys(struct hci_dev *hdev)
  633. {
  634. return (get_supported_phys(hdev) & ~MGMT_PHY_BR_1M_1SLOT &
  635. ~MGMT_PHY_LE_1M_TX & ~MGMT_PHY_LE_1M_RX);
  636. }
  637. static u32 get_supported_settings(struct hci_dev *hdev)
  638. {
  639. u32 settings = 0;
  640. settings |= MGMT_SETTING_POWERED;
  641. settings |= MGMT_SETTING_BONDABLE;
  642. settings |= MGMT_SETTING_DEBUG_KEYS;
  643. settings |= MGMT_SETTING_CONNECTABLE;
  644. settings |= MGMT_SETTING_DISCOVERABLE;
  645. if (lmp_bredr_capable(hdev)) {
  646. if (hdev->hci_ver >= BLUETOOTH_VER_1_2)
  647. settings |= MGMT_SETTING_FAST_CONNECTABLE;
  648. settings |= MGMT_SETTING_BREDR;
  649. settings |= MGMT_SETTING_LINK_SECURITY;
  650. if (lmp_ssp_capable(hdev)) {
  651. settings |= MGMT_SETTING_SSP;
  652. if (IS_ENABLED(CONFIG_BT_HS))
  653. settings |= MGMT_SETTING_HS;
  654. }
  655. if (lmp_sc_capable(hdev))
  656. settings |= MGMT_SETTING_SECURE_CONN;
  657. if (test_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED,
  658. &hdev->quirks))
  659. settings |= MGMT_SETTING_WIDEBAND_SPEECH;
  660. }
  661. if (lmp_le_capable(hdev)) {
  662. settings |= MGMT_SETTING_LE;
  663. settings |= MGMT_SETTING_SECURE_CONN;
  664. settings |= MGMT_SETTING_PRIVACY;
  665. settings |= MGMT_SETTING_STATIC_ADDRESS;
  666. /* When the experimental feature for LL Privacy support is
  667. * enabled, then advertising is no longer supported.
  668. */
  669. if (!hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY))
  670. settings |= MGMT_SETTING_ADVERTISING;
  671. }
  672. if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) ||
  673. hdev->set_bdaddr)
  674. settings |= MGMT_SETTING_CONFIGURATION;
  675. settings |= MGMT_SETTING_PHY_CONFIGURATION;
  676. return settings;
  677. }
  678. static u32 get_current_settings(struct hci_dev *hdev)
  679. {
  680. u32 settings = 0;
  681. if (hdev_is_powered(hdev))
  682. settings |= MGMT_SETTING_POWERED;
  683. if (hci_dev_test_flag(hdev, HCI_CONNECTABLE))
  684. settings |= MGMT_SETTING_CONNECTABLE;
  685. if (hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE))
  686. settings |= MGMT_SETTING_FAST_CONNECTABLE;
  687. if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE))
  688. settings |= MGMT_SETTING_DISCOVERABLE;
  689. if (hci_dev_test_flag(hdev, HCI_BONDABLE))
  690. settings |= MGMT_SETTING_BONDABLE;
  691. if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
  692. settings |= MGMT_SETTING_BREDR;
  693. if (hci_dev_test_flag(hdev, HCI_LE_ENABLED))
  694. settings |= MGMT_SETTING_LE;
  695. if (hci_dev_test_flag(hdev, HCI_LINK_SECURITY))
  696. settings |= MGMT_SETTING_LINK_SECURITY;
  697. if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
  698. settings |= MGMT_SETTING_SSP;
  699. if (hci_dev_test_flag(hdev, HCI_HS_ENABLED))
  700. settings |= MGMT_SETTING_HS;
  701. if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
  702. settings |= MGMT_SETTING_ADVERTISING;
  703. if (hci_dev_test_flag(hdev, HCI_SC_ENABLED))
  704. settings |= MGMT_SETTING_SECURE_CONN;
  705. if (hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS))
  706. settings |= MGMT_SETTING_DEBUG_KEYS;
  707. if (hci_dev_test_flag(hdev, HCI_PRIVACY))
  708. settings |= MGMT_SETTING_PRIVACY;
  709. /* The current setting for static address has two purposes. The
  710. * first is to indicate if the static address will be used and
  711. * the second is to indicate if it is actually set.
  712. *
  713. * This means if the static address is not configured, this flag
  714. * will never be set. If the address is configured, then if the
  715. * address is actually used decides if the flag is set or not.
  716. *
  717. * For single mode LE only controllers and dual-mode controllers
  718. * with BR/EDR disabled, the existence of the static address will
  719. * be evaluated.
  720. */
  721. if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ||
  722. !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) ||
  723. !bacmp(&hdev->bdaddr, BDADDR_ANY)) {
  724. if (bacmp(&hdev->static_addr, BDADDR_ANY))
  725. settings |= MGMT_SETTING_STATIC_ADDRESS;
  726. }
  727. if (hci_dev_test_flag(hdev, HCI_WIDEBAND_SPEECH_ENABLED))
  728. settings |= MGMT_SETTING_WIDEBAND_SPEECH;
  729. return settings;
  730. }
  731. static struct mgmt_pending_cmd *pending_find(u16 opcode, struct hci_dev *hdev)
  732. {
  733. return mgmt_pending_find(HCI_CHANNEL_CONTROL, opcode, hdev);
  734. }
  735. static struct mgmt_pending_cmd *pending_find_data(u16 opcode,
  736. struct hci_dev *hdev,
  737. const void *data)
  738. {
  739. return mgmt_pending_find_data(HCI_CHANNEL_CONTROL, opcode, hdev, data);
  740. }
  741. u8 mgmt_get_adv_discov_flags(struct hci_dev *hdev)
  742. {
  743. struct mgmt_pending_cmd *cmd;
  744. /* If there's a pending mgmt command the flags will not yet have
  745. * their final values, so check for this first.
  746. */
  747. cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
  748. if (cmd) {
  749. struct mgmt_mode *cp = cmd->param;
  750. if (cp->val == 0x01)
  751. return LE_AD_GENERAL;
  752. else if (cp->val == 0x02)
  753. return LE_AD_LIMITED;
  754. } else {
  755. if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE))
  756. return LE_AD_LIMITED;
  757. else if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE))
  758. return LE_AD_GENERAL;
  759. }
  760. return 0;
  761. }
  762. bool mgmt_get_connectable(struct hci_dev *hdev)
  763. {
  764. struct mgmt_pending_cmd *cmd;
  765. /* If there's a pending mgmt command the flag will not yet have
  766. * it's final value, so check for this first.
  767. */
  768. cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
  769. if (cmd) {
  770. struct mgmt_mode *cp = cmd->param;
  771. return cp->val;
  772. }
  773. return hci_dev_test_flag(hdev, HCI_CONNECTABLE);
  774. }
  775. static void service_cache_off(struct work_struct *work)
  776. {
  777. struct hci_dev *hdev = container_of(work, struct hci_dev,
  778. service_cache.work);
  779. struct hci_request req;
  780. if (!hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE))
  781. return;
  782. hci_req_init(&req, hdev);
  783. hci_dev_lock(hdev);
  784. __hci_req_update_eir(&req);
  785. __hci_req_update_class(&req);
  786. hci_dev_unlock(hdev);
  787. hci_req_run(&req, NULL);
  788. }
  789. static void rpa_expired(struct work_struct *work)
  790. {
  791. struct hci_dev *hdev = container_of(work, struct hci_dev,
  792. rpa_expired.work);
  793. struct hci_request req;
  794. bt_dev_dbg(hdev, "");
  795. hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
  796. if (!hci_dev_test_flag(hdev, HCI_ADVERTISING))
  797. return;
  798. /* The generation of a new RPA and programming it into the
  799. * controller happens in the hci_req_enable_advertising()
  800. * function.
  801. */
  802. hci_req_init(&req, hdev);
  803. if (ext_adv_capable(hdev))
  804. __hci_req_start_ext_adv(&req, hdev->cur_adv_instance);
  805. else
  806. __hci_req_enable_advertising(&req);
  807. hci_req_run(&req, NULL);
  808. }
  809. static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
  810. {
  811. if (hci_dev_test_and_set_flag(hdev, HCI_MGMT))
  812. return;
  813. INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
  814. INIT_DELAYED_WORK(&hdev->rpa_expired, rpa_expired);
  815. /* Non-mgmt controlled devices get this bit set
  816. * implicitly so that pairing works for them, however
  817. * for mgmt we require user-space to explicitly enable
  818. * it
  819. */
  820. hci_dev_clear_flag(hdev, HCI_BONDABLE);
  821. }
  822. static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
  823. void *data, u16 data_len)
  824. {
  825. struct mgmt_rp_read_info rp;
  826. bt_dev_dbg(hdev, "sock %p", sk);
  827. hci_dev_lock(hdev);
  828. memset(&rp, 0, sizeof(rp));
  829. bacpy(&rp.bdaddr, &hdev->bdaddr);
  830. rp.version = hdev->hci_ver;
  831. rp.manufacturer = cpu_to_le16(hdev->manufacturer);
  832. rp.supported_settings = cpu_to_le32(get_supported_settings(hdev));
  833. rp.current_settings = cpu_to_le32(get_current_settings(hdev));
  834. memcpy(rp.dev_class, hdev->dev_class, 3);
  835. memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
  836. memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
  837. hci_dev_unlock(hdev);
  838. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
  839. sizeof(rp));
  840. }
  841. static u16 append_eir_data_to_buf(struct hci_dev *hdev, u8 *eir)
  842. {
  843. u16 eir_len = 0;
  844. size_t name_len;
  845. if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
  846. eir_len = eir_append_data(eir, eir_len, EIR_CLASS_OF_DEV,
  847. hdev->dev_class, 3);
  848. if (hci_dev_test_flag(hdev, HCI_LE_ENABLED))
  849. eir_len = eir_append_le16(eir, eir_len, EIR_APPEARANCE,
  850. hdev->appearance);
  851. name_len = strlen(hdev->dev_name);
  852. eir_len = eir_append_data(eir, eir_len, EIR_NAME_COMPLETE,
  853. hdev->dev_name, name_len);
  854. name_len = strlen(hdev->short_name);
  855. eir_len = eir_append_data(eir, eir_len, EIR_NAME_SHORT,
  856. hdev->short_name, name_len);
  857. return eir_len;
  858. }
  859. static int read_ext_controller_info(struct sock *sk, struct hci_dev *hdev,
  860. void *data, u16 data_len)
  861. {
  862. char buf[512];
  863. struct mgmt_rp_read_ext_info *rp = (void *)buf;
  864. u16 eir_len;
  865. bt_dev_dbg(hdev, "sock %p", sk);
  866. memset(&buf, 0, sizeof(buf));
  867. hci_dev_lock(hdev);
  868. bacpy(&rp->bdaddr, &hdev->bdaddr);
  869. rp->version = hdev->hci_ver;
  870. rp->manufacturer = cpu_to_le16(hdev->manufacturer);
  871. rp->supported_settings = cpu_to_le32(get_supported_settings(hdev));
  872. rp->current_settings = cpu_to_le32(get_current_settings(hdev));
  873. eir_len = append_eir_data_to_buf(hdev, rp->eir);
  874. rp->eir_len = cpu_to_le16(eir_len);
  875. hci_dev_unlock(hdev);
  876. /* If this command is called at least once, then the events
  877. * for class of device and local name changes are disabled
  878. * and only the new extended controller information event
  879. * is used.
  880. */
  881. hci_sock_set_flag(sk, HCI_MGMT_EXT_INFO_EVENTS);
  882. hci_sock_clear_flag(sk, HCI_MGMT_DEV_CLASS_EVENTS);
  883. hci_sock_clear_flag(sk, HCI_MGMT_LOCAL_NAME_EVENTS);
  884. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_EXT_INFO, 0, rp,
  885. sizeof(*rp) + eir_len);
  886. }
  887. static int ext_info_changed(struct hci_dev *hdev, struct sock *skip)
  888. {
  889. char buf[512];
  890. struct mgmt_ev_ext_info_changed *ev = (void *)buf;
  891. u16 eir_len;
  892. memset(buf, 0, sizeof(buf));
  893. eir_len = append_eir_data_to_buf(hdev, ev->eir);
  894. ev->eir_len = cpu_to_le16(eir_len);
  895. return mgmt_limited_event(MGMT_EV_EXT_INFO_CHANGED, hdev, ev,
  896. sizeof(*ev) + eir_len,
  897. HCI_MGMT_EXT_INFO_EVENTS, skip);
  898. }
  899. static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
  900. {
  901. __le32 settings = cpu_to_le32(get_current_settings(hdev));
  902. return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &settings,
  903. sizeof(settings));
  904. }
  905. static void clean_up_hci_complete(struct hci_dev *hdev, u8 status, u16 opcode)
  906. {
  907. bt_dev_dbg(hdev, "status 0x%02x", status);
  908. if (hci_conn_count(hdev) == 0) {
  909. cancel_delayed_work(&hdev->power_off);
  910. queue_work(hdev->req_workqueue, &hdev->power_off.work);
  911. }
  912. }
  913. void mgmt_advertising_added(struct sock *sk, struct hci_dev *hdev, u8 instance)
  914. {
  915. struct mgmt_ev_advertising_added ev;
  916. ev.instance = instance;
  917. mgmt_event(MGMT_EV_ADVERTISING_ADDED, hdev, &ev, sizeof(ev), sk);
  918. }
  919. void mgmt_advertising_removed(struct sock *sk, struct hci_dev *hdev,
  920. u8 instance)
  921. {
  922. struct mgmt_ev_advertising_removed ev;
  923. ev.instance = instance;
  924. mgmt_event(MGMT_EV_ADVERTISING_REMOVED, hdev, &ev, sizeof(ev), sk);
  925. }
  926. static void cancel_adv_timeout(struct hci_dev *hdev)
  927. {
  928. if (hdev->adv_instance_timeout) {
  929. hdev->adv_instance_timeout = 0;
  930. cancel_delayed_work(&hdev->adv_instance_expire);
  931. }
  932. }
  933. static int clean_up_hci_state(struct hci_dev *hdev)
  934. {
  935. struct hci_request req;
  936. struct hci_conn *conn;
  937. bool discov_stopped;
  938. int err;
  939. hci_req_init(&req, hdev);
  940. if (test_bit(HCI_ISCAN, &hdev->flags) ||
  941. test_bit(HCI_PSCAN, &hdev->flags)) {
  942. u8 scan = 0x00;
  943. hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
  944. }
  945. hci_req_clear_adv_instance(hdev, NULL, NULL, 0x00, false);
  946. if (hci_dev_test_flag(hdev, HCI_LE_ADV))
  947. __hci_req_disable_advertising(&req);
  948. discov_stopped = hci_req_stop_discovery(&req);
  949. list_for_each_entry(conn, &hdev->conn_hash.list, list) {
  950. /* 0x15 == Terminated due to Power Off */
  951. __hci_abort_conn(&req, conn, 0x15);
  952. }
  953. err = hci_req_run(&req, clean_up_hci_complete);
  954. if (!err && discov_stopped)
  955. hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
  956. return err;
  957. }
  958. static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
  959. u16 len)
  960. {
  961. struct mgmt_mode *cp = data;
  962. struct mgmt_pending_cmd *cmd;
  963. int err;
  964. bt_dev_dbg(hdev, "sock %p", sk);
  965. if (cp->val != 0x00 && cp->val != 0x01)
  966. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
  967. MGMT_STATUS_INVALID_PARAMS);
  968. hci_dev_lock(hdev);
  969. if (pending_find(MGMT_OP_SET_POWERED, hdev)) {
  970. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
  971. MGMT_STATUS_BUSY);
  972. goto failed;
  973. }
  974. if (!!cp->val == hdev_is_powered(hdev)) {
  975. err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
  976. goto failed;
  977. }
  978. cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
  979. if (!cmd) {
  980. err = -ENOMEM;
  981. goto failed;
  982. }
  983. if (cp->val) {
  984. queue_work(hdev->req_workqueue, &hdev->power_on);
  985. err = 0;
  986. } else {
  987. /* Disconnect connections, stop scans, etc */
  988. err = clean_up_hci_state(hdev);
  989. if (!err)
  990. queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
  991. HCI_POWER_OFF_TIMEOUT);
  992. /* ENODATA means there were no HCI commands queued */
  993. if (err == -ENODATA) {
  994. cancel_delayed_work(&hdev->power_off);
  995. queue_work(hdev->req_workqueue, &hdev->power_off.work);
  996. err = 0;
  997. }
  998. }
  999. failed:
  1000. hci_dev_unlock(hdev);
  1001. return err;
  1002. }
  1003. static int new_settings(struct hci_dev *hdev, struct sock *skip)
  1004. {
  1005. __le32 ev = cpu_to_le32(get_current_settings(hdev));
  1006. return mgmt_limited_event(MGMT_EV_NEW_SETTINGS, hdev, &ev,
  1007. sizeof(ev), HCI_MGMT_SETTING_EVENTS, skip);
  1008. }
  1009. int mgmt_new_settings(struct hci_dev *hdev)
  1010. {
  1011. return new_settings(hdev, NULL);
  1012. }
  1013. struct cmd_lookup {
  1014. struct sock *sk;
  1015. struct hci_dev *hdev;
  1016. u8 mgmt_status;
  1017. };
  1018. static void settings_rsp(struct mgmt_pending_cmd *cmd, void *data)
  1019. {
  1020. struct cmd_lookup *match = data;
  1021. send_settings_rsp(cmd->sk, cmd->opcode, match->hdev);
  1022. list_del(&cmd->list);
  1023. if (match->sk == NULL) {
  1024. match->sk = cmd->sk;
  1025. sock_hold(match->sk);
  1026. }
  1027. mgmt_pending_free(cmd);
  1028. }
  1029. static void cmd_status_rsp(struct mgmt_pending_cmd *cmd, void *data)
  1030. {
  1031. u8 *status = data;
  1032. mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
  1033. mgmt_pending_remove(cmd);
  1034. }
  1035. static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data)
  1036. {
  1037. if (cmd->cmd_complete) {
  1038. u8 *status = data;
  1039. cmd->cmd_complete(cmd, *status);
  1040. mgmt_pending_remove(cmd);
  1041. return;
  1042. }
  1043. cmd_status_rsp(cmd, data);
  1044. }
  1045. static int generic_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
  1046. {
  1047. return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
  1048. cmd->param, cmd->param_len);
  1049. }
  1050. static int addr_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
  1051. {
  1052. return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
  1053. cmd->param, sizeof(struct mgmt_addr_info));
  1054. }
  1055. static u8 mgmt_bredr_support(struct hci_dev *hdev)
  1056. {
  1057. if (!lmp_bredr_capable(hdev))
  1058. return MGMT_STATUS_NOT_SUPPORTED;
  1059. else if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
  1060. return MGMT_STATUS_REJECTED;
  1061. else
  1062. return MGMT_STATUS_SUCCESS;
  1063. }
  1064. static u8 mgmt_le_support(struct hci_dev *hdev)
  1065. {
  1066. if (!lmp_le_capable(hdev))
  1067. return MGMT_STATUS_NOT_SUPPORTED;
  1068. else if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
  1069. return MGMT_STATUS_REJECTED;
  1070. else
  1071. return MGMT_STATUS_SUCCESS;
  1072. }
  1073. void mgmt_set_discoverable_complete(struct hci_dev *hdev, u8 status)
  1074. {
  1075. struct mgmt_pending_cmd *cmd;
  1076. bt_dev_dbg(hdev, "status 0x%02x", status);
  1077. hci_dev_lock(hdev);
  1078. cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
  1079. if (!cmd)
  1080. goto unlock;
  1081. if (status) {
  1082. u8 mgmt_err = mgmt_status(status);
  1083. mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
  1084. hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
  1085. goto remove_cmd;
  1086. }
  1087. if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE) &&
  1088. hdev->discov_timeout > 0) {
  1089. int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
  1090. queue_delayed_work(hdev->req_workqueue, &hdev->discov_off, to);
  1091. }
  1092. send_settings_rsp(cmd->sk, MGMT_OP_SET_DISCOVERABLE, hdev);
  1093. new_settings(hdev, cmd->sk);
  1094. remove_cmd:
  1095. mgmt_pending_remove(cmd);
  1096. unlock:
  1097. hci_dev_unlock(hdev);
  1098. }
  1099. static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
  1100. u16 len)
  1101. {
  1102. struct mgmt_cp_set_discoverable *cp = data;
  1103. struct mgmt_pending_cmd *cmd;
  1104. u16 timeout;
  1105. int err;
  1106. bt_dev_dbg(hdev, "sock %p", sk);
  1107. if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
  1108. !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
  1109. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
  1110. MGMT_STATUS_REJECTED);
  1111. if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
  1112. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
  1113. MGMT_STATUS_INVALID_PARAMS);
  1114. timeout = __le16_to_cpu(cp->timeout);
  1115. /* Disabling discoverable requires that no timeout is set,
  1116. * and enabling limited discoverable requires a timeout.
  1117. */
  1118. if ((cp->val == 0x00 && timeout > 0) ||
  1119. (cp->val == 0x02 && timeout == 0))
  1120. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
  1121. MGMT_STATUS_INVALID_PARAMS);
  1122. hci_dev_lock(hdev);
  1123. if (!hdev_is_powered(hdev) && timeout > 0) {
  1124. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
  1125. MGMT_STATUS_NOT_POWERED);
  1126. goto failed;
  1127. }
  1128. if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
  1129. pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
  1130. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
  1131. MGMT_STATUS_BUSY);
  1132. goto failed;
  1133. }
  1134. if (!hci_dev_test_flag(hdev, HCI_CONNECTABLE)) {
  1135. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
  1136. MGMT_STATUS_REJECTED);
  1137. goto failed;
  1138. }
  1139. if (hdev->advertising_paused) {
  1140. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
  1141. MGMT_STATUS_BUSY);
  1142. goto failed;
  1143. }
  1144. if (!hdev_is_powered(hdev)) {
  1145. bool changed = false;
  1146. /* Setting limited discoverable when powered off is
  1147. * not a valid operation since it requires a timeout
  1148. * and so no need to check HCI_LIMITED_DISCOVERABLE.
  1149. */
  1150. if (!!cp->val != hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) {
  1151. hci_dev_change_flag(hdev, HCI_DISCOVERABLE);
  1152. changed = true;
  1153. }
  1154. err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
  1155. if (err < 0)
  1156. goto failed;
  1157. if (changed)
  1158. err = new_settings(hdev, sk);
  1159. goto failed;
  1160. }
  1161. /* If the current mode is the same, then just update the timeout
  1162. * value with the new value. And if only the timeout gets updated,
  1163. * then no need for any HCI transactions.
  1164. */
  1165. if (!!cp->val == hci_dev_test_flag(hdev, HCI_DISCOVERABLE) &&
  1166. (cp->val == 0x02) == hci_dev_test_flag(hdev,
  1167. HCI_LIMITED_DISCOVERABLE)) {
  1168. cancel_delayed_work(&hdev->discov_off);
  1169. hdev->discov_timeout = timeout;
  1170. if (cp->val && hdev->discov_timeout > 0) {
  1171. int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
  1172. queue_delayed_work(hdev->req_workqueue,
  1173. &hdev->discov_off, to);
  1174. }
  1175. err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
  1176. goto failed;
  1177. }
  1178. cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
  1179. if (!cmd) {
  1180. err = -ENOMEM;
  1181. goto failed;
  1182. }
  1183. /* Cancel any potential discoverable timeout that might be
  1184. * still active and store new timeout value. The arming of
  1185. * the timeout happens in the complete handler.
  1186. */
  1187. cancel_delayed_work(&hdev->discov_off);
  1188. hdev->discov_timeout = timeout;
  1189. if (cp->val)
  1190. hci_dev_set_flag(hdev, HCI_DISCOVERABLE);
  1191. else
  1192. hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
  1193. /* Limited discoverable mode */
  1194. if (cp->val == 0x02)
  1195. hci_dev_set_flag(hdev, HCI_LIMITED_DISCOVERABLE);
  1196. else
  1197. hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
  1198. queue_work(hdev->req_workqueue, &hdev->discoverable_update);
  1199. err = 0;
  1200. failed:
  1201. hci_dev_unlock(hdev);
  1202. return err;
  1203. }
  1204. void mgmt_set_connectable_complete(struct hci_dev *hdev, u8 status)
  1205. {
  1206. struct mgmt_pending_cmd *cmd;
  1207. bt_dev_dbg(hdev, "status 0x%02x", status);
  1208. hci_dev_lock(hdev);
  1209. cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
  1210. if (!cmd)
  1211. goto unlock;
  1212. if (status) {
  1213. u8 mgmt_err = mgmt_status(status);
  1214. mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
  1215. goto remove_cmd;
  1216. }
  1217. send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev);
  1218. new_settings(hdev, cmd->sk);
  1219. remove_cmd:
  1220. mgmt_pending_remove(cmd);
  1221. unlock:
  1222. hci_dev_unlock(hdev);
  1223. }
  1224. static int set_connectable_update_settings(struct hci_dev *hdev,
  1225. struct sock *sk, u8 val)
  1226. {
  1227. bool changed = false;
  1228. int err;
  1229. if (!!val != hci_dev_test_flag(hdev, HCI_CONNECTABLE))
  1230. changed = true;
  1231. if (val) {
  1232. hci_dev_set_flag(hdev, HCI_CONNECTABLE);
  1233. } else {
  1234. hci_dev_clear_flag(hdev, HCI_CONNECTABLE);
  1235. hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
  1236. }
  1237. err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
  1238. if (err < 0)
  1239. return err;
  1240. if (changed) {
  1241. hci_req_update_scan(hdev);
  1242. hci_update_background_scan(hdev);
  1243. return new_settings(hdev, sk);
  1244. }
  1245. return 0;
  1246. }
  1247. static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
  1248. u16 len)
  1249. {
  1250. struct mgmt_mode *cp = data;
  1251. struct mgmt_pending_cmd *cmd;
  1252. int err;
  1253. bt_dev_dbg(hdev, "sock %p", sk);
  1254. if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
  1255. !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
  1256. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
  1257. MGMT_STATUS_REJECTED);
  1258. if (cp->val != 0x00 && cp->val != 0x01)
  1259. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
  1260. MGMT_STATUS_INVALID_PARAMS);
  1261. hci_dev_lock(hdev);
  1262. if (!hdev_is_powered(hdev)) {
  1263. err = set_connectable_update_settings(hdev, sk, cp->val);
  1264. goto failed;
  1265. }
  1266. if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
  1267. pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
  1268. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
  1269. MGMT_STATUS_BUSY);
  1270. goto failed;
  1271. }
  1272. cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
  1273. if (!cmd) {
  1274. err = -ENOMEM;
  1275. goto failed;
  1276. }
  1277. if (cp->val) {
  1278. hci_dev_set_flag(hdev, HCI_CONNECTABLE);
  1279. } else {
  1280. if (hdev->discov_timeout > 0)
  1281. cancel_delayed_work(&hdev->discov_off);
  1282. hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
  1283. hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
  1284. hci_dev_clear_flag(hdev, HCI_CONNECTABLE);
  1285. }
  1286. queue_work(hdev->req_workqueue, &hdev->connectable_update);
  1287. err = 0;
  1288. failed:
  1289. hci_dev_unlock(hdev);
  1290. return err;
  1291. }
  1292. static int set_bondable(struct sock *sk, struct hci_dev *hdev, void *data,
  1293. u16 len)
  1294. {
  1295. struct mgmt_mode *cp = data;
  1296. bool changed;
  1297. int err;
  1298. bt_dev_dbg(hdev, "sock %p", sk);
  1299. if (cp->val != 0x00 && cp->val != 0x01)
  1300. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BONDABLE,
  1301. MGMT_STATUS_INVALID_PARAMS);
  1302. hci_dev_lock(hdev);
  1303. if (cp->val)
  1304. changed = !hci_dev_test_and_set_flag(hdev, HCI_BONDABLE);
  1305. else
  1306. changed = hci_dev_test_and_clear_flag(hdev, HCI_BONDABLE);
  1307. err = send_settings_rsp(sk, MGMT_OP_SET_BONDABLE, hdev);
  1308. if (err < 0)
  1309. goto unlock;
  1310. if (changed) {
  1311. /* In limited privacy mode the change of bondable mode
  1312. * may affect the local advertising address.
  1313. */
  1314. if (hdev_is_powered(hdev) &&
  1315. hci_dev_test_flag(hdev, HCI_ADVERTISING) &&
  1316. hci_dev_test_flag(hdev, HCI_DISCOVERABLE) &&
  1317. hci_dev_test_flag(hdev, HCI_LIMITED_PRIVACY))
  1318. queue_work(hdev->req_workqueue,
  1319. &hdev->discoverable_update);
  1320. err = new_settings(hdev, sk);
  1321. }
  1322. unlock:
  1323. hci_dev_unlock(hdev);
  1324. return err;
  1325. }
  1326. static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
  1327. u16 len)
  1328. {
  1329. struct mgmt_mode *cp = data;
  1330. struct mgmt_pending_cmd *cmd;
  1331. u8 val, status;
  1332. int err;
  1333. bt_dev_dbg(hdev, "sock %p", sk);
  1334. status = mgmt_bredr_support(hdev);
  1335. if (status)
  1336. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
  1337. status);
  1338. if (cp->val != 0x00 && cp->val != 0x01)
  1339. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
  1340. MGMT_STATUS_INVALID_PARAMS);
  1341. hci_dev_lock(hdev);
  1342. if (!hdev_is_powered(hdev)) {
  1343. bool changed = false;
  1344. if (!!cp->val != hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) {
  1345. hci_dev_change_flag(hdev, HCI_LINK_SECURITY);
  1346. changed = true;
  1347. }
  1348. err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
  1349. if (err < 0)
  1350. goto failed;
  1351. if (changed)
  1352. err = new_settings(hdev, sk);
  1353. goto failed;
  1354. }
  1355. if (pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
  1356. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
  1357. MGMT_STATUS_BUSY);
  1358. goto failed;
  1359. }
  1360. val = !!cp->val;
  1361. if (test_bit(HCI_AUTH, &hdev->flags) == val) {
  1362. err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
  1363. goto failed;
  1364. }
  1365. cmd = mgmt_pending_add(sk, MGMT_OP_SET_LINK_SECURITY, hdev, data, len);
  1366. if (!cmd) {
  1367. err = -ENOMEM;
  1368. goto failed;
  1369. }
  1370. err = hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE, sizeof(val), &val);
  1371. if (err < 0) {
  1372. mgmt_pending_remove(cmd);
  1373. goto failed;
  1374. }
  1375. failed:
  1376. hci_dev_unlock(hdev);
  1377. return err;
  1378. }
  1379. static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
  1380. {
  1381. struct mgmt_mode *cp = data;
  1382. struct mgmt_pending_cmd *cmd;
  1383. u8 status;
  1384. int err;
  1385. bt_dev_dbg(hdev, "sock %p", sk);
  1386. status = mgmt_bredr_support(hdev);
  1387. if (status)
  1388. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status);
  1389. if (!lmp_ssp_capable(hdev))
  1390. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
  1391. MGMT_STATUS_NOT_SUPPORTED);
  1392. if (cp->val != 0x00 && cp->val != 0x01)
  1393. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
  1394. MGMT_STATUS_INVALID_PARAMS);
  1395. hci_dev_lock(hdev);
  1396. if (!hdev_is_powered(hdev)) {
  1397. bool changed;
  1398. if (cp->val) {
  1399. changed = !hci_dev_test_and_set_flag(hdev,
  1400. HCI_SSP_ENABLED);
  1401. } else {
  1402. changed = hci_dev_test_and_clear_flag(hdev,
  1403. HCI_SSP_ENABLED);
  1404. if (!changed)
  1405. changed = hci_dev_test_and_clear_flag(hdev,
  1406. HCI_HS_ENABLED);
  1407. else
  1408. hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
  1409. }
  1410. err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
  1411. if (err < 0)
  1412. goto failed;
  1413. if (changed)
  1414. err = new_settings(hdev, sk);
  1415. goto failed;
  1416. }
  1417. if (pending_find(MGMT_OP_SET_SSP, hdev)) {
  1418. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
  1419. MGMT_STATUS_BUSY);
  1420. goto failed;
  1421. }
  1422. if (!!cp->val == hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
  1423. err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
  1424. goto failed;
  1425. }
  1426. cmd = mgmt_pending_add(sk, MGMT_OP_SET_SSP, hdev, data, len);
  1427. if (!cmd) {
  1428. err = -ENOMEM;
  1429. goto failed;
  1430. }
  1431. if (!cp->val && hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS))
  1432. hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE,
  1433. sizeof(cp->val), &cp->val);
  1434. err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val);
  1435. if (err < 0) {
  1436. mgmt_pending_remove(cmd);
  1437. goto failed;
  1438. }
  1439. failed:
  1440. hci_dev_unlock(hdev);
  1441. return err;
  1442. }
  1443. static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
  1444. {
  1445. struct mgmt_mode *cp = data;
  1446. bool changed;
  1447. u8 status;
  1448. int err;
  1449. bt_dev_dbg(hdev, "sock %p", sk);
  1450. if (!IS_ENABLED(CONFIG_BT_HS))
  1451. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
  1452. MGMT_STATUS_NOT_SUPPORTED);
  1453. status = mgmt_bredr_support(hdev);
  1454. if (status)
  1455. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status);
  1456. if (!lmp_ssp_capable(hdev))
  1457. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
  1458. MGMT_STATUS_NOT_SUPPORTED);
  1459. if (!hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
  1460. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
  1461. MGMT_STATUS_REJECTED);
  1462. if (cp->val != 0x00 && cp->val != 0x01)
  1463. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
  1464. MGMT_STATUS_INVALID_PARAMS);
  1465. hci_dev_lock(hdev);
  1466. if (pending_find(MGMT_OP_SET_SSP, hdev)) {
  1467. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
  1468. MGMT_STATUS_BUSY);
  1469. goto unlock;
  1470. }
  1471. if (cp->val) {
  1472. changed = !hci_dev_test_and_set_flag(hdev, HCI_HS_ENABLED);
  1473. } else {
  1474. if (hdev_is_powered(hdev)) {
  1475. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
  1476. MGMT_STATUS_REJECTED);
  1477. goto unlock;
  1478. }
  1479. changed = hci_dev_test_and_clear_flag(hdev, HCI_HS_ENABLED);
  1480. }
  1481. err = send_settings_rsp(sk, MGMT_OP_SET_HS, hdev);
  1482. if (err < 0)
  1483. goto unlock;
  1484. if (changed)
  1485. err = new_settings(hdev, sk);
  1486. unlock:
  1487. hci_dev_unlock(hdev);
  1488. return err;
  1489. }
  1490. static void le_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode)
  1491. {
  1492. struct cmd_lookup match = { NULL, hdev };
  1493. hci_dev_lock(hdev);
  1494. if (status) {
  1495. u8 mgmt_err = mgmt_status(status);
  1496. mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp,
  1497. &mgmt_err);
  1498. goto unlock;
  1499. }
  1500. mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match);
  1501. new_settings(hdev, match.sk);
  1502. if (match.sk)
  1503. sock_put(match.sk);
  1504. /* Make sure the controller has a good default for
  1505. * advertising data. Restrict the update to when LE
  1506. * has actually been enabled. During power on, the
  1507. * update in powered_update_hci will take care of it.
  1508. */
  1509. if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
  1510. struct hci_request req;
  1511. hci_req_init(&req, hdev);
  1512. if (ext_adv_capable(hdev)) {
  1513. int err;
  1514. err = __hci_req_setup_ext_adv_instance(&req, 0x00);
  1515. if (!err)
  1516. __hci_req_update_scan_rsp_data(&req, 0x00);
  1517. } else {
  1518. __hci_req_update_adv_data(&req, 0x00);
  1519. __hci_req_update_scan_rsp_data(&req, 0x00);
  1520. }
  1521. hci_req_run(&req, NULL);
  1522. hci_update_background_scan(hdev);
  1523. }
  1524. unlock:
  1525. hci_dev_unlock(hdev);
  1526. }
  1527. static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
  1528. {
  1529. struct mgmt_mode *cp = data;
  1530. struct hci_cp_write_le_host_supported hci_cp;
  1531. struct mgmt_pending_cmd *cmd;
  1532. struct hci_request req;
  1533. int err;
  1534. u8 val, enabled;
  1535. bt_dev_dbg(hdev, "sock %p", sk);
  1536. if (!lmp_le_capable(hdev))
  1537. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
  1538. MGMT_STATUS_NOT_SUPPORTED);
  1539. if (cp->val != 0x00 && cp->val != 0x01)
  1540. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
  1541. MGMT_STATUS_INVALID_PARAMS);
  1542. /* Bluetooth single mode LE only controllers or dual-mode
  1543. * controllers configured as LE only devices, do not allow
  1544. * switching LE off. These have either LE enabled explicitly
  1545. * or BR/EDR has been previously switched off.
  1546. *
  1547. * When trying to enable an already enabled LE, then gracefully
  1548. * send a positive response. Trying to disable it however will
  1549. * result into rejection.
  1550. */
  1551. if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
  1552. if (cp->val == 0x01)
  1553. return send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
  1554. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
  1555. MGMT_STATUS_REJECTED);
  1556. }
  1557. hci_dev_lock(hdev);
  1558. val = !!cp->val;
  1559. enabled = lmp_host_le_capable(hdev);
  1560. if (!val)
  1561. hci_req_clear_adv_instance(hdev, NULL, NULL, 0x00, true);
  1562. if (!hdev_is_powered(hdev) || val == enabled) {
  1563. bool changed = false;
  1564. if (val != hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
  1565. hci_dev_change_flag(hdev, HCI_LE_ENABLED);
  1566. changed = true;
  1567. }
  1568. if (!val && hci_dev_test_flag(hdev, HCI_ADVERTISING)) {
  1569. hci_dev_clear_flag(hdev, HCI_ADVERTISING);
  1570. changed = true;
  1571. }
  1572. err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
  1573. if (err < 0)
  1574. goto unlock;
  1575. if (changed)
  1576. err = new_settings(hdev, sk);
  1577. goto unlock;
  1578. }
  1579. if (pending_find(MGMT_OP_SET_LE, hdev) ||
  1580. pending_find(MGMT_OP_SET_ADVERTISING, hdev)) {
  1581. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
  1582. MGMT_STATUS_BUSY);
  1583. goto unlock;
  1584. }
  1585. cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
  1586. if (!cmd) {
  1587. err = -ENOMEM;
  1588. goto unlock;
  1589. }
  1590. hci_req_init(&req, hdev);
  1591. memset(&hci_cp, 0, sizeof(hci_cp));
  1592. if (val) {
  1593. hci_cp.le = val;
  1594. hci_cp.simul = 0x00;
  1595. } else {
  1596. if (hci_dev_test_flag(hdev, HCI_LE_ADV))
  1597. __hci_req_disable_advertising(&req);
  1598. if (ext_adv_capable(hdev))
  1599. __hci_req_clear_ext_adv_sets(&req);
  1600. }
  1601. hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
  1602. &hci_cp);
  1603. err = hci_req_run(&req, le_enable_complete);
  1604. if (err < 0)
  1605. mgmt_pending_remove(cmd);
  1606. unlock:
  1607. hci_dev_unlock(hdev);
  1608. return err;
  1609. }
  1610. /* This is a helper function to test for pending mgmt commands that can
  1611. * cause CoD or EIR HCI commands. We can only allow one such pending
  1612. * mgmt command at a time since otherwise we cannot easily track what
  1613. * the current values are, will be, and based on that calculate if a new
  1614. * HCI command needs to be sent and if yes with what value.
  1615. */
  1616. static bool pending_eir_or_class(struct hci_dev *hdev)
  1617. {
  1618. struct mgmt_pending_cmd *cmd;
  1619. list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
  1620. switch (cmd->opcode) {
  1621. case MGMT_OP_ADD_UUID:
  1622. case MGMT_OP_REMOVE_UUID:
  1623. case MGMT_OP_SET_DEV_CLASS:
  1624. case MGMT_OP_SET_POWERED:
  1625. return true;
  1626. }
  1627. }
  1628. return false;
  1629. }
  1630. static const u8 bluetooth_base_uuid[] = {
  1631. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
  1632. 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1633. };
  1634. static u8 get_uuid_size(const u8 *uuid)
  1635. {
  1636. u32 val;
  1637. if (memcmp(uuid, bluetooth_base_uuid, 12))
  1638. return 128;
  1639. val = get_unaligned_le32(&uuid[12]);
  1640. if (val > 0xffff)
  1641. return 32;
  1642. return 16;
  1643. }
  1644. static void mgmt_class_complete(struct hci_dev *hdev, u16 mgmt_op, u8 status)
  1645. {
  1646. struct mgmt_pending_cmd *cmd;
  1647. hci_dev_lock(hdev);
  1648. cmd = pending_find(mgmt_op, hdev);
  1649. if (!cmd)
  1650. goto unlock;
  1651. mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
  1652. mgmt_status(status), hdev->dev_class, 3);
  1653. mgmt_pending_remove(cmd);
  1654. unlock:
  1655. hci_dev_unlock(hdev);
  1656. }
  1657. static void add_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode)
  1658. {
  1659. bt_dev_dbg(hdev, "status 0x%02x", status);
  1660. mgmt_class_complete(hdev, MGMT_OP_ADD_UUID, status);
  1661. }
  1662. static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
  1663. {
  1664. struct mgmt_cp_add_uuid *cp = data;
  1665. struct mgmt_pending_cmd *cmd;
  1666. struct hci_request req;
  1667. struct bt_uuid *uuid;
  1668. int err;
  1669. bt_dev_dbg(hdev, "sock %p", sk);
  1670. hci_dev_lock(hdev);
  1671. if (pending_eir_or_class(hdev)) {
  1672. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
  1673. MGMT_STATUS_BUSY);
  1674. goto failed;
  1675. }
  1676. uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
  1677. if (!uuid) {
  1678. err = -ENOMEM;
  1679. goto failed;
  1680. }
  1681. memcpy(uuid->uuid, cp->uuid, 16);
  1682. uuid->svc_hint = cp->svc_hint;
  1683. uuid->size = get_uuid_size(cp->uuid);
  1684. list_add_tail(&uuid->list, &hdev->uuids);
  1685. hci_req_init(&req, hdev);
  1686. __hci_req_update_class(&req);
  1687. __hci_req_update_eir(&req);
  1688. err = hci_req_run(&req, add_uuid_complete);
  1689. if (err < 0) {
  1690. if (err != -ENODATA)
  1691. goto failed;
  1692. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
  1693. hdev->dev_class, 3);
  1694. goto failed;
  1695. }
  1696. cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
  1697. if (!cmd) {
  1698. err = -ENOMEM;
  1699. goto failed;
  1700. }
  1701. err = 0;
  1702. failed:
  1703. hci_dev_unlock(hdev);
  1704. return err;
  1705. }
  1706. static bool enable_service_cache(struct hci_dev *hdev)
  1707. {
  1708. if (!hdev_is_powered(hdev))
  1709. return false;
  1710. if (!hci_dev_test_and_set_flag(hdev, HCI_SERVICE_CACHE)) {
  1711. queue_delayed_work(hdev->workqueue, &hdev->service_cache,
  1712. CACHE_TIMEOUT);
  1713. return true;
  1714. }
  1715. return false;
  1716. }
  1717. static void remove_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode)
  1718. {
  1719. bt_dev_dbg(hdev, "status 0x%02x", status);
  1720. mgmt_class_complete(hdev, MGMT_OP_REMOVE_UUID, status);
  1721. }
  1722. static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
  1723. u16 len)
  1724. {
  1725. struct mgmt_cp_remove_uuid *cp = data;
  1726. struct mgmt_pending_cmd *cmd;
  1727. struct bt_uuid *match, *tmp;
  1728. u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  1729. struct hci_request req;
  1730. int err, found;
  1731. bt_dev_dbg(hdev, "sock %p", sk);
  1732. hci_dev_lock(hdev);
  1733. if (pending_eir_or_class(hdev)) {
  1734. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
  1735. MGMT_STATUS_BUSY);
  1736. goto unlock;
  1737. }
  1738. if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
  1739. hci_uuids_clear(hdev);
  1740. if (enable_service_cache(hdev)) {
  1741. err = mgmt_cmd_complete(sk, hdev->id,
  1742. MGMT_OP_REMOVE_UUID,
  1743. 0, hdev->dev_class, 3);
  1744. goto unlock;
  1745. }
  1746. goto update_class;
  1747. }
  1748. found = 0;
  1749. list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
  1750. if (memcmp(match->uuid, cp->uuid, 16) != 0)
  1751. continue;
  1752. list_del(&match->list);
  1753. kfree(match);
  1754. found++;
  1755. }
  1756. if (found == 0) {
  1757. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
  1758. MGMT_STATUS_INVALID_PARAMS);
  1759. goto unlock;
  1760. }
  1761. update_class:
  1762. hci_req_init(&req, hdev);
  1763. __hci_req_update_class(&req);
  1764. __hci_req_update_eir(&req);
  1765. err = hci_req_run(&req, remove_uuid_complete);
  1766. if (err < 0) {
  1767. if (err != -ENODATA)
  1768. goto unlock;
  1769. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
  1770. hdev->dev_class, 3);
  1771. goto unlock;
  1772. }
  1773. cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
  1774. if (!cmd) {
  1775. err = -ENOMEM;
  1776. goto unlock;
  1777. }
  1778. err = 0;
  1779. unlock:
  1780. hci_dev_unlock(hdev);
  1781. return err;
  1782. }
  1783. static void set_class_complete(struct hci_dev *hdev, u8 status, u16 opcode)
  1784. {
  1785. bt_dev_dbg(hdev, "status 0x%02x", status);
  1786. mgmt_class_complete(hdev, MGMT_OP_SET_DEV_CLASS, status);
  1787. }
  1788. static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
  1789. u16 len)
  1790. {
  1791. struct mgmt_cp_set_dev_class *cp = data;
  1792. struct mgmt_pending_cmd *cmd;
  1793. struct hci_request req;
  1794. int err;
  1795. bt_dev_dbg(hdev, "sock %p", sk);
  1796. if (!lmp_bredr_capable(hdev))
  1797. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
  1798. MGMT_STATUS_NOT_SUPPORTED);
  1799. hci_dev_lock(hdev);
  1800. if (pending_eir_or_class(hdev)) {
  1801. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
  1802. MGMT_STATUS_BUSY);
  1803. goto unlock;
  1804. }
  1805. if ((cp->minor & 0x03) != 0 || (cp->major & 0xe0) != 0) {
  1806. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
  1807. MGMT_STATUS_INVALID_PARAMS);
  1808. goto unlock;
  1809. }
  1810. hdev->major_class = cp->major;
  1811. hdev->minor_class = cp->minor;
  1812. if (!hdev_is_powered(hdev)) {
  1813. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
  1814. hdev->dev_class, 3);
  1815. goto unlock;
  1816. }
  1817. hci_req_init(&req, hdev);
  1818. if (hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) {
  1819. hci_dev_unlock(hdev);
  1820. cancel_delayed_work_sync(&hdev->service_cache);
  1821. hci_dev_lock(hdev);
  1822. __hci_req_update_eir(&req);
  1823. }
  1824. __hci_req_update_class(&req);
  1825. err = hci_req_run(&req, set_class_complete);
  1826. if (err < 0) {
  1827. if (err != -ENODATA)
  1828. goto unlock;
  1829. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
  1830. hdev->dev_class, 3);
  1831. goto unlock;
  1832. }
  1833. cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
  1834. if (!cmd) {
  1835. err = -ENOMEM;
  1836. goto unlock;
  1837. }
  1838. err = 0;
  1839. unlock:
  1840. hci_dev_unlock(hdev);
  1841. return err;
  1842. }
  1843. static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
  1844. u16 len)
  1845. {
  1846. struct mgmt_cp_load_link_keys *cp = data;
  1847. const u16 max_key_count = ((U16_MAX - sizeof(*cp)) /
  1848. sizeof(struct mgmt_link_key_info));
  1849. u16 key_count, expected_len;
  1850. bool changed;
  1851. int i;
  1852. bt_dev_dbg(hdev, "sock %p", sk);
  1853. if (!lmp_bredr_capable(hdev))
  1854. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
  1855. MGMT_STATUS_NOT_SUPPORTED);
  1856. key_count = __le16_to_cpu(cp->key_count);
  1857. if (key_count > max_key_count) {
  1858. bt_dev_err(hdev, "load_link_keys: too big key_count value %u",
  1859. key_count);
  1860. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
  1861. MGMT_STATUS_INVALID_PARAMS);
  1862. }
  1863. expected_len = struct_size(cp, keys, key_count);
  1864. if (expected_len != len) {
  1865. bt_dev_err(hdev, "load_link_keys: expected %u bytes, got %u bytes",
  1866. expected_len, len);
  1867. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
  1868. MGMT_STATUS_INVALID_PARAMS);
  1869. }
  1870. if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
  1871. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
  1872. MGMT_STATUS_INVALID_PARAMS);
  1873. bt_dev_dbg(hdev, "debug_keys %u key_count %u", cp->debug_keys,
  1874. key_count);
  1875. for (i = 0; i < key_count; i++) {
  1876. struct mgmt_link_key_info *key = &cp->keys[i];
  1877. if (key->addr.type != BDADDR_BREDR || key->type > 0x08)
  1878. return mgmt_cmd_status(sk, hdev->id,
  1879. MGMT_OP_LOAD_LINK_KEYS,
  1880. MGMT_STATUS_INVALID_PARAMS);
  1881. }
  1882. hci_dev_lock(hdev);
  1883. hci_link_keys_clear(hdev);
  1884. if (cp->debug_keys)
  1885. changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS);
  1886. else
  1887. changed = hci_dev_test_and_clear_flag(hdev,
  1888. HCI_KEEP_DEBUG_KEYS);
  1889. if (changed)
  1890. new_settings(hdev, NULL);
  1891. for (i = 0; i < key_count; i++) {
  1892. struct mgmt_link_key_info *key = &cp->keys[i];
  1893. if (hci_is_blocked_key(hdev,
  1894. HCI_BLOCKED_KEY_TYPE_LINKKEY,
  1895. key->val)) {
  1896. bt_dev_warn(hdev, "Skipping blocked link key for %pMR",
  1897. &key->addr.bdaddr);
  1898. continue;
  1899. }
  1900. /* Always ignore debug keys and require a new pairing if
  1901. * the user wants to use them.
  1902. */
  1903. if (key->type == HCI_LK_DEBUG_COMBINATION)
  1904. continue;
  1905. hci_add_link_key(hdev, NULL, &key->addr.bdaddr, key->val,
  1906. key->type, key->pin_len, NULL);
  1907. }
  1908. mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
  1909. hci_dev_unlock(hdev);
  1910. return 0;
  1911. }
  1912. static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
  1913. u8 addr_type, struct sock *skip_sk)
  1914. {
  1915. struct mgmt_ev_device_unpaired ev;
  1916. bacpy(&ev.addr.bdaddr, bdaddr);
  1917. ev.addr.type = addr_type;
  1918. return mgmt_event(MGMT_EV_DEVICE_UNPAIRED, hdev, &ev, sizeof(ev),
  1919. skip_sk);
  1920. }
  1921. static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
  1922. u16 len)
  1923. {
  1924. struct mgmt_cp_unpair_device *cp = data;
  1925. struct mgmt_rp_unpair_device rp;
  1926. struct hci_conn_params *params;
  1927. struct mgmt_pending_cmd *cmd;
  1928. struct hci_conn *conn;
  1929. u8 addr_type;
  1930. int err;
  1931. memset(&rp, 0, sizeof(rp));
  1932. bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
  1933. rp.addr.type = cp->addr.type;
  1934. if (!bdaddr_type_is_valid(cp->addr.type))
  1935. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
  1936. MGMT_STATUS_INVALID_PARAMS,
  1937. &rp, sizeof(rp));
  1938. if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
  1939. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
  1940. MGMT_STATUS_INVALID_PARAMS,
  1941. &rp, sizeof(rp));
  1942. hci_dev_lock(hdev);
  1943. if (!hdev_is_powered(hdev)) {
  1944. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
  1945. MGMT_STATUS_NOT_POWERED, &rp,
  1946. sizeof(rp));
  1947. goto unlock;
  1948. }
  1949. if (cp->addr.type == BDADDR_BREDR) {
  1950. /* If disconnection is requested, then look up the
  1951. * connection. If the remote device is connected, it
  1952. * will be later used to terminate the link.
  1953. *
  1954. * Setting it to NULL explicitly will cause no
  1955. * termination of the link.
  1956. */
  1957. if (cp->disconnect)
  1958. conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
  1959. &cp->addr.bdaddr);
  1960. else
  1961. conn = NULL;
  1962. err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
  1963. if (err < 0) {
  1964. err = mgmt_cmd_complete(sk, hdev->id,
  1965. MGMT_OP_UNPAIR_DEVICE,
  1966. MGMT_STATUS_NOT_PAIRED, &rp,
  1967. sizeof(rp));
  1968. goto unlock;
  1969. }
  1970. goto done;
  1971. }
  1972. /* LE address type */
  1973. addr_type = le_addr_type(cp->addr.type);
  1974. /* Abort any ongoing SMP pairing. Removes ltk and irk if they exist. */
  1975. err = smp_cancel_and_remove_pairing(hdev, &cp->addr.bdaddr, addr_type);
  1976. if (err < 0) {
  1977. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
  1978. MGMT_STATUS_NOT_PAIRED, &rp,
  1979. sizeof(rp));
  1980. goto unlock;
  1981. }
  1982. conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, addr_type);
  1983. if (!conn) {
  1984. hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type);
  1985. goto done;
  1986. }
  1987. /* Defer clearing up the connection parameters until closing to
  1988. * give a chance of keeping them if a repairing happens.
  1989. */
  1990. set_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags);
  1991. /* Disable auto-connection parameters if present */
  1992. params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, addr_type);
  1993. if (params) {
  1994. if (params->explicit_connect)
  1995. params->auto_connect = HCI_AUTO_CONN_EXPLICIT;
  1996. else
  1997. params->auto_connect = HCI_AUTO_CONN_DISABLED;
  1998. }
  1999. /* If disconnection is not requested, then clear the connection
  2000. * variable so that the link is not terminated.
  2001. */
  2002. if (!cp->disconnect)
  2003. conn = NULL;
  2004. done:
  2005. /* If the connection variable is set, then termination of the
  2006. * link is requested.
  2007. */
  2008. if (!conn) {
  2009. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
  2010. &rp, sizeof(rp));
  2011. device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
  2012. goto unlock;
  2013. }
  2014. cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
  2015. sizeof(*cp));
  2016. if (!cmd) {
  2017. err = -ENOMEM;
  2018. goto unlock;
  2019. }
  2020. cmd->cmd_complete = addr_cmd_complete;
  2021. err = hci_abort_conn(conn, HCI_ERROR_REMOTE_USER_TERM);
  2022. if (err < 0)
  2023. mgmt_pending_remove(cmd);
  2024. unlock:
  2025. hci_dev_unlock(hdev);
  2026. return err;
  2027. }
  2028. static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
  2029. u16 len)
  2030. {
  2031. struct mgmt_cp_disconnect *cp = data;
  2032. struct mgmt_rp_disconnect rp;
  2033. struct mgmt_pending_cmd *cmd;
  2034. struct hci_conn *conn;
  2035. int err;
  2036. bt_dev_dbg(hdev, "sock %p", sk);
  2037. memset(&rp, 0, sizeof(rp));
  2038. bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
  2039. rp.addr.type = cp->addr.type;
  2040. if (!bdaddr_type_is_valid(cp->addr.type))
  2041. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
  2042. MGMT_STATUS_INVALID_PARAMS,
  2043. &rp, sizeof(rp));
  2044. hci_dev_lock(hdev);
  2045. if (!test_bit(HCI_UP, &hdev->flags)) {
  2046. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
  2047. MGMT_STATUS_NOT_POWERED, &rp,
  2048. sizeof(rp));
  2049. goto failed;
  2050. }
  2051. if (pending_find(MGMT_OP_DISCONNECT, hdev)) {
  2052. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
  2053. MGMT_STATUS_BUSY, &rp, sizeof(rp));
  2054. goto failed;
  2055. }
  2056. if (cp->addr.type == BDADDR_BREDR)
  2057. conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
  2058. &cp->addr.bdaddr);
  2059. else
  2060. conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr,
  2061. le_addr_type(cp->addr.type));
  2062. if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
  2063. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
  2064. MGMT_STATUS_NOT_CONNECTED, &rp,
  2065. sizeof(rp));
  2066. goto failed;
  2067. }
  2068. cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
  2069. if (!cmd) {
  2070. err = -ENOMEM;
  2071. goto failed;
  2072. }
  2073. cmd->cmd_complete = generic_cmd_complete;
  2074. err = hci_disconnect(conn, HCI_ERROR_REMOTE_USER_TERM);
  2075. if (err < 0)
  2076. mgmt_pending_remove(cmd);
  2077. failed:
  2078. hci_dev_unlock(hdev);
  2079. return err;
  2080. }
  2081. static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
  2082. {
  2083. switch (link_type) {
  2084. case LE_LINK:
  2085. switch (addr_type) {
  2086. case ADDR_LE_DEV_PUBLIC:
  2087. return BDADDR_LE_PUBLIC;
  2088. default:
  2089. /* Fallback to LE Random address type */
  2090. return BDADDR_LE_RANDOM;
  2091. }
  2092. default:
  2093. /* Fallback to BR/EDR type */
  2094. return BDADDR_BREDR;
  2095. }
  2096. }
  2097. static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
  2098. u16 data_len)
  2099. {
  2100. struct mgmt_rp_get_connections *rp;
  2101. struct hci_conn *c;
  2102. int err;
  2103. u16 i;
  2104. bt_dev_dbg(hdev, "sock %p", sk);
  2105. hci_dev_lock(hdev);
  2106. if (!hdev_is_powered(hdev)) {
  2107. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
  2108. MGMT_STATUS_NOT_POWERED);
  2109. goto unlock;
  2110. }
  2111. i = 0;
  2112. list_for_each_entry(c, &hdev->conn_hash.list, list) {
  2113. if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
  2114. i++;
  2115. }
  2116. rp = kmalloc(struct_size(rp, addr, i), GFP_KERNEL);
  2117. if (!rp) {
  2118. err = -ENOMEM;
  2119. goto unlock;
  2120. }
  2121. i = 0;
  2122. list_for_each_entry(c, &hdev->conn_hash.list, list) {
  2123. if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
  2124. continue;
  2125. bacpy(&rp->addr[i].bdaddr, &c->dst);
  2126. rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
  2127. if (c->type == SCO_LINK || c->type == ESCO_LINK)
  2128. continue;
  2129. i++;
  2130. }
  2131. rp->conn_count = cpu_to_le16(i);
  2132. /* Recalculate length in case of filtered SCO connections, etc */
  2133. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
  2134. struct_size(rp, addr, i));
  2135. kfree(rp);
  2136. unlock:
  2137. hci_dev_unlock(hdev);
  2138. return err;
  2139. }
  2140. static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
  2141. struct mgmt_cp_pin_code_neg_reply *cp)
  2142. {
  2143. struct mgmt_pending_cmd *cmd;
  2144. int err;
  2145. cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
  2146. sizeof(*cp));
  2147. if (!cmd)
  2148. return -ENOMEM;
  2149. cmd->cmd_complete = addr_cmd_complete;
  2150. err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
  2151. sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
  2152. if (err < 0)
  2153. mgmt_pending_remove(cmd);
  2154. return err;
  2155. }
  2156. static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
  2157. u16 len)
  2158. {
  2159. struct hci_conn *conn;
  2160. struct mgmt_cp_pin_code_reply *cp = data;
  2161. struct hci_cp_pin_code_reply reply;
  2162. struct mgmt_pending_cmd *cmd;
  2163. int err;
  2164. bt_dev_dbg(hdev, "sock %p", sk);
  2165. hci_dev_lock(hdev);
  2166. if (!hdev_is_powered(hdev)) {
  2167. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
  2168. MGMT_STATUS_NOT_POWERED);
  2169. goto failed;
  2170. }
  2171. conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
  2172. if (!conn) {
  2173. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
  2174. MGMT_STATUS_NOT_CONNECTED);
  2175. goto failed;
  2176. }
  2177. if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
  2178. struct mgmt_cp_pin_code_neg_reply ncp;
  2179. memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
  2180. bt_dev_err(hdev, "PIN code is not 16 bytes long");
  2181. err = send_pin_code_neg_reply(sk, hdev, &ncp);
  2182. if (err >= 0)
  2183. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
  2184. MGMT_STATUS_INVALID_PARAMS);
  2185. goto failed;
  2186. }
  2187. cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
  2188. if (!cmd) {
  2189. err = -ENOMEM;
  2190. goto failed;
  2191. }
  2192. cmd->cmd_complete = addr_cmd_complete;
  2193. bacpy(&reply.bdaddr, &cp->addr.bdaddr);
  2194. reply.pin_len = cp->pin_len;
  2195. memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
  2196. err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
  2197. if (err < 0)
  2198. mgmt_pending_remove(cmd);
  2199. failed:
  2200. hci_dev_unlock(hdev);
  2201. return err;
  2202. }
  2203. static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
  2204. u16 len)
  2205. {
  2206. struct mgmt_cp_set_io_capability *cp = data;
  2207. bt_dev_dbg(hdev, "sock %p", sk);
  2208. if (cp->io_capability > SMP_IO_KEYBOARD_DISPLAY)
  2209. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY,
  2210. MGMT_STATUS_INVALID_PARAMS);
  2211. hci_dev_lock(hdev);
  2212. hdev->io_capability = cp->io_capability;
  2213. bt_dev_dbg(hdev, "IO capability set to 0x%02x", hdev->io_capability);
  2214. hci_dev_unlock(hdev);
  2215. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0,
  2216. NULL, 0);
  2217. }
  2218. static struct mgmt_pending_cmd *find_pairing(struct hci_conn *conn)
  2219. {
  2220. struct hci_dev *hdev = conn->hdev;
  2221. struct mgmt_pending_cmd *cmd;
  2222. list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
  2223. if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
  2224. continue;
  2225. if (cmd->user_data != conn)
  2226. continue;
  2227. return cmd;
  2228. }
  2229. return NULL;
  2230. }
  2231. static int pairing_complete(struct mgmt_pending_cmd *cmd, u8 status)
  2232. {
  2233. struct mgmt_rp_pair_device rp;
  2234. struct hci_conn *conn = cmd->user_data;
  2235. int err;
  2236. bacpy(&rp.addr.bdaddr, &conn->dst);
  2237. rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
  2238. err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE,
  2239. status, &rp, sizeof(rp));
  2240. /* So we don't get further callbacks for this connection */
  2241. conn->connect_cfm_cb = NULL;
  2242. conn->security_cfm_cb = NULL;
  2243. conn->disconn_cfm_cb = NULL;
  2244. hci_conn_drop(conn);
  2245. /* The device is paired so there is no need to remove
  2246. * its connection parameters anymore.
  2247. */
  2248. clear_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags);
  2249. hci_conn_put(conn);
  2250. return err;
  2251. }
  2252. void mgmt_smp_complete(struct hci_conn *conn, bool complete)
  2253. {
  2254. u8 status = complete ? MGMT_STATUS_SUCCESS : MGMT_STATUS_FAILED;
  2255. struct mgmt_pending_cmd *cmd;
  2256. cmd = find_pairing(conn);
  2257. if (cmd) {
  2258. cmd->cmd_complete(cmd, status);
  2259. mgmt_pending_remove(cmd);
  2260. }
  2261. }
  2262. static void pairing_complete_cb(struct hci_conn *conn, u8 status)
  2263. {
  2264. struct mgmt_pending_cmd *cmd;
  2265. BT_DBG("status %u", status);
  2266. cmd = find_pairing(conn);
  2267. if (!cmd) {
  2268. BT_DBG("Unable to find a pending command");
  2269. return;
  2270. }
  2271. cmd->cmd_complete(cmd, mgmt_status(status));
  2272. mgmt_pending_remove(cmd);
  2273. }
  2274. static void le_pairing_complete_cb(struct hci_conn *conn, u8 status)
  2275. {
  2276. struct mgmt_pending_cmd *cmd;
  2277. BT_DBG("status %u", status);
  2278. if (!status)
  2279. return;
  2280. cmd = find_pairing(conn);
  2281. if (!cmd) {
  2282. BT_DBG("Unable to find a pending command");
  2283. return;
  2284. }
  2285. cmd->cmd_complete(cmd, mgmt_status(status));
  2286. mgmt_pending_remove(cmd);
  2287. }
  2288. static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
  2289. u16 len)
  2290. {
  2291. struct mgmt_cp_pair_device *cp = data;
  2292. struct mgmt_rp_pair_device rp;
  2293. struct mgmt_pending_cmd *cmd;
  2294. u8 sec_level, auth_type;
  2295. struct hci_conn *conn;
  2296. int err;
  2297. bt_dev_dbg(hdev, "sock %p", sk);
  2298. memset(&rp, 0, sizeof(rp));
  2299. bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
  2300. rp.addr.type = cp->addr.type;
  2301. if (!bdaddr_type_is_valid(cp->addr.type))
  2302. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
  2303. MGMT_STATUS_INVALID_PARAMS,
  2304. &rp, sizeof(rp));
  2305. if (cp->io_cap > SMP_IO_KEYBOARD_DISPLAY)
  2306. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
  2307. MGMT_STATUS_INVALID_PARAMS,
  2308. &rp, sizeof(rp));
  2309. hci_dev_lock(hdev);
  2310. if (!hdev_is_powered(hdev)) {
  2311. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
  2312. MGMT_STATUS_NOT_POWERED, &rp,
  2313. sizeof(rp));
  2314. goto unlock;
  2315. }
  2316. if (hci_bdaddr_is_paired(hdev, &cp->addr.bdaddr, cp->addr.type)) {
  2317. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
  2318. MGMT_STATUS_ALREADY_PAIRED, &rp,
  2319. sizeof(rp));
  2320. goto unlock;
  2321. }
  2322. sec_level = BT_SECURITY_MEDIUM;
  2323. auth_type = HCI_AT_DEDICATED_BONDING;
  2324. if (cp->addr.type == BDADDR_BREDR) {
  2325. conn = hci_connect_acl(hdev, &cp->addr.bdaddr, sec_level,
  2326. auth_type, CONN_REASON_PAIR_DEVICE);
  2327. } else {
  2328. u8 addr_type = le_addr_type(cp->addr.type);
  2329. struct hci_conn_params *p;
  2330. /* When pairing a new device, it is expected to remember
  2331. * this device for future connections. Adding the connection
  2332. * parameter information ahead of time allows tracking
  2333. * of the slave preferred values and will speed up any
  2334. * further connection establishment.
  2335. *
  2336. * If connection parameters already exist, then they
  2337. * will be kept and this function does nothing.
  2338. */
  2339. p = hci_conn_params_add(hdev, &cp->addr.bdaddr, addr_type);
  2340. if (p->auto_connect == HCI_AUTO_CONN_EXPLICIT)
  2341. p->auto_connect = HCI_AUTO_CONN_DISABLED;
  2342. conn = hci_connect_le_scan(hdev, &cp->addr.bdaddr, addr_type,
  2343. sec_level, HCI_LE_CONN_TIMEOUT,
  2344. CONN_REASON_PAIR_DEVICE);
  2345. }
  2346. if (IS_ERR(conn)) {
  2347. int status;
  2348. if (PTR_ERR(conn) == -EBUSY)
  2349. status = MGMT_STATUS_BUSY;
  2350. else if (PTR_ERR(conn) == -EOPNOTSUPP)
  2351. status = MGMT_STATUS_NOT_SUPPORTED;
  2352. else if (PTR_ERR(conn) == -ECONNREFUSED)
  2353. status = MGMT_STATUS_REJECTED;
  2354. else
  2355. status = MGMT_STATUS_CONNECT_FAILED;
  2356. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
  2357. status, &rp, sizeof(rp));
  2358. goto unlock;
  2359. }
  2360. if (conn->connect_cfm_cb) {
  2361. hci_conn_drop(conn);
  2362. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
  2363. MGMT_STATUS_BUSY, &rp, sizeof(rp));
  2364. goto unlock;
  2365. }
  2366. cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
  2367. if (!cmd) {
  2368. err = -ENOMEM;
  2369. hci_conn_drop(conn);
  2370. goto unlock;
  2371. }
  2372. cmd->cmd_complete = pairing_complete;
  2373. /* For LE, just connecting isn't a proof that the pairing finished */
  2374. if (cp->addr.type == BDADDR_BREDR) {
  2375. conn->connect_cfm_cb = pairing_complete_cb;
  2376. conn->security_cfm_cb = pairing_complete_cb;
  2377. conn->disconn_cfm_cb = pairing_complete_cb;
  2378. } else {
  2379. conn->connect_cfm_cb = le_pairing_complete_cb;
  2380. conn->security_cfm_cb = le_pairing_complete_cb;
  2381. conn->disconn_cfm_cb = le_pairing_complete_cb;
  2382. }
  2383. conn->io_capability = cp->io_cap;
  2384. cmd->user_data = hci_conn_get(conn);
  2385. if ((conn->state == BT_CONNECTED || conn->state == BT_CONFIG) &&
  2386. hci_conn_security(conn, sec_level, auth_type, true)) {
  2387. cmd->cmd_complete(cmd, 0);
  2388. mgmt_pending_remove(cmd);
  2389. }
  2390. err = 0;
  2391. unlock:
  2392. hci_dev_unlock(hdev);
  2393. return err;
  2394. }
  2395. static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
  2396. u16 len)
  2397. {
  2398. struct mgmt_addr_info *addr = data;
  2399. struct mgmt_pending_cmd *cmd;
  2400. struct hci_conn *conn;
  2401. int err;
  2402. bt_dev_dbg(hdev, "sock %p", sk);
  2403. hci_dev_lock(hdev);
  2404. if (!hdev_is_powered(hdev)) {
  2405. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
  2406. MGMT_STATUS_NOT_POWERED);
  2407. goto unlock;
  2408. }
  2409. cmd = pending_find(MGMT_OP_PAIR_DEVICE, hdev);
  2410. if (!cmd) {
  2411. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
  2412. MGMT_STATUS_INVALID_PARAMS);
  2413. goto unlock;
  2414. }
  2415. conn = cmd->user_data;
  2416. if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
  2417. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
  2418. MGMT_STATUS_INVALID_PARAMS);
  2419. goto unlock;
  2420. }
  2421. cmd->cmd_complete(cmd, MGMT_STATUS_CANCELLED);
  2422. mgmt_pending_remove(cmd);
  2423. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
  2424. addr, sizeof(*addr));
  2425. /* Since user doesn't want to proceed with the connection, abort any
  2426. * ongoing pairing and then terminate the link if it was created
  2427. * because of the pair device action.
  2428. */
  2429. if (addr->type == BDADDR_BREDR)
  2430. hci_remove_link_key(hdev, &addr->bdaddr);
  2431. else
  2432. smp_cancel_and_remove_pairing(hdev, &addr->bdaddr,
  2433. le_addr_type(addr->type));
  2434. if (conn->conn_reason == CONN_REASON_PAIR_DEVICE)
  2435. hci_abort_conn(conn, HCI_ERROR_REMOTE_USER_TERM);
  2436. unlock:
  2437. hci_dev_unlock(hdev);
  2438. return err;
  2439. }
  2440. static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
  2441. struct mgmt_addr_info *addr, u16 mgmt_op,
  2442. u16 hci_op, __le32 passkey)
  2443. {
  2444. struct mgmt_pending_cmd *cmd;
  2445. struct hci_conn *conn;
  2446. int err;
  2447. hci_dev_lock(hdev);
  2448. if (!hdev_is_powered(hdev)) {
  2449. err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
  2450. MGMT_STATUS_NOT_POWERED, addr,
  2451. sizeof(*addr));
  2452. goto done;
  2453. }
  2454. if (addr->type == BDADDR_BREDR)
  2455. conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
  2456. else
  2457. conn = hci_conn_hash_lookup_le(hdev, &addr->bdaddr,
  2458. le_addr_type(addr->type));
  2459. if (!conn) {
  2460. err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
  2461. MGMT_STATUS_NOT_CONNECTED, addr,
  2462. sizeof(*addr));
  2463. goto done;
  2464. }
  2465. if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) {
  2466. err = smp_user_confirm_reply(conn, mgmt_op, passkey);
  2467. if (!err)
  2468. err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
  2469. MGMT_STATUS_SUCCESS, addr,
  2470. sizeof(*addr));
  2471. else
  2472. err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
  2473. MGMT_STATUS_FAILED, addr,
  2474. sizeof(*addr));
  2475. goto done;
  2476. }
  2477. cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr));
  2478. if (!cmd) {
  2479. err = -ENOMEM;
  2480. goto done;
  2481. }
  2482. cmd->cmd_complete = addr_cmd_complete;
  2483. /* Continue with pairing via HCI */
  2484. if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
  2485. struct hci_cp_user_passkey_reply cp;
  2486. bacpy(&cp.bdaddr, &addr->bdaddr);
  2487. cp.passkey = passkey;
  2488. err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
  2489. } else
  2490. err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr),
  2491. &addr->bdaddr);
  2492. if (err < 0)
  2493. mgmt_pending_remove(cmd);
  2494. done:
  2495. hci_dev_unlock(hdev);
  2496. return err;
  2497. }
  2498. static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
  2499. void *data, u16 len)
  2500. {
  2501. struct mgmt_cp_pin_code_neg_reply *cp = data;
  2502. bt_dev_dbg(hdev, "sock %p", sk);
  2503. return user_pairing_resp(sk, hdev, &cp->addr,
  2504. MGMT_OP_PIN_CODE_NEG_REPLY,
  2505. HCI_OP_PIN_CODE_NEG_REPLY, 0);
  2506. }
  2507. static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
  2508. u16 len)
  2509. {
  2510. struct mgmt_cp_user_confirm_reply *cp = data;
  2511. bt_dev_dbg(hdev, "sock %p", sk);
  2512. if (len != sizeof(*cp))
  2513. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
  2514. MGMT_STATUS_INVALID_PARAMS);
  2515. return user_pairing_resp(sk, hdev, &cp->addr,
  2516. MGMT_OP_USER_CONFIRM_REPLY,
  2517. HCI_OP_USER_CONFIRM_REPLY, 0);
  2518. }
  2519. static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
  2520. void *data, u16 len)
  2521. {
  2522. struct mgmt_cp_user_confirm_neg_reply *cp = data;
  2523. bt_dev_dbg(hdev, "sock %p", sk);
  2524. return user_pairing_resp(sk, hdev, &cp->addr,
  2525. MGMT_OP_USER_CONFIRM_NEG_REPLY,
  2526. HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
  2527. }
  2528. static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
  2529. u16 len)
  2530. {
  2531. struct mgmt_cp_user_passkey_reply *cp = data;
  2532. bt_dev_dbg(hdev, "sock %p", sk);
  2533. return user_pairing_resp(sk, hdev, &cp->addr,
  2534. MGMT_OP_USER_PASSKEY_REPLY,
  2535. HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
  2536. }
  2537. static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
  2538. void *data, u16 len)
  2539. {
  2540. struct mgmt_cp_user_passkey_neg_reply *cp = data;
  2541. bt_dev_dbg(hdev, "sock %p", sk);
  2542. return user_pairing_resp(sk, hdev, &cp->addr,
  2543. MGMT_OP_USER_PASSKEY_NEG_REPLY,
  2544. HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
  2545. }
  2546. static void adv_expire(struct hci_dev *hdev, u32 flags)
  2547. {
  2548. struct adv_info *adv_instance;
  2549. struct hci_request req;
  2550. int err;
  2551. adv_instance = hci_find_adv_instance(hdev, hdev->cur_adv_instance);
  2552. if (!adv_instance)
  2553. return;
  2554. /* stop if current instance doesn't need to be changed */
  2555. if (!(adv_instance->flags & flags))
  2556. return;
  2557. cancel_adv_timeout(hdev);
  2558. adv_instance = hci_get_next_instance(hdev, adv_instance->instance);
  2559. if (!adv_instance)
  2560. return;
  2561. hci_req_init(&req, hdev);
  2562. err = __hci_req_schedule_adv_instance(&req, adv_instance->instance,
  2563. true);
  2564. if (err)
  2565. return;
  2566. hci_req_run(&req, NULL);
  2567. }
  2568. static void set_name_complete(struct hci_dev *hdev, u8 status, u16 opcode)
  2569. {
  2570. struct mgmt_cp_set_local_name *cp;
  2571. struct mgmt_pending_cmd *cmd;
  2572. bt_dev_dbg(hdev, "status 0x%02x", status);
  2573. hci_dev_lock(hdev);
  2574. cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
  2575. if (!cmd)
  2576. goto unlock;
  2577. cp = cmd->param;
  2578. if (status) {
  2579. mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
  2580. mgmt_status(status));
  2581. } else {
  2582. mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
  2583. cp, sizeof(*cp));
  2584. if (hci_dev_test_flag(hdev, HCI_LE_ADV))
  2585. adv_expire(hdev, MGMT_ADV_FLAG_LOCAL_NAME);
  2586. }
  2587. mgmt_pending_remove(cmd);
  2588. unlock:
  2589. hci_dev_unlock(hdev);
  2590. }
  2591. static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
  2592. u16 len)
  2593. {
  2594. struct mgmt_cp_set_local_name *cp = data;
  2595. struct mgmt_pending_cmd *cmd;
  2596. struct hci_request req;
  2597. int err;
  2598. bt_dev_dbg(hdev, "sock %p", sk);
  2599. hci_dev_lock(hdev);
  2600. /* If the old values are the same as the new ones just return a
  2601. * direct command complete event.
  2602. */
  2603. if (!memcmp(hdev->dev_name, cp->name, sizeof(hdev->dev_name)) &&
  2604. !memcmp(hdev->short_name, cp->short_name,
  2605. sizeof(hdev->short_name))) {
  2606. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
  2607. data, len);
  2608. goto failed;
  2609. }
  2610. memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
  2611. if (!hdev_is_powered(hdev)) {
  2612. memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
  2613. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
  2614. data, len);
  2615. if (err < 0)
  2616. goto failed;
  2617. err = mgmt_limited_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data,
  2618. len, HCI_MGMT_LOCAL_NAME_EVENTS, sk);
  2619. ext_info_changed(hdev, sk);
  2620. goto failed;
  2621. }
  2622. cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
  2623. if (!cmd) {
  2624. err = -ENOMEM;
  2625. goto failed;
  2626. }
  2627. memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
  2628. hci_req_init(&req, hdev);
  2629. if (lmp_bredr_capable(hdev)) {
  2630. __hci_req_update_name(&req);
  2631. __hci_req_update_eir(&req);
  2632. }
  2633. /* The name is stored in the scan response data and so
  2634. * no need to udpate the advertising data here.
  2635. */
  2636. if (lmp_le_capable(hdev) && hci_dev_test_flag(hdev, HCI_ADVERTISING))
  2637. __hci_req_update_scan_rsp_data(&req, hdev->cur_adv_instance);
  2638. err = hci_req_run(&req, set_name_complete);
  2639. if (err < 0)
  2640. mgmt_pending_remove(cmd);
  2641. failed:
  2642. hci_dev_unlock(hdev);
  2643. return err;
  2644. }
  2645. static int set_appearance(struct sock *sk, struct hci_dev *hdev, void *data,
  2646. u16 len)
  2647. {
  2648. struct mgmt_cp_set_appearance *cp = data;
  2649. u16 appearance;
  2650. int err;
  2651. bt_dev_dbg(hdev, "sock %p", sk);
  2652. if (!lmp_le_capable(hdev))
  2653. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_APPEARANCE,
  2654. MGMT_STATUS_NOT_SUPPORTED);
  2655. appearance = le16_to_cpu(cp->appearance);
  2656. hci_dev_lock(hdev);
  2657. if (hdev->appearance != appearance) {
  2658. hdev->appearance = appearance;
  2659. if (hci_dev_test_flag(hdev, HCI_LE_ADV))
  2660. adv_expire(hdev, MGMT_ADV_FLAG_APPEARANCE);
  2661. ext_info_changed(hdev, sk);
  2662. }
  2663. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_APPEARANCE, 0, NULL,
  2664. 0);
  2665. hci_dev_unlock(hdev);
  2666. return err;
  2667. }
  2668. static int get_phy_configuration(struct sock *sk, struct hci_dev *hdev,
  2669. void *data, u16 len)
  2670. {
  2671. struct mgmt_rp_get_phy_confguration rp;
  2672. bt_dev_dbg(hdev, "sock %p", sk);
  2673. hci_dev_lock(hdev);
  2674. memset(&rp, 0, sizeof(rp));
  2675. rp.supported_phys = cpu_to_le32(get_supported_phys(hdev));
  2676. rp.selected_phys = cpu_to_le32(get_selected_phys(hdev));
  2677. rp.configurable_phys = cpu_to_le32(get_configurable_phys(hdev));
  2678. hci_dev_unlock(hdev);
  2679. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_PHY_CONFIGURATION, 0,
  2680. &rp, sizeof(rp));
  2681. }
  2682. int mgmt_phy_configuration_changed(struct hci_dev *hdev, struct sock *skip)
  2683. {
  2684. struct mgmt_ev_phy_configuration_changed ev;
  2685. memset(&ev, 0, sizeof(ev));
  2686. ev.selected_phys = cpu_to_le32(get_selected_phys(hdev));
  2687. return mgmt_event(MGMT_EV_PHY_CONFIGURATION_CHANGED, hdev, &ev,
  2688. sizeof(ev), skip);
  2689. }
  2690. static void set_default_phy_complete(struct hci_dev *hdev, u8 status,
  2691. u16 opcode, struct sk_buff *skb)
  2692. {
  2693. struct mgmt_pending_cmd *cmd;
  2694. bt_dev_dbg(hdev, "status 0x%02x", status);
  2695. hci_dev_lock(hdev);
  2696. cmd = pending_find(MGMT_OP_SET_PHY_CONFIGURATION, hdev);
  2697. if (!cmd)
  2698. goto unlock;
  2699. if (status) {
  2700. mgmt_cmd_status(cmd->sk, hdev->id,
  2701. MGMT_OP_SET_PHY_CONFIGURATION,
  2702. mgmt_status(status));
  2703. } else {
  2704. mgmt_cmd_complete(cmd->sk, hdev->id,
  2705. MGMT_OP_SET_PHY_CONFIGURATION, 0,
  2706. NULL, 0);
  2707. mgmt_phy_configuration_changed(hdev, cmd->sk);
  2708. }
  2709. mgmt_pending_remove(cmd);
  2710. unlock:
  2711. hci_dev_unlock(hdev);
  2712. }
  2713. static int set_phy_configuration(struct sock *sk, struct hci_dev *hdev,
  2714. void *data, u16 len)
  2715. {
  2716. struct mgmt_cp_set_phy_confguration *cp = data;
  2717. struct hci_cp_le_set_default_phy cp_phy;
  2718. struct mgmt_pending_cmd *cmd;
  2719. struct hci_request req;
  2720. u32 selected_phys, configurable_phys, supported_phys, unconfigure_phys;
  2721. u16 pkt_type = (HCI_DH1 | HCI_DM1);
  2722. bool changed = false;
  2723. int err;
  2724. bt_dev_dbg(hdev, "sock %p", sk);
  2725. configurable_phys = get_configurable_phys(hdev);
  2726. supported_phys = get_supported_phys(hdev);
  2727. selected_phys = __le32_to_cpu(cp->selected_phys);
  2728. if (selected_phys & ~supported_phys)
  2729. return mgmt_cmd_status(sk, hdev->id,
  2730. MGMT_OP_SET_PHY_CONFIGURATION,
  2731. MGMT_STATUS_INVALID_PARAMS);
  2732. unconfigure_phys = supported_phys & ~configurable_phys;
  2733. if ((selected_phys & unconfigure_phys) != unconfigure_phys)
  2734. return mgmt_cmd_status(sk, hdev->id,
  2735. MGMT_OP_SET_PHY_CONFIGURATION,
  2736. MGMT_STATUS_INVALID_PARAMS);
  2737. if (selected_phys == get_selected_phys(hdev))
  2738. return mgmt_cmd_complete(sk, hdev->id,
  2739. MGMT_OP_SET_PHY_CONFIGURATION,
  2740. 0, NULL, 0);
  2741. hci_dev_lock(hdev);
  2742. if (!hdev_is_powered(hdev)) {
  2743. err = mgmt_cmd_status(sk, hdev->id,
  2744. MGMT_OP_SET_PHY_CONFIGURATION,
  2745. MGMT_STATUS_REJECTED);
  2746. goto unlock;
  2747. }
  2748. if (pending_find(MGMT_OP_SET_PHY_CONFIGURATION, hdev)) {
  2749. err = mgmt_cmd_status(sk, hdev->id,
  2750. MGMT_OP_SET_PHY_CONFIGURATION,
  2751. MGMT_STATUS_BUSY);
  2752. goto unlock;
  2753. }
  2754. if (selected_phys & MGMT_PHY_BR_1M_3SLOT)
  2755. pkt_type |= (HCI_DH3 | HCI_DM3);
  2756. else
  2757. pkt_type &= ~(HCI_DH3 | HCI_DM3);
  2758. if (selected_phys & MGMT_PHY_BR_1M_5SLOT)
  2759. pkt_type |= (HCI_DH5 | HCI_DM5);
  2760. else
  2761. pkt_type &= ~(HCI_DH5 | HCI_DM5);
  2762. if (selected_phys & MGMT_PHY_EDR_2M_1SLOT)
  2763. pkt_type &= ~HCI_2DH1;
  2764. else
  2765. pkt_type |= HCI_2DH1;
  2766. if (selected_phys & MGMT_PHY_EDR_2M_3SLOT)
  2767. pkt_type &= ~HCI_2DH3;
  2768. else
  2769. pkt_type |= HCI_2DH3;
  2770. if (selected_phys & MGMT_PHY_EDR_2M_5SLOT)
  2771. pkt_type &= ~HCI_2DH5;
  2772. else
  2773. pkt_type |= HCI_2DH5;
  2774. if (selected_phys & MGMT_PHY_EDR_3M_1SLOT)
  2775. pkt_type &= ~HCI_3DH1;
  2776. else
  2777. pkt_type |= HCI_3DH1;
  2778. if (selected_phys & MGMT_PHY_EDR_3M_3SLOT)
  2779. pkt_type &= ~HCI_3DH3;
  2780. else
  2781. pkt_type |= HCI_3DH3;
  2782. if (selected_phys & MGMT_PHY_EDR_3M_5SLOT)
  2783. pkt_type &= ~HCI_3DH5;
  2784. else
  2785. pkt_type |= HCI_3DH5;
  2786. if (pkt_type != hdev->pkt_type) {
  2787. hdev->pkt_type = pkt_type;
  2788. changed = true;
  2789. }
  2790. if ((selected_phys & MGMT_PHY_LE_MASK) ==
  2791. (get_selected_phys(hdev) & MGMT_PHY_LE_MASK)) {
  2792. if (changed)
  2793. mgmt_phy_configuration_changed(hdev, sk);
  2794. err = mgmt_cmd_complete(sk, hdev->id,
  2795. MGMT_OP_SET_PHY_CONFIGURATION,
  2796. 0, NULL, 0);
  2797. goto unlock;
  2798. }
  2799. cmd = mgmt_pending_add(sk, MGMT_OP_SET_PHY_CONFIGURATION, hdev, data,
  2800. len);
  2801. if (!cmd) {
  2802. err = -ENOMEM;
  2803. goto unlock;
  2804. }
  2805. hci_req_init(&req, hdev);
  2806. memset(&cp_phy, 0, sizeof(cp_phy));
  2807. if (!(selected_phys & MGMT_PHY_LE_TX_MASK))
  2808. cp_phy.all_phys |= 0x01;
  2809. if (!(selected_phys & MGMT_PHY_LE_RX_MASK))
  2810. cp_phy.all_phys |= 0x02;
  2811. if (selected_phys & MGMT_PHY_LE_1M_TX)
  2812. cp_phy.tx_phys |= HCI_LE_SET_PHY_1M;
  2813. if (selected_phys & MGMT_PHY_LE_2M_TX)
  2814. cp_phy.tx_phys |= HCI_LE_SET_PHY_2M;
  2815. if (selected_phys & MGMT_PHY_LE_CODED_TX)
  2816. cp_phy.tx_phys |= HCI_LE_SET_PHY_CODED;
  2817. if (selected_phys & MGMT_PHY_LE_1M_RX)
  2818. cp_phy.rx_phys |= HCI_LE_SET_PHY_1M;
  2819. if (selected_phys & MGMT_PHY_LE_2M_RX)
  2820. cp_phy.rx_phys |= HCI_LE_SET_PHY_2M;
  2821. if (selected_phys & MGMT_PHY_LE_CODED_RX)
  2822. cp_phy.rx_phys |= HCI_LE_SET_PHY_CODED;
  2823. hci_req_add(&req, HCI_OP_LE_SET_DEFAULT_PHY, sizeof(cp_phy), &cp_phy);
  2824. err = hci_req_run_skb(&req, set_default_phy_complete);
  2825. if (err < 0)
  2826. mgmt_pending_remove(cmd);
  2827. unlock:
  2828. hci_dev_unlock(hdev);
  2829. return err;
  2830. }
  2831. static int set_blocked_keys(struct sock *sk, struct hci_dev *hdev, void *data,
  2832. u16 len)
  2833. {
  2834. int err = MGMT_STATUS_SUCCESS;
  2835. struct mgmt_cp_set_blocked_keys *keys = data;
  2836. const u16 max_key_count = ((U16_MAX - sizeof(*keys)) /
  2837. sizeof(struct mgmt_blocked_key_info));
  2838. u16 key_count, expected_len;
  2839. int i;
  2840. bt_dev_dbg(hdev, "sock %p", sk);
  2841. key_count = __le16_to_cpu(keys->key_count);
  2842. if (key_count > max_key_count) {
  2843. bt_dev_err(hdev, "too big key_count value %u", key_count);
  2844. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BLOCKED_KEYS,
  2845. MGMT_STATUS_INVALID_PARAMS);
  2846. }
  2847. expected_len = struct_size(keys, keys, key_count);
  2848. if (expected_len != len) {
  2849. bt_dev_err(hdev, "expected %u bytes, got %u bytes",
  2850. expected_len, len);
  2851. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BLOCKED_KEYS,
  2852. MGMT_STATUS_INVALID_PARAMS);
  2853. }
  2854. hci_dev_lock(hdev);
  2855. hci_blocked_keys_clear(hdev);
  2856. for (i = 0; i < keys->key_count; ++i) {
  2857. struct blocked_key *b = kzalloc(sizeof(*b), GFP_KERNEL);
  2858. if (!b) {
  2859. err = MGMT_STATUS_NO_RESOURCES;
  2860. break;
  2861. }
  2862. b->type = keys->keys[i].type;
  2863. memcpy(b->val, keys->keys[i].val, sizeof(b->val));
  2864. list_add_rcu(&b->list, &hdev->blocked_keys);
  2865. }
  2866. hci_dev_unlock(hdev);
  2867. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_BLOCKED_KEYS,
  2868. err, NULL, 0);
  2869. }
  2870. static int set_wideband_speech(struct sock *sk, struct hci_dev *hdev,
  2871. void *data, u16 len)
  2872. {
  2873. struct mgmt_mode *cp = data;
  2874. int err;
  2875. bool changed = false;
  2876. bt_dev_dbg(hdev, "sock %p", sk);
  2877. if (!test_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks))
  2878. return mgmt_cmd_status(sk, hdev->id,
  2879. MGMT_OP_SET_WIDEBAND_SPEECH,
  2880. MGMT_STATUS_NOT_SUPPORTED);
  2881. if (cp->val != 0x00 && cp->val != 0x01)
  2882. return mgmt_cmd_status(sk, hdev->id,
  2883. MGMT_OP_SET_WIDEBAND_SPEECH,
  2884. MGMT_STATUS_INVALID_PARAMS);
  2885. hci_dev_lock(hdev);
  2886. if (pending_find(MGMT_OP_SET_WIDEBAND_SPEECH, hdev)) {
  2887. err = mgmt_cmd_status(sk, hdev->id,
  2888. MGMT_OP_SET_WIDEBAND_SPEECH,
  2889. MGMT_STATUS_BUSY);
  2890. goto unlock;
  2891. }
  2892. if (hdev_is_powered(hdev) &&
  2893. !!cp->val != hci_dev_test_flag(hdev,
  2894. HCI_WIDEBAND_SPEECH_ENABLED)) {
  2895. err = mgmt_cmd_status(sk, hdev->id,
  2896. MGMT_OP_SET_WIDEBAND_SPEECH,
  2897. MGMT_STATUS_REJECTED);
  2898. goto unlock;
  2899. }
  2900. if (cp->val)
  2901. changed = !hci_dev_test_and_set_flag(hdev,
  2902. HCI_WIDEBAND_SPEECH_ENABLED);
  2903. else
  2904. changed = hci_dev_test_and_clear_flag(hdev,
  2905. HCI_WIDEBAND_SPEECH_ENABLED);
  2906. err = send_settings_rsp(sk, MGMT_OP_SET_WIDEBAND_SPEECH, hdev);
  2907. if (err < 0)
  2908. goto unlock;
  2909. if (changed)
  2910. err = new_settings(hdev, sk);
  2911. unlock:
  2912. hci_dev_unlock(hdev);
  2913. return err;
  2914. }
  2915. static int read_security_info(struct sock *sk, struct hci_dev *hdev,
  2916. void *data, u16 data_len)
  2917. {
  2918. char buf[16];
  2919. struct mgmt_rp_read_security_info *rp = (void *)buf;
  2920. u16 sec_len = 0;
  2921. u8 flags = 0;
  2922. bt_dev_dbg(hdev, "sock %p", sk);
  2923. memset(&buf, 0, sizeof(buf));
  2924. hci_dev_lock(hdev);
  2925. /* When the Read Simple Pairing Options command is supported, then
  2926. * the remote public key validation is supported.
  2927. */
  2928. if (hdev->commands[41] & 0x08)
  2929. flags |= 0x01; /* Remote public key validation (BR/EDR) */
  2930. flags |= 0x02; /* Remote public key validation (LE) */
  2931. /* When the Read Encryption Key Size command is supported, then the
  2932. * encryption key size is enforced.
  2933. */
  2934. if (hdev->commands[20] & 0x10)
  2935. flags |= 0x04; /* Encryption key size enforcement (BR/EDR) */
  2936. flags |= 0x08; /* Encryption key size enforcement (LE) */
  2937. sec_len = eir_append_data(rp->sec, sec_len, 0x01, &flags, 1);
  2938. /* When the Read Simple Pairing Options command is supported, then
  2939. * also max encryption key size information is provided.
  2940. */
  2941. if (hdev->commands[41] & 0x08)
  2942. sec_len = eir_append_le16(rp->sec, sec_len, 0x02,
  2943. hdev->max_enc_key_size);
  2944. sec_len = eir_append_le16(rp->sec, sec_len, 0x03, SMP_MAX_ENC_KEY_SIZE);
  2945. rp->sec_len = cpu_to_le16(sec_len);
  2946. hci_dev_unlock(hdev);
  2947. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_SECURITY_INFO, 0,
  2948. rp, sizeof(*rp) + sec_len);
  2949. }
  2950. #ifdef CONFIG_BT_FEATURE_DEBUG
  2951. /* d4992530-b9ec-469f-ab01-6c481c47da1c */
  2952. static const u8 debug_uuid[16] = {
  2953. 0x1c, 0xda, 0x47, 0x1c, 0x48, 0x6c, 0x01, 0xab,
  2954. 0x9f, 0x46, 0xec, 0xb9, 0x30, 0x25, 0x99, 0xd4,
  2955. };
  2956. #endif
  2957. /* 671b10b5-42c0-4696-9227-eb28d1b049d6 */
  2958. static const u8 simult_central_periph_uuid[16] = {
  2959. 0xd6, 0x49, 0xb0, 0xd1, 0x28, 0xeb, 0x27, 0x92,
  2960. 0x96, 0x46, 0xc0, 0x42, 0xb5, 0x10, 0x1b, 0x67,
  2961. };
  2962. /* 15c0a148-c273-11ea-b3de-0242ac130004 */
  2963. static const u8 rpa_resolution_uuid[16] = {
  2964. 0x04, 0x00, 0x13, 0xac, 0x42, 0x02, 0xde, 0xb3,
  2965. 0xea, 0x11, 0x73, 0xc2, 0x48, 0xa1, 0xc0, 0x15,
  2966. };
  2967. static int read_exp_features_info(struct sock *sk, struct hci_dev *hdev,
  2968. void *data, u16 data_len)
  2969. {
  2970. char buf[62]; /* Enough space for 3 features */
  2971. struct mgmt_rp_read_exp_features_info *rp = (void *)buf;
  2972. u16 idx = 0;
  2973. u32 flags;
  2974. bt_dev_dbg(hdev, "sock %p", sk);
  2975. memset(&buf, 0, sizeof(buf));
  2976. #ifdef CONFIG_BT_FEATURE_DEBUG
  2977. if (!hdev) {
  2978. flags = bt_dbg_get() ? BIT(0) : 0;
  2979. memcpy(rp->features[idx].uuid, debug_uuid, 16);
  2980. rp->features[idx].flags = cpu_to_le32(flags);
  2981. idx++;
  2982. }
  2983. #endif
  2984. if (hdev) {
  2985. if (test_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks) &&
  2986. (hdev->le_states[4] & 0x08) && /* Central */
  2987. (hdev->le_states[4] & 0x40) && /* Peripheral */
  2988. (hdev->le_states[3] & 0x10)) /* Simultaneous */
  2989. flags = BIT(0);
  2990. else
  2991. flags = 0;
  2992. memcpy(rp->features[idx].uuid, simult_central_periph_uuid, 16);
  2993. rp->features[idx].flags = cpu_to_le32(flags);
  2994. idx++;
  2995. }
  2996. if (hdev && use_ll_privacy(hdev)) {
  2997. if (hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY))
  2998. flags = BIT(0) | BIT(1);
  2999. else
  3000. flags = BIT(1);
  3001. memcpy(rp->features[idx].uuid, rpa_resolution_uuid, 16);
  3002. rp->features[idx].flags = cpu_to_le32(flags);
  3003. idx++;
  3004. }
  3005. rp->feature_count = cpu_to_le16(idx);
  3006. /* After reading the experimental features information, enable
  3007. * the events to update client on any future change.
  3008. */
  3009. hci_sock_set_flag(sk, HCI_MGMT_EXP_FEATURE_EVENTS);
  3010. return mgmt_cmd_complete(sk, hdev ? hdev->id : MGMT_INDEX_NONE,
  3011. MGMT_OP_READ_EXP_FEATURES_INFO,
  3012. 0, rp, sizeof(*rp) + (20 * idx));
  3013. }
  3014. static int exp_ll_privacy_feature_changed(bool enabled, struct hci_dev *hdev,
  3015. struct sock *skip)
  3016. {
  3017. struct mgmt_ev_exp_feature_changed ev;
  3018. memset(&ev, 0, sizeof(ev));
  3019. memcpy(ev.uuid, rpa_resolution_uuid, 16);
  3020. ev.flags = cpu_to_le32((enabled ? BIT(0) : 0) | BIT(1));
  3021. return mgmt_limited_event(MGMT_EV_EXP_FEATURE_CHANGED, hdev,
  3022. &ev, sizeof(ev),
  3023. HCI_MGMT_EXP_FEATURE_EVENTS, skip);
  3024. }
  3025. #ifdef CONFIG_BT_FEATURE_DEBUG
  3026. static int exp_debug_feature_changed(bool enabled, struct sock *skip)
  3027. {
  3028. struct mgmt_ev_exp_feature_changed ev;
  3029. memset(&ev, 0, sizeof(ev));
  3030. memcpy(ev.uuid, debug_uuid, 16);
  3031. ev.flags = cpu_to_le32(enabled ? BIT(0) : 0);
  3032. return mgmt_limited_event(MGMT_EV_EXP_FEATURE_CHANGED, NULL,
  3033. &ev, sizeof(ev),
  3034. HCI_MGMT_EXP_FEATURE_EVENTS, skip);
  3035. }
  3036. #endif
  3037. static int set_exp_feature(struct sock *sk, struct hci_dev *hdev,
  3038. void *data, u16 data_len)
  3039. {
  3040. struct mgmt_cp_set_exp_feature *cp = data;
  3041. struct mgmt_rp_set_exp_feature rp;
  3042. bt_dev_dbg(hdev, "sock %p", sk);
  3043. if (!memcmp(cp->uuid, ZERO_KEY, 16)) {
  3044. memset(rp.uuid, 0, 16);
  3045. rp.flags = cpu_to_le32(0);
  3046. #ifdef CONFIG_BT_FEATURE_DEBUG
  3047. if (!hdev) {
  3048. bool changed = bt_dbg_get();
  3049. bt_dbg_set(false);
  3050. if (changed)
  3051. exp_debug_feature_changed(false, sk);
  3052. }
  3053. #endif
  3054. if (hdev && use_ll_privacy(hdev) && !hdev_is_powered(hdev)) {
  3055. bool changed = hci_dev_test_flag(hdev,
  3056. HCI_ENABLE_LL_PRIVACY);
  3057. hci_dev_clear_flag(hdev, HCI_ENABLE_LL_PRIVACY);
  3058. if (changed)
  3059. exp_ll_privacy_feature_changed(false, hdev, sk);
  3060. }
  3061. hci_sock_set_flag(sk, HCI_MGMT_EXP_FEATURE_EVENTS);
  3062. return mgmt_cmd_complete(sk, hdev ? hdev->id : MGMT_INDEX_NONE,
  3063. MGMT_OP_SET_EXP_FEATURE, 0,
  3064. &rp, sizeof(rp));
  3065. }
  3066. #ifdef CONFIG_BT_FEATURE_DEBUG
  3067. if (!memcmp(cp->uuid, debug_uuid, 16)) {
  3068. bool val, changed;
  3069. int err;
  3070. /* Command requires to use the non-controller index */
  3071. if (hdev)
  3072. return mgmt_cmd_status(sk, hdev->id,
  3073. MGMT_OP_SET_EXP_FEATURE,
  3074. MGMT_STATUS_INVALID_INDEX);
  3075. /* Parameters are limited to a single octet */
  3076. if (data_len != MGMT_SET_EXP_FEATURE_SIZE + 1)
  3077. return mgmt_cmd_status(sk, MGMT_INDEX_NONE,
  3078. MGMT_OP_SET_EXP_FEATURE,
  3079. MGMT_STATUS_INVALID_PARAMS);
  3080. /* Only boolean on/off is supported */
  3081. if (cp->param[0] != 0x00 && cp->param[0] != 0x01)
  3082. return mgmt_cmd_status(sk, MGMT_INDEX_NONE,
  3083. MGMT_OP_SET_EXP_FEATURE,
  3084. MGMT_STATUS_INVALID_PARAMS);
  3085. val = !!cp->param[0];
  3086. changed = val ? !bt_dbg_get() : bt_dbg_get();
  3087. bt_dbg_set(val);
  3088. memcpy(rp.uuid, debug_uuid, 16);
  3089. rp.flags = cpu_to_le32(val ? BIT(0) : 0);
  3090. hci_sock_set_flag(sk, HCI_MGMT_EXP_FEATURE_EVENTS);
  3091. err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE,
  3092. MGMT_OP_SET_EXP_FEATURE, 0,
  3093. &rp, sizeof(rp));
  3094. if (changed)
  3095. exp_debug_feature_changed(val, sk);
  3096. return err;
  3097. }
  3098. #endif
  3099. if (!memcmp(cp->uuid, rpa_resolution_uuid, 16)) {
  3100. bool val, changed;
  3101. int err;
  3102. u32 flags;
  3103. /* Command requires to use the controller index */
  3104. if (!hdev)
  3105. return mgmt_cmd_status(sk, MGMT_INDEX_NONE,
  3106. MGMT_OP_SET_EXP_FEATURE,
  3107. MGMT_STATUS_INVALID_INDEX);
  3108. /* Changes can only be made when controller is powered down */
  3109. if (hdev_is_powered(hdev))
  3110. return mgmt_cmd_status(sk, hdev->id,
  3111. MGMT_OP_SET_EXP_FEATURE,
  3112. MGMT_STATUS_NOT_POWERED);
  3113. /* Parameters are limited to a single octet */
  3114. if (data_len != MGMT_SET_EXP_FEATURE_SIZE + 1)
  3115. return mgmt_cmd_status(sk, hdev->id,
  3116. MGMT_OP_SET_EXP_FEATURE,
  3117. MGMT_STATUS_INVALID_PARAMS);
  3118. /* Only boolean on/off is supported */
  3119. if (cp->param[0] != 0x00 && cp->param[0] != 0x01)
  3120. return mgmt_cmd_status(sk, hdev->id,
  3121. MGMT_OP_SET_EXP_FEATURE,
  3122. MGMT_STATUS_INVALID_PARAMS);
  3123. val = !!cp->param[0];
  3124. if (val) {
  3125. changed = !hci_dev_test_flag(hdev,
  3126. HCI_ENABLE_LL_PRIVACY);
  3127. hci_dev_set_flag(hdev, HCI_ENABLE_LL_PRIVACY);
  3128. hci_dev_clear_flag(hdev, HCI_ADVERTISING);
  3129. /* Enable LL privacy + supported settings changed */
  3130. flags = BIT(0) | BIT(1);
  3131. } else {
  3132. changed = hci_dev_test_flag(hdev,
  3133. HCI_ENABLE_LL_PRIVACY);
  3134. hci_dev_clear_flag(hdev, HCI_ENABLE_LL_PRIVACY);
  3135. /* Disable LL privacy + supported settings changed */
  3136. flags = BIT(1);
  3137. }
  3138. memcpy(rp.uuid, rpa_resolution_uuid, 16);
  3139. rp.flags = cpu_to_le32(flags);
  3140. hci_sock_set_flag(sk, HCI_MGMT_EXP_FEATURE_EVENTS);
  3141. err = mgmt_cmd_complete(sk, hdev->id,
  3142. MGMT_OP_SET_EXP_FEATURE, 0,
  3143. &rp, sizeof(rp));
  3144. if (changed)
  3145. exp_ll_privacy_feature_changed(val, hdev, sk);
  3146. return err;
  3147. }
  3148. return mgmt_cmd_status(sk, hdev ? hdev->id : MGMT_INDEX_NONE,
  3149. MGMT_OP_SET_EXP_FEATURE,
  3150. MGMT_STATUS_NOT_SUPPORTED);
  3151. }
  3152. #define SUPPORTED_DEVICE_FLAGS() ((1U << HCI_CONN_FLAG_MAX) - 1)
  3153. static int get_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
  3154. u16 data_len)
  3155. {
  3156. struct mgmt_cp_get_device_flags *cp = data;
  3157. struct mgmt_rp_get_device_flags rp;
  3158. struct bdaddr_list_with_flags *br_params;
  3159. struct hci_conn_params *params;
  3160. u32 supported_flags = SUPPORTED_DEVICE_FLAGS();
  3161. u32 current_flags = 0;
  3162. u8 status = MGMT_STATUS_INVALID_PARAMS;
  3163. bt_dev_dbg(hdev, "Get device flags %pMR (type 0x%x)\n",
  3164. &cp->addr.bdaddr, cp->addr.type);
  3165. hci_dev_lock(hdev);
  3166. memset(&rp, 0, sizeof(rp));
  3167. if (cp->addr.type == BDADDR_BREDR) {
  3168. br_params = hci_bdaddr_list_lookup_with_flags(&hdev->whitelist,
  3169. &cp->addr.bdaddr,
  3170. cp->addr.type);
  3171. if (!br_params)
  3172. goto done;
  3173. current_flags = br_params->current_flags;
  3174. } else {
  3175. params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr,
  3176. le_addr_type(cp->addr.type));
  3177. if (!params)
  3178. goto done;
  3179. current_flags = params->current_flags;
  3180. }
  3181. bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
  3182. rp.addr.type = cp->addr.type;
  3183. rp.supported_flags = cpu_to_le32(supported_flags);
  3184. rp.current_flags = cpu_to_le32(current_flags);
  3185. status = MGMT_STATUS_SUCCESS;
  3186. done:
  3187. hci_dev_unlock(hdev);
  3188. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_DEVICE_FLAGS, status,
  3189. &rp, sizeof(rp));
  3190. }
  3191. static void device_flags_changed(struct sock *sk, struct hci_dev *hdev,
  3192. bdaddr_t *bdaddr, u8 bdaddr_type,
  3193. u32 supported_flags, u32 current_flags)
  3194. {
  3195. struct mgmt_ev_device_flags_changed ev;
  3196. bacpy(&ev.addr.bdaddr, bdaddr);
  3197. ev.addr.type = bdaddr_type;
  3198. ev.supported_flags = cpu_to_le32(supported_flags);
  3199. ev.current_flags = cpu_to_le32(current_flags);
  3200. mgmt_event(MGMT_EV_DEVICE_FLAGS_CHANGED, hdev, &ev, sizeof(ev), sk);
  3201. }
  3202. static int set_device_flags(struct sock *sk, struct hci_dev *hdev, void *data,
  3203. u16 len)
  3204. {
  3205. struct mgmt_cp_set_device_flags *cp = data;
  3206. struct bdaddr_list_with_flags *br_params;
  3207. struct hci_conn_params *params;
  3208. u8 status = MGMT_STATUS_INVALID_PARAMS;
  3209. u32 supported_flags = SUPPORTED_DEVICE_FLAGS();
  3210. u32 current_flags = __le32_to_cpu(cp->current_flags);
  3211. bt_dev_dbg(hdev, "Set device flags %pMR (type 0x%x) = 0x%x",
  3212. &cp->addr.bdaddr, cp->addr.type,
  3213. __le32_to_cpu(current_flags));
  3214. if ((supported_flags | current_flags) != supported_flags) {
  3215. bt_dev_warn(hdev, "Bad flag given (0x%x) vs supported (0x%0x)",
  3216. current_flags, supported_flags);
  3217. goto done;
  3218. }
  3219. hci_dev_lock(hdev);
  3220. if (cp->addr.type == BDADDR_BREDR) {
  3221. br_params = hci_bdaddr_list_lookup_with_flags(&hdev->whitelist,
  3222. &cp->addr.bdaddr,
  3223. cp->addr.type);
  3224. if (br_params) {
  3225. br_params->current_flags = current_flags;
  3226. status = MGMT_STATUS_SUCCESS;
  3227. } else {
  3228. bt_dev_warn(hdev, "No such BR/EDR device %pMR (0x%x)",
  3229. &cp->addr.bdaddr, cp->addr.type);
  3230. }
  3231. } else {
  3232. params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr,
  3233. le_addr_type(cp->addr.type));
  3234. if (params) {
  3235. params->current_flags = current_flags;
  3236. status = MGMT_STATUS_SUCCESS;
  3237. } else {
  3238. bt_dev_warn(hdev, "No such LE device %pMR (0x%x)",
  3239. &cp->addr.bdaddr,
  3240. le_addr_type(cp->addr.type));
  3241. }
  3242. }
  3243. done:
  3244. hci_dev_unlock(hdev);
  3245. if (status == MGMT_STATUS_SUCCESS)
  3246. device_flags_changed(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
  3247. supported_flags, current_flags);
  3248. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_FLAGS, status,
  3249. &cp->addr, sizeof(cp->addr));
  3250. }
  3251. static void mgmt_adv_monitor_added(struct sock *sk, struct hci_dev *hdev,
  3252. u16 handle)
  3253. {
  3254. struct mgmt_ev_adv_monitor_added ev;
  3255. ev.monitor_handle = cpu_to_le16(handle);
  3256. mgmt_event(MGMT_EV_ADV_MONITOR_ADDED, hdev, &ev, sizeof(ev), sk);
  3257. }
  3258. static void mgmt_adv_monitor_removed(struct sock *sk, struct hci_dev *hdev,
  3259. u16 handle)
  3260. {
  3261. struct mgmt_ev_adv_monitor_added ev;
  3262. ev.monitor_handle = cpu_to_le16(handle);
  3263. mgmt_event(MGMT_EV_ADV_MONITOR_REMOVED, hdev, &ev, sizeof(ev), sk);
  3264. }
  3265. static int read_adv_mon_features(struct sock *sk, struct hci_dev *hdev,
  3266. void *data, u16 len)
  3267. {
  3268. struct adv_monitor *monitor = NULL;
  3269. struct mgmt_rp_read_adv_monitor_features *rp = NULL;
  3270. int handle, err;
  3271. size_t rp_size = 0;
  3272. __u32 supported = 0;
  3273. __u16 num_handles = 0;
  3274. __u16 handles[HCI_MAX_ADV_MONITOR_NUM_HANDLES];
  3275. BT_DBG("request for %s", hdev->name);
  3276. hci_dev_lock(hdev);
  3277. if (msft_get_features(hdev) & MSFT_FEATURE_MASK_LE_ADV_MONITOR)
  3278. supported |= MGMT_ADV_MONITOR_FEATURE_MASK_OR_PATTERNS;
  3279. idr_for_each_entry(&hdev->adv_monitors_idr, monitor, handle) {
  3280. handles[num_handles++] = monitor->handle;
  3281. }
  3282. hci_dev_unlock(hdev);
  3283. rp_size = sizeof(*rp) + (num_handles * sizeof(u16));
  3284. rp = kmalloc(rp_size, GFP_KERNEL);
  3285. if (!rp)
  3286. return -ENOMEM;
  3287. /* Once controller-based monitoring is in place, the enabled_features
  3288. * should reflect the use.
  3289. */
  3290. rp->supported_features = cpu_to_le32(supported);
  3291. rp->enabled_features = 0;
  3292. rp->max_num_handles = cpu_to_le16(HCI_MAX_ADV_MONITOR_NUM_HANDLES);
  3293. rp->max_num_patterns = HCI_MAX_ADV_MONITOR_NUM_PATTERNS;
  3294. rp->num_handles = cpu_to_le16(num_handles);
  3295. if (num_handles)
  3296. memcpy(&rp->handles, &handles, (num_handles * sizeof(u16)));
  3297. err = mgmt_cmd_complete(sk, hdev->id,
  3298. MGMT_OP_READ_ADV_MONITOR_FEATURES,
  3299. MGMT_STATUS_SUCCESS, rp, rp_size);
  3300. kfree(rp);
  3301. return err;
  3302. }
  3303. static int add_adv_patterns_monitor(struct sock *sk, struct hci_dev *hdev,
  3304. void *data, u16 len)
  3305. {
  3306. struct mgmt_cp_add_adv_patterns_monitor *cp = data;
  3307. struct mgmt_rp_add_adv_patterns_monitor rp;
  3308. struct adv_monitor *m = NULL;
  3309. struct adv_pattern *p = NULL;
  3310. unsigned int mp_cnt = 0, prev_adv_monitors_cnt;
  3311. __u8 cp_ofst = 0, cp_len = 0;
  3312. int err, i;
  3313. BT_DBG("request for %s", hdev->name);
  3314. if (len <= sizeof(*cp) || cp->pattern_count == 0) {
  3315. err = mgmt_cmd_status(sk, hdev->id,
  3316. MGMT_OP_ADD_ADV_PATTERNS_MONITOR,
  3317. MGMT_STATUS_INVALID_PARAMS);
  3318. goto failed;
  3319. }
  3320. m = kmalloc(sizeof(*m), GFP_KERNEL);
  3321. if (!m) {
  3322. err = -ENOMEM;
  3323. goto failed;
  3324. }
  3325. INIT_LIST_HEAD(&m->patterns);
  3326. m->active = false;
  3327. for (i = 0; i < cp->pattern_count; i++) {
  3328. if (++mp_cnt > HCI_MAX_ADV_MONITOR_NUM_PATTERNS) {
  3329. err = mgmt_cmd_status(sk, hdev->id,
  3330. MGMT_OP_ADD_ADV_PATTERNS_MONITOR,
  3331. MGMT_STATUS_INVALID_PARAMS);
  3332. goto failed;
  3333. }
  3334. cp_ofst = cp->patterns[i].offset;
  3335. cp_len = cp->patterns[i].length;
  3336. if (cp_ofst >= HCI_MAX_AD_LENGTH ||
  3337. cp_len > HCI_MAX_AD_LENGTH ||
  3338. (cp_ofst + cp_len) > HCI_MAX_AD_LENGTH) {
  3339. err = mgmt_cmd_status(sk, hdev->id,
  3340. MGMT_OP_ADD_ADV_PATTERNS_MONITOR,
  3341. MGMT_STATUS_INVALID_PARAMS);
  3342. goto failed;
  3343. }
  3344. p = kmalloc(sizeof(*p), GFP_KERNEL);
  3345. if (!p) {
  3346. err = -ENOMEM;
  3347. goto failed;
  3348. }
  3349. p->ad_type = cp->patterns[i].ad_type;
  3350. p->offset = cp->patterns[i].offset;
  3351. p->length = cp->patterns[i].length;
  3352. memcpy(p->value, cp->patterns[i].value, p->length);
  3353. INIT_LIST_HEAD(&p->list);
  3354. list_add(&p->list, &m->patterns);
  3355. }
  3356. if (mp_cnt != cp->pattern_count) {
  3357. err = mgmt_cmd_status(sk, hdev->id,
  3358. MGMT_OP_ADD_ADV_PATTERNS_MONITOR,
  3359. MGMT_STATUS_INVALID_PARAMS);
  3360. goto failed;
  3361. }
  3362. hci_dev_lock(hdev);
  3363. prev_adv_monitors_cnt = hdev->adv_monitors_cnt;
  3364. err = hci_add_adv_monitor(hdev, m);
  3365. if (err) {
  3366. if (err == -ENOSPC) {
  3367. mgmt_cmd_status(sk, hdev->id,
  3368. MGMT_OP_ADD_ADV_PATTERNS_MONITOR,
  3369. MGMT_STATUS_NO_RESOURCES);
  3370. }
  3371. goto unlock;
  3372. }
  3373. if (hdev->adv_monitors_cnt > prev_adv_monitors_cnt)
  3374. mgmt_adv_monitor_added(sk, hdev, m->handle);
  3375. hci_dev_unlock(hdev);
  3376. rp.monitor_handle = cpu_to_le16(m->handle);
  3377. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_ADV_PATTERNS_MONITOR,
  3378. MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
  3379. unlock:
  3380. hci_dev_unlock(hdev);
  3381. failed:
  3382. hci_free_adv_monitor(m);
  3383. return err;
  3384. }
  3385. static int remove_adv_monitor(struct sock *sk, struct hci_dev *hdev,
  3386. void *data, u16 len)
  3387. {
  3388. struct mgmt_cp_remove_adv_monitor *cp = data;
  3389. struct mgmt_rp_remove_adv_monitor rp;
  3390. unsigned int prev_adv_monitors_cnt;
  3391. u16 handle;
  3392. int err;
  3393. BT_DBG("request for %s", hdev->name);
  3394. hci_dev_lock(hdev);
  3395. handle = __le16_to_cpu(cp->monitor_handle);
  3396. prev_adv_monitors_cnt = hdev->adv_monitors_cnt;
  3397. err = hci_remove_adv_monitor(hdev, handle);
  3398. if (err == -ENOENT) {
  3399. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADV_MONITOR,
  3400. MGMT_STATUS_INVALID_INDEX);
  3401. goto unlock;
  3402. }
  3403. if (hdev->adv_monitors_cnt < prev_adv_monitors_cnt)
  3404. mgmt_adv_monitor_removed(sk, hdev, handle);
  3405. hci_dev_unlock(hdev);
  3406. rp.monitor_handle = cp->monitor_handle;
  3407. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_ADV_MONITOR,
  3408. MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
  3409. unlock:
  3410. hci_dev_unlock(hdev);
  3411. return err;
  3412. }
  3413. static void read_local_oob_data_complete(struct hci_dev *hdev, u8 status,
  3414. u16 opcode, struct sk_buff *skb)
  3415. {
  3416. struct mgmt_rp_read_local_oob_data mgmt_rp;
  3417. size_t rp_size = sizeof(mgmt_rp);
  3418. struct mgmt_pending_cmd *cmd;
  3419. bt_dev_dbg(hdev, "status %u", status);
  3420. cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
  3421. if (!cmd)
  3422. return;
  3423. if (status || !skb) {
  3424. mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
  3425. status ? mgmt_status(status) : MGMT_STATUS_FAILED);
  3426. goto remove;
  3427. }
  3428. memset(&mgmt_rp, 0, sizeof(mgmt_rp));
  3429. if (opcode == HCI_OP_READ_LOCAL_OOB_DATA) {
  3430. struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
  3431. if (skb->len < sizeof(*rp)) {
  3432. mgmt_cmd_status(cmd->sk, hdev->id,
  3433. MGMT_OP_READ_LOCAL_OOB_DATA,
  3434. MGMT_STATUS_FAILED);
  3435. goto remove;
  3436. }
  3437. memcpy(mgmt_rp.hash192, rp->hash, sizeof(rp->hash));
  3438. memcpy(mgmt_rp.rand192, rp->rand, sizeof(rp->rand));
  3439. rp_size -= sizeof(mgmt_rp.hash256) + sizeof(mgmt_rp.rand256);
  3440. } else {
  3441. struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
  3442. if (skb->len < sizeof(*rp)) {
  3443. mgmt_cmd_status(cmd->sk, hdev->id,
  3444. MGMT_OP_READ_LOCAL_OOB_DATA,
  3445. MGMT_STATUS_FAILED);
  3446. goto remove;
  3447. }
  3448. memcpy(mgmt_rp.hash192, rp->hash192, sizeof(rp->hash192));
  3449. memcpy(mgmt_rp.rand192, rp->rand192, sizeof(rp->rand192));
  3450. memcpy(mgmt_rp.hash256, rp->hash256, sizeof(rp->hash256));
  3451. memcpy(mgmt_rp.rand256, rp->rand256, sizeof(rp->rand256));
  3452. }
  3453. mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
  3454. MGMT_STATUS_SUCCESS, &mgmt_rp, rp_size);
  3455. remove:
  3456. mgmt_pending_remove(cmd);
  3457. }
  3458. static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
  3459. void *data, u16 data_len)
  3460. {
  3461. struct mgmt_pending_cmd *cmd;
  3462. struct hci_request req;
  3463. int err;
  3464. bt_dev_dbg(hdev, "sock %p", sk);
  3465. hci_dev_lock(hdev);
  3466. if (!hdev_is_powered(hdev)) {
  3467. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
  3468. MGMT_STATUS_NOT_POWERED);
  3469. goto unlock;
  3470. }
  3471. if (!lmp_ssp_capable(hdev)) {
  3472. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
  3473. MGMT_STATUS_NOT_SUPPORTED);
  3474. goto unlock;
  3475. }
  3476. if (pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
  3477. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
  3478. MGMT_STATUS_BUSY);
  3479. goto unlock;
  3480. }
  3481. cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
  3482. if (!cmd) {
  3483. err = -ENOMEM;
  3484. goto unlock;
  3485. }
  3486. hci_req_init(&req, hdev);
  3487. if (bredr_sc_enabled(hdev))
  3488. hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_EXT_DATA, 0, NULL);
  3489. else
  3490. hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
  3491. err = hci_req_run_skb(&req, read_local_oob_data_complete);
  3492. if (err < 0)
  3493. mgmt_pending_remove(cmd);
  3494. unlock:
  3495. hci_dev_unlock(hdev);
  3496. return err;
  3497. }
  3498. static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
  3499. void *data, u16 len)
  3500. {
  3501. struct mgmt_addr_info *addr = data;
  3502. int err;
  3503. bt_dev_dbg(hdev, "sock %p", sk);
  3504. if (!bdaddr_type_is_valid(addr->type))
  3505. return mgmt_cmd_complete(sk, hdev->id,
  3506. MGMT_OP_ADD_REMOTE_OOB_DATA,
  3507. MGMT_STATUS_INVALID_PARAMS,
  3508. addr, sizeof(*addr));
  3509. hci_dev_lock(hdev);
  3510. if (len == MGMT_ADD_REMOTE_OOB_DATA_SIZE) {
  3511. struct mgmt_cp_add_remote_oob_data *cp = data;
  3512. u8 status;
  3513. if (cp->addr.type != BDADDR_BREDR) {
  3514. err = mgmt_cmd_complete(sk, hdev->id,
  3515. MGMT_OP_ADD_REMOTE_OOB_DATA,
  3516. MGMT_STATUS_INVALID_PARAMS,
  3517. &cp->addr, sizeof(cp->addr));
  3518. goto unlock;
  3519. }
  3520. err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr,
  3521. cp->addr.type, cp->hash,
  3522. cp->rand, NULL, NULL);
  3523. if (err < 0)
  3524. status = MGMT_STATUS_FAILED;
  3525. else
  3526. status = MGMT_STATUS_SUCCESS;
  3527. err = mgmt_cmd_complete(sk, hdev->id,
  3528. MGMT_OP_ADD_REMOTE_OOB_DATA, status,
  3529. &cp->addr, sizeof(cp->addr));
  3530. } else if (len == MGMT_ADD_REMOTE_OOB_EXT_DATA_SIZE) {
  3531. struct mgmt_cp_add_remote_oob_ext_data *cp = data;
  3532. u8 *rand192, *hash192, *rand256, *hash256;
  3533. u8 status;
  3534. if (bdaddr_type_is_le(cp->addr.type)) {
  3535. /* Enforce zero-valued 192-bit parameters as
  3536. * long as legacy SMP OOB isn't implemented.
  3537. */
  3538. if (memcmp(cp->rand192, ZERO_KEY, 16) ||
  3539. memcmp(cp->hash192, ZERO_KEY, 16)) {
  3540. err = mgmt_cmd_complete(sk, hdev->id,
  3541. MGMT_OP_ADD_REMOTE_OOB_DATA,
  3542. MGMT_STATUS_INVALID_PARAMS,
  3543. addr, sizeof(*addr));
  3544. goto unlock;
  3545. }
  3546. rand192 = NULL;
  3547. hash192 = NULL;
  3548. } else {
  3549. /* In case one of the P-192 values is set to zero,
  3550. * then just disable OOB data for P-192.
  3551. */
  3552. if (!memcmp(cp->rand192, ZERO_KEY, 16) ||
  3553. !memcmp(cp->hash192, ZERO_KEY, 16)) {
  3554. rand192 = NULL;
  3555. hash192 = NULL;
  3556. } else {
  3557. rand192 = cp->rand192;
  3558. hash192 = cp->hash192;
  3559. }
  3560. }
  3561. /* In case one of the P-256 values is set to zero, then just
  3562. * disable OOB data for P-256.
  3563. */
  3564. if (!memcmp(cp->rand256, ZERO_KEY, 16) ||
  3565. !memcmp(cp->hash256, ZERO_KEY, 16)) {
  3566. rand256 = NULL;
  3567. hash256 = NULL;
  3568. } else {
  3569. rand256 = cp->rand256;
  3570. hash256 = cp->hash256;
  3571. }
  3572. err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr,
  3573. cp->addr.type, hash192, rand192,
  3574. hash256, rand256);
  3575. if (err < 0)
  3576. status = MGMT_STATUS_FAILED;
  3577. else
  3578. status = MGMT_STATUS_SUCCESS;
  3579. err = mgmt_cmd_complete(sk, hdev->id,
  3580. MGMT_OP_ADD_REMOTE_OOB_DATA,
  3581. status, &cp->addr, sizeof(cp->addr));
  3582. } else {
  3583. bt_dev_err(hdev, "add_remote_oob_data: invalid len of %u bytes",
  3584. len);
  3585. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA,
  3586. MGMT_STATUS_INVALID_PARAMS);
  3587. }
  3588. unlock:
  3589. hci_dev_unlock(hdev);
  3590. return err;
  3591. }
  3592. static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
  3593. void *data, u16 len)
  3594. {
  3595. struct mgmt_cp_remove_remote_oob_data *cp = data;
  3596. u8 status;
  3597. int err;
  3598. bt_dev_dbg(hdev, "sock %p", sk);
  3599. if (cp->addr.type != BDADDR_BREDR)
  3600. return mgmt_cmd_complete(sk, hdev->id,
  3601. MGMT_OP_REMOVE_REMOTE_OOB_DATA,
  3602. MGMT_STATUS_INVALID_PARAMS,
  3603. &cp->addr, sizeof(cp->addr));
  3604. hci_dev_lock(hdev);
  3605. if (!bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
  3606. hci_remote_oob_data_clear(hdev);
  3607. status = MGMT_STATUS_SUCCESS;
  3608. goto done;
  3609. }
  3610. err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr, cp->addr.type);
  3611. if (err < 0)
  3612. status = MGMT_STATUS_INVALID_PARAMS;
  3613. else
  3614. status = MGMT_STATUS_SUCCESS;
  3615. done:
  3616. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
  3617. status, &cp->addr, sizeof(cp->addr));
  3618. hci_dev_unlock(hdev);
  3619. return err;
  3620. }
  3621. void mgmt_start_discovery_complete(struct hci_dev *hdev, u8 status)
  3622. {
  3623. struct mgmt_pending_cmd *cmd;
  3624. bt_dev_dbg(hdev, "status %d", status);
  3625. hci_dev_lock(hdev);
  3626. cmd = pending_find(MGMT_OP_START_DISCOVERY, hdev);
  3627. if (!cmd)
  3628. cmd = pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev);
  3629. if (!cmd)
  3630. cmd = pending_find(MGMT_OP_START_LIMITED_DISCOVERY, hdev);
  3631. if (cmd) {
  3632. cmd->cmd_complete(cmd, mgmt_status(status));
  3633. mgmt_pending_remove(cmd);
  3634. }
  3635. hci_dev_unlock(hdev);
  3636. /* Handle suspend notifier */
  3637. if (test_and_clear_bit(SUSPEND_UNPAUSE_DISCOVERY,
  3638. hdev->suspend_tasks)) {
  3639. bt_dev_dbg(hdev, "Unpaused discovery");
  3640. wake_up(&hdev->suspend_wait_q);
  3641. }
  3642. }
  3643. static bool discovery_type_is_valid(struct hci_dev *hdev, uint8_t type,
  3644. uint8_t *mgmt_status)
  3645. {
  3646. switch (type) {
  3647. case DISCOV_TYPE_LE:
  3648. *mgmt_status = mgmt_le_support(hdev);
  3649. if (*mgmt_status)
  3650. return false;
  3651. break;
  3652. case DISCOV_TYPE_INTERLEAVED:
  3653. *mgmt_status = mgmt_le_support(hdev);
  3654. if (*mgmt_status)
  3655. return false;
  3656. fallthrough;
  3657. case DISCOV_TYPE_BREDR:
  3658. *mgmt_status = mgmt_bredr_support(hdev);
  3659. if (*mgmt_status)
  3660. return false;
  3661. break;
  3662. default:
  3663. *mgmt_status = MGMT_STATUS_INVALID_PARAMS;
  3664. return false;
  3665. }
  3666. return true;
  3667. }
  3668. static int start_discovery_internal(struct sock *sk, struct hci_dev *hdev,
  3669. u16 op, void *data, u16 len)
  3670. {
  3671. struct mgmt_cp_start_discovery *cp = data;
  3672. struct mgmt_pending_cmd *cmd;
  3673. u8 status;
  3674. int err;
  3675. bt_dev_dbg(hdev, "sock %p", sk);
  3676. hci_dev_lock(hdev);
  3677. if (!hdev_is_powered(hdev)) {
  3678. err = mgmt_cmd_complete(sk, hdev->id, op,
  3679. MGMT_STATUS_NOT_POWERED,
  3680. &cp->type, sizeof(cp->type));
  3681. goto failed;
  3682. }
  3683. if (hdev->discovery.state != DISCOVERY_STOPPED ||
  3684. hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) {
  3685. err = mgmt_cmd_complete(sk, hdev->id, op, MGMT_STATUS_BUSY,
  3686. &cp->type, sizeof(cp->type));
  3687. goto failed;
  3688. }
  3689. if (!discovery_type_is_valid(hdev, cp->type, &status)) {
  3690. err = mgmt_cmd_complete(sk, hdev->id, op, status,
  3691. &cp->type, sizeof(cp->type));
  3692. goto failed;
  3693. }
  3694. /* Can't start discovery when it is paused */
  3695. if (hdev->discovery_paused) {
  3696. err = mgmt_cmd_complete(sk, hdev->id, op, MGMT_STATUS_BUSY,
  3697. &cp->type, sizeof(cp->type));
  3698. goto failed;
  3699. }
  3700. /* Clear the discovery filter first to free any previously
  3701. * allocated memory for the UUID list.
  3702. */
  3703. hci_discovery_filter_clear(hdev);
  3704. hdev->discovery.type = cp->type;
  3705. hdev->discovery.report_invalid_rssi = false;
  3706. if (op == MGMT_OP_START_LIMITED_DISCOVERY)
  3707. hdev->discovery.limited = true;
  3708. else
  3709. hdev->discovery.limited = false;
  3710. cmd = mgmt_pending_add(sk, op, hdev, data, len);
  3711. if (!cmd) {
  3712. err = -ENOMEM;
  3713. goto failed;
  3714. }
  3715. cmd->cmd_complete = generic_cmd_complete;
  3716. hci_discovery_set_state(hdev, DISCOVERY_STARTING);
  3717. queue_work(hdev->req_workqueue, &hdev->discov_update);
  3718. err = 0;
  3719. failed:
  3720. hci_dev_unlock(hdev);
  3721. return err;
  3722. }
  3723. static int start_discovery(struct sock *sk, struct hci_dev *hdev,
  3724. void *data, u16 len)
  3725. {
  3726. return start_discovery_internal(sk, hdev, MGMT_OP_START_DISCOVERY,
  3727. data, len);
  3728. }
  3729. static int start_limited_discovery(struct sock *sk, struct hci_dev *hdev,
  3730. void *data, u16 len)
  3731. {
  3732. return start_discovery_internal(sk, hdev,
  3733. MGMT_OP_START_LIMITED_DISCOVERY,
  3734. data, len);
  3735. }
  3736. static int service_discovery_cmd_complete(struct mgmt_pending_cmd *cmd,
  3737. u8 status)
  3738. {
  3739. return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
  3740. cmd->param, 1);
  3741. }
  3742. static int start_service_discovery(struct sock *sk, struct hci_dev *hdev,
  3743. void *data, u16 len)
  3744. {
  3745. struct mgmt_cp_start_service_discovery *cp = data;
  3746. struct mgmt_pending_cmd *cmd;
  3747. const u16 max_uuid_count = ((U16_MAX - sizeof(*cp)) / 16);
  3748. u16 uuid_count, expected_len;
  3749. u8 status;
  3750. int err;
  3751. bt_dev_dbg(hdev, "sock %p", sk);
  3752. hci_dev_lock(hdev);
  3753. if (!hdev_is_powered(hdev)) {
  3754. err = mgmt_cmd_complete(sk, hdev->id,
  3755. MGMT_OP_START_SERVICE_DISCOVERY,
  3756. MGMT_STATUS_NOT_POWERED,
  3757. &cp->type, sizeof(cp->type));
  3758. goto failed;
  3759. }
  3760. if (hdev->discovery.state != DISCOVERY_STOPPED ||
  3761. hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) {
  3762. err = mgmt_cmd_complete(sk, hdev->id,
  3763. MGMT_OP_START_SERVICE_DISCOVERY,
  3764. MGMT_STATUS_BUSY, &cp->type,
  3765. sizeof(cp->type));
  3766. goto failed;
  3767. }
  3768. uuid_count = __le16_to_cpu(cp->uuid_count);
  3769. if (uuid_count > max_uuid_count) {
  3770. bt_dev_err(hdev, "service_discovery: too big uuid_count value %u",
  3771. uuid_count);
  3772. err = mgmt_cmd_complete(sk, hdev->id,
  3773. MGMT_OP_START_SERVICE_DISCOVERY,
  3774. MGMT_STATUS_INVALID_PARAMS, &cp->type,
  3775. sizeof(cp->type));
  3776. goto failed;
  3777. }
  3778. expected_len = sizeof(*cp) + uuid_count * 16;
  3779. if (expected_len != len) {
  3780. bt_dev_err(hdev, "service_discovery: expected %u bytes, got %u bytes",
  3781. expected_len, len);
  3782. err = mgmt_cmd_complete(sk, hdev->id,
  3783. MGMT_OP_START_SERVICE_DISCOVERY,
  3784. MGMT_STATUS_INVALID_PARAMS, &cp->type,
  3785. sizeof(cp->type));
  3786. goto failed;
  3787. }
  3788. if (!discovery_type_is_valid(hdev, cp->type, &status)) {
  3789. err = mgmt_cmd_complete(sk, hdev->id,
  3790. MGMT_OP_START_SERVICE_DISCOVERY,
  3791. status, &cp->type, sizeof(cp->type));
  3792. goto failed;
  3793. }
  3794. cmd = mgmt_pending_add(sk, MGMT_OP_START_SERVICE_DISCOVERY,
  3795. hdev, data, len);
  3796. if (!cmd) {
  3797. err = -ENOMEM;
  3798. goto failed;
  3799. }
  3800. cmd->cmd_complete = service_discovery_cmd_complete;
  3801. /* Clear the discovery filter first to free any previously
  3802. * allocated memory for the UUID list.
  3803. */
  3804. hci_discovery_filter_clear(hdev);
  3805. hdev->discovery.result_filtering = true;
  3806. hdev->discovery.type = cp->type;
  3807. hdev->discovery.rssi = cp->rssi;
  3808. hdev->discovery.uuid_count = uuid_count;
  3809. if (uuid_count > 0) {
  3810. hdev->discovery.uuids = kmemdup(cp->uuids, uuid_count * 16,
  3811. GFP_KERNEL);
  3812. if (!hdev->discovery.uuids) {
  3813. err = mgmt_cmd_complete(sk, hdev->id,
  3814. MGMT_OP_START_SERVICE_DISCOVERY,
  3815. MGMT_STATUS_FAILED,
  3816. &cp->type, sizeof(cp->type));
  3817. mgmt_pending_remove(cmd);
  3818. goto failed;
  3819. }
  3820. }
  3821. hci_discovery_set_state(hdev, DISCOVERY_STARTING);
  3822. queue_work(hdev->req_workqueue, &hdev->discov_update);
  3823. err = 0;
  3824. failed:
  3825. hci_dev_unlock(hdev);
  3826. return err;
  3827. }
  3828. void mgmt_stop_discovery_complete(struct hci_dev *hdev, u8 status)
  3829. {
  3830. struct mgmt_pending_cmd *cmd;
  3831. bt_dev_dbg(hdev, "status %d", status);
  3832. hci_dev_lock(hdev);
  3833. cmd = pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
  3834. if (cmd) {
  3835. cmd->cmd_complete(cmd, mgmt_status(status));
  3836. mgmt_pending_remove(cmd);
  3837. }
  3838. hci_dev_unlock(hdev);
  3839. /* Handle suspend notifier */
  3840. if (test_and_clear_bit(SUSPEND_PAUSE_DISCOVERY, hdev->suspend_tasks)) {
  3841. bt_dev_dbg(hdev, "Paused discovery");
  3842. wake_up(&hdev->suspend_wait_q);
  3843. }
  3844. }
  3845. static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
  3846. u16 len)
  3847. {
  3848. struct mgmt_cp_stop_discovery *mgmt_cp = data;
  3849. struct mgmt_pending_cmd *cmd;
  3850. int err;
  3851. bt_dev_dbg(hdev, "sock %p", sk);
  3852. hci_dev_lock(hdev);
  3853. if (!hci_discovery_active(hdev)) {
  3854. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
  3855. MGMT_STATUS_REJECTED, &mgmt_cp->type,
  3856. sizeof(mgmt_cp->type));
  3857. goto unlock;
  3858. }
  3859. if (hdev->discovery.type != mgmt_cp->type) {
  3860. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
  3861. MGMT_STATUS_INVALID_PARAMS,
  3862. &mgmt_cp->type, sizeof(mgmt_cp->type));
  3863. goto unlock;
  3864. }
  3865. cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, data, len);
  3866. if (!cmd) {
  3867. err = -ENOMEM;
  3868. goto unlock;
  3869. }
  3870. cmd->cmd_complete = generic_cmd_complete;
  3871. hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
  3872. queue_work(hdev->req_workqueue, &hdev->discov_update);
  3873. err = 0;
  3874. unlock:
  3875. hci_dev_unlock(hdev);
  3876. return err;
  3877. }
  3878. static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
  3879. u16 len)
  3880. {
  3881. struct mgmt_cp_confirm_name *cp = data;
  3882. struct inquiry_entry *e;
  3883. int err;
  3884. bt_dev_dbg(hdev, "sock %p", sk);
  3885. hci_dev_lock(hdev);
  3886. if (!hci_discovery_active(hdev)) {
  3887. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
  3888. MGMT_STATUS_FAILED, &cp->addr,
  3889. sizeof(cp->addr));
  3890. goto failed;
  3891. }
  3892. e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
  3893. if (!e) {
  3894. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
  3895. MGMT_STATUS_INVALID_PARAMS, &cp->addr,
  3896. sizeof(cp->addr));
  3897. goto failed;
  3898. }
  3899. if (cp->name_known) {
  3900. e->name_state = NAME_KNOWN;
  3901. list_del(&e->list);
  3902. } else {
  3903. e->name_state = NAME_NEEDED;
  3904. hci_inquiry_cache_update_resolve(hdev, e);
  3905. }
  3906. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0,
  3907. &cp->addr, sizeof(cp->addr));
  3908. failed:
  3909. hci_dev_unlock(hdev);
  3910. return err;
  3911. }
  3912. static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
  3913. u16 len)
  3914. {
  3915. struct mgmt_cp_block_device *cp = data;
  3916. u8 status;
  3917. int err;
  3918. bt_dev_dbg(hdev, "sock %p", sk);
  3919. if (!bdaddr_type_is_valid(cp->addr.type))
  3920. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
  3921. MGMT_STATUS_INVALID_PARAMS,
  3922. &cp->addr, sizeof(cp->addr));
  3923. hci_dev_lock(hdev);
  3924. err = hci_bdaddr_list_add(&hdev->blacklist, &cp->addr.bdaddr,
  3925. cp->addr.type);
  3926. if (err < 0) {
  3927. status = MGMT_STATUS_FAILED;
  3928. goto done;
  3929. }
  3930. mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &cp->addr, sizeof(cp->addr),
  3931. sk);
  3932. status = MGMT_STATUS_SUCCESS;
  3933. done:
  3934. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
  3935. &cp->addr, sizeof(cp->addr));
  3936. hci_dev_unlock(hdev);
  3937. return err;
  3938. }
  3939. static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
  3940. u16 len)
  3941. {
  3942. struct mgmt_cp_unblock_device *cp = data;
  3943. u8 status;
  3944. int err;
  3945. bt_dev_dbg(hdev, "sock %p", sk);
  3946. if (!bdaddr_type_is_valid(cp->addr.type))
  3947. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
  3948. MGMT_STATUS_INVALID_PARAMS,
  3949. &cp->addr, sizeof(cp->addr));
  3950. hci_dev_lock(hdev);
  3951. err = hci_bdaddr_list_del(&hdev->blacklist, &cp->addr.bdaddr,
  3952. cp->addr.type);
  3953. if (err < 0) {
  3954. status = MGMT_STATUS_INVALID_PARAMS;
  3955. goto done;
  3956. }
  3957. mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &cp->addr, sizeof(cp->addr),
  3958. sk);
  3959. status = MGMT_STATUS_SUCCESS;
  3960. done:
  3961. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
  3962. &cp->addr, sizeof(cp->addr));
  3963. hci_dev_unlock(hdev);
  3964. return err;
  3965. }
  3966. static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
  3967. u16 len)
  3968. {
  3969. struct mgmt_cp_set_device_id *cp = data;
  3970. struct hci_request req;
  3971. int err;
  3972. __u16 source;
  3973. bt_dev_dbg(hdev, "sock %p", sk);
  3974. source = __le16_to_cpu(cp->source);
  3975. if (source > 0x0002)
  3976. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID,
  3977. MGMT_STATUS_INVALID_PARAMS);
  3978. hci_dev_lock(hdev);
  3979. hdev->devid_source = source;
  3980. hdev->devid_vendor = __le16_to_cpu(cp->vendor);
  3981. hdev->devid_product = __le16_to_cpu(cp->product);
  3982. hdev->devid_version = __le16_to_cpu(cp->version);
  3983. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0,
  3984. NULL, 0);
  3985. hci_req_init(&req, hdev);
  3986. __hci_req_update_eir(&req);
  3987. hci_req_run(&req, NULL);
  3988. hci_dev_unlock(hdev);
  3989. return err;
  3990. }
  3991. static void enable_advertising_instance(struct hci_dev *hdev, u8 status,
  3992. u16 opcode)
  3993. {
  3994. bt_dev_dbg(hdev, "status %d", status);
  3995. }
  3996. static void set_advertising_complete(struct hci_dev *hdev, u8 status,
  3997. u16 opcode)
  3998. {
  3999. struct cmd_lookup match = { NULL, hdev };
  4000. struct hci_request req;
  4001. u8 instance;
  4002. struct adv_info *adv_instance;
  4003. int err;
  4004. hci_dev_lock(hdev);
  4005. if (status) {
  4006. u8 mgmt_err = mgmt_status(status);
  4007. mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev,
  4008. cmd_status_rsp, &mgmt_err);
  4009. goto unlock;
  4010. }
  4011. if (hci_dev_test_flag(hdev, HCI_LE_ADV))
  4012. hci_dev_set_flag(hdev, HCI_ADVERTISING);
  4013. else
  4014. hci_dev_clear_flag(hdev, HCI_ADVERTISING);
  4015. mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp,
  4016. &match);
  4017. new_settings(hdev, match.sk);
  4018. if (match.sk)
  4019. sock_put(match.sk);
  4020. /* Handle suspend notifier */
  4021. if (test_and_clear_bit(SUSPEND_PAUSE_ADVERTISING,
  4022. hdev->suspend_tasks)) {
  4023. bt_dev_dbg(hdev, "Paused advertising");
  4024. wake_up(&hdev->suspend_wait_q);
  4025. } else if (test_and_clear_bit(SUSPEND_UNPAUSE_ADVERTISING,
  4026. hdev->suspend_tasks)) {
  4027. bt_dev_dbg(hdev, "Unpaused advertising");
  4028. wake_up(&hdev->suspend_wait_q);
  4029. }
  4030. /* If "Set Advertising" was just disabled and instance advertising was
  4031. * set up earlier, then re-enable multi-instance advertising.
  4032. */
  4033. if (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
  4034. list_empty(&hdev->adv_instances))
  4035. goto unlock;
  4036. instance = hdev->cur_adv_instance;
  4037. if (!instance) {
  4038. adv_instance = list_first_entry_or_null(&hdev->adv_instances,
  4039. struct adv_info, list);
  4040. if (!adv_instance)
  4041. goto unlock;
  4042. instance = adv_instance->instance;
  4043. }
  4044. hci_req_init(&req, hdev);
  4045. err = __hci_req_schedule_adv_instance(&req, instance, true);
  4046. if (!err)
  4047. err = hci_req_run(&req, enable_advertising_instance);
  4048. if (err)
  4049. bt_dev_err(hdev, "failed to re-configure advertising");
  4050. unlock:
  4051. hci_dev_unlock(hdev);
  4052. }
  4053. static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data,
  4054. u16 len)
  4055. {
  4056. struct mgmt_mode *cp = data;
  4057. struct mgmt_pending_cmd *cmd;
  4058. struct hci_request req;
  4059. u8 val, status;
  4060. int err;
  4061. bt_dev_dbg(hdev, "sock %p", sk);
  4062. status = mgmt_le_support(hdev);
  4063. if (status)
  4064. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
  4065. status);
  4066. /* Enabling the experimental LL Privay support disables support for
  4067. * advertising.
  4068. */
  4069. if (hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY))
  4070. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
  4071. MGMT_STATUS_NOT_SUPPORTED);
  4072. if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
  4073. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
  4074. MGMT_STATUS_INVALID_PARAMS);
  4075. if (hdev->advertising_paused)
  4076. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
  4077. MGMT_STATUS_BUSY);
  4078. hci_dev_lock(hdev);
  4079. val = !!cp->val;
  4080. /* The following conditions are ones which mean that we should
  4081. * not do any HCI communication but directly send a mgmt
  4082. * response to user space (after toggling the flag if
  4083. * necessary).
  4084. */
  4085. if (!hdev_is_powered(hdev) ||
  4086. (val == hci_dev_test_flag(hdev, HCI_ADVERTISING) &&
  4087. (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE)) ||
  4088. hci_conn_num(hdev, LE_LINK) > 0 ||
  4089. (hci_dev_test_flag(hdev, HCI_LE_SCAN) &&
  4090. hdev->le_scan_type == LE_SCAN_ACTIVE)) {
  4091. bool changed;
  4092. if (cp->val) {
  4093. hdev->cur_adv_instance = 0x00;
  4094. changed = !hci_dev_test_and_set_flag(hdev, HCI_ADVERTISING);
  4095. if (cp->val == 0x02)
  4096. hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
  4097. else
  4098. hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
  4099. } else {
  4100. changed = hci_dev_test_and_clear_flag(hdev, HCI_ADVERTISING);
  4101. hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
  4102. }
  4103. err = send_settings_rsp(sk, MGMT_OP_SET_ADVERTISING, hdev);
  4104. if (err < 0)
  4105. goto unlock;
  4106. if (changed)
  4107. err = new_settings(hdev, sk);
  4108. goto unlock;
  4109. }
  4110. if (pending_find(MGMT_OP_SET_ADVERTISING, hdev) ||
  4111. pending_find(MGMT_OP_SET_LE, hdev)) {
  4112. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
  4113. MGMT_STATUS_BUSY);
  4114. goto unlock;
  4115. }
  4116. cmd = mgmt_pending_add(sk, MGMT_OP_SET_ADVERTISING, hdev, data, len);
  4117. if (!cmd) {
  4118. err = -ENOMEM;
  4119. goto unlock;
  4120. }
  4121. hci_req_init(&req, hdev);
  4122. if (cp->val == 0x02)
  4123. hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
  4124. else
  4125. hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
  4126. cancel_adv_timeout(hdev);
  4127. if (val) {
  4128. /* Switch to instance "0" for the Set Advertising setting.
  4129. * We cannot use update_[adv|scan_rsp]_data() here as the
  4130. * HCI_ADVERTISING flag is not yet set.
  4131. */
  4132. hdev->cur_adv_instance = 0x00;
  4133. if (ext_adv_capable(hdev)) {
  4134. __hci_req_start_ext_adv(&req, 0x00);
  4135. } else {
  4136. __hci_req_update_adv_data(&req, 0x00);
  4137. __hci_req_update_scan_rsp_data(&req, 0x00);
  4138. __hci_req_enable_advertising(&req);
  4139. }
  4140. } else {
  4141. __hci_req_disable_advertising(&req);
  4142. }
  4143. err = hci_req_run(&req, set_advertising_complete);
  4144. if (err < 0)
  4145. mgmt_pending_remove(cmd);
  4146. unlock:
  4147. hci_dev_unlock(hdev);
  4148. return err;
  4149. }
  4150. static int set_static_address(struct sock *sk, struct hci_dev *hdev,
  4151. void *data, u16 len)
  4152. {
  4153. struct mgmt_cp_set_static_address *cp = data;
  4154. int err;
  4155. bt_dev_dbg(hdev, "sock %p", sk);
  4156. if (!lmp_le_capable(hdev))
  4157. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
  4158. MGMT_STATUS_NOT_SUPPORTED);
  4159. if (hdev_is_powered(hdev))
  4160. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
  4161. MGMT_STATUS_REJECTED);
  4162. if (bacmp(&cp->bdaddr, BDADDR_ANY)) {
  4163. if (!bacmp(&cp->bdaddr, BDADDR_NONE))
  4164. return mgmt_cmd_status(sk, hdev->id,
  4165. MGMT_OP_SET_STATIC_ADDRESS,
  4166. MGMT_STATUS_INVALID_PARAMS);
  4167. /* Two most significant bits shall be set */
  4168. if ((cp->bdaddr.b[5] & 0xc0) != 0xc0)
  4169. return mgmt_cmd_status(sk, hdev->id,
  4170. MGMT_OP_SET_STATIC_ADDRESS,
  4171. MGMT_STATUS_INVALID_PARAMS);
  4172. }
  4173. hci_dev_lock(hdev);
  4174. bacpy(&hdev->static_addr, &cp->bdaddr);
  4175. err = send_settings_rsp(sk, MGMT_OP_SET_STATIC_ADDRESS, hdev);
  4176. if (err < 0)
  4177. goto unlock;
  4178. err = new_settings(hdev, sk);
  4179. unlock:
  4180. hci_dev_unlock(hdev);
  4181. return err;
  4182. }
  4183. static int set_scan_params(struct sock *sk, struct hci_dev *hdev,
  4184. void *data, u16 len)
  4185. {
  4186. struct mgmt_cp_set_scan_params *cp = data;
  4187. __u16 interval, window;
  4188. int err;
  4189. bt_dev_dbg(hdev, "sock %p", sk);
  4190. if (!lmp_le_capable(hdev))
  4191. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
  4192. MGMT_STATUS_NOT_SUPPORTED);
  4193. interval = __le16_to_cpu(cp->interval);
  4194. if (interval < 0x0004 || interval > 0x4000)
  4195. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
  4196. MGMT_STATUS_INVALID_PARAMS);
  4197. window = __le16_to_cpu(cp->window);
  4198. if (window < 0x0004 || window > 0x4000)
  4199. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
  4200. MGMT_STATUS_INVALID_PARAMS);
  4201. if (window > interval)
  4202. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
  4203. MGMT_STATUS_INVALID_PARAMS);
  4204. hci_dev_lock(hdev);
  4205. hdev->le_scan_interval = interval;
  4206. hdev->le_scan_window = window;
  4207. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, 0,
  4208. NULL, 0);
  4209. /* If background scan is running, restart it so new parameters are
  4210. * loaded.
  4211. */
  4212. if (hci_dev_test_flag(hdev, HCI_LE_SCAN) &&
  4213. hdev->discovery.state == DISCOVERY_STOPPED) {
  4214. struct hci_request req;
  4215. hci_req_init(&req, hdev);
  4216. hci_req_add_le_scan_disable(&req, false);
  4217. hci_req_add_le_passive_scan(&req);
  4218. hci_req_run(&req, NULL);
  4219. }
  4220. hci_dev_unlock(hdev);
  4221. return err;
  4222. }
  4223. static void fast_connectable_complete(struct hci_dev *hdev, u8 status,
  4224. u16 opcode)
  4225. {
  4226. struct mgmt_pending_cmd *cmd;
  4227. bt_dev_dbg(hdev, "status 0x%02x", status);
  4228. hci_dev_lock(hdev);
  4229. cmd = pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev);
  4230. if (!cmd)
  4231. goto unlock;
  4232. if (status) {
  4233. mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
  4234. mgmt_status(status));
  4235. } else {
  4236. struct mgmt_mode *cp = cmd->param;
  4237. if (cp->val)
  4238. hci_dev_set_flag(hdev, HCI_FAST_CONNECTABLE);
  4239. else
  4240. hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE);
  4241. send_settings_rsp(cmd->sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev);
  4242. new_settings(hdev, cmd->sk);
  4243. }
  4244. mgmt_pending_remove(cmd);
  4245. unlock:
  4246. hci_dev_unlock(hdev);
  4247. }
  4248. static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
  4249. void *data, u16 len)
  4250. {
  4251. struct mgmt_mode *cp = data;
  4252. struct mgmt_pending_cmd *cmd;
  4253. struct hci_request req;
  4254. int err;
  4255. bt_dev_dbg(hdev, "sock %p", sk);
  4256. if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) ||
  4257. hdev->hci_ver < BLUETOOTH_VER_1_2)
  4258. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
  4259. MGMT_STATUS_NOT_SUPPORTED);
  4260. if (cp->val != 0x00 && cp->val != 0x01)
  4261. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
  4262. MGMT_STATUS_INVALID_PARAMS);
  4263. hci_dev_lock(hdev);
  4264. if (pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev)) {
  4265. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
  4266. MGMT_STATUS_BUSY);
  4267. goto unlock;
  4268. }
  4269. if (!!cp->val == hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) {
  4270. err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
  4271. hdev);
  4272. goto unlock;
  4273. }
  4274. if (!hdev_is_powered(hdev)) {
  4275. hci_dev_change_flag(hdev, HCI_FAST_CONNECTABLE);
  4276. err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
  4277. hdev);
  4278. new_settings(hdev, sk);
  4279. goto unlock;
  4280. }
  4281. cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
  4282. data, len);
  4283. if (!cmd) {
  4284. err = -ENOMEM;
  4285. goto unlock;
  4286. }
  4287. hci_req_init(&req, hdev);
  4288. __hci_req_write_fast_connectable(&req, cp->val);
  4289. err = hci_req_run(&req, fast_connectable_complete);
  4290. if (err < 0) {
  4291. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
  4292. MGMT_STATUS_FAILED);
  4293. mgmt_pending_remove(cmd);
  4294. }
  4295. unlock:
  4296. hci_dev_unlock(hdev);
  4297. return err;
  4298. }
  4299. static void set_bredr_complete(struct hci_dev *hdev, u8 status, u16 opcode)
  4300. {
  4301. struct mgmt_pending_cmd *cmd;
  4302. bt_dev_dbg(hdev, "status 0x%02x", status);
  4303. hci_dev_lock(hdev);
  4304. cmd = pending_find(MGMT_OP_SET_BREDR, hdev);
  4305. if (!cmd)
  4306. goto unlock;
  4307. if (status) {
  4308. u8 mgmt_err = mgmt_status(status);
  4309. /* We need to restore the flag if related HCI commands
  4310. * failed.
  4311. */
  4312. hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED);
  4313. mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
  4314. } else {
  4315. send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev);
  4316. new_settings(hdev, cmd->sk);
  4317. }
  4318. mgmt_pending_remove(cmd);
  4319. unlock:
  4320. hci_dev_unlock(hdev);
  4321. }
  4322. static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
  4323. {
  4324. struct mgmt_mode *cp = data;
  4325. struct mgmt_pending_cmd *cmd;
  4326. struct hci_request req;
  4327. int err;
  4328. bt_dev_dbg(hdev, "sock %p", sk);
  4329. if (!lmp_bredr_capable(hdev) || !lmp_le_capable(hdev))
  4330. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
  4331. MGMT_STATUS_NOT_SUPPORTED);
  4332. if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
  4333. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
  4334. MGMT_STATUS_REJECTED);
  4335. if (cp->val != 0x00 && cp->val != 0x01)
  4336. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
  4337. MGMT_STATUS_INVALID_PARAMS);
  4338. hci_dev_lock(hdev);
  4339. if (cp->val == hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
  4340. err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev);
  4341. goto unlock;
  4342. }
  4343. if (!hdev_is_powered(hdev)) {
  4344. if (!cp->val) {
  4345. hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
  4346. hci_dev_clear_flag(hdev, HCI_SSP_ENABLED);
  4347. hci_dev_clear_flag(hdev, HCI_LINK_SECURITY);
  4348. hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE);
  4349. hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
  4350. }
  4351. hci_dev_change_flag(hdev, HCI_BREDR_ENABLED);
  4352. err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev);
  4353. if (err < 0)
  4354. goto unlock;
  4355. err = new_settings(hdev, sk);
  4356. goto unlock;
  4357. }
  4358. /* Reject disabling when powered on */
  4359. if (!cp->val) {
  4360. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
  4361. MGMT_STATUS_REJECTED);
  4362. goto unlock;
  4363. } else {
  4364. /* When configuring a dual-mode controller to operate
  4365. * with LE only and using a static address, then switching
  4366. * BR/EDR back on is not allowed.
  4367. *
  4368. * Dual-mode controllers shall operate with the public
  4369. * address as its identity address for BR/EDR and LE. So
  4370. * reject the attempt to create an invalid configuration.
  4371. *
  4372. * The same restrictions applies when secure connections
  4373. * has been enabled. For BR/EDR this is a controller feature
  4374. * while for LE it is a host stack feature. This means that
  4375. * switching BR/EDR back on when secure connections has been
  4376. * enabled is not a supported transaction.
  4377. */
  4378. if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
  4379. (bacmp(&hdev->static_addr, BDADDR_ANY) ||
  4380. hci_dev_test_flag(hdev, HCI_SC_ENABLED))) {
  4381. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
  4382. MGMT_STATUS_REJECTED);
  4383. goto unlock;
  4384. }
  4385. }
  4386. if (pending_find(MGMT_OP_SET_BREDR, hdev)) {
  4387. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
  4388. MGMT_STATUS_BUSY);
  4389. goto unlock;
  4390. }
  4391. cmd = mgmt_pending_add(sk, MGMT_OP_SET_BREDR, hdev, data, len);
  4392. if (!cmd) {
  4393. err = -ENOMEM;
  4394. goto unlock;
  4395. }
  4396. /* We need to flip the bit already here so that
  4397. * hci_req_update_adv_data generates the correct flags.
  4398. */
  4399. hci_dev_set_flag(hdev, HCI_BREDR_ENABLED);
  4400. hci_req_init(&req, hdev);
  4401. __hci_req_write_fast_connectable(&req, false);
  4402. __hci_req_update_scan(&req);
  4403. /* Since only the advertising data flags will change, there
  4404. * is no need to update the scan response data.
  4405. */
  4406. __hci_req_update_adv_data(&req, hdev->cur_adv_instance);
  4407. err = hci_req_run(&req, set_bredr_complete);
  4408. if (err < 0)
  4409. mgmt_pending_remove(cmd);
  4410. unlock:
  4411. hci_dev_unlock(hdev);
  4412. return err;
  4413. }
  4414. static void sc_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode)
  4415. {
  4416. struct mgmt_pending_cmd *cmd;
  4417. struct mgmt_mode *cp;
  4418. bt_dev_dbg(hdev, "status %u", status);
  4419. hci_dev_lock(hdev);
  4420. cmd = pending_find(MGMT_OP_SET_SECURE_CONN, hdev);
  4421. if (!cmd)
  4422. goto unlock;
  4423. if (status) {
  4424. mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
  4425. mgmt_status(status));
  4426. goto remove;
  4427. }
  4428. cp = cmd->param;
  4429. switch (cp->val) {
  4430. case 0x00:
  4431. hci_dev_clear_flag(hdev, HCI_SC_ENABLED);
  4432. hci_dev_clear_flag(hdev, HCI_SC_ONLY);
  4433. break;
  4434. case 0x01:
  4435. hci_dev_set_flag(hdev, HCI_SC_ENABLED);
  4436. hci_dev_clear_flag(hdev, HCI_SC_ONLY);
  4437. break;
  4438. case 0x02:
  4439. hci_dev_set_flag(hdev, HCI_SC_ENABLED);
  4440. hci_dev_set_flag(hdev, HCI_SC_ONLY);
  4441. break;
  4442. }
  4443. send_settings_rsp(cmd->sk, MGMT_OP_SET_SECURE_CONN, hdev);
  4444. new_settings(hdev, cmd->sk);
  4445. remove:
  4446. mgmt_pending_remove(cmd);
  4447. unlock:
  4448. hci_dev_unlock(hdev);
  4449. }
  4450. static int set_secure_conn(struct sock *sk, struct hci_dev *hdev,
  4451. void *data, u16 len)
  4452. {
  4453. struct mgmt_mode *cp = data;
  4454. struct mgmt_pending_cmd *cmd;
  4455. struct hci_request req;
  4456. u8 val;
  4457. int err;
  4458. bt_dev_dbg(hdev, "sock %p", sk);
  4459. if (!lmp_sc_capable(hdev) &&
  4460. !hci_dev_test_flag(hdev, HCI_LE_ENABLED))
  4461. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
  4462. MGMT_STATUS_NOT_SUPPORTED);
  4463. if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
  4464. lmp_sc_capable(hdev) &&
  4465. !hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
  4466. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
  4467. MGMT_STATUS_REJECTED);
  4468. if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
  4469. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
  4470. MGMT_STATUS_INVALID_PARAMS);
  4471. hci_dev_lock(hdev);
  4472. if (!hdev_is_powered(hdev) || !lmp_sc_capable(hdev) ||
  4473. !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
  4474. bool changed;
  4475. if (cp->val) {
  4476. changed = !hci_dev_test_and_set_flag(hdev,
  4477. HCI_SC_ENABLED);
  4478. if (cp->val == 0x02)
  4479. hci_dev_set_flag(hdev, HCI_SC_ONLY);
  4480. else
  4481. hci_dev_clear_flag(hdev, HCI_SC_ONLY);
  4482. } else {
  4483. changed = hci_dev_test_and_clear_flag(hdev,
  4484. HCI_SC_ENABLED);
  4485. hci_dev_clear_flag(hdev, HCI_SC_ONLY);
  4486. }
  4487. err = send_settings_rsp(sk, MGMT_OP_SET_SECURE_CONN, hdev);
  4488. if (err < 0)
  4489. goto failed;
  4490. if (changed)
  4491. err = new_settings(hdev, sk);
  4492. goto failed;
  4493. }
  4494. if (pending_find(MGMT_OP_SET_SECURE_CONN, hdev)) {
  4495. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
  4496. MGMT_STATUS_BUSY);
  4497. goto failed;
  4498. }
  4499. val = !!cp->val;
  4500. if (val == hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
  4501. (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
  4502. err = send_settings_rsp(sk, MGMT_OP_SET_SECURE_CONN, hdev);
  4503. goto failed;
  4504. }
  4505. cmd = mgmt_pending_add(sk, MGMT_OP_SET_SECURE_CONN, hdev, data, len);
  4506. if (!cmd) {
  4507. err = -ENOMEM;
  4508. goto failed;
  4509. }
  4510. hci_req_init(&req, hdev);
  4511. hci_req_add(&req, HCI_OP_WRITE_SC_SUPPORT, 1, &val);
  4512. err = hci_req_run(&req, sc_enable_complete);
  4513. if (err < 0) {
  4514. mgmt_pending_remove(cmd);
  4515. goto failed;
  4516. }
  4517. failed:
  4518. hci_dev_unlock(hdev);
  4519. return err;
  4520. }
  4521. static int set_debug_keys(struct sock *sk, struct hci_dev *hdev,
  4522. void *data, u16 len)
  4523. {
  4524. struct mgmt_mode *cp = data;
  4525. bool changed, use_changed;
  4526. int err;
  4527. bt_dev_dbg(hdev, "sock %p", sk);
  4528. if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
  4529. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEBUG_KEYS,
  4530. MGMT_STATUS_INVALID_PARAMS);
  4531. hci_dev_lock(hdev);
  4532. if (cp->val)
  4533. changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS);
  4534. else
  4535. changed = hci_dev_test_and_clear_flag(hdev,
  4536. HCI_KEEP_DEBUG_KEYS);
  4537. if (cp->val == 0x02)
  4538. use_changed = !hci_dev_test_and_set_flag(hdev,
  4539. HCI_USE_DEBUG_KEYS);
  4540. else
  4541. use_changed = hci_dev_test_and_clear_flag(hdev,
  4542. HCI_USE_DEBUG_KEYS);
  4543. if (hdev_is_powered(hdev) && use_changed &&
  4544. hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
  4545. u8 mode = (cp->val == 0x02) ? 0x01 : 0x00;
  4546. hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE,
  4547. sizeof(mode), &mode);
  4548. }
  4549. err = send_settings_rsp(sk, MGMT_OP_SET_DEBUG_KEYS, hdev);
  4550. if (err < 0)
  4551. goto unlock;
  4552. if (changed)
  4553. err = new_settings(hdev, sk);
  4554. unlock:
  4555. hci_dev_unlock(hdev);
  4556. return err;
  4557. }
  4558. static int set_privacy(struct sock *sk, struct hci_dev *hdev, void *cp_data,
  4559. u16 len)
  4560. {
  4561. struct mgmt_cp_set_privacy *cp = cp_data;
  4562. bool changed;
  4563. int err;
  4564. bt_dev_dbg(hdev, "sock %p", sk);
  4565. if (!lmp_le_capable(hdev))
  4566. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
  4567. MGMT_STATUS_NOT_SUPPORTED);
  4568. if (cp->privacy != 0x00 && cp->privacy != 0x01 && cp->privacy != 0x02)
  4569. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
  4570. MGMT_STATUS_INVALID_PARAMS);
  4571. if (hdev_is_powered(hdev))
  4572. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
  4573. MGMT_STATUS_REJECTED);
  4574. hci_dev_lock(hdev);
  4575. /* If user space supports this command it is also expected to
  4576. * handle IRKs. Therefore, set the HCI_RPA_RESOLVING flag.
  4577. */
  4578. hci_dev_set_flag(hdev, HCI_RPA_RESOLVING);
  4579. if (cp->privacy) {
  4580. changed = !hci_dev_test_and_set_flag(hdev, HCI_PRIVACY);
  4581. memcpy(hdev->irk, cp->irk, sizeof(hdev->irk));
  4582. hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
  4583. hci_adv_instances_set_rpa_expired(hdev, true);
  4584. if (cp->privacy == 0x02)
  4585. hci_dev_set_flag(hdev, HCI_LIMITED_PRIVACY);
  4586. else
  4587. hci_dev_clear_flag(hdev, HCI_LIMITED_PRIVACY);
  4588. } else {
  4589. changed = hci_dev_test_and_clear_flag(hdev, HCI_PRIVACY);
  4590. memset(hdev->irk, 0, sizeof(hdev->irk));
  4591. hci_dev_clear_flag(hdev, HCI_RPA_EXPIRED);
  4592. hci_adv_instances_set_rpa_expired(hdev, false);
  4593. hci_dev_clear_flag(hdev, HCI_LIMITED_PRIVACY);
  4594. }
  4595. err = send_settings_rsp(sk, MGMT_OP_SET_PRIVACY, hdev);
  4596. if (err < 0)
  4597. goto unlock;
  4598. if (changed)
  4599. err = new_settings(hdev, sk);
  4600. unlock:
  4601. hci_dev_unlock(hdev);
  4602. return err;
  4603. }
  4604. static bool irk_is_valid(struct mgmt_irk_info *irk)
  4605. {
  4606. switch (irk->addr.type) {
  4607. case BDADDR_LE_PUBLIC:
  4608. return true;
  4609. case BDADDR_LE_RANDOM:
  4610. /* Two most significant bits shall be set */
  4611. if ((irk->addr.bdaddr.b[5] & 0xc0) != 0xc0)
  4612. return false;
  4613. return true;
  4614. }
  4615. return false;
  4616. }
  4617. static int load_irks(struct sock *sk, struct hci_dev *hdev, void *cp_data,
  4618. u16 len)
  4619. {
  4620. struct mgmt_cp_load_irks *cp = cp_data;
  4621. const u16 max_irk_count = ((U16_MAX - sizeof(*cp)) /
  4622. sizeof(struct mgmt_irk_info));
  4623. u16 irk_count, expected_len;
  4624. int i, err;
  4625. bt_dev_dbg(hdev, "sock %p", sk);
  4626. if (!lmp_le_capable(hdev))
  4627. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
  4628. MGMT_STATUS_NOT_SUPPORTED);
  4629. irk_count = __le16_to_cpu(cp->irk_count);
  4630. if (irk_count > max_irk_count) {
  4631. bt_dev_err(hdev, "load_irks: too big irk_count value %u",
  4632. irk_count);
  4633. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
  4634. MGMT_STATUS_INVALID_PARAMS);
  4635. }
  4636. expected_len = struct_size(cp, irks, irk_count);
  4637. if (expected_len != len) {
  4638. bt_dev_err(hdev, "load_irks: expected %u bytes, got %u bytes",
  4639. expected_len, len);
  4640. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
  4641. MGMT_STATUS_INVALID_PARAMS);
  4642. }
  4643. bt_dev_dbg(hdev, "irk_count %u", irk_count);
  4644. for (i = 0; i < irk_count; i++) {
  4645. struct mgmt_irk_info *key = &cp->irks[i];
  4646. if (!irk_is_valid(key))
  4647. return mgmt_cmd_status(sk, hdev->id,
  4648. MGMT_OP_LOAD_IRKS,
  4649. MGMT_STATUS_INVALID_PARAMS);
  4650. }
  4651. hci_dev_lock(hdev);
  4652. hci_smp_irks_clear(hdev);
  4653. for (i = 0; i < irk_count; i++) {
  4654. struct mgmt_irk_info *irk = &cp->irks[i];
  4655. if (hci_is_blocked_key(hdev,
  4656. HCI_BLOCKED_KEY_TYPE_IRK,
  4657. irk->val)) {
  4658. bt_dev_warn(hdev, "Skipping blocked IRK for %pMR",
  4659. &irk->addr.bdaddr);
  4660. continue;
  4661. }
  4662. hci_add_irk(hdev, &irk->addr.bdaddr,
  4663. le_addr_type(irk->addr.type), irk->val,
  4664. BDADDR_ANY);
  4665. }
  4666. hci_dev_set_flag(hdev, HCI_RPA_RESOLVING);
  4667. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_IRKS, 0, NULL, 0);
  4668. hci_dev_unlock(hdev);
  4669. return err;
  4670. }
  4671. static bool ltk_is_valid(struct mgmt_ltk_info *key)
  4672. {
  4673. if (key->master != 0x00 && key->master != 0x01)
  4674. return false;
  4675. switch (key->addr.type) {
  4676. case BDADDR_LE_PUBLIC:
  4677. return true;
  4678. case BDADDR_LE_RANDOM:
  4679. /* Two most significant bits shall be set */
  4680. if ((key->addr.bdaddr.b[5] & 0xc0) != 0xc0)
  4681. return false;
  4682. return true;
  4683. }
  4684. return false;
  4685. }
  4686. static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
  4687. void *cp_data, u16 len)
  4688. {
  4689. struct mgmt_cp_load_long_term_keys *cp = cp_data;
  4690. const u16 max_key_count = ((U16_MAX - sizeof(*cp)) /
  4691. sizeof(struct mgmt_ltk_info));
  4692. u16 key_count, expected_len;
  4693. int i, err;
  4694. bt_dev_dbg(hdev, "sock %p", sk);
  4695. if (!lmp_le_capable(hdev))
  4696. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
  4697. MGMT_STATUS_NOT_SUPPORTED);
  4698. key_count = __le16_to_cpu(cp->key_count);
  4699. if (key_count > max_key_count) {
  4700. bt_dev_err(hdev, "load_ltks: too big key_count value %u",
  4701. key_count);
  4702. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
  4703. MGMT_STATUS_INVALID_PARAMS);
  4704. }
  4705. expected_len = struct_size(cp, keys, key_count);
  4706. if (expected_len != len) {
  4707. bt_dev_err(hdev, "load_keys: expected %u bytes, got %u bytes",
  4708. expected_len, len);
  4709. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
  4710. MGMT_STATUS_INVALID_PARAMS);
  4711. }
  4712. bt_dev_dbg(hdev, "key_count %u", key_count);
  4713. for (i = 0; i < key_count; i++) {
  4714. struct mgmt_ltk_info *key = &cp->keys[i];
  4715. if (!ltk_is_valid(key))
  4716. return mgmt_cmd_status(sk, hdev->id,
  4717. MGMT_OP_LOAD_LONG_TERM_KEYS,
  4718. MGMT_STATUS_INVALID_PARAMS);
  4719. }
  4720. hci_dev_lock(hdev);
  4721. hci_smp_ltks_clear(hdev);
  4722. for (i = 0; i < key_count; i++) {
  4723. struct mgmt_ltk_info *key = &cp->keys[i];
  4724. u8 type, authenticated;
  4725. if (hci_is_blocked_key(hdev,
  4726. HCI_BLOCKED_KEY_TYPE_LTK,
  4727. key->val)) {
  4728. bt_dev_warn(hdev, "Skipping blocked LTK for %pMR",
  4729. &key->addr.bdaddr);
  4730. continue;
  4731. }
  4732. switch (key->type) {
  4733. case MGMT_LTK_UNAUTHENTICATED:
  4734. authenticated = 0x00;
  4735. type = key->master ? SMP_LTK : SMP_LTK_SLAVE;
  4736. break;
  4737. case MGMT_LTK_AUTHENTICATED:
  4738. authenticated = 0x01;
  4739. type = key->master ? SMP_LTK : SMP_LTK_SLAVE;
  4740. break;
  4741. case MGMT_LTK_P256_UNAUTH:
  4742. authenticated = 0x00;
  4743. type = SMP_LTK_P256;
  4744. break;
  4745. case MGMT_LTK_P256_AUTH:
  4746. authenticated = 0x01;
  4747. type = SMP_LTK_P256;
  4748. break;
  4749. case MGMT_LTK_P256_DEBUG:
  4750. authenticated = 0x00;
  4751. type = SMP_LTK_P256_DEBUG;
  4752. fallthrough;
  4753. default:
  4754. continue;
  4755. }
  4756. hci_add_ltk(hdev, &key->addr.bdaddr,
  4757. le_addr_type(key->addr.type), type, authenticated,
  4758. key->val, key->enc_size, key->ediv, key->rand);
  4759. }
  4760. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
  4761. NULL, 0);
  4762. hci_dev_unlock(hdev);
  4763. return err;
  4764. }
  4765. static int conn_info_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
  4766. {
  4767. struct hci_conn *conn = cmd->user_data;
  4768. struct mgmt_rp_get_conn_info rp;
  4769. int err;
  4770. memcpy(&rp.addr, cmd->param, sizeof(rp.addr));
  4771. if (status == MGMT_STATUS_SUCCESS) {
  4772. rp.rssi = conn->rssi;
  4773. rp.tx_power = conn->tx_power;
  4774. rp.max_tx_power = conn->max_tx_power;
  4775. } else {
  4776. rp.rssi = HCI_RSSI_INVALID;
  4777. rp.tx_power = HCI_TX_POWER_INVALID;
  4778. rp.max_tx_power = HCI_TX_POWER_INVALID;
  4779. }
  4780. err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_GET_CONN_INFO,
  4781. status, &rp, sizeof(rp));
  4782. hci_conn_drop(conn);
  4783. hci_conn_put(conn);
  4784. return err;
  4785. }
  4786. static void conn_info_refresh_complete(struct hci_dev *hdev, u8 hci_status,
  4787. u16 opcode)
  4788. {
  4789. struct hci_cp_read_rssi *cp;
  4790. struct mgmt_pending_cmd *cmd;
  4791. struct hci_conn *conn;
  4792. u16 handle;
  4793. u8 status;
  4794. bt_dev_dbg(hdev, "status 0x%02x", hci_status);
  4795. hci_dev_lock(hdev);
  4796. /* Commands sent in request are either Read RSSI or Read Transmit Power
  4797. * Level so we check which one was last sent to retrieve connection
  4798. * handle. Both commands have handle as first parameter so it's safe to
  4799. * cast data on the same command struct.
  4800. *
  4801. * First command sent is always Read RSSI and we fail only if it fails.
  4802. * In other case we simply override error to indicate success as we
  4803. * already remembered if TX power value is actually valid.
  4804. */
  4805. cp = hci_sent_cmd_data(hdev, HCI_OP_READ_RSSI);
  4806. if (!cp) {
  4807. cp = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
  4808. status = MGMT_STATUS_SUCCESS;
  4809. } else {
  4810. status = mgmt_status(hci_status);
  4811. }
  4812. if (!cp) {
  4813. bt_dev_err(hdev, "invalid sent_cmd in conn_info response");
  4814. goto unlock;
  4815. }
  4816. handle = __le16_to_cpu(cp->handle);
  4817. conn = hci_conn_hash_lookup_handle(hdev, handle);
  4818. if (!conn) {
  4819. bt_dev_err(hdev, "unknown handle (%d) in conn_info response",
  4820. handle);
  4821. goto unlock;
  4822. }
  4823. cmd = pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn);
  4824. if (!cmd)
  4825. goto unlock;
  4826. cmd->cmd_complete(cmd, status);
  4827. mgmt_pending_remove(cmd);
  4828. unlock:
  4829. hci_dev_unlock(hdev);
  4830. }
  4831. static int get_conn_info(struct sock *sk, struct hci_dev *hdev, void *data,
  4832. u16 len)
  4833. {
  4834. struct mgmt_cp_get_conn_info *cp = data;
  4835. struct mgmt_rp_get_conn_info rp;
  4836. struct hci_conn *conn;
  4837. unsigned long conn_info_age;
  4838. int err = 0;
  4839. bt_dev_dbg(hdev, "sock %p", sk);
  4840. memset(&rp, 0, sizeof(rp));
  4841. bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
  4842. rp.addr.type = cp->addr.type;
  4843. if (!bdaddr_type_is_valid(cp->addr.type))
  4844. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
  4845. MGMT_STATUS_INVALID_PARAMS,
  4846. &rp, sizeof(rp));
  4847. hci_dev_lock(hdev);
  4848. if (!hdev_is_powered(hdev)) {
  4849. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
  4850. MGMT_STATUS_NOT_POWERED, &rp,
  4851. sizeof(rp));
  4852. goto unlock;
  4853. }
  4854. if (cp->addr.type == BDADDR_BREDR)
  4855. conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
  4856. &cp->addr.bdaddr);
  4857. else
  4858. conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
  4859. if (!conn || conn->state != BT_CONNECTED) {
  4860. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
  4861. MGMT_STATUS_NOT_CONNECTED, &rp,
  4862. sizeof(rp));
  4863. goto unlock;
  4864. }
  4865. if (pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn)) {
  4866. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
  4867. MGMT_STATUS_BUSY, &rp, sizeof(rp));
  4868. goto unlock;
  4869. }
  4870. /* To avoid client trying to guess when to poll again for information we
  4871. * calculate conn info age as random value between min/max set in hdev.
  4872. */
  4873. conn_info_age = hdev->conn_info_min_age +
  4874. prandom_u32_max(hdev->conn_info_max_age -
  4875. hdev->conn_info_min_age);
  4876. /* Query controller to refresh cached values if they are too old or were
  4877. * never read.
  4878. */
  4879. if (time_after(jiffies, conn->conn_info_timestamp +
  4880. msecs_to_jiffies(conn_info_age)) ||
  4881. !conn->conn_info_timestamp) {
  4882. struct hci_request req;
  4883. struct hci_cp_read_tx_power req_txp_cp;
  4884. struct hci_cp_read_rssi req_rssi_cp;
  4885. struct mgmt_pending_cmd *cmd;
  4886. hci_req_init(&req, hdev);
  4887. req_rssi_cp.handle = cpu_to_le16(conn->handle);
  4888. hci_req_add(&req, HCI_OP_READ_RSSI, sizeof(req_rssi_cp),
  4889. &req_rssi_cp);
  4890. /* For LE links TX power does not change thus we don't need to
  4891. * query for it once value is known.
  4892. */
  4893. if (!bdaddr_type_is_le(cp->addr.type) ||
  4894. conn->tx_power == HCI_TX_POWER_INVALID) {
  4895. req_txp_cp.handle = cpu_to_le16(conn->handle);
  4896. req_txp_cp.type = 0x00;
  4897. hci_req_add(&req, HCI_OP_READ_TX_POWER,
  4898. sizeof(req_txp_cp), &req_txp_cp);
  4899. }
  4900. /* Max TX power needs to be read only once per connection */
  4901. if (conn->max_tx_power == HCI_TX_POWER_INVALID) {
  4902. req_txp_cp.handle = cpu_to_le16(conn->handle);
  4903. req_txp_cp.type = 0x01;
  4904. hci_req_add(&req, HCI_OP_READ_TX_POWER,
  4905. sizeof(req_txp_cp), &req_txp_cp);
  4906. }
  4907. err = hci_req_run(&req, conn_info_refresh_complete);
  4908. if (err < 0)
  4909. goto unlock;
  4910. cmd = mgmt_pending_add(sk, MGMT_OP_GET_CONN_INFO, hdev,
  4911. data, len);
  4912. if (!cmd) {
  4913. err = -ENOMEM;
  4914. goto unlock;
  4915. }
  4916. hci_conn_hold(conn);
  4917. cmd->user_data = hci_conn_get(conn);
  4918. cmd->cmd_complete = conn_info_cmd_complete;
  4919. conn->conn_info_timestamp = jiffies;
  4920. } else {
  4921. /* Cache is valid, just reply with values cached in hci_conn */
  4922. rp.rssi = conn->rssi;
  4923. rp.tx_power = conn->tx_power;
  4924. rp.max_tx_power = conn->max_tx_power;
  4925. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
  4926. MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
  4927. }
  4928. unlock:
  4929. hci_dev_unlock(hdev);
  4930. return err;
  4931. }
  4932. static int clock_info_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
  4933. {
  4934. struct hci_conn *conn = cmd->user_data;
  4935. struct mgmt_rp_get_clock_info rp;
  4936. struct hci_dev *hdev;
  4937. int err;
  4938. memset(&rp, 0, sizeof(rp));
  4939. memcpy(&rp.addr, cmd->param, sizeof(rp.addr));
  4940. if (status)
  4941. goto complete;
  4942. hdev = hci_dev_get(cmd->index);
  4943. if (hdev) {
  4944. rp.local_clock = cpu_to_le32(hdev->clock);
  4945. hci_dev_put(hdev);
  4946. }
  4947. if (conn) {
  4948. rp.piconet_clock = cpu_to_le32(conn->clock);
  4949. rp.accuracy = cpu_to_le16(conn->clock_accuracy);
  4950. }
  4951. complete:
  4952. err = mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, &rp,
  4953. sizeof(rp));
  4954. if (conn) {
  4955. hci_conn_drop(conn);
  4956. hci_conn_put(conn);
  4957. }
  4958. return err;
  4959. }
  4960. static void get_clock_info_complete(struct hci_dev *hdev, u8 status, u16 opcode)
  4961. {
  4962. struct hci_cp_read_clock *hci_cp;
  4963. struct mgmt_pending_cmd *cmd;
  4964. struct hci_conn *conn;
  4965. bt_dev_dbg(hdev, "status %u", status);
  4966. hci_dev_lock(hdev);
  4967. hci_cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
  4968. if (!hci_cp)
  4969. goto unlock;
  4970. if (hci_cp->which) {
  4971. u16 handle = __le16_to_cpu(hci_cp->handle);
  4972. conn = hci_conn_hash_lookup_handle(hdev, handle);
  4973. } else {
  4974. conn = NULL;
  4975. }
  4976. cmd = pending_find_data(MGMT_OP_GET_CLOCK_INFO, hdev, conn);
  4977. if (!cmd)
  4978. goto unlock;
  4979. cmd->cmd_complete(cmd, mgmt_status(status));
  4980. mgmt_pending_remove(cmd);
  4981. unlock:
  4982. hci_dev_unlock(hdev);
  4983. }
  4984. static int get_clock_info(struct sock *sk, struct hci_dev *hdev, void *data,
  4985. u16 len)
  4986. {
  4987. struct mgmt_cp_get_clock_info *cp = data;
  4988. struct mgmt_rp_get_clock_info rp;
  4989. struct hci_cp_read_clock hci_cp;
  4990. struct mgmt_pending_cmd *cmd;
  4991. struct hci_request req;
  4992. struct hci_conn *conn;
  4993. int err;
  4994. bt_dev_dbg(hdev, "sock %p", sk);
  4995. memset(&rp, 0, sizeof(rp));
  4996. bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
  4997. rp.addr.type = cp->addr.type;
  4998. if (cp->addr.type != BDADDR_BREDR)
  4999. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO,
  5000. MGMT_STATUS_INVALID_PARAMS,
  5001. &rp, sizeof(rp));
  5002. hci_dev_lock(hdev);
  5003. if (!hdev_is_powered(hdev)) {
  5004. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO,
  5005. MGMT_STATUS_NOT_POWERED, &rp,
  5006. sizeof(rp));
  5007. goto unlock;
  5008. }
  5009. if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
  5010. conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
  5011. &cp->addr.bdaddr);
  5012. if (!conn || conn->state != BT_CONNECTED) {
  5013. err = mgmt_cmd_complete(sk, hdev->id,
  5014. MGMT_OP_GET_CLOCK_INFO,
  5015. MGMT_STATUS_NOT_CONNECTED,
  5016. &rp, sizeof(rp));
  5017. goto unlock;
  5018. }
  5019. } else {
  5020. conn = NULL;
  5021. }
  5022. cmd = mgmt_pending_add(sk, MGMT_OP_GET_CLOCK_INFO, hdev, data, len);
  5023. if (!cmd) {
  5024. err = -ENOMEM;
  5025. goto unlock;
  5026. }
  5027. cmd->cmd_complete = clock_info_cmd_complete;
  5028. hci_req_init(&req, hdev);
  5029. memset(&hci_cp, 0, sizeof(hci_cp));
  5030. hci_req_add(&req, HCI_OP_READ_CLOCK, sizeof(hci_cp), &hci_cp);
  5031. if (conn) {
  5032. hci_conn_hold(conn);
  5033. cmd->user_data = hci_conn_get(conn);
  5034. hci_cp.handle = cpu_to_le16(conn->handle);
  5035. hci_cp.which = 0x01; /* Piconet clock */
  5036. hci_req_add(&req, HCI_OP_READ_CLOCK, sizeof(hci_cp), &hci_cp);
  5037. }
  5038. err = hci_req_run(&req, get_clock_info_complete);
  5039. if (err < 0)
  5040. mgmt_pending_remove(cmd);
  5041. unlock:
  5042. hci_dev_unlock(hdev);
  5043. return err;
  5044. }
  5045. static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type)
  5046. {
  5047. struct hci_conn *conn;
  5048. conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, addr);
  5049. if (!conn)
  5050. return false;
  5051. if (conn->dst_type != type)
  5052. return false;
  5053. if (conn->state != BT_CONNECTED)
  5054. return false;
  5055. return true;
  5056. }
  5057. /* This function requires the caller holds hdev->lock */
  5058. static int hci_conn_params_set(struct hci_dev *hdev, bdaddr_t *addr,
  5059. u8 addr_type, u8 auto_connect)
  5060. {
  5061. struct hci_conn_params *params;
  5062. params = hci_conn_params_add(hdev, addr, addr_type);
  5063. if (!params)
  5064. return -EIO;
  5065. if (params->auto_connect == auto_connect)
  5066. return 0;
  5067. list_del_init(&params->action);
  5068. switch (auto_connect) {
  5069. case HCI_AUTO_CONN_DISABLED:
  5070. case HCI_AUTO_CONN_LINK_LOSS:
  5071. /* If auto connect is being disabled when we're trying to
  5072. * connect to device, keep connecting.
  5073. */
  5074. if (params->explicit_connect)
  5075. list_add(&params->action, &hdev->pend_le_conns);
  5076. break;
  5077. case HCI_AUTO_CONN_REPORT:
  5078. if (params->explicit_connect)
  5079. list_add(&params->action, &hdev->pend_le_conns);
  5080. else
  5081. list_add(&params->action, &hdev->pend_le_reports);
  5082. break;
  5083. case HCI_AUTO_CONN_DIRECT:
  5084. case HCI_AUTO_CONN_ALWAYS:
  5085. if (!is_connected(hdev, addr, addr_type))
  5086. list_add(&params->action, &hdev->pend_le_conns);
  5087. break;
  5088. }
  5089. params->auto_connect = auto_connect;
  5090. bt_dev_dbg(hdev, "addr %pMR (type %u) auto_connect %u",
  5091. addr, addr_type, auto_connect);
  5092. return 0;
  5093. }
  5094. static void device_added(struct sock *sk, struct hci_dev *hdev,
  5095. bdaddr_t *bdaddr, u8 type, u8 action)
  5096. {
  5097. struct mgmt_ev_device_added ev;
  5098. bacpy(&ev.addr.bdaddr, bdaddr);
  5099. ev.addr.type = type;
  5100. ev.action = action;
  5101. mgmt_event(MGMT_EV_DEVICE_ADDED, hdev, &ev, sizeof(ev), sk);
  5102. }
  5103. static int add_device(struct sock *sk, struct hci_dev *hdev,
  5104. void *data, u16 len)
  5105. {
  5106. struct mgmt_cp_add_device *cp = data;
  5107. u8 auto_conn, addr_type;
  5108. struct hci_conn_params *params;
  5109. int err;
  5110. u32 current_flags = 0;
  5111. bt_dev_dbg(hdev, "sock %p", sk);
  5112. if (!bdaddr_type_is_valid(cp->addr.type) ||
  5113. !bacmp(&cp->addr.bdaddr, BDADDR_ANY))
  5114. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
  5115. MGMT_STATUS_INVALID_PARAMS,
  5116. &cp->addr, sizeof(cp->addr));
  5117. if (cp->action != 0x00 && cp->action != 0x01 && cp->action != 0x02)
  5118. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
  5119. MGMT_STATUS_INVALID_PARAMS,
  5120. &cp->addr, sizeof(cp->addr));
  5121. hci_dev_lock(hdev);
  5122. if (cp->addr.type == BDADDR_BREDR) {
  5123. /* Only incoming connections action is supported for now */
  5124. if (cp->action != 0x01) {
  5125. err = mgmt_cmd_complete(sk, hdev->id,
  5126. MGMT_OP_ADD_DEVICE,
  5127. MGMT_STATUS_INVALID_PARAMS,
  5128. &cp->addr, sizeof(cp->addr));
  5129. goto unlock;
  5130. }
  5131. err = hci_bdaddr_list_add_with_flags(&hdev->whitelist,
  5132. &cp->addr.bdaddr,
  5133. cp->addr.type, 0);
  5134. if (err)
  5135. goto unlock;
  5136. hci_req_update_scan(hdev);
  5137. goto added;
  5138. }
  5139. addr_type = le_addr_type(cp->addr.type);
  5140. if (cp->action == 0x02)
  5141. auto_conn = HCI_AUTO_CONN_ALWAYS;
  5142. else if (cp->action == 0x01)
  5143. auto_conn = HCI_AUTO_CONN_DIRECT;
  5144. else
  5145. auto_conn = HCI_AUTO_CONN_REPORT;
  5146. /* Kernel internally uses conn_params with resolvable private
  5147. * address, but Add Device allows only identity addresses.
  5148. * Make sure it is enforced before calling
  5149. * hci_conn_params_lookup.
  5150. */
  5151. if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) {
  5152. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
  5153. MGMT_STATUS_INVALID_PARAMS,
  5154. &cp->addr, sizeof(cp->addr));
  5155. goto unlock;
  5156. }
  5157. /* If the connection parameters don't exist for this device,
  5158. * they will be created and configured with defaults.
  5159. */
  5160. if (hci_conn_params_set(hdev, &cp->addr.bdaddr, addr_type,
  5161. auto_conn) < 0) {
  5162. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
  5163. MGMT_STATUS_FAILED, &cp->addr,
  5164. sizeof(cp->addr));
  5165. goto unlock;
  5166. } else {
  5167. params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr,
  5168. addr_type);
  5169. if (params)
  5170. current_flags = params->current_flags;
  5171. }
  5172. hci_update_background_scan(hdev);
  5173. added:
  5174. device_added(sk, hdev, &cp->addr.bdaddr, cp->addr.type, cp->action);
  5175. device_flags_changed(NULL, hdev, &cp->addr.bdaddr, cp->addr.type,
  5176. SUPPORTED_DEVICE_FLAGS(), current_flags);
  5177. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
  5178. MGMT_STATUS_SUCCESS, &cp->addr,
  5179. sizeof(cp->addr));
  5180. unlock:
  5181. hci_dev_unlock(hdev);
  5182. return err;
  5183. }
  5184. static void device_removed(struct sock *sk, struct hci_dev *hdev,
  5185. bdaddr_t *bdaddr, u8 type)
  5186. {
  5187. struct mgmt_ev_device_removed ev;
  5188. bacpy(&ev.addr.bdaddr, bdaddr);
  5189. ev.addr.type = type;
  5190. mgmt_event(MGMT_EV_DEVICE_REMOVED, hdev, &ev, sizeof(ev), sk);
  5191. }
  5192. static int remove_device(struct sock *sk, struct hci_dev *hdev,
  5193. void *data, u16 len)
  5194. {
  5195. struct mgmt_cp_remove_device *cp = data;
  5196. int err;
  5197. bt_dev_dbg(hdev, "sock %p", sk);
  5198. hci_dev_lock(hdev);
  5199. if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
  5200. struct hci_conn_params *params;
  5201. u8 addr_type;
  5202. if (!bdaddr_type_is_valid(cp->addr.type)) {
  5203. err = mgmt_cmd_complete(sk, hdev->id,
  5204. MGMT_OP_REMOVE_DEVICE,
  5205. MGMT_STATUS_INVALID_PARAMS,
  5206. &cp->addr, sizeof(cp->addr));
  5207. goto unlock;
  5208. }
  5209. if (cp->addr.type == BDADDR_BREDR) {
  5210. err = hci_bdaddr_list_del(&hdev->whitelist,
  5211. &cp->addr.bdaddr,
  5212. cp->addr.type);
  5213. if (err) {
  5214. err = mgmt_cmd_complete(sk, hdev->id,
  5215. MGMT_OP_REMOVE_DEVICE,
  5216. MGMT_STATUS_INVALID_PARAMS,
  5217. &cp->addr,
  5218. sizeof(cp->addr));
  5219. goto unlock;
  5220. }
  5221. hci_req_update_scan(hdev);
  5222. device_removed(sk, hdev, &cp->addr.bdaddr,
  5223. cp->addr.type);
  5224. goto complete;
  5225. }
  5226. addr_type = le_addr_type(cp->addr.type);
  5227. /* Kernel internally uses conn_params with resolvable private
  5228. * address, but Remove Device allows only identity addresses.
  5229. * Make sure it is enforced before calling
  5230. * hci_conn_params_lookup.
  5231. */
  5232. if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) {
  5233. err = mgmt_cmd_complete(sk, hdev->id,
  5234. MGMT_OP_REMOVE_DEVICE,
  5235. MGMT_STATUS_INVALID_PARAMS,
  5236. &cp->addr, sizeof(cp->addr));
  5237. goto unlock;
  5238. }
  5239. params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr,
  5240. addr_type);
  5241. if (!params) {
  5242. err = mgmt_cmd_complete(sk, hdev->id,
  5243. MGMT_OP_REMOVE_DEVICE,
  5244. MGMT_STATUS_INVALID_PARAMS,
  5245. &cp->addr, sizeof(cp->addr));
  5246. goto unlock;
  5247. }
  5248. if (params->auto_connect == HCI_AUTO_CONN_DISABLED ||
  5249. params->auto_connect == HCI_AUTO_CONN_EXPLICIT) {
  5250. err = mgmt_cmd_complete(sk, hdev->id,
  5251. MGMT_OP_REMOVE_DEVICE,
  5252. MGMT_STATUS_INVALID_PARAMS,
  5253. &cp->addr, sizeof(cp->addr));
  5254. goto unlock;
  5255. }
  5256. list_del(&params->action);
  5257. list_del(&params->list);
  5258. kfree(params);
  5259. hci_update_background_scan(hdev);
  5260. device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type);
  5261. } else {
  5262. struct hci_conn_params *p, *tmp;
  5263. struct bdaddr_list *b, *btmp;
  5264. if (cp->addr.type) {
  5265. err = mgmt_cmd_complete(sk, hdev->id,
  5266. MGMT_OP_REMOVE_DEVICE,
  5267. MGMT_STATUS_INVALID_PARAMS,
  5268. &cp->addr, sizeof(cp->addr));
  5269. goto unlock;
  5270. }
  5271. list_for_each_entry_safe(b, btmp, &hdev->whitelist, list) {
  5272. device_removed(sk, hdev, &b->bdaddr, b->bdaddr_type);
  5273. list_del(&b->list);
  5274. kfree(b);
  5275. }
  5276. hci_req_update_scan(hdev);
  5277. list_for_each_entry_safe(p, tmp, &hdev->le_conn_params, list) {
  5278. if (p->auto_connect == HCI_AUTO_CONN_DISABLED)
  5279. continue;
  5280. device_removed(sk, hdev, &p->addr, p->addr_type);
  5281. if (p->explicit_connect) {
  5282. p->auto_connect = HCI_AUTO_CONN_EXPLICIT;
  5283. continue;
  5284. }
  5285. list_del(&p->action);
  5286. list_del(&p->list);
  5287. kfree(p);
  5288. }
  5289. bt_dev_dbg(hdev, "All LE connection parameters were removed");
  5290. hci_update_background_scan(hdev);
  5291. }
  5292. complete:
  5293. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_DEVICE,
  5294. MGMT_STATUS_SUCCESS, &cp->addr,
  5295. sizeof(cp->addr));
  5296. unlock:
  5297. hci_dev_unlock(hdev);
  5298. return err;
  5299. }
  5300. static int load_conn_param(struct sock *sk, struct hci_dev *hdev, void *data,
  5301. u16 len)
  5302. {
  5303. struct mgmt_cp_load_conn_param *cp = data;
  5304. const u16 max_param_count = ((U16_MAX - sizeof(*cp)) /
  5305. sizeof(struct mgmt_conn_param));
  5306. u16 param_count, expected_len;
  5307. int i;
  5308. if (!lmp_le_capable(hdev))
  5309. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
  5310. MGMT_STATUS_NOT_SUPPORTED);
  5311. param_count = __le16_to_cpu(cp->param_count);
  5312. if (param_count > max_param_count) {
  5313. bt_dev_err(hdev, "load_conn_param: too big param_count value %u",
  5314. param_count);
  5315. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
  5316. MGMT_STATUS_INVALID_PARAMS);
  5317. }
  5318. expected_len = struct_size(cp, params, param_count);
  5319. if (expected_len != len) {
  5320. bt_dev_err(hdev, "load_conn_param: expected %u bytes, got %u bytes",
  5321. expected_len, len);
  5322. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
  5323. MGMT_STATUS_INVALID_PARAMS);
  5324. }
  5325. bt_dev_dbg(hdev, "param_count %u", param_count);
  5326. hci_dev_lock(hdev);
  5327. hci_conn_params_clear_disabled(hdev);
  5328. for (i = 0; i < param_count; i++) {
  5329. struct mgmt_conn_param *param = &cp->params[i];
  5330. struct hci_conn_params *hci_param;
  5331. u16 min, max, latency, timeout;
  5332. u8 addr_type;
  5333. bt_dev_dbg(hdev, "Adding %pMR (type %u)", &param->addr.bdaddr,
  5334. param->addr.type);
  5335. if (param->addr.type == BDADDR_LE_PUBLIC) {
  5336. addr_type = ADDR_LE_DEV_PUBLIC;
  5337. } else if (param->addr.type == BDADDR_LE_RANDOM) {
  5338. addr_type = ADDR_LE_DEV_RANDOM;
  5339. } else {
  5340. bt_dev_err(hdev, "ignoring invalid connection parameters");
  5341. continue;
  5342. }
  5343. min = le16_to_cpu(param->min_interval);
  5344. max = le16_to_cpu(param->max_interval);
  5345. latency = le16_to_cpu(param->latency);
  5346. timeout = le16_to_cpu(param->timeout);
  5347. bt_dev_dbg(hdev, "min 0x%04x max 0x%04x latency 0x%04x timeout 0x%04x",
  5348. min, max, latency, timeout);
  5349. if (hci_check_conn_params(min, max, latency, timeout) < 0) {
  5350. bt_dev_err(hdev, "ignoring invalid connection parameters");
  5351. continue;
  5352. }
  5353. hci_param = hci_conn_params_add(hdev, &param->addr.bdaddr,
  5354. addr_type);
  5355. if (!hci_param) {
  5356. bt_dev_err(hdev, "failed to add connection parameters");
  5357. continue;
  5358. }
  5359. hci_param->conn_min_interval = min;
  5360. hci_param->conn_max_interval = max;
  5361. hci_param->conn_latency = latency;
  5362. hci_param->supervision_timeout = timeout;
  5363. }
  5364. hci_dev_unlock(hdev);
  5365. return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, 0,
  5366. NULL, 0);
  5367. }
  5368. static int set_external_config(struct sock *sk, struct hci_dev *hdev,
  5369. void *data, u16 len)
  5370. {
  5371. struct mgmt_cp_set_external_config *cp = data;
  5372. bool changed;
  5373. int err;
  5374. bt_dev_dbg(hdev, "sock %p", sk);
  5375. if (hdev_is_powered(hdev))
  5376. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
  5377. MGMT_STATUS_REJECTED);
  5378. if (cp->config != 0x00 && cp->config != 0x01)
  5379. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
  5380. MGMT_STATUS_INVALID_PARAMS);
  5381. if (!test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks))
  5382. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
  5383. MGMT_STATUS_NOT_SUPPORTED);
  5384. hci_dev_lock(hdev);
  5385. if (cp->config)
  5386. changed = !hci_dev_test_and_set_flag(hdev, HCI_EXT_CONFIGURED);
  5387. else
  5388. changed = hci_dev_test_and_clear_flag(hdev, HCI_EXT_CONFIGURED);
  5389. err = send_options_rsp(sk, MGMT_OP_SET_EXTERNAL_CONFIG, hdev);
  5390. if (err < 0)
  5391. goto unlock;
  5392. if (!changed)
  5393. goto unlock;
  5394. err = new_options(hdev, sk);
  5395. if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED) == is_configured(hdev)) {
  5396. mgmt_index_removed(hdev);
  5397. if (hci_dev_test_and_change_flag(hdev, HCI_UNCONFIGURED)) {
  5398. hci_dev_set_flag(hdev, HCI_CONFIG);
  5399. hci_dev_set_flag(hdev, HCI_AUTO_OFF);
  5400. queue_work(hdev->req_workqueue, &hdev->power_on);
  5401. } else {
  5402. set_bit(HCI_RAW, &hdev->flags);
  5403. mgmt_index_added(hdev);
  5404. }
  5405. }
  5406. unlock:
  5407. hci_dev_unlock(hdev);
  5408. return err;
  5409. }
  5410. static int set_public_address(struct sock *sk, struct hci_dev *hdev,
  5411. void *data, u16 len)
  5412. {
  5413. struct mgmt_cp_set_public_address *cp = data;
  5414. bool changed;
  5415. int err;
  5416. bt_dev_dbg(hdev, "sock %p", sk);
  5417. if (hdev_is_powered(hdev))
  5418. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
  5419. MGMT_STATUS_REJECTED);
  5420. if (!bacmp(&cp->bdaddr, BDADDR_ANY))
  5421. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
  5422. MGMT_STATUS_INVALID_PARAMS);
  5423. if (!hdev->set_bdaddr)
  5424. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
  5425. MGMT_STATUS_NOT_SUPPORTED);
  5426. hci_dev_lock(hdev);
  5427. changed = !!bacmp(&hdev->public_addr, &cp->bdaddr);
  5428. bacpy(&hdev->public_addr, &cp->bdaddr);
  5429. err = send_options_rsp(sk, MGMT_OP_SET_PUBLIC_ADDRESS, hdev);
  5430. if (err < 0)
  5431. goto unlock;
  5432. if (!changed)
  5433. goto unlock;
  5434. if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED))
  5435. err = new_options(hdev, sk);
  5436. if (is_configured(hdev)) {
  5437. mgmt_index_removed(hdev);
  5438. hci_dev_clear_flag(hdev, HCI_UNCONFIGURED);
  5439. hci_dev_set_flag(hdev, HCI_CONFIG);
  5440. hci_dev_set_flag(hdev, HCI_AUTO_OFF);
  5441. queue_work(hdev->req_workqueue, &hdev->power_on);
  5442. }
  5443. unlock:
  5444. hci_dev_unlock(hdev);
  5445. return err;
  5446. }
  5447. static void read_local_oob_ext_data_complete(struct hci_dev *hdev, u8 status,
  5448. u16 opcode, struct sk_buff *skb)
  5449. {
  5450. const struct mgmt_cp_read_local_oob_ext_data *mgmt_cp;
  5451. struct mgmt_rp_read_local_oob_ext_data *mgmt_rp;
  5452. u8 *h192, *r192, *h256, *r256;
  5453. struct mgmt_pending_cmd *cmd;
  5454. u16 eir_len;
  5455. int err;
  5456. bt_dev_dbg(hdev, "status %u", status);
  5457. cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev);
  5458. if (!cmd)
  5459. return;
  5460. mgmt_cp = cmd->param;
  5461. if (status) {
  5462. status = mgmt_status(status);
  5463. eir_len = 0;
  5464. h192 = NULL;
  5465. r192 = NULL;
  5466. h256 = NULL;
  5467. r256 = NULL;
  5468. } else if (opcode == HCI_OP_READ_LOCAL_OOB_DATA) {
  5469. struct hci_rp_read_local_oob_data *rp;
  5470. if (skb->len != sizeof(*rp)) {
  5471. status = MGMT_STATUS_FAILED;
  5472. eir_len = 0;
  5473. } else {
  5474. status = MGMT_STATUS_SUCCESS;
  5475. rp = (void *)skb->data;
  5476. eir_len = 5 + 18 + 18;
  5477. h192 = rp->hash;
  5478. r192 = rp->rand;
  5479. h256 = NULL;
  5480. r256 = NULL;
  5481. }
  5482. } else {
  5483. struct hci_rp_read_local_oob_ext_data *rp;
  5484. if (skb->len != sizeof(*rp)) {
  5485. status = MGMT_STATUS_FAILED;
  5486. eir_len = 0;
  5487. } else {
  5488. status = MGMT_STATUS_SUCCESS;
  5489. rp = (void *)skb->data;
  5490. if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
  5491. eir_len = 5 + 18 + 18;
  5492. h192 = NULL;
  5493. r192 = NULL;
  5494. } else {
  5495. eir_len = 5 + 18 + 18 + 18 + 18;
  5496. h192 = rp->hash192;
  5497. r192 = rp->rand192;
  5498. }
  5499. h256 = rp->hash256;
  5500. r256 = rp->rand256;
  5501. }
  5502. }
  5503. mgmt_rp = kmalloc(sizeof(*mgmt_rp) + eir_len, GFP_KERNEL);
  5504. if (!mgmt_rp)
  5505. goto done;
  5506. if (status)
  5507. goto send_rsp;
  5508. eir_len = eir_append_data(mgmt_rp->eir, 0, EIR_CLASS_OF_DEV,
  5509. hdev->dev_class, 3);
  5510. if (h192 && r192) {
  5511. eir_len = eir_append_data(mgmt_rp->eir, eir_len,
  5512. EIR_SSP_HASH_C192, h192, 16);
  5513. eir_len = eir_append_data(mgmt_rp->eir, eir_len,
  5514. EIR_SSP_RAND_R192, r192, 16);
  5515. }
  5516. if (h256 && r256) {
  5517. eir_len = eir_append_data(mgmt_rp->eir, eir_len,
  5518. EIR_SSP_HASH_C256, h256, 16);
  5519. eir_len = eir_append_data(mgmt_rp->eir, eir_len,
  5520. EIR_SSP_RAND_R256, r256, 16);
  5521. }
  5522. send_rsp:
  5523. mgmt_rp->type = mgmt_cp->type;
  5524. mgmt_rp->eir_len = cpu_to_le16(eir_len);
  5525. err = mgmt_cmd_complete(cmd->sk, hdev->id,
  5526. MGMT_OP_READ_LOCAL_OOB_EXT_DATA, status,
  5527. mgmt_rp, sizeof(*mgmt_rp) + eir_len);
  5528. if (err < 0 || status)
  5529. goto done;
  5530. hci_sock_set_flag(cmd->sk, HCI_MGMT_OOB_DATA_EVENTS);
  5531. err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev,
  5532. mgmt_rp, sizeof(*mgmt_rp) + eir_len,
  5533. HCI_MGMT_OOB_DATA_EVENTS, cmd->sk);
  5534. done:
  5535. kfree(mgmt_rp);
  5536. mgmt_pending_remove(cmd);
  5537. }
  5538. static int read_local_ssp_oob_req(struct hci_dev *hdev, struct sock *sk,
  5539. struct mgmt_cp_read_local_oob_ext_data *cp)
  5540. {
  5541. struct mgmt_pending_cmd *cmd;
  5542. struct hci_request req;
  5543. int err;
  5544. cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev,
  5545. cp, sizeof(*cp));
  5546. if (!cmd)
  5547. return -ENOMEM;
  5548. hci_req_init(&req, hdev);
  5549. if (bredr_sc_enabled(hdev))
  5550. hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_EXT_DATA, 0, NULL);
  5551. else
  5552. hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
  5553. err = hci_req_run_skb(&req, read_local_oob_ext_data_complete);
  5554. if (err < 0) {
  5555. mgmt_pending_remove(cmd);
  5556. return err;
  5557. }
  5558. return 0;
  5559. }
  5560. static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev,
  5561. void *data, u16 data_len)
  5562. {
  5563. struct mgmt_cp_read_local_oob_ext_data *cp = data;
  5564. struct mgmt_rp_read_local_oob_ext_data *rp;
  5565. size_t rp_len;
  5566. u16 eir_len;
  5567. u8 status, flags, role, addr[7], hash[16], rand[16];
  5568. int err;
  5569. bt_dev_dbg(hdev, "sock %p", sk);
  5570. if (hdev_is_powered(hdev)) {
  5571. switch (cp->type) {
  5572. case BIT(BDADDR_BREDR):
  5573. status = mgmt_bredr_support(hdev);
  5574. if (status)
  5575. eir_len = 0;
  5576. else
  5577. eir_len = 5;
  5578. break;
  5579. case (BIT(BDADDR_LE_PUBLIC) | BIT(BDADDR_LE_RANDOM)):
  5580. status = mgmt_le_support(hdev);
  5581. if (status)
  5582. eir_len = 0;
  5583. else
  5584. eir_len = 9 + 3 + 18 + 18 + 3;
  5585. break;
  5586. default:
  5587. status = MGMT_STATUS_INVALID_PARAMS;
  5588. eir_len = 0;
  5589. break;
  5590. }
  5591. } else {
  5592. status = MGMT_STATUS_NOT_POWERED;
  5593. eir_len = 0;
  5594. }
  5595. rp_len = sizeof(*rp) + eir_len;
  5596. rp = kmalloc(rp_len, GFP_ATOMIC);
  5597. if (!rp)
  5598. return -ENOMEM;
  5599. if (status)
  5600. goto complete;
  5601. hci_dev_lock(hdev);
  5602. eir_len = 0;
  5603. switch (cp->type) {
  5604. case BIT(BDADDR_BREDR):
  5605. if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
  5606. err = read_local_ssp_oob_req(hdev, sk, cp);
  5607. hci_dev_unlock(hdev);
  5608. if (!err)
  5609. goto done;
  5610. status = MGMT_STATUS_FAILED;
  5611. goto complete;
  5612. } else {
  5613. eir_len = eir_append_data(rp->eir, eir_len,
  5614. EIR_CLASS_OF_DEV,
  5615. hdev->dev_class, 3);
  5616. }
  5617. break;
  5618. case (BIT(BDADDR_LE_PUBLIC) | BIT(BDADDR_LE_RANDOM)):
  5619. if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
  5620. smp_generate_oob(hdev, hash, rand) < 0) {
  5621. hci_dev_unlock(hdev);
  5622. status = MGMT_STATUS_FAILED;
  5623. goto complete;
  5624. }
  5625. /* This should return the active RPA, but since the RPA
  5626. * is only programmed on demand, it is really hard to fill
  5627. * this in at the moment. For now disallow retrieving
  5628. * local out-of-band data when privacy is in use.
  5629. *
  5630. * Returning the identity address will not help here since
  5631. * pairing happens before the identity resolving key is
  5632. * known and thus the connection establishment happens
  5633. * based on the RPA and not the identity address.
  5634. */
  5635. if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
  5636. hci_dev_unlock(hdev);
  5637. status = MGMT_STATUS_REJECTED;
  5638. goto complete;
  5639. }
  5640. if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ||
  5641. !bacmp(&hdev->bdaddr, BDADDR_ANY) ||
  5642. (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
  5643. bacmp(&hdev->static_addr, BDADDR_ANY))) {
  5644. memcpy(addr, &hdev->static_addr, 6);
  5645. addr[6] = 0x01;
  5646. } else {
  5647. memcpy(addr, &hdev->bdaddr, 6);
  5648. addr[6] = 0x00;
  5649. }
  5650. eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_BDADDR,
  5651. addr, sizeof(addr));
  5652. if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
  5653. role = 0x02;
  5654. else
  5655. role = 0x01;
  5656. eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_ROLE,
  5657. &role, sizeof(role));
  5658. if (hci_dev_test_flag(hdev, HCI_SC_ENABLED)) {
  5659. eir_len = eir_append_data(rp->eir, eir_len,
  5660. EIR_LE_SC_CONFIRM,
  5661. hash, sizeof(hash));
  5662. eir_len = eir_append_data(rp->eir, eir_len,
  5663. EIR_LE_SC_RANDOM,
  5664. rand, sizeof(rand));
  5665. }
  5666. flags = mgmt_get_adv_discov_flags(hdev);
  5667. if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
  5668. flags |= LE_AD_NO_BREDR;
  5669. eir_len = eir_append_data(rp->eir, eir_len, EIR_FLAGS,
  5670. &flags, sizeof(flags));
  5671. break;
  5672. }
  5673. hci_dev_unlock(hdev);
  5674. hci_sock_set_flag(sk, HCI_MGMT_OOB_DATA_EVENTS);
  5675. status = MGMT_STATUS_SUCCESS;
  5676. complete:
  5677. rp->type = cp->type;
  5678. rp->eir_len = cpu_to_le16(eir_len);
  5679. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
  5680. status, rp, sizeof(*rp) + eir_len);
  5681. if (err < 0 || status)
  5682. goto done;
  5683. err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev,
  5684. rp, sizeof(*rp) + eir_len,
  5685. HCI_MGMT_OOB_DATA_EVENTS, sk);
  5686. done:
  5687. kfree(rp);
  5688. return err;
  5689. }
  5690. static u32 get_supported_adv_flags(struct hci_dev *hdev)
  5691. {
  5692. u32 flags = 0;
  5693. flags |= MGMT_ADV_FLAG_CONNECTABLE;
  5694. flags |= MGMT_ADV_FLAG_DISCOV;
  5695. flags |= MGMT_ADV_FLAG_LIMITED_DISCOV;
  5696. flags |= MGMT_ADV_FLAG_MANAGED_FLAGS;
  5697. flags |= MGMT_ADV_FLAG_APPEARANCE;
  5698. flags |= MGMT_ADV_FLAG_LOCAL_NAME;
  5699. /* In extended adv TX_POWER returned from Set Adv Param
  5700. * will be always valid.
  5701. */
  5702. if ((hdev->adv_tx_power != HCI_TX_POWER_INVALID) ||
  5703. ext_adv_capable(hdev))
  5704. flags |= MGMT_ADV_FLAG_TX_POWER;
  5705. if (ext_adv_capable(hdev)) {
  5706. flags |= MGMT_ADV_FLAG_SEC_1M;
  5707. flags |= MGMT_ADV_FLAG_HW_OFFLOAD;
  5708. flags |= MGMT_ADV_FLAG_CAN_SET_TX_POWER;
  5709. if (hdev->le_features[1] & HCI_LE_PHY_2M)
  5710. flags |= MGMT_ADV_FLAG_SEC_2M;
  5711. if (hdev->le_features[1] & HCI_LE_PHY_CODED)
  5712. flags |= MGMT_ADV_FLAG_SEC_CODED;
  5713. }
  5714. return flags;
  5715. }
  5716. static int read_adv_features(struct sock *sk, struct hci_dev *hdev,
  5717. void *data, u16 data_len)
  5718. {
  5719. struct mgmt_rp_read_adv_features *rp;
  5720. size_t rp_len;
  5721. int err;
  5722. struct adv_info *adv_instance;
  5723. u32 supported_flags;
  5724. u8 *instance;
  5725. bt_dev_dbg(hdev, "sock %p", sk);
  5726. if (!lmp_le_capable(hdev))
  5727. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES,
  5728. MGMT_STATUS_REJECTED);
  5729. /* Enabling the experimental LL Privay support disables support for
  5730. * advertising.
  5731. */
  5732. if (hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY))
  5733. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
  5734. MGMT_STATUS_NOT_SUPPORTED);
  5735. hci_dev_lock(hdev);
  5736. rp_len = sizeof(*rp) + hdev->adv_instance_cnt;
  5737. rp = kmalloc(rp_len, GFP_ATOMIC);
  5738. if (!rp) {
  5739. hci_dev_unlock(hdev);
  5740. return -ENOMEM;
  5741. }
  5742. supported_flags = get_supported_adv_flags(hdev);
  5743. rp->supported_flags = cpu_to_le32(supported_flags);
  5744. rp->max_adv_data_len = HCI_MAX_AD_LENGTH;
  5745. rp->max_scan_rsp_len = HCI_MAX_AD_LENGTH;
  5746. rp->max_instances = hdev->le_num_of_adv_sets;
  5747. rp->num_instances = hdev->adv_instance_cnt;
  5748. instance = rp->instance;
  5749. list_for_each_entry(adv_instance, &hdev->adv_instances, list) {
  5750. *instance = adv_instance->instance;
  5751. instance++;
  5752. }
  5753. hci_dev_unlock(hdev);
  5754. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES,
  5755. MGMT_STATUS_SUCCESS, rp, rp_len);
  5756. kfree(rp);
  5757. return err;
  5758. }
  5759. static u8 calculate_name_len(struct hci_dev *hdev)
  5760. {
  5761. u8 buf[HCI_MAX_SHORT_NAME_LENGTH + 3];
  5762. return append_local_name(hdev, buf, 0);
  5763. }
  5764. static u8 tlv_data_max_len(struct hci_dev *hdev, u32 adv_flags,
  5765. bool is_adv_data)
  5766. {
  5767. u8 max_len = HCI_MAX_AD_LENGTH;
  5768. if (is_adv_data) {
  5769. if (adv_flags & (MGMT_ADV_FLAG_DISCOV |
  5770. MGMT_ADV_FLAG_LIMITED_DISCOV |
  5771. MGMT_ADV_FLAG_MANAGED_FLAGS))
  5772. max_len -= 3;
  5773. if (adv_flags & MGMT_ADV_FLAG_TX_POWER)
  5774. max_len -= 3;
  5775. } else {
  5776. if (adv_flags & MGMT_ADV_FLAG_LOCAL_NAME)
  5777. max_len -= calculate_name_len(hdev);
  5778. if (adv_flags & (MGMT_ADV_FLAG_APPEARANCE))
  5779. max_len -= 4;
  5780. }
  5781. return max_len;
  5782. }
  5783. static bool flags_managed(u32 adv_flags)
  5784. {
  5785. return adv_flags & (MGMT_ADV_FLAG_DISCOV |
  5786. MGMT_ADV_FLAG_LIMITED_DISCOV |
  5787. MGMT_ADV_FLAG_MANAGED_FLAGS);
  5788. }
  5789. static bool tx_power_managed(u32 adv_flags)
  5790. {
  5791. return adv_flags & MGMT_ADV_FLAG_TX_POWER;
  5792. }
  5793. static bool name_managed(u32 adv_flags)
  5794. {
  5795. return adv_flags & MGMT_ADV_FLAG_LOCAL_NAME;
  5796. }
  5797. static bool appearance_managed(u32 adv_flags)
  5798. {
  5799. return adv_flags & MGMT_ADV_FLAG_APPEARANCE;
  5800. }
  5801. static bool tlv_data_is_valid(struct hci_dev *hdev, u32 adv_flags, u8 *data,
  5802. u8 len, bool is_adv_data)
  5803. {
  5804. int i, cur_len;
  5805. u8 max_len;
  5806. max_len = tlv_data_max_len(hdev, adv_flags, is_adv_data);
  5807. if (len > max_len)
  5808. return false;
  5809. /* Make sure that the data is correctly formatted. */
  5810. for (i = 0, cur_len = 0; i < len; i += (cur_len + 1)) {
  5811. cur_len = data[i];
  5812. if (!cur_len)
  5813. continue;
  5814. if (data[i + 1] == EIR_FLAGS &&
  5815. (!is_adv_data || flags_managed(adv_flags)))
  5816. return false;
  5817. if (data[i + 1] == EIR_TX_POWER && tx_power_managed(adv_flags))
  5818. return false;
  5819. if (data[i + 1] == EIR_NAME_COMPLETE && name_managed(adv_flags))
  5820. return false;
  5821. if (data[i + 1] == EIR_NAME_SHORT && name_managed(adv_flags))
  5822. return false;
  5823. if (data[i + 1] == EIR_APPEARANCE &&
  5824. appearance_managed(adv_flags))
  5825. return false;
  5826. /* If the current field length would exceed the total data
  5827. * length, then it's invalid.
  5828. */
  5829. if (i + cur_len >= len)
  5830. return false;
  5831. }
  5832. return true;
  5833. }
  5834. static void add_advertising_complete(struct hci_dev *hdev, u8 status,
  5835. u16 opcode)
  5836. {
  5837. struct mgmt_pending_cmd *cmd;
  5838. struct mgmt_cp_add_advertising *cp;
  5839. struct mgmt_rp_add_advertising rp;
  5840. struct adv_info *adv_instance, *n;
  5841. u8 instance;
  5842. bt_dev_dbg(hdev, "status %d", status);
  5843. hci_dev_lock(hdev);
  5844. cmd = pending_find(MGMT_OP_ADD_ADVERTISING, hdev);
  5845. list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances, list) {
  5846. if (!adv_instance->pending)
  5847. continue;
  5848. if (!status) {
  5849. adv_instance->pending = false;
  5850. continue;
  5851. }
  5852. instance = adv_instance->instance;
  5853. if (hdev->cur_adv_instance == instance)
  5854. cancel_adv_timeout(hdev);
  5855. hci_remove_adv_instance(hdev, instance);
  5856. mgmt_advertising_removed(cmd ? cmd->sk : NULL, hdev, instance);
  5857. }
  5858. if (!cmd)
  5859. goto unlock;
  5860. cp = cmd->param;
  5861. rp.instance = cp->instance;
  5862. if (status)
  5863. mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
  5864. mgmt_status(status));
  5865. else
  5866. mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
  5867. mgmt_status(status), &rp, sizeof(rp));
  5868. mgmt_pending_remove(cmd);
  5869. unlock:
  5870. hci_dev_unlock(hdev);
  5871. }
  5872. static int add_advertising(struct sock *sk, struct hci_dev *hdev,
  5873. void *data, u16 data_len)
  5874. {
  5875. struct mgmt_cp_add_advertising *cp = data;
  5876. struct mgmt_rp_add_advertising rp;
  5877. u32 flags;
  5878. u32 supported_flags, phy_flags;
  5879. u8 status;
  5880. u16 timeout, duration;
  5881. unsigned int prev_instance_cnt = hdev->adv_instance_cnt;
  5882. u8 schedule_instance = 0;
  5883. struct adv_info *next_instance;
  5884. int err;
  5885. struct mgmt_pending_cmd *cmd;
  5886. struct hci_request req;
  5887. bt_dev_dbg(hdev, "sock %p", sk);
  5888. status = mgmt_le_support(hdev);
  5889. if (status)
  5890. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
  5891. status);
  5892. /* Enabling the experimental LL Privay support disables support for
  5893. * advertising.
  5894. */
  5895. if (hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY))
  5896. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
  5897. MGMT_STATUS_NOT_SUPPORTED);
  5898. if (cp->instance < 1 || cp->instance > hdev->le_num_of_adv_sets)
  5899. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
  5900. MGMT_STATUS_INVALID_PARAMS);
  5901. if (data_len != sizeof(*cp) + cp->adv_data_len + cp->scan_rsp_len)
  5902. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
  5903. MGMT_STATUS_INVALID_PARAMS);
  5904. flags = __le32_to_cpu(cp->flags);
  5905. timeout = __le16_to_cpu(cp->timeout);
  5906. duration = __le16_to_cpu(cp->duration);
  5907. /* The current implementation only supports a subset of the specified
  5908. * flags. Also need to check mutual exclusiveness of sec flags.
  5909. */
  5910. supported_flags = get_supported_adv_flags(hdev);
  5911. phy_flags = flags & MGMT_ADV_FLAG_SEC_MASK;
  5912. if (flags & ~supported_flags ||
  5913. ((phy_flags && (phy_flags ^ (phy_flags & -phy_flags)))))
  5914. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
  5915. MGMT_STATUS_INVALID_PARAMS);
  5916. hci_dev_lock(hdev);
  5917. if (timeout && !hdev_is_powered(hdev)) {
  5918. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
  5919. MGMT_STATUS_REJECTED);
  5920. goto unlock;
  5921. }
  5922. if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) ||
  5923. pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) ||
  5924. pending_find(MGMT_OP_SET_LE, hdev)) {
  5925. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
  5926. MGMT_STATUS_BUSY);
  5927. goto unlock;
  5928. }
  5929. if (!tlv_data_is_valid(hdev, flags, cp->data, cp->adv_data_len, true) ||
  5930. !tlv_data_is_valid(hdev, flags, cp->data + cp->adv_data_len,
  5931. cp->scan_rsp_len, false)) {
  5932. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
  5933. MGMT_STATUS_INVALID_PARAMS);
  5934. goto unlock;
  5935. }
  5936. err = hci_add_adv_instance(hdev, cp->instance, flags,
  5937. cp->adv_data_len, cp->data,
  5938. cp->scan_rsp_len,
  5939. cp->data + cp->adv_data_len,
  5940. timeout, duration);
  5941. if (err < 0) {
  5942. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
  5943. MGMT_STATUS_FAILED);
  5944. goto unlock;
  5945. }
  5946. /* Only trigger an advertising added event if a new instance was
  5947. * actually added.
  5948. */
  5949. if (hdev->adv_instance_cnt > prev_instance_cnt)
  5950. mgmt_advertising_added(sk, hdev, cp->instance);
  5951. if (hdev->cur_adv_instance == cp->instance) {
  5952. /* If the currently advertised instance is being changed then
  5953. * cancel the current advertising and schedule the next
  5954. * instance. If there is only one instance then the overridden
  5955. * advertising data will be visible right away.
  5956. */
  5957. cancel_adv_timeout(hdev);
  5958. next_instance = hci_get_next_instance(hdev, cp->instance);
  5959. if (next_instance)
  5960. schedule_instance = next_instance->instance;
  5961. } else if (!hdev->adv_instance_timeout) {
  5962. /* Immediately advertise the new instance if no other
  5963. * instance is currently being advertised.
  5964. */
  5965. schedule_instance = cp->instance;
  5966. }
  5967. /* If the HCI_ADVERTISING flag is set or the device isn't powered or
  5968. * there is no instance to be advertised then we have no HCI
  5969. * communication to make. Simply return.
  5970. */
  5971. if (!hdev_is_powered(hdev) ||
  5972. hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
  5973. !schedule_instance) {
  5974. rp.instance = cp->instance;
  5975. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
  5976. MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
  5977. goto unlock;
  5978. }
  5979. /* We're good to go, update advertising data, parameters, and start
  5980. * advertising.
  5981. */
  5982. cmd = mgmt_pending_add(sk, MGMT_OP_ADD_ADVERTISING, hdev, data,
  5983. data_len);
  5984. if (!cmd) {
  5985. err = -ENOMEM;
  5986. goto unlock;
  5987. }
  5988. hci_req_init(&req, hdev);
  5989. err = __hci_req_schedule_adv_instance(&req, schedule_instance, true);
  5990. if (!err)
  5991. err = hci_req_run(&req, add_advertising_complete);
  5992. if (err < 0) {
  5993. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
  5994. MGMT_STATUS_FAILED);
  5995. mgmt_pending_remove(cmd);
  5996. }
  5997. unlock:
  5998. hci_dev_unlock(hdev);
  5999. return err;
  6000. }
  6001. static void remove_advertising_complete(struct hci_dev *hdev, u8 status,
  6002. u16 opcode)
  6003. {
  6004. struct mgmt_pending_cmd *cmd;
  6005. struct mgmt_cp_remove_advertising *cp;
  6006. struct mgmt_rp_remove_advertising rp;
  6007. bt_dev_dbg(hdev, "status %d", status);
  6008. hci_dev_lock(hdev);
  6009. /* A failure status here only means that we failed to disable
  6010. * advertising. Otherwise, the advertising instance has been removed,
  6011. * so report success.
  6012. */
  6013. cmd = pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev);
  6014. if (!cmd)
  6015. goto unlock;
  6016. cp = cmd->param;
  6017. rp.instance = cp->instance;
  6018. mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, MGMT_STATUS_SUCCESS,
  6019. &rp, sizeof(rp));
  6020. mgmt_pending_remove(cmd);
  6021. unlock:
  6022. hci_dev_unlock(hdev);
  6023. }
  6024. static int remove_advertising(struct sock *sk, struct hci_dev *hdev,
  6025. void *data, u16 data_len)
  6026. {
  6027. struct mgmt_cp_remove_advertising *cp = data;
  6028. struct mgmt_rp_remove_advertising rp;
  6029. struct mgmt_pending_cmd *cmd;
  6030. struct hci_request req;
  6031. int err;
  6032. bt_dev_dbg(hdev, "sock %p", sk);
  6033. /* Enabling the experimental LL Privay support disables support for
  6034. * advertising.
  6035. */
  6036. if (hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY))
  6037. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
  6038. MGMT_STATUS_NOT_SUPPORTED);
  6039. hci_dev_lock(hdev);
  6040. if (cp->instance && !hci_find_adv_instance(hdev, cp->instance)) {
  6041. err = mgmt_cmd_status(sk, hdev->id,
  6042. MGMT_OP_REMOVE_ADVERTISING,
  6043. MGMT_STATUS_INVALID_PARAMS);
  6044. goto unlock;
  6045. }
  6046. if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) ||
  6047. pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) ||
  6048. pending_find(MGMT_OP_SET_LE, hdev)) {
  6049. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING,
  6050. MGMT_STATUS_BUSY);
  6051. goto unlock;
  6052. }
  6053. if (list_empty(&hdev->adv_instances)) {
  6054. err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING,
  6055. MGMT_STATUS_INVALID_PARAMS);
  6056. goto unlock;
  6057. }
  6058. hci_req_init(&req, hdev);
  6059. /* If we use extended advertising, instance is disabled and removed */
  6060. if (ext_adv_capable(hdev)) {
  6061. __hci_req_disable_ext_adv_instance(&req, cp->instance);
  6062. __hci_req_remove_ext_adv_instance(&req, cp->instance);
  6063. }
  6064. hci_req_clear_adv_instance(hdev, sk, &req, cp->instance, true);
  6065. if (list_empty(&hdev->adv_instances))
  6066. __hci_req_disable_advertising(&req);
  6067. /* If no HCI commands have been collected so far or the HCI_ADVERTISING
  6068. * flag is set or the device isn't powered then we have no HCI
  6069. * communication to make. Simply return.
  6070. */
  6071. if (skb_queue_empty(&req.cmd_q) ||
  6072. !hdev_is_powered(hdev) ||
  6073. hci_dev_test_flag(hdev, HCI_ADVERTISING)) {
  6074. hci_req_purge(&req);
  6075. rp.instance = cp->instance;
  6076. err = mgmt_cmd_complete(sk, hdev->id,
  6077. MGMT_OP_REMOVE_ADVERTISING,
  6078. MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
  6079. goto unlock;
  6080. }
  6081. cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_ADVERTISING, hdev, data,
  6082. data_len);
  6083. if (!cmd) {
  6084. err = -ENOMEM;
  6085. goto unlock;
  6086. }
  6087. err = hci_req_run(&req, remove_advertising_complete);
  6088. if (err < 0)
  6089. mgmt_pending_remove(cmd);
  6090. unlock:
  6091. hci_dev_unlock(hdev);
  6092. return err;
  6093. }
  6094. static int get_adv_size_info(struct sock *sk, struct hci_dev *hdev,
  6095. void *data, u16 data_len)
  6096. {
  6097. struct mgmt_cp_get_adv_size_info *cp = data;
  6098. struct mgmt_rp_get_adv_size_info rp;
  6099. u32 flags, supported_flags;
  6100. int err;
  6101. bt_dev_dbg(hdev, "sock %p", sk);
  6102. if (!lmp_le_capable(hdev))
  6103. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO,
  6104. MGMT_STATUS_REJECTED);
  6105. if (cp->instance < 1 || cp->instance > hdev->le_num_of_adv_sets)
  6106. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO,
  6107. MGMT_STATUS_INVALID_PARAMS);
  6108. flags = __le32_to_cpu(cp->flags);
  6109. /* The current implementation only supports a subset of the specified
  6110. * flags.
  6111. */
  6112. supported_flags = get_supported_adv_flags(hdev);
  6113. if (flags & ~supported_flags)
  6114. return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO,
  6115. MGMT_STATUS_INVALID_PARAMS);
  6116. rp.instance = cp->instance;
  6117. rp.flags = cp->flags;
  6118. rp.max_adv_data_len = tlv_data_max_len(hdev, flags, true);
  6119. rp.max_scan_rsp_len = tlv_data_max_len(hdev, flags, false);
  6120. err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO,
  6121. MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
  6122. return err;
  6123. }
  6124. static const struct hci_mgmt_handler mgmt_handlers[] = {
  6125. { NULL }, /* 0x0000 (no command) */
  6126. { read_version, MGMT_READ_VERSION_SIZE,
  6127. HCI_MGMT_NO_HDEV |
  6128. HCI_MGMT_UNTRUSTED },
  6129. { read_commands, MGMT_READ_COMMANDS_SIZE,
  6130. HCI_MGMT_NO_HDEV |
  6131. HCI_MGMT_UNTRUSTED },
  6132. { read_index_list, MGMT_READ_INDEX_LIST_SIZE,
  6133. HCI_MGMT_NO_HDEV |
  6134. HCI_MGMT_UNTRUSTED },
  6135. { read_controller_info, MGMT_READ_INFO_SIZE,
  6136. HCI_MGMT_UNTRUSTED },
  6137. { set_powered, MGMT_SETTING_SIZE },
  6138. { set_discoverable, MGMT_SET_DISCOVERABLE_SIZE },
  6139. { set_connectable, MGMT_SETTING_SIZE },
  6140. { set_fast_connectable, MGMT_SETTING_SIZE },
  6141. { set_bondable, MGMT_SETTING_SIZE },
  6142. { set_link_security, MGMT_SETTING_SIZE },
  6143. { set_ssp, MGMT_SETTING_SIZE },
  6144. { set_hs, MGMT_SETTING_SIZE },
  6145. { set_le, MGMT_SETTING_SIZE },
  6146. { set_dev_class, MGMT_SET_DEV_CLASS_SIZE },
  6147. { set_local_name, MGMT_SET_LOCAL_NAME_SIZE },
  6148. { add_uuid, MGMT_ADD_UUID_SIZE },
  6149. { remove_uuid, MGMT_REMOVE_UUID_SIZE },
  6150. { load_link_keys, MGMT_LOAD_LINK_KEYS_SIZE,
  6151. HCI_MGMT_VAR_LEN },
  6152. { load_long_term_keys, MGMT_LOAD_LONG_TERM_KEYS_SIZE,
  6153. HCI_MGMT_VAR_LEN },
  6154. { disconnect, MGMT_DISCONNECT_SIZE },
  6155. { get_connections, MGMT_GET_CONNECTIONS_SIZE },
  6156. { pin_code_reply, MGMT_PIN_CODE_REPLY_SIZE },
  6157. { pin_code_neg_reply, MGMT_PIN_CODE_NEG_REPLY_SIZE },
  6158. { set_io_capability, MGMT_SET_IO_CAPABILITY_SIZE },
  6159. { pair_device, MGMT_PAIR_DEVICE_SIZE },
  6160. { cancel_pair_device, MGMT_CANCEL_PAIR_DEVICE_SIZE },
  6161. { unpair_device, MGMT_UNPAIR_DEVICE_SIZE },
  6162. { user_confirm_reply, MGMT_USER_CONFIRM_REPLY_SIZE },
  6163. { user_confirm_neg_reply, MGMT_USER_CONFIRM_NEG_REPLY_SIZE },
  6164. { user_passkey_reply, MGMT_USER_PASSKEY_REPLY_SIZE },
  6165. { user_passkey_neg_reply, MGMT_USER_PASSKEY_NEG_REPLY_SIZE },
  6166. { read_local_oob_data, MGMT_READ_LOCAL_OOB_DATA_SIZE },
  6167. { add_remote_oob_data, MGMT_ADD_REMOTE_OOB_DATA_SIZE,
  6168. HCI_MGMT_VAR_LEN },
  6169. { remove_remote_oob_data, MGMT_REMOVE_REMOTE_OOB_DATA_SIZE },
  6170. { start_discovery, MGMT_START_DISCOVERY_SIZE },
  6171. { stop_discovery, MGMT_STOP_DISCOVERY_SIZE },
  6172. { confirm_name, MGMT_CONFIRM_NAME_SIZE },
  6173. { block_device, MGMT_BLOCK_DEVICE_SIZE },
  6174. { unblock_device, MGMT_UNBLOCK_DEVICE_SIZE },
  6175. { set_device_id, MGMT_SET_DEVICE_ID_SIZE },
  6176. { set_advertising, MGMT_SETTING_SIZE },
  6177. { set_bredr, MGMT_SETTING_SIZE },
  6178. { set_static_address, MGMT_SET_STATIC_ADDRESS_SIZE },
  6179. { set_scan_params, MGMT_SET_SCAN_PARAMS_SIZE },
  6180. { set_secure_conn, MGMT_SETTING_SIZE },
  6181. { set_debug_keys, MGMT_SETTING_SIZE },
  6182. { set_privacy, MGMT_SET_PRIVACY_SIZE },
  6183. { load_irks, MGMT_LOAD_IRKS_SIZE,
  6184. HCI_MGMT_VAR_LEN },
  6185. { get_conn_info, MGMT_GET_CONN_INFO_SIZE },
  6186. { get_clock_info, MGMT_GET_CLOCK_INFO_SIZE },
  6187. { add_device, MGMT_ADD_DEVICE_SIZE },
  6188. { remove_device, MGMT_REMOVE_DEVICE_SIZE },
  6189. { load_conn_param, MGMT_LOAD_CONN_PARAM_SIZE,
  6190. HCI_MGMT_VAR_LEN },
  6191. { read_unconf_index_list, MGMT_READ_UNCONF_INDEX_LIST_SIZE,
  6192. HCI_MGMT_NO_HDEV |
  6193. HCI_MGMT_UNTRUSTED },
  6194. { read_config_info, MGMT_READ_CONFIG_INFO_SIZE,
  6195. HCI_MGMT_UNCONFIGURED |
  6196. HCI_MGMT_UNTRUSTED },
  6197. { set_external_config, MGMT_SET_EXTERNAL_CONFIG_SIZE,
  6198. HCI_MGMT_UNCONFIGURED },
  6199. { set_public_address, MGMT_SET_PUBLIC_ADDRESS_SIZE,
  6200. HCI_MGMT_UNCONFIGURED },
  6201. { start_service_discovery, MGMT_START_SERVICE_DISCOVERY_SIZE,
  6202. HCI_MGMT_VAR_LEN },
  6203. { read_local_oob_ext_data, MGMT_READ_LOCAL_OOB_EXT_DATA_SIZE },
  6204. { read_ext_index_list, MGMT_READ_EXT_INDEX_LIST_SIZE,
  6205. HCI_MGMT_NO_HDEV |
  6206. HCI_MGMT_UNTRUSTED },
  6207. { read_adv_features, MGMT_READ_ADV_FEATURES_SIZE },
  6208. { add_advertising, MGMT_ADD_ADVERTISING_SIZE,
  6209. HCI_MGMT_VAR_LEN },
  6210. { remove_advertising, MGMT_REMOVE_ADVERTISING_SIZE },
  6211. { get_adv_size_info, MGMT_GET_ADV_SIZE_INFO_SIZE },
  6212. { start_limited_discovery, MGMT_START_DISCOVERY_SIZE },
  6213. { read_ext_controller_info,MGMT_READ_EXT_INFO_SIZE,
  6214. HCI_MGMT_UNTRUSTED },
  6215. { set_appearance, MGMT_SET_APPEARANCE_SIZE },
  6216. { get_phy_configuration, MGMT_GET_PHY_CONFIGURATION_SIZE },
  6217. { set_phy_configuration, MGMT_SET_PHY_CONFIGURATION_SIZE },
  6218. { set_blocked_keys, MGMT_OP_SET_BLOCKED_KEYS_SIZE,
  6219. HCI_MGMT_VAR_LEN },
  6220. { set_wideband_speech, MGMT_SETTING_SIZE },
  6221. { read_security_info, MGMT_READ_SECURITY_INFO_SIZE,
  6222. HCI_MGMT_UNTRUSTED },
  6223. { read_exp_features_info, MGMT_READ_EXP_FEATURES_INFO_SIZE,
  6224. HCI_MGMT_UNTRUSTED |
  6225. HCI_MGMT_HDEV_OPTIONAL },
  6226. { set_exp_feature, MGMT_SET_EXP_FEATURE_SIZE,
  6227. HCI_MGMT_VAR_LEN |
  6228. HCI_MGMT_HDEV_OPTIONAL },
  6229. { read_def_system_config, MGMT_READ_DEF_SYSTEM_CONFIG_SIZE,
  6230. HCI_MGMT_UNTRUSTED },
  6231. { set_def_system_config, MGMT_SET_DEF_SYSTEM_CONFIG_SIZE,
  6232. HCI_MGMT_VAR_LEN },
  6233. { read_def_runtime_config, MGMT_READ_DEF_RUNTIME_CONFIG_SIZE,
  6234. HCI_MGMT_UNTRUSTED },
  6235. { set_def_runtime_config, MGMT_SET_DEF_RUNTIME_CONFIG_SIZE,
  6236. HCI_MGMT_VAR_LEN },
  6237. { get_device_flags, MGMT_GET_DEVICE_FLAGS_SIZE },
  6238. { set_device_flags, MGMT_SET_DEVICE_FLAGS_SIZE },
  6239. { read_adv_mon_features, MGMT_READ_ADV_MONITOR_FEATURES_SIZE },
  6240. { add_adv_patterns_monitor,MGMT_ADD_ADV_PATTERNS_MONITOR_SIZE,
  6241. HCI_MGMT_VAR_LEN },
  6242. { remove_adv_monitor, MGMT_REMOVE_ADV_MONITOR_SIZE },
  6243. };
  6244. void mgmt_index_added(struct hci_dev *hdev)
  6245. {
  6246. struct mgmt_ev_ext_index ev;
  6247. if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
  6248. return;
  6249. switch (hdev->dev_type) {
  6250. case HCI_PRIMARY:
  6251. if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
  6252. mgmt_index_event(MGMT_EV_UNCONF_INDEX_ADDED, hdev,
  6253. NULL, 0, HCI_MGMT_UNCONF_INDEX_EVENTS);
  6254. ev.type = 0x01;
  6255. } else {
  6256. mgmt_index_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0,
  6257. HCI_MGMT_INDEX_EVENTS);
  6258. ev.type = 0x00;
  6259. }
  6260. break;
  6261. case HCI_AMP:
  6262. ev.type = 0x02;
  6263. break;
  6264. default:
  6265. return;
  6266. }
  6267. ev.bus = hdev->bus;
  6268. mgmt_index_event(MGMT_EV_EXT_INDEX_ADDED, hdev, &ev, sizeof(ev),
  6269. HCI_MGMT_EXT_INDEX_EVENTS);
  6270. }
  6271. void mgmt_index_removed(struct hci_dev *hdev)
  6272. {
  6273. struct mgmt_ev_ext_index ev;
  6274. u8 status = MGMT_STATUS_INVALID_INDEX;
  6275. if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
  6276. return;
  6277. switch (hdev->dev_type) {
  6278. case HCI_PRIMARY:
  6279. mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status);
  6280. if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
  6281. mgmt_index_event(MGMT_EV_UNCONF_INDEX_REMOVED, hdev,
  6282. NULL, 0, HCI_MGMT_UNCONF_INDEX_EVENTS);
  6283. ev.type = 0x01;
  6284. } else {
  6285. mgmt_index_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0,
  6286. HCI_MGMT_INDEX_EVENTS);
  6287. ev.type = 0x00;
  6288. }
  6289. break;
  6290. case HCI_AMP:
  6291. ev.type = 0x02;
  6292. break;
  6293. default:
  6294. return;
  6295. }
  6296. ev.bus = hdev->bus;
  6297. mgmt_index_event(MGMT_EV_EXT_INDEX_REMOVED, hdev, &ev, sizeof(ev),
  6298. HCI_MGMT_EXT_INDEX_EVENTS);
  6299. }
  6300. /* This function requires the caller holds hdev->lock */
  6301. static void restart_le_actions(struct hci_dev *hdev)
  6302. {
  6303. struct hci_conn_params *p;
  6304. list_for_each_entry(p, &hdev->le_conn_params, list) {
  6305. /* Needed for AUTO_OFF case where might not "really"
  6306. * have been powered off.
  6307. */
  6308. list_del_init(&p->action);
  6309. switch (p->auto_connect) {
  6310. case HCI_AUTO_CONN_DIRECT:
  6311. case HCI_AUTO_CONN_ALWAYS:
  6312. list_add(&p->action, &hdev->pend_le_conns);
  6313. break;
  6314. case HCI_AUTO_CONN_REPORT:
  6315. list_add(&p->action, &hdev->pend_le_reports);
  6316. break;
  6317. default:
  6318. break;
  6319. }
  6320. }
  6321. }
  6322. void mgmt_power_on(struct hci_dev *hdev, int err)
  6323. {
  6324. struct cmd_lookup match = { NULL, hdev };
  6325. bt_dev_dbg(hdev, "err %d", err);
  6326. hci_dev_lock(hdev);
  6327. if (!err) {
  6328. restart_le_actions(hdev);
  6329. hci_update_background_scan(hdev);
  6330. }
  6331. mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
  6332. new_settings(hdev, match.sk);
  6333. if (match.sk)
  6334. sock_put(match.sk);
  6335. hci_dev_unlock(hdev);
  6336. }
  6337. void __mgmt_power_off(struct hci_dev *hdev)
  6338. {
  6339. struct cmd_lookup match = { NULL, hdev };
  6340. u8 status, zero_cod[] = { 0, 0, 0 };
  6341. mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
  6342. /* If the power off is because of hdev unregistration let
  6343. * use the appropriate INVALID_INDEX status. Otherwise use
  6344. * NOT_POWERED. We cover both scenarios here since later in
  6345. * mgmt_index_removed() any hci_conn callbacks will have already
  6346. * been triggered, potentially causing misleading DISCONNECTED
  6347. * status responses.
  6348. */
  6349. if (hci_dev_test_flag(hdev, HCI_UNREGISTER))
  6350. status = MGMT_STATUS_INVALID_INDEX;
  6351. else
  6352. status = MGMT_STATUS_NOT_POWERED;
  6353. mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status);
  6354. if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) {
  6355. mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev,
  6356. zero_cod, sizeof(zero_cod),
  6357. HCI_MGMT_DEV_CLASS_EVENTS, NULL);
  6358. ext_info_changed(hdev, NULL);
  6359. }
  6360. new_settings(hdev, match.sk);
  6361. if (match.sk)
  6362. sock_put(match.sk);
  6363. }
  6364. void mgmt_set_powered_failed(struct hci_dev *hdev, int err)
  6365. {
  6366. struct mgmt_pending_cmd *cmd;
  6367. u8 status;
  6368. cmd = pending_find(MGMT_OP_SET_POWERED, hdev);
  6369. if (!cmd)
  6370. return;
  6371. if (err == -ERFKILL)
  6372. status = MGMT_STATUS_RFKILLED;
  6373. else
  6374. status = MGMT_STATUS_FAILED;
  6375. mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status);
  6376. mgmt_pending_remove(cmd);
  6377. }
  6378. void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
  6379. bool persistent)
  6380. {
  6381. struct mgmt_ev_new_link_key ev;
  6382. memset(&ev, 0, sizeof(ev));
  6383. ev.store_hint = persistent;
  6384. bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
  6385. ev.key.addr.type = BDADDR_BREDR;
  6386. ev.key.type = key->type;
  6387. memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
  6388. ev.key.pin_len = key->pin_len;
  6389. mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
  6390. }
  6391. static u8 mgmt_ltk_type(struct smp_ltk *ltk)
  6392. {
  6393. switch (ltk->type) {
  6394. case SMP_LTK:
  6395. case SMP_LTK_SLAVE:
  6396. if (ltk->authenticated)
  6397. return MGMT_LTK_AUTHENTICATED;
  6398. return MGMT_LTK_UNAUTHENTICATED;
  6399. case SMP_LTK_P256:
  6400. if (ltk->authenticated)
  6401. return MGMT_LTK_P256_AUTH;
  6402. return MGMT_LTK_P256_UNAUTH;
  6403. case SMP_LTK_P256_DEBUG:
  6404. return MGMT_LTK_P256_DEBUG;
  6405. }
  6406. return MGMT_LTK_UNAUTHENTICATED;
  6407. }
  6408. void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, bool persistent)
  6409. {
  6410. struct mgmt_ev_new_long_term_key ev;
  6411. memset(&ev, 0, sizeof(ev));
  6412. /* Devices using resolvable or non-resolvable random addresses
  6413. * without providing an identity resolving key don't require
  6414. * to store long term keys. Their addresses will change the
  6415. * next time around.
  6416. *
  6417. * Only when a remote device provides an identity address
  6418. * make sure the long term key is stored. If the remote
  6419. * identity is known, the long term keys are internally
  6420. * mapped to the identity address. So allow static random
  6421. * and public addresses here.
  6422. */
  6423. if (key->bdaddr_type == ADDR_LE_DEV_RANDOM &&
  6424. (key->bdaddr.b[5] & 0xc0) != 0xc0)
  6425. ev.store_hint = 0x00;
  6426. else
  6427. ev.store_hint = persistent;
  6428. bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
  6429. ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
  6430. ev.key.type = mgmt_ltk_type(key);
  6431. ev.key.enc_size = key->enc_size;
  6432. ev.key.ediv = key->ediv;
  6433. ev.key.rand = key->rand;
  6434. if (key->type == SMP_LTK)
  6435. ev.key.master = 1;
  6436. /* Make sure we copy only the significant bytes based on the
  6437. * encryption key size, and set the rest of the value to zeroes.
  6438. */
  6439. memcpy(ev.key.val, key->val, key->enc_size);
  6440. memset(ev.key.val + key->enc_size, 0,
  6441. sizeof(ev.key.val) - key->enc_size);
  6442. mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev), NULL);
  6443. }
  6444. void mgmt_new_irk(struct hci_dev *hdev, struct smp_irk *irk, bool persistent)
  6445. {
  6446. struct mgmt_ev_new_irk ev;
  6447. memset(&ev, 0, sizeof(ev));
  6448. ev.store_hint = persistent;
  6449. bacpy(&ev.rpa, &irk->rpa);
  6450. bacpy(&ev.irk.addr.bdaddr, &irk->bdaddr);
  6451. ev.irk.addr.type = link_to_bdaddr(LE_LINK, irk->addr_type);
  6452. memcpy(ev.irk.val, irk->val, sizeof(irk->val));
  6453. mgmt_event(MGMT_EV_NEW_IRK, hdev, &ev, sizeof(ev), NULL);
  6454. }
  6455. void mgmt_new_csrk(struct hci_dev *hdev, struct smp_csrk *csrk,
  6456. bool persistent)
  6457. {
  6458. struct mgmt_ev_new_csrk ev;
  6459. memset(&ev, 0, sizeof(ev));
  6460. /* Devices using resolvable or non-resolvable random addresses
  6461. * without providing an identity resolving key don't require
  6462. * to store signature resolving keys. Their addresses will change
  6463. * the next time around.
  6464. *
  6465. * Only when a remote device provides an identity address
  6466. * make sure the signature resolving key is stored. So allow
  6467. * static random and public addresses here.
  6468. */
  6469. if (csrk->bdaddr_type == ADDR_LE_DEV_RANDOM &&
  6470. (csrk->bdaddr.b[5] & 0xc0) != 0xc0)
  6471. ev.store_hint = 0x00;
  6472. else
  6473. ev.store_hint = persistent;
  6474. bacpy(&ev.key.addr.bdaddr, &csrk->bdaddr);
  6475. ev.key.addr.type = link_to_bdaddr(LE_LINK, csrk->bdaddr_type);
  6476. ev.key.type = csrk->type;
  6477. memcpy(ev.key.val, csrk->val, sizeof(csrk->val));
  6478. mgmt_event(MGMT_EV_NEW_CSRK, hdev, &ev, sizeof(ev), NULL);
  6479. }
  6480. void mgmt_new_conn_param(struct hci_dev *hdev, bdaddr_t *bdaddr,
  6481. u8 bdaddr_type, u8 store_hint, u16 min_interval,
  6482. u16 max_interval, u16 latency, u16 timeout)
  6483. {
  6484. struct mgmt_ev_new_conn_param ev;
  6485. if (!hci_is_identity_address(bdaddr, bdaddr_type))
  6486. return;
  6487. memset(&ev, 0, sizeof(ev));
  6488. bacpy(&ev.addr.bdaddr, bdaddr);
  6489. ev.addr.type = link_to_bdaddr(LE_LINK, bdaddr_type);
  6490. ev.store_hint = store_hint;
  6491. ev.min_interval = cpu_to_le16(min_interval);
  6492. ev.max_interval = cpu_to_le16(max_interval);
  6493. ev.latency = cpu_to_le16(latency);
  6494. ev.timeout = cpu_to_le16(timeout);
  6495. mgmt_event(MGMT_EV_NEW_CONN_PARAM, hdev, &ev, sizeof(ev), NULL);
  6496. }
  6497. void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn,
  6498. u32 flags, u8 *name, u8 name_len)
  6499. {
  6500. char buf[512];
  6501. struct mgmt_ev_device_connected *ev = (void *) buf;
  6502. u16 eir_len = 0;
  6503. bacpy(&ev->addr.bdaddr, &conn->dst);
  6504. ev->addr.type = link_to_bdaddr(conn->type, conn->dst_type);
  6505. ev->flags = __cpu_to_le32(flags);
  6506. /* We must ensure that the EIR Data fields are ordered and
  6507. * unique. Keep it simple for now and avoid the problem by not
  6508. * adding any BR/EDR data to the LE adv.
  6509. */
  6510. if (conn->le_adv_data_len > 0) {
  6511. memcpy(&ev->eir[eir_len],
  6512. conn->le_adv_data, conn->le_adv_data_len);
  6513. eir_len = conn->le_adv_data_len;
  6514. } else {
  6515. if (name_len > 0)
  6516. eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
  6517. name, name_len);
  6518. if (memcmp(conn->dev_class, "\0\0\0", 3) != 0)
  6519. eir_len = eir_append_data(ev->eir, eir_len,
  6520. EIR_CLASS_OF_DEV,
  6521. conn->dev_class, 3);
  6522. }
  6523. ev->eir_len = cpu_to_le16(eir_len);
  6524. mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
  6525. sizeof(*ev) + eir_len, NULL);
  6526. }
  6527. static void disconnect_rsp(struct mgmt_pending_cmd *cmd, void *data)
  6528. {
  6529. struct sock **sk = data;
  6530. cmd->cmd_complete(cmd, 0);
  6531. *sk = cmd->sk;
  6532. sock_hold(*sk);
  6533. mgmt_pending_remove(cmd);
  6534. }
  6535. static void unpair_device_rsp(struct mgmt_pending_cmd *cmd, void *data)
  6536. {
  6537. struct hci_dev *hdev = data;
  6538. struct mgmt_cp_unpair_device *cp = cmd->param;
  6539. device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk);
  6540. cmd->cmd_complete(cmd, 0);
  6541. mgmt_pending_remove(cmd);
  6542. }
  6543. bool mgmt_powering_down(struct hci_dev *hdev)
  6544. {
  6545. struct mgmt_pending_cmd *cmd;
  6546. struct mgmt_mode *cp;
  6547. cmd = pending_find(MGMT_OP_SET_POWERED, hdev);
  6548. if (!cmd)
  6549. return false;
  6550. cp = cmd->param;
  6551. if (!cp->val)
  6552. return true;
  6553. return false;
  6554. }
  6555. void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
  6556. u8 link_type, u8 addr_type, u8 reason,
  6557. bool mgmt_connected)
  6558. {
  6559. struct mgmt_ev_device_disconnected ev;
  6560. struct sock *sk = NULL;
  6561. /* The connection is still in hci_conn_hash so test for 1
  6562. * instead of 0 to know if this is the last one.
  6563. */
  6564. if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) {
  6565. cancel_delayed_work(&hdev->power_off);
  6566. queue_work(hdev->req_workqueue, &hdev->power_off.work);
  6567. }
  6568. if (!mgmt_connected)
  6569. return;
  6570. if (link_type != ACL_LINK && link_type != LE_LINK)
  6571. return;
  6572. mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
  6573. bacpy(&ev.addr.bdaddr, bdaddr);
  6574. ev.addr.type = link_to_bdaddr(link_type, addr_type);
  6575. ev.reason = reason;
  6576. /* Report disconnects due to suspend */
  6577. if (hdev->suspended)
  6578. ev.reason = MGMT_DEV_DISCONN_LOCAL_HOST_SUSPEND;
  6579. mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev), sk);
  6580. if (sk)
  6581. sock_put(sk);
  6582. mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
  6583. hdev);
  6584. }
  6585. void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
  6586. u8 link_type, u8 addr_type, u8 status)
  6587. {
  6588. u8 bdaddr_type = link_to_bdaddr(link_type, addr_type);
  6589. struct mgmt_cp_disconnect *cp;
  6590. struct mgmt_pending_cmd *cmd;
  6591. mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
  6592. hdev);
  6593. cmd = pending_find(MGMT_OP_DISCONNECT, hdev);
  6594. if (!cmd)
  6595. return;
  6596. cp = cmd->param;
  6597. if (bacmp(bdaddr, &cp->addr.bdaddr))
  6598. return;
  6599. if (cp->addr.type != bdaddr_type)
  6600. return;
  6601. cmd->cmd_complete(cmd, mgmt_status(status));
  6602. mgmt_pending_remove(cmd);
  6603. }
  6604. void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
  6605. u8 addr_type, u8 status)
  6606. {
  6607. struct mgmt_ev_connect_failed ev;
  6608. /* The connection is still in hci_conn_hash so test for 1
  6609. * instead of 0 to know if this is the last one.
  6610. */
  6611. if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) {
  6612. cancel_delayed_work(&hdev->power_off);
  6613. queue_work(hdev->req_workqueue, &hdev->power_off.work);
  6614. }
  6615. bacpy(&ev.addr.bdaddr, bdaddr);
  6616. ev.addr.type = link_to_bdaddr(link_type, addr_type);
  6617. ev.status = mgmt_status(status);
  6618. mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
  6619. }
  6620. void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
  6621. {
  6622. struct mgmt_ev_pin_code_request ev;
  6623. bacpy(&ev.addr.bdaddr, bdaddr);
  6624. ev.addr.type = BDADDR_BREDR;
  6625. ev.secure = secure;
  6626. mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev), NULL);
  6627. }
  6628. void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
  6629. u8 status)
  6630. {
  6631. struct mgmt_pending_cmd *cmd;
  6632. cmd = pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
  6633. if (!cmd)
  6634. return;
  6635. cmd->cmd_complete(cmd, mgmt_status(status));
  6636. mgmt_pending_remove(cmd);
  6637. }
  6638. void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
  6639. u8 status)
  6640. {
  6641. struct mgmt_pending_cmd *cmd;
  6642. cmd = pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
  6643. if (!cmd)
  6644. return;
  6645. cmd->cmd_complete(cmd, mgmt_status(status));
  6646. mgmt_pending_remove(cmd);
  6647. }
  6648. int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
  6649. u8 link_type, u8 addr_type, u32 value,
  6650. u8 confirm_hint)
  6651. {
  6652. struct mgmt_ev_user_confirm_request ev;
  6653. bt_dev_dbg(hdev, "bdaddr %pMR", bdaddr);
  6654. bacpy(&ev.addr.bdaddr, bdaddr);
  6655. ev.addr.type = link_to_bdaddr(link_type, addr_type);
  6656. ev.confirm_hint = confirm_hint;
  6657. ev.value = cpu_to_le32(value);
  6658. return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
  6659. NULL);
  6660. }
  6661. int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
  6662. u8 link_type, u8 addr_type)
  6663. {
  6664. struct mgmt_ev_user_passkey_request ev;
  6665. bt_dev_dbg(hdev, "bdaddr %pMR", bdaddr);
  6666. bacpy(&ev.addr.bdaddr, bdaddr);
  6667. ev.addr.type = link_to_bdaddr(link_type, addr_type);
  6668. return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
  6669. NULL);
  6670. }
  6671. static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
  6672. u8 link_type, u8 addr_type, u8 status,
  6673. u8 opcode)
  6674. {
  6675. struct mgmt_pending_cmd *cmd;
  6676. cmd = pending_find(opcode, hdev);
  6677. if (!cmd)
  6678. return -ENOENT;
  6679. cmd->cmd_complete(cmd, mgmt_status(status));
  6680. mgmt_pending_remove(cmd);
  6681. return 0;
  6682. }
  6683. int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
  6684. u8 link_type, u8 addr_type, u8 status)
  6685. {
  6686. return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
  6687. status, MGMT_OP_USER_CONFIRM_REPLY);
  6688. }
  6689. int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
  6690. u8 link_type, u8 addr_type, u8 status)
  6691. {
  6692. return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
  6693. status,
  6694. MGMT_OP_USER_CONFIRM_NEG_REPLY);
  6695. }
  6696. int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
  6697. u8 link_type, u8 addr_type, u8 status)
  6698. {
  6699. return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
  6700. status, MGMT_OP_USER_PASSKEY_REPLY);
  6701. }
  6702. int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
  6703. u8 link_type, u8 addr_type, u8 status)
  6704. {
  6705. return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
  6706. status,
  6707. MGMT_OP_USER_PASSKEY_NEG_REPLY);
  6708. }
  6709. int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
  6710. u8 link_type, u8 addr_type, u32 passkey,
  6711. u8 entered)
  6712. {
  6713. struct mgmt_ev_passkey_notify ev;
  6714. bt_dev_dbg(hdev, "bdaddr %pMR", bdaddr);
  6715. bacpy(&ev.addr.bdaddr, bdaddr);
  6716. ev.addr.type = link_to_bdaddr(link_type, addr_type);
  6717. ev.passkey = __cpu_to_le32(passkey);
  6718. ev.entered = entered;
  6719. return mgmt_event(MGMT_EV_PASSKEY_NOTIFY, hdev, &ev, sizeof(ev), NULL);
  6720. }
  6721. void mgmt_auth_failed(struct hci_conn *conn, u8 hci_status)
  6722. {
  6723. struct mgmt_ev_auth_failed ev;
  6724. struct mgmt_pending_cmd *cmd;
  6725. u8 status = mgmt_status(hci_status);
  6726. bacpy(&ev.addr.bdaddr, &conn->dst);
  6727. ev.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
  6728. ev.status = status;
  6729. cmd = find_pairing(conn);
  6730. mgmt_event(MGMT_EV_AUTH_FAILED, conn->hdev, &ev, sizeof(ev),
  6731. cmd ? cmd->sk : NULL);
  6732. if (cmd) {
  6733. cmd->cmd_complete(cmd, status);
  6734. mgmt_pending_remove(cmd);
  6735. }
  6736. }
  6737. void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
  6738. {
  6739. struct cmd_lookup match = { NULL, hdev };
  6740. bool changed;
  6741. if (status) {
  6742. u8 mgmt_err = mgmt_status(status);
  6743. mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
  6744. cmd_status_rsp, &mgmt_err);
  6745. return;
  6746. }
  6747. if (test_bit(HCI_AUTH, &hdev->flags))
  6748. changed = !hci_dev_test_and_set_flag(hdev, HCI_LINK_SECURITY);
  6749. else
  6750. changed = hci_dev_test_and_clear_flag(hdev, HCI_LINK_SECURITY);
  6751. mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
  6752. &match);
  6753. if (changed)
  6754. new_settings(hdev, match.sk);
  6755. if (match.sk)
  6756. sock_put(match.sk);
  6757. }
  6758. static void clear_eir(struct hci_request *req)
  6759. {
  6760. struct hci_dev *hdev = req->hdev;
  6761. struct hci_cp_write_eir cp;
  6762. if (!lmp_ext_inq_capable(hdev))
  6763. return;
  6764. memset(hdev->eir, 0, sizeof(hdev->eir));
  6765. memset(&cp, 0, sizeof(cp));
  6766. hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
  6767. }
  6768. void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
  6769. {
  6770. struct cmd_lookup match = { NULL, hdev };
  6771. struct hci_request req;
  6772. bool changed = false;
  6773. if (status) {
  6774. u8 mgmt_err = mgmt_status(status);
  6775. if (enable && hci_dev_test_and_clear_flag(hdev,
  6776. HCI_SSP_ENABLED)) {
  6777. hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
  6778. new_settings(hdev, NULL);
  6779. }
  6780. mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
  6781. &mgmt_err);
  6782. return;
  6783. }
  6784. if (enable) {
  6785. changed = !hci_dev_test_and_set_flag(hdev, HCI_SSP_ENABLED);
  6786. } else {
  6787. changed = hci_dev_test_and_clear_flag(hdev, HCI_SSP_ENABLED);
  6788. if (!changed)
  6789. changed = hci_dev_test_and_clear_flag(hdev,
  6790. HCI_HS_ENABLED);
  6791. else
  6792. hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
  6793. }
  6794. mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match);
  6795. if (changed)
  6796. new_settings(hdev, match.sk);
  6797. if (match.sk)
  6798. sock_put(match.sk);
  6799. hci_req_init(&req, hdev);
  6800. if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
  6801. if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS))
  6802. hci_req_add(&req, HCI_OP_WRITE_SSP_DEBUG_MODE,
  6803. sizeof(enable), &enable);
  6804. __hci_req_update_eir(&req);
  6805. } else {
  6806. clear_eir(&req);
  6807. }
  6808. hci_req_run(&req, NULL);
  6809. }
  6810. static void sk_lookup(struct mgmt_pending_cmd *cmd, void *data)
  6811. {
  6812. struct cmd_lookup *match = data;
  6813. if (match->sk == NULL) {
  6814. match->sk = cmd->sk;
  6815. sock_hold(match->sk);
  6816. }
  6817. }
  6818. void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
  6819. u8 status)
  6820. {
  6821. struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
  6822. mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match);
  6823. mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match);
  6824. mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match);
  6825. if (!status) {
  6826. mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
  6827. 3, HCI_MGMT_DEV_CLASS_EVENTS, NULL);
  6828. ext_info_changed(hdev, NULL);
  6829. }
  6830. if (match.sk)
  6831. sock_put(match.sk);
  6832. }
  6833. void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
  6834. {
  6835. struct mgmt_cp_set_local_name ev;
  6836. struct mgmt_pending_cmd *cmd;
  6837. if (status)
  6838. return;
  6839. memset(&ev, 0, sizeof(ev));
  6840. memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
  6841. memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH);
  6842. cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
  6843. if (!cmd) {
  6844. memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
  6845. /* If this is a HCI command related to powering on the
  6846. * HCI dev don't send any mgmt signals.
  6847. */
  6848. if (pending_find(MGMT_OP_SET_POWERED, hdev))
  6849. return;
  6850. }
  6851. mgmt_limited_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
  6852. HCI_MGMT_LOCAL_NAME_EVENTS, cmd ? cmd->sk : NULL);
  6853. ext_info_changed(hdev, cmd ? cmd->sk : NULL);
  6854. }
  6855. static inline bool has_uuid(u8 *uuid, u16 uuid_count, u8 (*uuids)[16])
  6856. {
  6857. int i;
  6858. for (i = 0; i < uuid_count; i++) {
  6859. if (!memcmp(uuid, uuids[i], 16))
  6860. return true;
  6861. }
  6862. return false;
  6863. }
  6864. static bool eir_has_uuids(u8 *eir, u16 eir_len, u16 uuid_count, u8 (*uuids)[16])
  6865. {
  6866. u16 parsed = 0;
  6867. while (parsed < eir_len) {
  6868. u8 field_len = eir[0];
  6869. u8 uuid[16];
  6870. int i;
  6871. if (field_len == 0)
  6872. break;
  6873. if (eir_len - parsed < field_len + 1)
  6874. break;
  6875. switch (eir[1]) {
  6876. case EIR_UUID16_ALL:
  6877. case EIR_UUID16_SOME:
  6878. for (i = 0; i + 3 <= field_len; i += 2) {
  6879. memcpy(uuid, bluetooth_base_uuid, 16);
  6880. uuid[13] = eir[i + 3];
  6881. uuid[12] = eir[i + 2];
  6882. if (has_uuid(uuid, uuid_count, uuids))
  6883. return true;
  6884. }
  6885. break;
  6886. case EIR_UUID32_ALL:
  6887. case EIR_UUID32_SOME:
  6888. for (i = 0; i + 5 <= field_len; i += 4) {
  6889. memcpy(uuid, bluetooth_base_uuid, 16);
  6890. uuid[15] = eir[i + 5];
  6891. uuid[14] = eir[i + 4];
  6892. uuid[13] = eir[i + 3];
  6893. uuid[12] = eir[i + 2];
  6894. if (has_uuid(uuid, uuid_count, uuids))
  6895. return true;
  6896. }
  6897. break;
  6898. case EIR_UUID128_ALL:
  6899. case EIR_UUID128_SOME:
  6900. for (i = 0; i + 17 <= field_len; i += 16) {
  6901. memcpy(uuid, eir + i + 2, 16);
  6902. if (has_uuid(uuid, uuid_count, uuids))
  6903. return true;
  6904. }
  6905. break;
  6906. }
  6907. parsed += field_len + 1;
  6908. eir += field_len + 1;
  6909. }
  6910. return false;
  6911. }
  6912. static void restart_le_scan(struct hci_dev *hdev)
  6913. {
  6914. /* If controller is not scanning we are done. */
  6915. if (!hci_dev_test_flag(hdev, HCI_LE_SCAN))
  6916. return;
  6917. if (time_after(jiffies + DISCOV_LE_RESTART_DELAY,
  6918. hdev->discovery.scan_start +
  6919. hdev->discovery.scan_duration))
  6920. return;
  6921. queue_delayed_work(hdev->req_workqueue, &hdev->le_scan_restart,
  6922. DISCOV_LE_RESTART_DELAY);
  6923. }
  6924. static bool is_filter_match(struct hci_dev *hdev, s8 rssi, u8 *eir,
  6925. u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len)
  6926. {
  6927. /* If a RSSI threshold has been specified, and
  6928. * HCI_QUIRK_STRICT_DUPLICATE_FILTER is not set, then all results with
  6929. * a RSSI smaller than the RSSI threshold will be dropped. If the quirk
  6930. * is set, let it through for further processing, as we might need to
  6931. * restart the scan.
  6932. *
  6933. * For BR/EDR devices (pre 1.2) providing no RSSI during inquiry,
  6934. * the results are also dropped.
  6935. */
  6936. if (hdev->discovery.rssi != HCI_RSSI_INVALID &&
  6937. (rssi == HCI_RSSI_INVALID ||
  6938. (rssi < hdev->discovery.rssi &&
  6939. !test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks))))
  6940. return false;
  6941. if (hdev->discovery.uuid_count != 0) {
  6942. /* If a list of UUIDs is provided in filter, results with no
  6943. * matching UUID should be dropped.
  6944. */
  6945. if (!eir_has_uuids(eir, eir_len, hdev->discovery.uuid_count,
  6946. hdev->discovery.uuids) &&
  6947. !eir_has_uuids(scan_rsp, scan_rsp_len,
  6948. hdev->discovery.uuid_count,
  6949. hdev->discovery.uuids))
  6950. return false;
  6951. }
  6952. /* If duplicate filtering does not report RSSI changes, then restart
  6953. * scanning to ensure updated result with updated RSSI values.
  6954. */
  6955. if (test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)) {
  6956. restart_le_scan(hdev);
  6957. /* Validate RSSI value against the RSSI threshold once more. */
  6958. if (hdev->discovery.rssi != HCI_RSSI_INVALID &&
  6959. rssi < hdev->discovery.rssi)
  6960. return false;
  6961. }
  6962. return true;
  6963. }
  6964. void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
  6965. u8 addr_type, u8 *dev_class, s8 rssi, u32 flags,
  6966. u8 *eir, u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len)
  6967. {
  6968. char buf[512];
  6969. struct mgmt_ev_device_found *ev = (void *)buf;
  6970. size_t ev_size;
  6971. /* Don't send events for a non-kernel initiated discovery. With
  6972. * LE one exception is if we have pend_le_reports > 0 in which
  6973. * case we're doing passive scanning and want these events.
  6974. */
  6975. if (!hci_discovery_active(hdev)) {
  6976. if (link_type == ACL_LINK)
  6977. return;
  6978. if (link_type == LE_LINK &&
  6979. list_empty(&hdev->pend_le_reports) &&
  6980. !hci_is_adv_monitoring(hdev)) {
  6981. return;
  6982. }
  6983. }
  6984. if (hdev->discovery.result_filtering) {
  6985. /* We are using service discovery */
  6986. if (!is_filter_match(hdev, rssi, eir, eir_len, scan_rsp,
  6987. scan_rsp_len))
  6988. return;
  6989. }
  6990. if (hdev->discovery.limited) {
  6991. /* Check for limited discoverable bit */
  6992. if (dev_class) {
  6993. if (!(dev_class[1] & 0x20))
  6994. return;
  6995. } else {
  6996. u8 *flags = eir_get_data(eir, eir_len, EIR_FLAGS, NULL);
  6997. if (!flags || !(flags[0] & LE_AD_LIMITED))
  6998. return;
  6999. }
  7000. }
  7001. /* Make sure that the buffer is big enough. The 5 extra bytes
  7002. * are for the potential CoD field.
  7003. */
  7004. if (sizeof(*ev) + eir_len + scan_rsp_len + 5 > sizeof(buf))
  7005. return;
  7006. memset(buf, 0, sizeof(buf));
  7007. /* In case of device discovery with BR/EDR devices (pre 1.2), the
  7008. * RSSI value was reported as 0 when not available. This behavior
  7009. * is kept when using device discovery. This is required for full
  7010. * backwards compatibility with the API.
  7011. *
  7012. * However when using service discovery, the value 127 will be
  7013. * returned when the RSSI is not available.
  7014. */
  7015. if (rssi == HCI_RSSI_INVALID && !hdev->discovery.report_invalid_rssi &&
  7016. link_type == ACL_LINK)
  7017. rssi = 0;
  7018. bacpy(&ev->addr.bdaddr, bdaddr);
  7019. ev->addr.type = link_to_bdaddr(link_type, addr_type);
  7020. ev->rssi = rssi;
  7021. ev->flags = cpu_to_le32(flags);
  7022. if (eir_len > 0)
  7023. /* Copy EIR or advertising data into event */
  7024. memcpy(ev->eir, eir, eir_len);
  7025. if (dev_class && !eir_get_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
  7026. NULL))
  7027. eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
  7028. dev_class, 3);
  7029. if (scan_rsp_len > 0)
  7030. /* Append scan response data to event */
  7031. memcpy(ev->eir + eir_len, scan_rsp, scan_rsp_len);
  7032. ev->eir_len = cpu_to_le16(eir_len + scan_rsp_len);
  7033. ev_size = sizeof(*ev) + eir_len + scan_rsp_len;
  7034. mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
  7035. }
  7036. void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
  7037. u8 addr_type, s8 rssi, u8 *name, u8 name_len)
  7038. {
  7039. struct mgmt_ev_device_found *ev;
  7040. char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
  7041. u16 eir_len;
  7042. ev = (struct mgmt_ev_device_found *) buf;
  7043. memset(buf, 0, sizeof(buf));
  7044. bacpy(&ev->addr.bdaddr, bdaddr);
  7045. ev->addr.type = link_to_bdaddr(link_type, addr_type);
  7046. ev->rssi = rssi;
  7047. eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
  7048. name_len);
  7049. ev->eir_len = cpu_to_le16(eir_len);
  7050. mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL);
  7051. }
  7052. void mgmt_discovering(struct hci_dev *hdev, u8 discovering)
  7053. {
  7054. struct mgmt_ev_discovering ev;
  7055. bt_dev_dbg(hdev, "discovering %u", discovering);
  7056. memset(&ev, 0, sizeof(ev));
  7057. ev.type = hdev->discovery.type;
  7058. ev.discovering = discovering;
  7059. mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
  7060. }
  7061. void mgmt_suspending(struct hci_dev *hdev, u8 state)
  7062. {
  7063. struct mgmt_ev_controller_suspend ev;
  7064. ev.suspend_state = state;
  7065. mgmt_event(MGMT_EV_CONTROLLER_SUSPEND, hdev, &ev, sizeof(ev), NULL);
  7066. }
  7067. void mgmt_resuming(struct hci_dev *hdev, u8 reason, bdaddr_t *bdaddr,
  7068. u8 addr_type)
  7069. {
  7070. struct mgmt_ev_controller_resume ev;
  7071. ev.wake_reason = reason;
  7072. if (bdaddr) {
  7073. bacpy(&ev.addr.bdaddr, bdaddr);
  7074. ev.addr.type = addr_type;
  7075. } else {
  7076. memset(&ev.addr, 0, sizeof(ev.addr));
  7077. }
  7078. mgmt_event(MGMT_EV_CONTROLLER_RESUME, hdev, &ev, sizeof(ev), NULL);
  7079. }
  7080. static struct hci_mgmt_chan chan = {
  7081. .channel = HCI_CHANNEL_CONTROL,
  7082. .handler_count = ARRAY_SIZE(mgmt_handlers),
  7083. .handlers = mgmt_handlers,
  7084. .hdev_init = mgmt_init_hdev,
  7085. };
  7086. int mgmt_init(void)
  7087. {
  7088. return hci_mgmt_chan_register(&chan);
  7089. }
  7090. void mgmt_exit(void)
  7091. {
  7092. hci_mgmt_chan_unregister(&chan);
  7093. }