mgmt-tester.c 426 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2012 Intel Corporation. All rights reserved.
  7. *
  8. *
  9. */
  10. #ifdef HAVE_CONFIG_H
  11. #include <config.h>
  12. #endif
  13. #include <stdlib.h>
  14. #include <stdbool.h>
  15. #include <sys/ioctl.h>
  16. #include <sys/stat.h>
  17. #include <sys/types.h>
  18. #include <fcntl.h>
  19. #include <errno.h>
  20. #include <unistd.h>
  21. #include <glib.h>
  22. #include "lib/bluetooth.h"
  23. #include "lib/hci.h"
  24. #include "lib/hci_lib.h"
  25. #include "lib/mgmt.h"
  26. #include "lib/l2cap.h"
  27. #include "monitor/bt.h"
  28. #include "emulator/bthost.h"
  29. #include "emulator/hciemu.h"
  30. #include "src/shared/util.h"
  31. #include "src/shared/tester.h"
  32. #include "src/shared/mgmt.h"
  33. struct test_data {
  34. tester_data_func_t test_setup;
  35. const void *test_data;
  36. uint8_t expected_version;
  37. uint16_t expected_manufacturer;
  38. uint32_t expected_supported_settings;
  39. uint32_t initial_settings;
  40. struct mgmt *mgmt;
  41. struct mgmt *mgmt_alt;
  42. unsigned int mgmt_settings_id;
  43. unsigned int mgmt_alt_settings_id;
  44. unsigned int mgmt_alt_ev_id;
  45. unsigned int mgmt_discov_ev_id;
  46. uint8_t mgmt_version;
  47. uint16_t mgmt_revision;
  48. uint16_t mgmt_index;
  49. struct hciemu *hciemu;
  50. enum hciemu_type hciemu_type;
  51. bool expect_hci_command_done;
  52. int unmet_conditions;
  53. int unmet_setup_conditions;
  54. int sk;
  55. };
  56. static void print_debug(const char *str, void *user_data)
  57. {
  58. const char *prefix = user_data;
  59. tester_print("%s%s", prefix, str);
  60. }
  61. static void test_post_teardown(const void *test_data)
  62. {
  63. struct test_data *data = tester_get_data();
  64. if (data->sk >= 0)
  65. close(data->sk);
  66. hciemu_unref(data->hciemu);
  67. data->hciemu = NULL;
  68. }
  69. static void test_pre_setup_failed(void)
  70. {
  71. test_post_teardown(NULL);
  72. tester_pre_setup_failed();
  73. }
  74. static void read_version_callback(uint8_t status, uint16_t length,
  75. const void *param, void *user_data)
  76. {
  77. struct test_data *data = tester_get_data();
  78. const struct mgmt_rp_read_version *rp = param;
  79. tester_print("Read Version callback");
  80. tester_print(" Status: %s (0x%02x)", mgmt_errstr(status), status);
  81. if (status || !param) {
  82. test_pre_setup_failed();
  83. return;
  84. }
  85. data->mgmt_version = rp->version;
  86. data->mgmt_revision = btohs(rp->revision);
  87. tester_print(" Version %u.%u",
  88. data->mgmt_version, data->mgmt_revision);
  89. }
  90. static void read_commands_callback(uint8_t status, uint16_t length,
  91. const void *param, void *user_data)
  92. {
  93. tester_print("Read Commands callback");
  94. tester_print(" Status: %s (0x%02x)", mgmt_errstr(status), status);
  95. if (status || !param) {
  96. test_pre_setup_failed();
  97. return;
  98. }
  99. }
  100. static bool check_settings(uint32_t supported, uint32_t expected)
  101. {
  102. int i;
  103. if (supported == expected)
  104. return true;
  105. for (i = 0; i < 17; i++) {
  106. if (supported & BIT(i))
  107. continue;
  108. if (expected & BIT(i)) {
  109. tester_warn("Expected bit %u not supported", i);
  110. return false;
  111. }
  112. }
  113. return true;
  114. }
  115. static void read_info_callback(uint8_t status, uint16_t length,
  116. const void *param, void *user_data)
  117. {
  118. struct test_data *data = tester_get_data();
  119. const struct mgmt_rp_read_info *rp = param;
  120. char addr[18];
  121. uint16_t manufacturer;
  122. uint32_t supported_settings, current_settings;
  123. struct bthost *bthost;
  124. tester_print("Read Info callback");
  125. tester_print(" Status: %s (0x%02x)", mgmt_errstr(status), status);
  126. if (status || !param) {
  127. test_pre_setup_failed();
  128. return;
  129. }
  130. ba2str(&rp->bdaddr, addr);
  131. manufacturer = btohs(rp->manufacturer);
  132. supported_settings = btohl(rp->supported_settings);
  133. current_settings = btohl(rp->current_settings);
  134. tester_print(" Address: %s", addr);
  135. tester_print(" Version: 0x%02x", rp->version);
  136. tester_print(" Manufacturer: 0x%04x", manufacturer);
  137. tester_print(" Supported settings: 0x%08x", supported_settings);
  138. tester_print(" Current settings: 0x%08x", current_settings);
  139. tester_print(" Class: 0x%02x%02x%02x",
  140. rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]);
  141. tester_print(" Name: %s", rp->name);
  142. tester_print(" Short name: %s", rp->short_name);
  143. if (strcmp(hciemu_get_address(data->hciemu), addr)) {
  144. test_pre_setup_failed();
  145. return;
  146. }
  147. if (rp->version != data->expected_version) {
  148. tester_warn("Expected version: 0x%02x != 0x%02x",
  149. rp->version, data->expected_version);
  150. test_pre_setup_failed();
  151. return;
  152. }
  153. if (manufacturer != data->expected_manufacturer) {
  154. tester_warn("Expected manufacturer: 0x%04x != 0x%04x",
  155. manufacturer, data->expected_manufacturer);
  156. test_pre_setup_failed();
  157. return;
  158. }
  159. if (!check_settings(supported_settings,
  160. data->expected_supported_settings)) {
  161. tester_warn("Expected supported settings: 0x%08x != 0x%08x",
  162. supported_settings,
  163. data->expected_supported_settings);
  164. test_pre_setup_failed();
  165. return;
  166. }
  167. if (!check_settings(current_settings, data->initial_settings)) {
  168. tester_warn("Initial settings: 0x%08x != 0x%08x",
  169. current_settings, data->initial_settings);
  170. test_pre_setup_failed();
  171. return;
  172. }
  173. if (rp->dev_class[0] != 0x00 || rp->dev_class[1] != 0x00 ||
  174. rp->dev_class[2] != 0x00) {
  175. test_pre_setup_failed();
  176. return;
  177. }
  178. bthost = hciemu_client_get_host(data->hciemu);
  179. bthost_notify_ready(bthost, tester_pre_setup_complete);
  180. }
  181. static void index_added_callback(uint16_t index, uint16_t length,
  182. const void *param, void *user_data)
  183. {
  184. struct test_data *data = tester_get_data();
  185. tester_print("Index Added callback");
  186. tester_print(" Index: 0x%04x", index);
  187. data->mgmt_index = index;
  188. mgmt_send(data->mgmt, MGMT_OP_READ_INFO, data->mgmt_index, 0, NULL,
  189. read_info_callback, NULL, NULL);
  190. }
  191. static void index_removed_callback(uint16_t index, uint16_t length,
  192. const void *param, void *user_data)
  193. {
  194. struct test_data *data = tester_get_data();
  195. tester_print("Index Removed callback");
  196. tester_print(" Index: 0x%04x", index);
  197. if (index != data->mgmt_index)
  198. return;
  199. mgmt_unregister_index(data->mgmt, data->mgmt_index);
  200. mgmt_unregister_index(data->mgmt_alt, data->mgmt_index);
  201. mgmt_unref(data->mgmt);
  202. data->mgmt = NULL;
  203. mgmt_unref(data->mgmt_alt);
  204. data->mgmt_alt = NULL;
  205. tester_post_teardown_complete();
  206. }
  207. struct generic_data {
  208. bool setup_le_states;
  209. const uint8_t *le_states;
  210. const uint16_t *setup_settings;
  211. bool setup_nobredr;
  212. bool setup_limited_discov;
  213. uint16_t setup_expect_hci_command;
  214. const void *setup_expect_hci_param;
  215. uint8_t setup_expect_hci_len;
  216. uint16_t setup_send_opcode;
  217. const void *setup_send_param;
  218. uint16_t setup_send_len;
  219. const struct setup_mgmt_cmd *setup_mgmt_cmd_arr;
  220. bool send_index_none;
  221. const void *setup_discovery_param;
  222. uint16_t send_opcode;
  223. const void *send_param;
  224. uint16_t send_len;
  225. const void * (*send_func)(uint16_t *len);
  226. uint8_t expect_status;
  227. bool expect_ignore_param;
  228. const void *expect_param;
  229. uint16_t expect_len;
  230. const void * (*expect_func)(uint16_t *len);
  231. uint32_t expect_settings_set;
  232. uint32_t expect_settings_unset;
  233. uint16_t expect_alt_ev;
  234. const void *expect_alt_ev_param;
  235. bool (*verify_alt_ev_func)(const void *param, uint16_t length);
  236. uint16_t expect_alt_ev_len;
  237. uint16_t expect_hci_command;
  238. const void *expect_hci_param;
  239. int (*expect_hci_param_check_func)(const void *param, uint16_t length);
  240. uint8_t expect_hci_len;
  241. const void * (*expect_hci_func)(uint8_t *len);
  242. bool expect_pin;
  243. uint8_t pin_len;
  244. const void *pin;
  245. uint8_t client_pin_len;
  246. const void *client_pin;
  247. bool client_enable_ssp;
  248. uint8_t io_cap;
  249. uint8_t client_io_cap;
  250. uint8_t client_auth_req;
  251. bool reject_confirm;
  252. bool client_reject_confirm;
  253. bool just_works;
  254. bool client_enable_le;
  255. bool client_enable_sc;
  256. bool client_enable_adv;
  257. bool expect_sc_key;
  258. bool force_power_off;
  259. bool addr_type_avail;
  260. bool fail_tolerant;
  261. uint8_t addr_type;
  262. bool set_adv;
  263. const uint8_t *adv_data;
  264. uint8_t adv_data_len;
  265. };
  266. static int set_debugfs_force_suspend(int index, bool enable)
  267. {
  268. int fd, n, err;
  269. char val, path[64];
  270. err = 0;
  271. /* path for the debugfs file
  272. * /sys/kernel/debug/bluetooth/hciX/force_suspend
  273. */
  274. memset(path, 0, sizeof(path));
  275. sprintf(path, "/sys/kernel/debug/bluetooth/hci%d/force_suspend", index);
  276. fd = open(path, O_RDWR);
  277. if (fd < 0)
  278. return -errno;
  279. val = (enable) ? 'Y' : 'N';
  280. n = write(fd, &val, sizeof(val));
  281. if (n < (ssize_t) sizeof(val))
  282. err = -errno;
  283. close(fd);
  284. return err;
  285. }
  286. static int set_debugfs_force_wakeup(int index, bool enable)
  287. {
  288. int fd, n, err;
  289. char val, path[64];
  290. err = 0;
  291. /* path for the debugfs file
  292. * /sys/kernel/debug/bluetooth/hciX/force_suspend
  293. */
  294. memset(path, 0, sizeof(path));
  295. sprintf(path, "/sys/kernel/debug/bluetooth/hci%d/force_wakeup", index);
  296. fd = open(path, O_RDWR);
  297. if (fd < 0)
  298. return -errno;
  299. val = (enable) ? 'Y' : 'N';
  300. n = write(fd, &val, sizeof(val));
  301. if (n < (ssize_t) sizeof(val))
  302. err = -errno;
  303. close(fd);
  304. return err;
  305. }
  306. static const uint8_t set_exp_feat_param_debug[] = {
  307. 0x1c, 0xda, 0x47, 0x1c, 0x48, 0x6c, 0x01, 0xab, /* UUID - Debug */
  308. 0x9f, 0x46, 0xec, 0xb9, 0x30, 0x25, 0x99, 0xd4,
  309. 0x01, /* Action - enable */
  310. };
  311. static void debug_exp_callback(uint8_t status, uint16_t length,
  312. const void *param, void *user_data)
  313. {
  314. if (status != MGMT_STATUS_SUCCESS) {
  315. tester_print("Debug feature could not be enabled");
  316. return;
  317. }
  318. tester_print("Debug feature is enabled");
  319. }
  320. static void debug_exp_feature(struct test_data *data)
  321. {
  322. tester_print("Enabling Debug feature");
  323. mgmt_send(data->mgmt, MGMT_OP_SET_EXP_FEATURE, MGMT_INDEX_NONE,
  324. sizeof(set_exp_feat_param_debug), set_exp_feat_param_debug,
  325. debug_exp_callback, NULL, NULL);
  326. }
  327. static void read_index_list_callback(uint8_t status, uint16_t length,
  328. const void *param, void *user_data)
  329. {
  330. struct test_data *data = tester_get_data();
  331. const struct generic_data *test = data->test_data;
  332. tester_print("Read Index List callback");
  333. tester_print(" Status: %s (0x%02x)", mgmt_errstr(status), status);
  334. if (status || !param) {
  335. test_pre_setup_failed();
  336. return;
  337. }
  338. mgmt_register(data->mgmt, MGMT_EV_INDEX_ADDED, MGMT_INDEX_NONE,
  339. index_added_callback, NULL, NULL);
  340. mgmt_register(data->mgmt, MGMT_EV_INDEX_REMOVED, MGMT_INDEX_NONE,
  341. index_removed_callback, NULL, NULL);
  342. data->hciemu = hciemu_new(data->hciemu_type);
  343. if (!data->hciemu) {
  344. tester_warn("Failed to setup HCI emulation");
  345. test_pre_setup_failed();
  346. }
  347. if (tester_use_debug())
  348. hciemu_set_debug(data->hciemu, print_debug, "hciemu: ", NULL);
  349. if (test && test->setup_le_states)
  350. hciemu_set_central_le_states(data->hciemu, test->le_states);
  351. }
  352. static void test_pre_setup(const void *test_data)
  353. {
  354. struct test_data *data = tester_get_data();
  355. data->mgmt = mgmt_new_default();
  356. if (!data->mgmt) {
  357. tester_warn("Failed to setup management interface");
  358. test_pre_setup_failed();
  359. return;
  360. }
  361. data->mgmt_alt = mgmt_new_default();
  362. if (!data->mgmt_alt) {
  363. tester_warn("Failed to setup alternate management interface");
  364. test_pre_setup_failed();
  365. mgmt_unref(data->mgmt);
  366. data->mgmt = NULL;
  367. return;
  368. }
  369. if (tester_use_debug()) {
  370. mgmt_set_debug(data->mgmt, print_debug, "mgmt: ", NULL);
  371. mgmt_set_debug(data->mgmt_alt, print_debug, "mgmt-alt: ", NULL);
  372. debug_exp_feature(data);
  373. }
  374. mgmt_send(data->mgmt, MGMT_OP_READ_VERSION, MGMT_INDEX_NONE, 0, NULL,
  375. read_version_callback, NULL, NULL);
  376. mgmt_send(data->mgmt, MGMT_OP_READ_COMMANDS, MGMT_INDEX_NONE, 0, NULL,
  377. read_commands_callback, NULL, NULL);
  378. mgmt_send(data->mgmt, MGMT_OP_READ_INDEX_LIST, MGMT_INDEX_NONE, 0, NULL,
  379. read_index_list_callback, NULL, NULL);
  380. data->sk = -1;
  381. }
  382. static void test_add_condition(struct test_data *data)
  383. {
  384. data->unmet_conditions++;
  385. tester_print("Test condition added, total %d", data->unmet_conditions);
  386. }
  387. static void test_add_setup_condition(struct test_data *data)
  388. {
  389. data->unmet_setup_conditions++;
  390. tester_print("Test setup condition added, total %d",
  391. data->unmet_setup_conditions);
  392. }
  393. static void test_setup_condition_complete(struct test_data *data)
  394. {
  395. data->unmet_setup_conditions--;
  396. tester_print("Test setup condition complete, %d left",
  397. data->unmet_setup_conditions);
  398. if (data->unmet_setup_conditions > 0)
  399. return;
  400. tester_setup_complete();
  401. }
  402. static void test_condition_complete(struct test_data *data)
  403. {
  404. data->unmet_conditions--;
  405. tester_print("Test condition complete, %d left",
  406. data->unmet_conditions);
  407. if (data->unmet_conditions > 0)
  408. return;
  409. tester_test_passed();
  410. }
  411. #define test_full(name, data, setup, func, timeout, type, version, \
  412. expected_settings, settings) \
  413. do { \
  414. struct test_data *user; \
  415. user = new0(struct test_data, 1); \
  416. user->hciemu_type = type; \
  417. user->test_setup = setup; \
  418. user->test_data = data; \
  419. user->expected_version = version; \
  420. user->expected_manufacturer = 0x003f; \
  421. user->expected_supported_settings = expected_settings; \
  422. user->initial_settings = settings; \
  423. tester_add_full(name, data, \
  424. test_pre_setup, test_setup, func, NULL, \
  425. test_post_teardown, timeout, user, free); \
  426. } while (0)
  427. #define test_bredrle_full(name, data, setup, func, timeout) \
  428. test_full(name, data, setup, func, timeout, HCIEMU_TYPE_BREDRLE, \
  429. 0x09, 0x0001beff, 0x00000080)
  430. #define test_bredrle(name, data, setup, func) \
  431. test_bredrle_full(name, data, setup, func, 2)
  432. #define test_bredr20(name, data, setup, func) \
  433. test_full(name, data, setup, func, 2, HCIEMU_TYPE_LEGACY, \
  434. 0x03, 0x000110bf, 0x00000080)
  435. #define test_bredr(name, data, setup, func) \
  436. test_full(name, data, setup, func, 2, HCIEMU_TYPE_BREDR, \
  437. 0x05, 0x000110ff, 0x00000080)
  438. #define test_le_full(name, data, setup, func, timeout) \
  439. test_full(name, data, setup, func, timeout, HCIEMU_TYPE_LE, \
  440. 0x09, 0x0001be1b, 0x00000200)
  441. #define test_le(name, data, setup, func) \
  442. test_le_full(name, data, setup, func, 2)
  443. #define test_bredrle50_full(name, data, setup, func, timeout) \
  444. test_full(name, data, setup, func, timeout, HCIEMU_TYPE_BREDRLE50, \
  445. 0x09, 0x0001beff, 0x00000080)
  446. #define test_bredrle50(name, data, setup, func) \
  447. test_bredrle50_full(name, data, setup, func, 2)
  448. #define test_hs_full(name, data, setup, func, timeout) \
  449. test_full(name, data, setup, func, timeout, HCIEMU_TYPE_BREDRLE, \
  450. 0x09, 0x0001bfff, 0x00000080)
  451. #define test_hs(name, data, setup, func) \
  452. test_hs_full(name, data, setup, func, 2)
  453. static void controller_setup(const void *test_data)
  454. {
  455. tester_test_passed();
  456. }
  457. struct setup_mgmt_cmd {
  458. uint8_t send_opcode;
  459. const void *send_param;
  460. uint16_t send_len;
  461. };
  462. static const char dummy_data[] = { 0x00 };
  463. static const struct generic_data invalid_command_test = {
  464. .send_opcode = 0xffff,
  465. .expect_status = MGMT_STATUS_UNKNOWN_COMMAND,
  466. };
  467. static const struct generic_data read_version_success_test = {
  468. .send_index_none = true,
  469. .send_opcode = MGMT_OP_READ_VERSION,
  470. .expect_status = MGMT_STATUS_SUCCESS,
  471. .expect_len = 3,
  472. };
  473. static const struct generic_data read_version_invalid_param_test = {
  474. .send_index_none = true,
  475. .send_opcode = MGMT_OP_READ_VERSION,
  476. .send_param = dummy_data,
  477. .send_len = sizeof(dummy_data),
  478. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  479. };
  480. static const struct generic_data read_version_invalid_index_test = {
  481. .send_opcode = MGMT_OP_READ_VERSION,
  482. .expect_status = MGMT_STATUS_INVALID_INDEX,
  483. };
  484. static const struct generic_data read_commands_invalid_param_test = {
  485. .send_index_none = true,
  486. .send_opcode = MGMT_OP_READ_COMMANDS,
  487. .send_param = dummy_data,
  488. .send_len = sizeof(dummy_data),
  489. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  490. };
  491. static const struct generic_data read_commands_invalid_index_test = {
  492. .send_opcode = MGMT_OP_READ_COMMANDS,
  493. .expect_status = MGMT_STATUS_INVALID_INDEX,
  494. };
  495. static const struct generic_data read_index_list_invalid_param_test = {
  496. .send_index_none = true,
  497. .send_opcode = MGMT_OP_READ_INDEX_LIST,
  498. .send_param = dummy_data,
  499. .send_len = sizeof(dummy_data),
  500. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  501. };
  502. static const struct generic_data read_index_list_invalid_index_test = {
  503. .send_opcode = MGMT_OP_READ_INDEX_LIST,
  504. .expect_status = MGMT_STATUS_INVALID_INDEX,
  505. };
  506. static const struct generic_data read_info_invalid_param_test = {
  507. .send_opcode = MGMT_OP_READ_INFO,
  508. .send_param = dummy_data,
  509. .send_len = sizeof(dummy_data),
  510. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  511. };
  512. static const struct generic_data read_info_invalid_index_test = {
  513. .send_index_none = true,
  514. .send_opcode = MGMT_OP_READ_INFO,
  515. .expect_status = MGMT_STATUS_INVALID_INDEX,
  516. };
  517. static const struct generic_data read_unconf_index_list_invalid_param_test = {
  518. .send_index_none = true,
  519. .send_opcode = MGMT_OP_READ_UNCONF_INDEX_LIST,
  520. .send_param = dummy_data,
  521. .send_len = sizeof(dummy_data),
  522. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  523. };
  524. static const struct generic_data read_unconf_index_list_invalid_index_test = {
  525. .send_opcode = MGMT_OP_READ_UNCONF_INDEX_LIST,
  526. .expect_status = MGMT_STATUS_INVALID_INDEX,
  527. };
  528. static const struct generic_data read_config_info_invalid_param_test = {
  529. .send_opcode = MGMT_OP_READ_CONFIG_INFO,
  530. .send_param = dummy_data,
  531. .send_len = sizeof(dummy_data),
  532. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  533. };
  534. static const struct generic_data read_config_info_invalid_index_test = {
  535. .send_index_none = true,
  536. .send_opcode = MGMT_OP_READ_CONFIG_INFO,
  537. .expect_status = MGMT_STATUS_INVALID_INDEX,
  538. };
  539. static const struct generic_data read_ext_index_list_invalid_param_test = {
  540. .send_index_none = true,
  541. .send_opcode = MGMT_OP_READ_EXT_INDEX_LIST,
  542. .send_param = dummy_data,
  543. .send_len = sizeof(dummy_data),
  544. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  545. };
  546. static const struct generic_data read_ext_index_list_invalid_index_test = {
  547. .send_opcode = MGMT_OP_READ_EXT_INDEX_LIST,
  548. .expect_status = MGMT_STATUS_INVALID_INDEX,
  549. };
  550. static const char set_powered_on_param[] = { 0x01 };
  551. static const char set_powered_invalid_param[] = { 0x02 };
  552. static const char set_powered_garbage_param[] = { 0x01, 0x00 };
  553. static const char set_powered_settings_param[] = { 0x81, 0x00, 0x00, 0x00 };
  554. static const struct generic_data set_powered_on_success_test = {
  555. .send_opcode = MGMT_OP_SET_POWERED,
  556. .send_param = set_powered_on_param,
  557. .send_len = sizeof(set_powered_on_param),
  558. .expect_status = MGMT_STATUS_SUCCESS,
  559. .expect_param = set_powered_settings_param,
  560. .expect_len = sizeof(set_powered_settings_param),
  561. .expect_settings_set = MGMT_SETTING_POWERED,
  562. };
  563. static const struct generic_data set_powered_on_invalid_param_test_1 = {
  564. .send_opcode = MGMT_OP_SET_POWERED,
  565. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  566. };
  567. static const struct generic_data set_powered_on_invalid_param_test_2 = {
  568. .send_opcode = MGMT_OP_SET_POWERED,
  569. .send_param = set_powered_invalid_param,
  570. .send_len = sizeof(set_powered_invalid_param),
  571. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  572. };
  573. static const struct generic_data set_powered_on_invalid_param_test_3 = {
  574. .send_opcode = MGMT_OP_SET_POWERED,
  575. .send_param = set_powered_garbage_param,
  576. .send_len = sizeof(set_powered_garbage_param),
  577. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  578. };
  579. static const struct generic_data set_powered_on_invalid_index_test = {
  580. .send_index_none = true,
  581. .send_opcode = MGMT_OP_SET_POWERED,
  582. .send_param = set_powered_on_param,
  583. .send_len = sizeof(set_powered_on_param),
  584. .expect_status = MGMT_STATUS_INVALID_INDEX,
  585. };
  586. static uint16_t settings_powered_advertising_privacy[] = {
  587. MGMT_OP_SET_PRIVACY,
  588. MGMT_OP_SET_ADVERTISING,
  589. MGMT_OP_SET_POWERED, 0 };
  590. static const char set_adv_off_param[] = { 0x00 };
  591. static const struct generic_data set_powered_on_privacy_adv_test = {
  592. .setup_settings = settings_powered_advertising_privacy,
  593. .send_opcode = MGMT_OP_SET_ADVERTISING,
  594. .send_param = set_adv_off_param,
  595. .send_len = sizeof(set_adv_off_param),
  596. .expect_status = MGMT_STATUS_SUCCESS,
  597. .expect_ignore_param = true,
  598. };
  599. static const uint16_t settings_powered[] = { MGMT_OP_SET_POWERED, 0 };
  600. static const char set_powered_off_param[] = { 0x00 };
  601. static const char set_powered_off_settings_param[] = { 0x80, 0x00, 0x00, 0x00 };
  602. static const char set_powered_off_class_of_dev[] = { 0x00, 0x00, 0x00 };
  603. static const struct generic_data set_powered_off_success_test = {
  604. .setup_settings = settings_powered,
  605. .send_opcode = MGMT_OP_SET_POWERED,
  606. .send_param = set_powered_off_param,
  607. .send_len = sizeof(set_powered_off_param),
  608. .expect_status = MGMT_STATUS_SUCCESS,
  609. .expect_param = set_powered_off_settings_param,
  610. .expect_len = sizeof(set_powered_off_settings_param),
  611. .expect_settings_unset = MGMT_SETTING_POWERED,
  612. };
  613. static const struct generic_data set_powered_off_class_test = {
  614. .send_opcode = MGMT_OP_SET_POWERED,
  615. .send_param = set_powered_off_param,
  616. .send_len = sizeof(set_powered_off_param),
  617. .expect_status = MGMT_STATUS_SUCCESS,
  618. .expect_param = set_powered_off_settings_param,
  619. .expect_len = sizeof(set_powered_off_settings_param),
  620. .expect_settings_unset = MGMT_SETTING_POWERED,
  621. .expect_alt_ev = MGMT_EV_CLASS_OF_DEV_CHANGED,
  622. .expect_alt_ev_param = set_powered_off_class_of_dev,
  623. .expect_alt_ev_len = sizeof(set_powered_off_class_of_dev),
  624. };
  625. static const struct generic_data set_powered_off_invalid_param_test_1 = {
  626. .setup_settings = settings_powered,
  627. .send_opcode = MGMT_OP_SET_POWERED,
  628. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  629. };
  630. static const struct generic_data set_powered_off_invalid_param_test_2 = {
  631. .setup_settings = settings_powered,
  632. .send_opcode = MGMT_OP_SET_POWERED,
  633. .send_param = set_powered_invalid_param,
  634. .send_len = sizeof(set_powered_invalid_param),
  635. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  636. };
  637. static const struct generic_data set_powered_off_invalid_param_test_3 = {
  638. .setup_settings = settings_powered,
  639. .send_opcode = MGMT_OP_SET_POWERED,
  640. .send_param = set_powered_garbage_param,
  641. .send_len = sizeof(set_powered_garbage_param),
  642. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  643. };
  644. static const char set_connectable_on_param[] = { 0x01 };
  645. static const char set_connectable_invalid_param[] = { 0x02 };
  646. static const char set_connectable_garbage_param[] = { 0x01, 0x00 };
  647. static const char set_connectable_settings_param_1[] = { 0x82, 0x00, 0x00, 0x00 };
  648. static const char set_connectable_settings_param_2[] = { 0x83, 0x00, 0x00, 0x00 };
  649. static const char set_connectable_scan_enable_param[] = { 0x02 };
  650. static const struct generic_data set_connectable_on_success_test_1 = {
  651. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  652. .send_param = set_connectable_on_param,
  653. .send_len = sizeof(set_connectable_on_param),
  654. .expect_status = MGMT_STATUS_SUCCESS,
  655. .expect_param = set_connectable_settings_param_1,
  656. .expect_len = sizeof(set_connectable_settings_param_1),
  657. .expect_settings_set = MGMT_SETTING_CONNECTABLE,
  658. };
  659. static const struct generic_data set_connectable_on_success_test_2 = {
  660. .setup_settings = settings_powered,
  661. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  662. .send_param = set_connectable_on_param,
  663. .send_len = sizeof(set_connectable_on_param),
  664. .expect_status = MGMT_STATUS_SUCCESS,
  665. .expect_param = set_connectable_settings_param_2,
  666. .expect_len = sizeof(set_connectable_settings_param_2),
  667. .expect_settings_set = MGMT_SETTING_CONNECTABLE,
  668. .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE,
  669. .expect_hci_param = set_connectable_scan_enable_param,
  670. .expect_hci_len = sizeof(set_connectable_scan_enable_param),
  671. };
  672. static const struct generic_data set_connectable_on_invalid_param_test_1 = {
  673. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  674. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  675. };
  676. static const struct generic_data set_connectable_on_invalid_param_test_2 = {
  677. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  678. .send_param = set_connectable_invalid_param,
  679. .send_len = sizeof(set_connectable_invalid_param),
  680. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  681. };
  682. static const struct generic_data set_connectable_on_invalid_param_test_3 = {
  683. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  684. .send_param = set_connectable_garbage_param,
  685. .send_len = sizeof(set_connectable_garbage_param),
  686. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  687. };
  688. static const struct generic_data set_connectable_on_invalid_index_test = {
  689. .send_index_none = true,
  690. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  691. .send_param = set_connectable_on_param,
  692. .send_len = sizeof(set_connectable_on_param),
  693. .expect_status = MGMT_STATUS_INVALID_INDEX,
  694. };
  695. static uint16_t settings_powered_advertising[] = { MGMT_OP_SET_ADVERTISING,
  696. MGMT_OP_SET_POWERED, 0 };
  697. static const char set_connectable_le_settings_param_1[] = { 0x02, 0x02, 0x00, 0x00 };
  698. static const char set_connectable_le_settings_param_2[] = { 0x03, 0x02, 0x00, 0x00 };
  699. static const char set_connectable_le_settings_param_3[] = { 0x03, 0x06, 0x00, 0x00 };
  700. static const struct generic_data set_connectable_on_le_test_1 = {
  701. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  702. .send_param = set_connectable_on_param,
  703. .send_len = sizeof(set_connectable_on_param),
  704. .expect_status = MGMT_STATUS_SUCCESS,
  705. .expect_param = set_connectable_le_settings_param_1,
  706. .expect_len = sizeof(set_connectable_le_settings_param_1),
  707. .expect_settings_set = MGMT_SETTING_CONNECTABLE,
  708. };
  709. static const struct generic_data set_connectable_on_le_test_2 = {
  710. .setup_settings = settings_powered,
  711. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  712. .send_param = set_connectable_on_param,
  713. .send_len = sizeof(set_connectable_on_param),
  714. .expect_status = MGMT_STATUS_SUCCESS,
  715. .expect_param = set_connectable_le_settings_param_2,
  716. .expect_len = sizeof(set_connectable_le_settings_param_2),
  717. .expect_settings_set = MGMT_SETTING_CONNECTABLE,
  718. };
  719. static uint8_t set_connectable_on_adv_param[] = {
  720. 0x00, 0x08, /* min_interval */
  721. 0x00, 0x08, /* max_interval */
  722. 0x00, /* type */
  723. 0x00, /* own_addr_type */
  724. 0x00, /* direct_addr_type */
  725. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* direct_addr */
  726. 0x07, /* channel_map */
  727. 0x00, /* filter_policy */
  728. };
  729. static const struct generic_data set_connectable_on_le_test_3 = {
  730. .setup_settings = settings_powered_advertising,
  731. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  732. .send_param = set_connectable_on_param,
  733. .send_len = sizeof(set_connectable_on_param),
  734. .expect_status = MGMT_STATUS_SUCCESS,
  735. .expect_param = set_connectable_le_settings_param_3,
  736. .expect_len = sizeof(set_connectable_le_settings_param_3),
  737. .expect_settings_set = MGMT_SETTING_CONNECTABLE,
  738. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS,
  739. .expect_hci_param = set_connectable_on_adv_param,
  740. .expect_hci_len = sizeof(set_connectable_on_adv_param),
  741. };
  742. static const uint16_t settings_connectable[] = { MGMT_OP_SET_CONNECTABLE, 0 };
  743. static const uint16_t settings_powered_connectable[] = {
  744. MGMT_OP_SET_CONNECTABLE,
  745. MGMT_OP_SET_POWERED, 0 };
  746. static const uint16_t settings_powered_discoverable[] = {
  747. MGMT_OP_SET_CONNECTABLE,
  748. MGMT_OP_SET_DISCOVERABLE,
  749. MGMT_OP_SET_POWERED, 0 };
  750. static const char set_connectable_off_param[] = { 0x00 };
  751. static const char set_connectable_off_settings_1[] = { 0x80, 0x00, 0x00, 0x00 };
  752. static const char set_connectable_off_settings_2[] = { 0x81, 0x00, 0x00, 0x00 };
  753. static const char set_connectable_off_scan_enable_param[] = { 0x00 };
  754. static const struct generic_data set_connectable_off_success_test_1 = {
  755. .setup_settings = settings_connectable,
  756. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  757. .send_param = set_connectable_off_param,
  758. .send_len = sizeof(set_connectable_off_param),
  759. .expect_status = MGMT_STATUS_SUCCESS,
  760. .expect_param = set_connectable_off_settings_1,
  761. .expect_len = sizeof(set_connectable_off_settings_1),
  762. .expect_settings_unset = MGMT_SETTING_CONNECTABLE,
  763. };
  764. static const struct generic_data set_connectable_off_success_test_2 = {
  765. .setup_settings = settings_powered_connectable,
  766. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  767. .send_param = set_connectable_off_param,
  768. .send_len = sizeof(set_connectable_off_param),
  769. .expect_status = MGMT_STATUS_SUCCESS,
  770. .expect_param = set_connectable_off_settings_2,
  771. .expect_len = sizeof(set_connectable_off_settings_2),
  772. .expect_settings_unset = MGMT_SETTING_CONNECTABLE,
  773. .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE,
  774. .expect_hci_param = set_connectable_off_scan_enable_param,
  775. .expect_hci_len = sizeof(set_connectable_off_scan_enable_param),
  776. };
  777. static const struct generic_data set_connectable_off_success_test_3 = {
  778. .setup_settings = settings_powered_discoverable,
  779. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  780. .send_param = set_connectable_off_param,
  781. .send_len = sizeof(set_connectable_off_param),
  782. .expect_status = MGMT_STATUS_SUCCESS,
  783. .expect_param = set_connectable_off_settings_2,
  784. .expect_len = sizeof(set_connectable_off_settings_2),
  785. .expect_settings_unset = MGMT_SETTING_CONNECTABLE,
  786. .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE,
  787. .expect_hci_param = set_connectable_off_scan_enable_param,
  788. .expect_hci_len = sizeof(set_connectable_off_scan_enable_param),
  789. };
  790. static const struct generic_data set_connectable_off_success_test_4 = {
  791. .setup_settings = settings_powered_discoverable,
  792. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  793. .send_param = set_connectable_off_param,
  794. .send_len = sizeof(set_connectable_off_param),
  795. .expect_status = MGMT_STATUS_SUCCESS,
  796. .expect_param = set_connectable_off_settings_2,
  797. .expect_len = sizeof(set_connectable_off_settings_2),
  798. .expect_settings_unset = MGMT_SETTING_CONNECTABLE,
  799. .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE,
  800. .expect_hci_param = set_connectable_scan_enable_param,
  801. .expect_hci_len = sizeof(set_connectable_scan_enable_param),
  802. };
  803. static const char set_connectable_off_le_settings_1[] = { 0x00, 0x02, 0x00, 0x00 };
  804. static const char set_connectable_off_le_settings_2[] = { 0x01, 0x06, 0x00, 0x00 };
  805. static uint16_t settings_le_connectable[] = { MGMT_OP_SET_LE,
  806. MGMT_OP_SET_CONNECTABLE, 0 };
  807. static const struct generic_data set_connectable_off_le_test_1 = {
  808. .setup_settings = settings_le_connectable,
  809. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  810. .send_param = set_connectable_off_param,
  811. .send_len = sizeof(set_connectable_off_param),
  812. .expect_status = MGMT_STATUS_SUCCESS,
  813. .expect_param = set_connectable_off_le_settings_1,
  814. .expect_len = sizeof(set_connectable_off_le_settings_1),
  815. .expect_settings_unset = MGMT_SETTING_CONNECTABLE,
  816. };
  817. static uint16_t settings_powered_le_connectable_advertising[] = {
  818. MGMT_OP_SET_LE,
  819. MGMT_OP_SET_CONNECTABLE,
  820. MGMT_OP_SET_ADVERTISING,
  821. MGMT_OP_SET_POWERED, 0 };
  822. static uint8_t set_connectable_off_scan_adv_param[] = {
  823. 0x64, 0x00, /* min_interval */
  824. 0x96, 0x00, /* max_interval */
  825. 0x02, /* type */
  826. 0x01, /* own_addr_type */
  827. 0x00, /* direct_addr_type */
  828. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* direct_addr */
  829. 0x07, /* channel_map */
  830. 0x00, /* filter_policy */
  831. };
  832. static int set_connectable_off_scan_adv_check_func(const void *param,
  833. uint16_t length)
  834. {
  835. const uint8_t *received = param;
  836. uint8_t *expected = set_connectable_off_scan_adv_param;
  837. /* Compare the received param with expected param, but ignore the
  838. * min_internal and max_interval since these values are turned often
  839. * in the kernel and we don't want to update the expected value every
  840. * time.
  841. */
  842. return memcmp(&received[4], &expected[4], length - 4);
  843. }
  844. static const struct generic_data set_connectable_off_le_test_2 = {
  845. .setup_settings = settings_powered_le_connectable_advertising,
  846. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  847. .send_param = set_connectable_off_param,
  848. .send_len = sizeof(set_connectable_off_param),
  849. .expect_status = MGMT_STATUS_SUCCESS,
  850. .expect_param = set_connectable_off_le_settings_2,
  851. .expect_len = sizeof(set_connectable_off_le_settings_2),
  852. .expect_settings_unset = MGMT_SETTING_CONNECTABLE,
  853. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS,
  854. .expect_hci_param = set_connectable_off_scan_adv_param,
  855. .expect_hci_len = sizeof(set_connectable_off_scan_adv_param),
  856. .expect_hci_param_check_func = set_connectable_off_scan_adv_check_func
  857. };
  858. static uint16_t settings_powered_le_discoverable[] = {
  859. MGMT_OP_SET_LE,
  860. MGMT_OP_SET_CONNECTABLE,
  861. MGMT_OP_SET_POWERED,
  862. MGMT_OP_SET_DISCOVERABLE, 0 };
  863. static uint16_t settings_powered_le_discoverable_advertising[] = {
  864. MGMT_OP_SET_LE,
  865. MGMT_OP_SET_CONNECTABLE,
  866. MGMT_OP_SET_ADVERTISING,
  867. MGMT_OP_SET_POWERED,
  868. MGMT_OP_SET_DISCOVERABLE, 0 };
  869. static const struct generic_data set_connectable_off_le_test_3 = {
  870. .setup_settings = settings_powered_le_discoverable_advertising,
  871. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  872. .send_param = set_connectable_off_param,
  873. .send_len = sizeof(set_connectable_off_param),
  874. .expect_status = MGMT_STATUS_SUCCESS,
  875. .expect_param = set_connectable_off_le_settings_2,
  876. .expect_len = sizeof(set_connectable_off_le_settings_2),
  877. .expect_settings_unset = MGMT_SETTING_CONNECTABLE,
  878. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS,
  879. .expect_hci_param = set_connectable_off_scan_adv_param,
  880. .expect_hci_len = sizeof(set_connectable_off_scan_adv_param),
  881. .expect_hci_param_check_func = set_connectable_off_scan_adv_check_func
  882. };
  883. static const struct generic_data set_connectable_off_le_test_4 = {
  884. .setup_settings = settings_powered_le_discoverable_advertising,
  885. .setup_limited_discov = true,
  886. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  887. .send_param = set_connectable_off_param,
  888. .send_len = sizeof(set_connectable_off_param),
  889. .expect_status = MGMT_STATUS_SUCCESS,
  890. .expect_param = set_connectable_off_le_settings_2,
  891. .expect_len = sizeof(set_connectable_off_le_settings_2),
  892. .expect_settings_unset = MGMT_SETTING_CONNECTABLE,
  893. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS,
  894. .expect_hci_param = set_connectable_off_scan_adv_param,
  895. .expect_hci_len = sizeof(set_connectable_off_scan_adv_param),
  896. .expect_hci_param_check_func = set_connectable_off_scan_adv_check_func
  897. };
  898. static const char set_fast_conn_on_param[] = { 0x01 };
  899. static const char set_fast_conn_on_settings_1[] = { 0x87, 0x00, 0x00, 0x00 };
  900. static const char set_fast_conn_on_settings_2[] = { 0x85, 0x00, 0x00, 0x00 };
  901. static const char set_fast_conn_on_settings_3[] = { 0x84, 0x00, 0x00, 0x00 };
  902. static const struct generic_data set_fast_conn_on_success_test_1 = {
  903. .setup_settings = settings_powered_connectable,
  904. .send_opcode = MGMT_OP_SET_FAST_CONNECTABLE,
  905. .send_param = set_fast_conn_on_param,
  906. .send_len = sizeof(set_fast_conn_on_param),
  907. .expect_status = MGMT_STATUS_SUCCESS,
  908. .expect_param = set_fast_conn_on_settings_1,
  909. .expect_len = sizeof(set_fast_conn_on_settings_1),
  910. .expect_settings_set = MGMT_SETTING_FAST_CONNECTABLE,
  911. };
  912. static const struct generic_data set_fast_conn_on_success_test_2 = {
  913. .setup_settings = settings_powered,
  914. .send_opcode = MGMT_OP_SET_FAST_CONNECTABLE,
  915. .send_param = set_fast_conn_on_param,
  916. .send_len = sizeof(set_fast_conn_on_param),
  917. .expect_status = MGMT_STATUS_SUCCESS,
  918. .expect_param = set_fast_conn_on_settings_2,
  919. .expect_len = sizeof(set_fast_conn_on_settings_2),
  920. .expect_settings_set = MGMT_SETTING_FAST_CONNECTABLE,
  921. };
  922. static const struct generic_data set_fast_conn_on_success_test_3 = {
  923. .send_opcode = MGMT_OP_SET_FAST_CONNECTABLE,
  924. .send_param = set_fast_conn_on_param,
  925. .send_len = sizeof(set_fast_conn_on_param),
  926. .expect_status = MGMT_STATUS_SUCCESS,
  927. .expect_param = set_fast_conn_on_settings_3,
  928. .expect_len = sizeof(set_fast_conn_on_settings_3),
  929. .expect_settings_set = MGMT_SETTING_FAST_CONNECTABLE,
  930. };
  931. static const struct generic_data set_fast_conn_on_not_supported_test_1 = {
  932. .setup_settings = settings_powered_connectable,
  933. .send_opcode = MGMT_OP_SET_FAST_CONNECTABLE,
  934. .send_param = set_fast_conn_on_param,
  935. .send_len = sizeof(set_fast_conn_on_param),
  936. .expect_status = MGMT_STATUS_NOT_SUPPORTED,
  937. };
  938. static const char set_fast_conn_nval_param[] = { 0xff };
  939. static const struct generic_data set_fast_conn_nval_param_test_1 = {
  940. .send_opcode = MGMT_OP_SET_FAST_CONNECTABLE,
  941. .send_param = set_fast_conn_nval_param,
  942. .send_len = sizeof(set_fast_conn_nval_param),
  943. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  944. };
  945. static const char set_bondable_on_param[] = { 0x01 };
  946. static const char set_bondable_invalid_param[] = { 0x02 };
  947. static const char set_bondable_garbage_param[] = { 0x01, 0x00 };
  948. static const char set_bondable_settings_param[] = { 0x90, 0x00, 0x00, 0x00 };
  949. static const struct generic_data set_bondable_on_success_test = {
  950. .send_opcode = MGMT_OP_SET_BONDABLE,
  951. .send_param = set_bondable_on_param,
  952. .send_len = sizeof(set_bondable_on_param),
  953. .expect_status = MGMT_STATUS_SUCCESS,
  954. .expect_param = set_bondable_settings_param,
  955. .expect_len = sizeof(set_bondable_settings_param),
  956. .expect_settings_set = MGMT_SETTING_BONDABLE,
  957. };
  958. static const struct generic_data set_bondable_on_invalid_param_test_1 = {
  959. .send_opcode = MGMT_OP_SET_BONDABLE,
  960. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  961. };
  962. static const struct generic_data set_bondable_on_invalid_param_test_2 = {
  963. .send_opcode = MGMT_OP_SET_BONDABLE,
  964. .send_param = set_bondable_invalid_param,
  965. .send_len = sizeof(set_bondable_invalid_param),
  966. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  967. };
  968. static const struct generic_data set_bondable_on_invalid_param_test_3 = {
  969. .send_opcode = MGMT_OP_SET_BONDABLE,
  970. .send_param = set_bondable_garbage_param,
  971. .send_len = sizeof(set_bondable_garbage_param),
  972. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  973. };
  974. static const struct generic_data set_bondable_on_invalid_index_test = {
  975. .send_index_none = true,
  976. .send_opcode = MGMT_OP_SET_BONDABLE,
  977. .send_param = set_bondable_on_param,
  978. .send_len = sizeof(set_bondable_on_param),
  979. .expect_status = MGMT_STATUS_INVALID_INDEX,
  980. };
  981. static const uint8_t set_discoverable_on_param[] = { 0x01, 0x00, 0x00 };
  982. static const uint8_t set_discoverable_timeout_param[] = { 0x01, 0x0a, 0x00 };
  983. static const uint8_t set_discoverable_invalid_param[] = { 0x02, 0x00, 0x00 };
  984. static const uint8_t set_discoverable_off_param[] = { 0x00, 0x00, 0x00 };
  985. static const uint8_t set_discoverable_offtimeout_param[] = { 0x00, 0x01, 0x00 };
  986. static const uint8_t set_discoverable_garbage_param[] = { 0x01, 0x00, 0x00, 0x00 };
  987. static const uint8_t set_discoverable_on_settings_param_1[] = { 0x8a, 0x00, 0x00, 0x00 };
  988. static const uint8_t set_discoverable_on_settings_param_2[] = { 0x8b, 0x00, 0x00, 0x00 };
  989. static const uint8_t set_discoverable_off_settings_param_1[] = { 0x82, 0x00, 0x00, 0x00 };
  990. static const uint8_t set_discoverable_off_settings_param_2[] = { 0x83, 0x00, 0x00, 0x00 };
  991. static const uint8_t set_discoverable_on_scan_enable_param[] = { 0x03 };
  992. static const uint8_t set_discoverable_off_scan_enable_param[] = { 0x02 };
  993. static const struct generic_data set_discoverable_on_invalid_param_test_1 = {
  994. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  995. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  996. };
  997. static const struct generic_data set_discoverable_on_invalid_param_test_2 = {
  998. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  999. .send_param = set_discoverable_invalid_param,
  1000. .send_len = sizeof(set_discoverable_invalid_param),
  1001. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1002. };
  1003. static const struct generic_data set_discoverable_on_invalid_param_test_3 = {
  1004. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1005. .send_param = set_discoverable_garbage_param,
  1006. .send_len = sizeof(set_discoverable_garbage_param),
  1007. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1008. };
  1009. static const struct generic_data set_discoverable_on_invalid_param_test_4 = {
  1010. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1011. .send_param = set_discoverable_offtimeout_param,
  1012. .send_len = sizeof(set_discoverable_offtimeout_param),
  1013. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1014. };
  1015. static const struct generic_data set_discoverable_on_not_powered_test_1 = {
  1016. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1017. .send_param = set_discoverable_timeout_param,
  1018. .send_len = sizeof(set_discoverable_timeout_param),
  1019. .expect_status = MGMT_STATUS_NOT_POWERED,
  1020. };
  1021. static const struct generic_data set_discoverable_on_not_powered_test_2 = {
  1022. .setup_settings = settings_connectable,
  1023. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1024. .send_param = set_discoverable_timeout_param,
  1025. .send_len = sizeof(set_discoverable_timeout_param),
  1026. .expect_status = MGMT_STATUS_NOT_POWERED,
  1027. };
  1028. static const struct generic_data set_discoverable_on_rejected_test_1 = {
  1029. .setup_settings = settings_powered,
  1030. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1031. .send_param = set_discoverable_on_param,
  1032. .send_len = sizeof(set_discoverable_on_param),
  1033. .expect_status = MGMT_STATUS_REJECTED,
  1034. };
  1035. static const struct generic_data set_discoverable_on_rejected_test_2 = {
  1036. .setup_settings = settings_powered,
  1037. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1038. .send_param = set_discoverable_on_param,
  1039. .send_len = sizeof(set_discoverable_on_param),
  1040. .expect_status = MGMT_STATUS_REJECTED,
  1041. };
  1042. static const struct generic_data set_discoverable_on_rejected_test_3 = {
  1043. .setup_settings = settings_powered,
  1044. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1045. .send_param = set_discoverable_timeout_param,
  1046. .send_len = sizeof(set_discoverable_timeout_param),
  1047. .expect_status = MGMT_STATUS_REJECTED,
  1048. };
  1049. static const struct generic_data set_discoverable_on_success_test_1 = {
  1050. .setup_settings = settings_connectable,
  1051. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1052. .send_param = set_discoverable_on_param,
  1053. .send_len = sizeof(set_discoverable_on_param),
  1054. .expect_status = MGMT_STATUS_SUCCESS,
  1055. .expect_param = set_discoverable_on_settings_param_1,
  1056. .expect_len = sizeof(set_discoverable_on_settings_param_1),
  1057. .expect_settings_set = MGMT_SETTING_DISCOVERABLE,
  1058. };
  1059. static const struct generic_data set_discoverable_on_success_test_2 = {
  1060. .setup_settings = settings_powered_connectable,
  1061. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1062. .send_param = set_discoverable_on_param,
  1063. .send_len = sizeof(set_discoverable_on_param),
  1064. .expect_status = MGMT_STATUS_SUCCESS,
  1065. .expect_param = set_discoverable_on_settings_param_2,
  1066. .expect_len = sizeof(set_discoverable_on_settings_param_2),
  1067. .expect_settings_set = MGMT_SETTING_DISCOVERABLE,
  1068. .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE,
  1069. .expect_hci_param = set_discoverable_on_scan_enable_param,
  1070. .expect_hci_len = sizeof(set_discoverable_on_scan_enable_param),
  1071. };
  1072. static uint8_t set_discov_on_le_param[] = { 0x0b, 0x06, 0x00, 0x00 };
  1073. static uint8_t set_discov_adv_data[32] = { 0x06, 0x02, 0x01, 0x06,
  1074. 0x02, 0x0a, };
  1075. static const struct generic_data set_discov_on_le_success_1 = {
  1076. .setup_settings = settings_powered_le_connectable_advertising,
  1077. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1078. .send_param = set_discoverable_on_param,
  1079. .send_len = sizeof(set_discoverable_on_param),
  1080. .expect_status = MGMT_STATUS_SUCCESS,
  1081. .expect_param = set_discov_on_le_param,
  1082. .expect_len = sizeof(set_discov_on_le_param),
  1083. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  1084. .expect_hci_param = set_discov_adv_data,
  1085. .expect_hci_len = sizeof(set_discov_adv_data),
  1086. };
  1087. static const struct generic_data set_discoverable_off_success_test_1 = {
  1088. .setup_settings = settings_connectable,
  1089. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1090. .send_param = set_discoverable_off_param,
  1091. .send_len = sizeof(set_discoverable_off_param),
  1092. .expect_status = MGMT_STATUS_SUCCESS,
  1093. .expect_param = set_discoverable_off_settings_param_1,
  1094. .expect_len = sizeof(set_discoverable_off_settings_param_1),
  1095. };
  1096. static const struct generic_data set_discoverable_off_success_test_2 = {
  1097. .setup_settings = settings_powered_discoverable,
  1098. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1099. .send_param = set_discoverable_off_param,
  1100. .send_len = sizeof(set_discoverable_off_param),
  1101. .expect_status = MGMT_STATUS_SUCCESS,
  1102. .expect_param = set_discoverable_off_settings_param_2,
  1103. .expect_len = sizeof(set_discoverable_off_settings_param_2),
  1104. .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE,
  1105. .expect_hci_param = set_discoverable_off_scan_enable_param,
  1106. .expect_hci_len = sizeof(set_discoverable_off_scan_enable_param),
  1107. };
  1108. static const uint8_t set_limited_discov_on_param[] = { 0x02, 0x01, 0x00 };
  1109. static const struct generic_data set_limited_discov_on_success_1 = {
  1110. .setup_settings = settings_powered_connectable,
  1111. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1112. .send_param = set_limited_discov_on_param,
  1113. .send_len = sizeof(set_limited_discov_on_param),
  1114. .expect_status = MGMT_STATUS_SUCCESS,
  1115. .expect_param = set_discoverable_on_settings_param_2,
  1116. .expect_len = sizeof(set_discoverable_on_settings_param_2),
  1117. .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE,
  1118. .expect_hci_param = set_discoverable_on_scan_enable_param,
  1119. .expect_hci_len = sizeof(set_discoverable_on_scan_enable_param),
  1120. };
  1121. static uint8_t write_current_iac_lap_limited[] = { 0x01, 0x00, 0x8b, 0x9e };
  1122. static const struct generic_data set_limited_discov_on_success_2 = {
  1123. .setup_settings = settings_powered_connectable,
  1124. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1125. .send_param = set_limited_discov_on_param,
  1126. .send_len = sizeof(set_limited_discov_on_param),
  1127. .expect_status = MGMT_STATUS_SUCCESS,
  1128. .expect_param = set_discoverable_on_settings_param_2,
  1129. .expect_len = sizeof(set_discoverable_on_settings_param_2),
  1130. .expect_hci_command = BT_HCI_CMD_WRITE_CURRENT_IAC_LAP,
  1131. .expect_hci_param = write_current_iac_lap_limited,
  1132. .expect_hci_len = sizeof(write_current_iac_lap_limited),
  1133. };
  1134. static uint8_t write_cod_limited[] = { 0x00, 0x20, 0x00 };
  1135. static const struct generic_data set_limited_discov_on_success_3 = {
  1136. .setup_settings = settings_powered_connectable,
  1137. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1138. .send_param = set_limited_discov_on_param,
  1139. .send_len = sizeof(set_limited_discov_on_param),
  1140. .expect_status = MGMT_STATUS_SUCCESS,
  1141. .expect_param = set_discoverable_on_settings_param_2,
  1142. .expect_len = sizeof(set_discoverable_on_settings_param_2),
  1143. .expect_hci_command = BT_HCI_CMD_WRITE_CLASS_OF_DEV,
  1144. .expect_hci_param = write_cod_limited,
  1145. .expect_hci_len = sizeof(write_cod_limited),
  1146. };
  1147. static uint8_t set_limited_discov_adv_data[32] = { 0x06, 0x02, 0x01, 0x05,
  1148. 0x02, 0x0a, };
  1149. static const struct generic_data set_limited_discov_on_le_success_1 = {
  1150. .setup_settings = settings_powered_le_connectable_advertising,
  1151. .send_opcode = MGMT_OP_SET_DISCOVERABLE,
  1152. .send_param = set_limited_discov_on_param,
  1153. .send_len = sizeof(set_limited_discov_on_param),
  1154. .expect_status = MGMT_STATUS_SUCCESS,
  1155. .expect_param = set_discov_on_le_param,
  1156. .expect_len = sizeof(set_discov_on_le_param),
  1157. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  1158. .expect_hci_param = set_limited_discov_adv_data,
  1159. .expect_hci_len = sizeof(set_limited_discov_adv_data),
  1160. };
  1161. static uint16_t settings_link_sec[] = { MGMT_OP_SET_LINK_SECURITY, 0 };
  1162. static const char set_link_sec_on_param[] = { 0x01 };
  1163. static const char set_link_sec_invalid_param[] = { 0x02 };
  1164. static const char set_link_sec_garbage_param[] = { 0x01, 0x00 };
  1165. static const char set_link_sec_settings_param_1[] = { 0xa0, 0x00, 0x00, 0x00 };
  1166. static const char set_link_sec_settings_param_2[] = { 0xa1, 0x00, 0x00, 0x00 };
  1167. static const char set_link_sec_auth_enable_param[] = { 0x01 };
  1168. static const struct generic_data set_link_sec_on_success_test_1 = {
  1169. .send_opcode = MGMT_OP_SET_LINK_SECURITY,
  1170. .send_param = set_link_sec_on_param,
  1171. .send_len = sizeof(set_link_sec_on_param),
  1172. .expect_status = MGMT_STATUS_SUCCESS,
  1173. .expect_param = set_link_sec_settings_param_1,
  1174. .expect_len = sizeof(set_link_sec_settings_param_1),
  1175. .expect_settings_set = MGMT_SETTING_LINK_SECURITY,
  1176. };
  1177. static const struct generic_data set_link_sec_on_success_test_2 = {
  1178. .setup_settings = settings_powered,
  1179. .send_opcode = MGMT_OP_SET_LINK_SECURITY,
  1180. .send_param = set_link_sec_on_param,
  1181. .send_len = sizeof(set_link_sec_on_param),
  1182. .expect_status = MGMT_STATUS_SUCCESS,
  1183. .expect_param = set_link_sec_settings_param_2,
  1184. .expect_len = sizeof(set_link_sec_settings_param_2),
  1185. .expect_settings_set = MGMT_SETTING_LINK_SECURITY,
  1186. .expect_hci_command = BT_HCI_CMD_WRITE_AUTH_ENABLE,
  1187. .expect_hci_param = set_link_sec_auth_enable_param,
  1188. .expect_hci_len = sizeof(set_link_sec_auth_enable_param),
  1189. };
  1190. static const struct generic_data set_link_sec_on_success_test_3 = {
  1191. .setup_settings = settings_link_sec,
  1192. .send_opcode = MGMT_OP_SET_POWERED,
  1193. .send_param = set_powered_on_param,
  1194. .send_len = sizeof(set_powered_on_param),
  1195. .expect_status = MGMT_STATUS_SUCCESS,
  1196. .expect_param = set_link_sec_settings_param_2,
  1197. .expect_len = sizeof(set_link_sec_settings_param_2),
  1198. .expect_settings_set = MGMT_SETTING_LINK_SECURITY,
  1199. .expect_hci_command = BT_HCI_CMD_WRITE_AUTH_ENABLE,
  1200. .expect_hci_param = set_link_sec_auth_enable_param,
  1201. .expect_hci_len = sizeof(set_link_sec_auth_enable_param),
  1202. };
  1203. static const struct generic_data set_link_sec_on_invalid_param_test_1 = {
  1204. .send_opcode = MGMT_OP_SET_LINK_SECURITY,
  1205. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1206. };
  1207. static const struct generic_data set_link_sec_on_invalid_param_test_2 = {
  1208. .send_opcode = MGMT_OP_SET_LINK_SECURITY,
  1209. .send_param = set_link_sec_invalid_param,
  1210. .send_len = sizeof(set_link_sec_invalid_param),
  1211. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1212. };
  1213. static const struct generic_data set_link_sec_on_invalid_param_test_3 = {
  1214. .send_opcode = MGMT_OP_SET_LINK_SECURITY,
  1215. .send_param = set_link_sec_garbage_param,
  1216. .send_len = sizeof(set_link_sec_garbage_param),
  1217. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1218. };
  1219. static const struct generic_data set_link_sec_on_invalid_index_test = {
  1220. .send_index_none = true,
  1221. .send_opcode = MGMT_OP_SET_LINK_SECURITY,
  1222. .send_param = set_link_sec_on_param,
  1223. .send_len = sizeof(set_link_sec_on_param),
  1224. .expect_status = MGMT_STATUS_INVALID_INDEX,
  1225. };
  1226. static const uint16_t settings_powered_link_sec[] = {
  1227. MGMT_OP_SET_LINK_SECURITY,
  1228. MGMT_OP_SET_POWERED, 0 };
  1229. static const char set_link_sec_off_param[] = { 0x00 };
  1230. static const char set_link_sec_off_settings_1[] = { 0x80, 0x00, 0x00, 0x00 };
  1231. static const char set_link_sec_off_settings_2[] = { 0x81, 0x00, 0x00, 0x00 };
  1232. static const char set_link_sec_off_auth_enable_param[] = { 0x00 };
  1233. static const struct generic_data set_link_sec_off_success_test_1 = {
  1234. .setup_settings = settings_link_sec,
  1235. .send_opcode = MGMT_OP_SET_LINK_SECURITY,
  1236. .send_param = set_link_sec_off_param,
  1237. .send_len = sizeof(set_link_sec_off_param),
  1238. .expect_status = MGMT_STATUS_SUCCESS,
  1239. .expect_param = set_link_sec_off_settings_1,
  1240. .expect_len = sizeof(set_link_sec_off_settings_1),
  1241. .expect_settings_unset = MGMT_SETTING_LINK_SECURITY,
  1242. };
  1243. static const struct generic_data set_link_sec_off_success_test_2 = {
  1244. .setup_settings = settings_powered_link_sec,
  1245. .send_opcode = MGMT_OP_SET_LINK_SECURITY,
  1246. .send_param = set_link_sec_off_param,
  1247. .send_len = sizeof(set_link_sec_off_param),
  1248. .expect_status = MGMT_STATUS_SUCCESS,
  1249. .expect_param = set_link_sec_off_settings_2,
  1250. .expect_len = sizeof(set_link_sec_off_settings_2),
  1251. .expect_settings_unset = MGMT_SETTING_LINK_SECURITY,
  1252. .expect_hci_command = BT_HCI_CMD_WRITE_AUTH_ENABLE,
  1253. .expect_hci_param = set_link_sec_off_auth_enable_param,
  1254. .expect_hci_len = sizeof(set_link_sec_off_auth_enable_param),
  1255. };
  1256. static uint16_t settings_ssp[] = { MGMT_OP_SET_SSP, 0 };
  1257. static const char set_ssp_on_param[] = { 0x01 };
  1258. static const char set_ssp_invalid_param[] = { 0x02 };
  1259. static const char set_ssp_garbage_param[] = { 0x01, 0x00 };
  1260. static const char set_ssp_settings_param_1[] = { 0xc0, 0x00, 0x00, 0x00 };
  1261. static const char set_ssp_settings_param_2[] = { 0xc1, 0x00, 0x00, 0x00 };
  1262. static const char set_ssp_on_write_ssp_mode_param[] = { 0x01 };
  1263. static const struct generic_data set_ssp_on_success_test_1 = {
  1264. .send_opcode = MGMT_OP_SET_SSP,
  1265. .send_param = set_ssp_on_param,
  1266. .send_len = sizeof(set_ssp_on_param),
  1267. .expect_status = MGMT_STATUS_SUCCESS,
  1268. .expect_param = set_ssp_settings_param_1,
  1269. .expect_len = sizeof(set_ssp_settings_param_1),
  1270. .expect_settings_set = MGMT_SETTING_SSP,
  1271. };
  1272. static const struct generic_data set_ssp_on_success_test_2 = {
  1273. .setup_settings = settings_powered,
  1274. .send_opcode = MGMT_OP_SET_SSP,
  1275. .send_param = set_ssp_on_param,
  1276. .send_len = sizeof(set_ssp_on_param),
  1277. .expect_status = MGMT_STATUS_SUCCESS,
  1278. .expect_param = set_ssp_settings_param_2,
  1279. .expect_len = sizeof(set_ssp_settings_param_2),
  1280. .expect_settings_set = MGMT_SETTING_SSP,
  1281. .expect_hci_command = BT_HCI_CMD_WRITE_SIMPLE_PAIRING_MODE,
  1282. .expect_hci_param = set_ssp_on_write_ssp_mode_param,
  1283. .expect_hci_len = sizeof(set_ssp_on_write_ssp_mode_param),
  1284. };
  1285. static const struct generic_data set_ssp_on_success_test_3 = {
  1286. .setup_settings = settings_ssp,
  1287. .send_opcode = MGMT_OP_SET_POWERED,
  1288. .send_param = set_powered_on_param,
  1289. .send_len = sizeof(set_powered_on_param),
  1290. .expect_status = MGMT_STATUS_SUCCESS,
  1291. .expect_param = set_ssp_settings_param_2,
  1292. .expect_len = sizeof(set_ssp_settings_param_2),
  1293. .expect_settings_set = MGMT_SETTING_SSP,
  1294. .expect_hci_command = BT_HCI_CMD_WRITE_SIMPLE_PAIRING_MODE,
  1295. .expect_hci_param = set_ssp_on_write_ssp_mode_param,
  1296. .expect_hci_len = sizeof(set_ssp_on_write_ssp_mode_param),
  1297. };
  1298. static const struct generic_data set_ssp_on_invalid_param_test_1 = {
  1299. .send_opcode = MGMT_OP_SET_SSP,
  1300. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1301. };
  1302. static const struct generic_data set_ssp_on_invalid_param_test_2 = {
  1303. .send_opcode = MGMT_OP_SET_SSP,
  1304. .send_param = set_ssp_invalid_param,
  1305. .send_len = sizeof(set_ssp_invalid_param),
  1306. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1307. };
  1308. static const struct generic_data set_ssp_on_invalid_param_test_3 = {
  1309. .send_opcode = MGMT_OP_SET_SSP,
  1310. .send_param = set_ssp_garbage_param,
  1311. .send_len = sizeof(set_ssp_garbage_param),
  1312. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1313. };
  1314. static const struct generic_data set_ssp_on_invalid_index_test = {
  1315. .send_index_none = true,
  1316. .send_opcode = MGMT_OP_SET_SSP,
  1317. .send_param = set_ssp_on_param,
  1318. .send_len = sizeof(set_ssp_on_param),
  1319. .expect_status = MGMT_STATUS_INVALID_INDEX,
  1320. };
  1321. static uint16_t settings_powered_ssp[] = { MGMT_OP_SET_SSP,
  1322. MGMT_OP_SET_POWERED, 0 };
  1323. static uint16_t settings_powered_sc[] = { MGMT_OP_SET_SSP,
  1324. MGMT_OP_SET_SECURE_CONN,
  1325. MGMT_OP_SET_POWERED, 0 };
  1326. static const char set_sc_on_param[] = { 0x01 };
  1327. static const char set_sc_only_on_param[] = { 0x02 };
  1328. static const char set_sc_invalid_param[] = { 0x03 };
  1329. static const char set_sc_garbage_param[] = { 0x01, 0x00 };
  1330. static const char set_sc_settings_param_1[] = { 0xc0, 0x08, 0x00, 0x00 };
  1331. static const char set_sc_settings_param_2[] = { 0xc1, 0x08, 0x00, 0x00 };
  1332. static const char set_sc_on_write_sc_support_param[] = { 0x01 };
  1333. static const struct generic_data set_sc_on_success_test_1 = {
  1334. .setup_settings = settings_ssp,
  1335. .send_opcode = MGMT_OP_SET_SECURE_CONN,
  1336. .send_param = set_sc_on_param,
  1337. .send_len = sizeof(set_sc_on_param),
  1338. .expect_status = MGMT_STATUS_SUCCESS,
  1339. .expect_param = set_sc_settings_param_1,
  1340. .expect_len = sizeof(set_sc_settings_param_1),
  1341. .expect_settings_set = MGMT_SETTING_SECURE_CONN,
  1342. };
  1343. static const struct generic_data set_sc_on_success_test_2 = {
  1344. .setup_settings = settings_powered_ssp,
  1345. .send_opcode = MGMT_OP_SET_SECURE_CONN,
  1346. .send_param = set_sc_on_param,
  1347. .send_len = sizeof(set_sc_on_param),
  1348. .expect_status = MGMT_STATUS_SUCCESS,
  1349. .expect_param = set_sc_settings_param_2,
  1350. .expect_len = sizeof(set_sc_settings_param_2),
  1351. .expect_settings_set = MGMT_SETTING_SECURE_CONN,
  1352. .expect_hci_command = BT_HCI_CMD_WRITE_SECURE_CONN_SUPPORT,
  1353. .expect_hci_param = set_sc_on_write_sc_support_param,
  1354. .expect_hci_len = sizeof(set_sc_on_write_sc_support_param),
  1355. };
  1356. static const struct generic_data set_sc_on_invalid_param_test_1 = {
  1357. .setup_settings = settings_ssp,
  1358. .send_opcode = MGMT_OP_SET_SECURE_CONN,
  1359. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1360. };
  1361. static const struct generic_data set_sc_on_invalid_param_test_2 = {
  1362. .setup_settings = settings_ssp,
  1363. .send_opcode = MGMT_OP_SET_SECURE_CONN,
  1364. .send_param = set_sc_invalid_param,
  1365. .send_len = sizeof(set_sc_invalid_param),
  1366. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1367. };
  1368. static const struct generic_data set_sc_on_invalid_param_test_3 = {
  1369. .setup_settings = settings_ssp,
  1370. .send_opcode = MGMT_OP_SET_SECURE_CONN,
  1371. .send_param = set_sc_garbage_param,
  1372. .send_len = sizeof(set_sc_garbage_param),
  1373. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1374. };
  1375. static const struct generic_data set_sc_on_invalid_index_test = {
  1376. .setup_settings = settings_ssp,
  1377. .send_index_none = true,
  1378. .send_opcode = MGMT_OP_SET_SECURE_CONN,
  1379. .send_param = set_sc_on_param,
  1380. .send_len = sizeof(set_sc_on_param),
  1381. .expect_status = MGMT_STATUS_INVALID_INDEX,
  1382. };
  1383. static const struct generic_data set_sc_on_not_supported_test_1 = {
  1384. .setup_settings = settings_ssp,
  1385. .send_opcode = MGMT_OP_SET_SECURE_CONN,
  1386. .send_param = set_sc_on_param,
  1387. .send_len = sizeof(set_sc_on_param),
  1388. .expect_status = MGMT_STATUS_NOT_SUPPORTED,
  1389. };
  1390. static const struct generic_data set_sc_on_not_supported_test_2 = {
  1391. .setup_settings = settings_powered_ssp,
  1392. .send_opcode = MGMT_OP_SET_SECURE_CONN,
  1393. .send_param = set_sc_on_param,
  1394. .send_len = sizeof(set_sc_on_param),
  1395. .expect_status = MGMT_STATUS_NOT_SUPPORTED,
  1396. };
  1397. static const struct generic_data set_sc_only_on_success_test_1 = {
  1398. .setup_settings = settings_ssp,
  1399. .send_opcode = MGMT_OP_SET_SECURE_CONN,
  1400. .send_param = set_sc_only_on_param,
  1401. .send_len = sizeof(set_sc_only_on_param),
  1402. .expect_status = MGMT_STATUS_SUCCESS,
  1403. .expect_param = set_sc_settings_param_1,
  1404. .expect_len = sizeof(set_sc_settings_param_1),
  1405. .expect_settings_set = MGMT_SETTING_SECURE_CONN,
  1406. };
  1407. static const struct generic_data set_sc_only_on_success_test_2 = {
  1408. .setup_settings = settings_powered_ssp,
  1409. .send_opcode = MGMT_OP_SET_SECURE_CONN,
  1410. .send_param = set_sc_only_on_param,
  1411. .send_len = sizeof(set_sc_only_on_param),
  1412. .expect_status = MGMT_STATUS_SUCCESS,
  1413. .expect_param = set_sc_settings_param_2,
  1414. .expect_len = sizeof(set_sc_settings_param_2),
  1415. .expect_settings_set = MGMT_SETTING_SECURE_CONN,
  1416. .expect_hci_command = BT_HCI_CMD_WRITE_SECURE_CONN_SUPPORT,
  1417. .expect_hci_param = set_sc_on_write_sc_support_param,
  1418. .expect_hci_len = sizeof(set_sc_on_write_sc_support_param),
  1419. };
  1420. static const char set_hs_on_param[] = { 0x01 };
  1421. static const char set_hs_invalid_param[] = { 0x02 };
  1422. static const char set_hs_garbage_param[] = { 0x01, 0x00 };
  1423. static const char set_hs_settings_param_1[] = { 0xc0, 0x01, 0x00, 0x00 };
  1424. static const struct generic_data set_hs_on_success_test = {
  1425. .setup_settings = settings_ssp,
  1426. .send_opcode = MGMT_OP_SET_HS,
  1427. .send_param = set_hs_on_param,
  1428. .send_len = sizeof(set_hs_on_param),
  1429. .expect_status = MGMT_STATUS_SUCCESS,
  1430. .expect_param = set_hs_settings_param_1,
  1431. .expect_len = sizeof(set_hs_settings_param_1),
  1432. .expect_settings_set = MGMT_SETTING_HS,
  1433. };
  1434. static const struct generic_data set_hs_on_invalid_param_test_1 = {
  1435. .setup_settings = settings_ssp,
  1436. .send_opcode = MGMT_OP_SET_HS,
  1437. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1438. };
  1439. static const struct generic_data set_hs_on_invalid_param_test_2 = {
  1440. .setup_settings = settings_ssp,
  1441. .send_opcode = MGMT_OP_SET_HS,
  1442. .send_param = set_hs_invalid_param,
  1443. .send_len = sizeof(set_hs_invalid_param),
  1444. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1445. };
  1446. static const struct generic_data set_hs_on_invalid_param_test_3 = {
  1447. .setup_settings = settings_ssp,
  1448. .send_opcode = MGMT_OP_SET_HS,
  1449. .send_param = set_hs_garbage_param,
  1450. .send_len = sizeof(set_hs_garbage_param),
  1451. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1452. };
  1453. static const struct generic_data set_hs_on_invalid_index_test = {
  1454. .setup_settings = settings_ssp,
  1455. .send_index_none = true,
  1456. .send_opcode = MGMT_OP_SET_HS,
  1457. .send_param = set_hs_on_param,
  1458. .send_len = sizeof(set_hs_on_param),
  1459. .expect_status = MGMT_STATUS_INVALID_INDEX,
  1460. };
  1461. static uint16_t settings_le[] = { MGMT_OP_SET_LE, 0 };
  1462. static const char set_le_on_param[] = { 0x01 };
  1463. static const char set_le_off_param[] = { 0x00 };
  1464. static const char set_le_invalid_param[] = { 0x02 };
  1465. static const char set_le_garbage_param[] = { 0x01, 0x00 };
  1466. static const char set_le_settings_param_1[] = { 0x80, 0x02, 0x00, 0x00 };
  1467. static const char set_le_settings_param_2[] = { 0x81, 0x02, 0x00, 0x00 };
  1468. static const char set_le_on_write_le_host_param[] = { 0x01, 0x00 };
  1469. static const struct generic_data set_le_on_success_test_1 = {
  1470. .send_opcode = MGMT_OP_SET_LE,
  1471. .send_param = set_le_on_param,
  1472. .send_len = sizeof(set_le_on_param),
  1473. .expect_status = MGMT_STATUS_SUCCESS,
  1474. .expect_param = set_le_settings_param_1,
  1475. .expect_len = sizeof(set_le_settings_param_1),
  1476. .expect_settings_set = MGMT_SETTING_LE,
  1477. };
  1478. static const struct generic_data set_le_on_success_test_2 = {
  1479. .setup_settings = settings_powered,
  1480. .send_opcode = MGMT_OP_SET_LE,
  1481. .send_param = set_le_on_param,
  1482. .send_len = sizeof(set_le_on_param),
  1483. .expect_status = MGMT_STATUS_SUCCESS,
  1484. .expect_param = set_le_settings_param_2,
  1485. .expect_len = sizeof(set_le_settings_param_2),
  1486. .expect_settings_set = MGMT_SETTING_LE,
  1487. .expect_hci_command = BT_HCI_CMD_WRITE_LE_HOST_SUPPORTED,
  1488. .expect_hci_param = set_le_on_write_le_host_param,
  1489. .expect_hci_len = sizeof(set_le_on_write_le_host_param),
  1490. };
  1491. static const struct generic_data set_le_on_success_test_3 = {
  1492. .setup_settings = settings_le,
  1493. .send_opcode = MGMT_OP_SET_POWERED,
  1494. .send_param = set_powered_on_param,
  1495. .send_len = sizeof(set_powered_on_param),
  1496. .expect_status = MGMT_STATUS_SUCCESS,
  1497. .expect_param = set_le_settings_param_2,
  1498. .expect_len = sizeof(set_le_settings_param_2),
  1499. .expect_settings_set = MGMT_SETTING_LE,
  1500. .expect_hci_command = BT_HCI_CMD_WRITE_LE_HOST_SUPPORTED,
  1501. .expect_hci_param = set_le_on_write_le_host_param,
  1502. .expect_hci_len = sizeof(set_le_on_write_le_host_param),
  1503. };
  1504. static const struct generic_data set_le_on_invalid_param_test_1 = {
  1505. .send_opcode = MGMT_OP_SET_LE,
  1506. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1507. };
  1508. static const struct generic_data set_le_on_invalid_param_test_2 = {
  1509. .send_opcode = MGMT_OP_SET_LE,
  1510. .send_param = set_le_invalid_param,
  1511. .send_len = sizeof(set_le_invalid_param),
  1512. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1513. };
  1514. static const struct generic_data set_le_on_invalid_param_test_3 = {
  1515. .send_opcode = MGMT_OP_SET_LE,
  1516. .send_param = set_le_garbage_param,
  1517. .send_len = sizeof(set_le_garbage_param),
  1518. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1519. };
  1520. static const struct generic_data set_le_on_invalid_index_test = {
  1521. .send_index_none = true,
  1522. .send_opcode = MGMT_OP_SET_LE,
  1523. .send_param = set_le_on_param,
  1524. .send_len = sizeof(set_le_on_param),
  1525. .expect_status = MGMT_STATUS_INVALID_INDEX,
  1526. };
  1527. static uint16_t settings_powered_le[] = { MGMT_OP_SET_LE,
  1528. MGMT_OP_SET_POWERED, 0 };
  1529. static const char set_adv_on_param[] = { 0x01 };
  1530. static const char set_adv_settings_param_1[] = { 0x80, 0x06, 0x00, 0x00 };
  1531. static const char set_adv_settings_param_2[] = { 0x81, 0x06, 0x00, 0x00 };
  1532. static const char set_adv_on_set_adv_enable_param[] = { 0x01 };
  1533. static const char set_adv_on_set_adv_disable_param[] = { 0x00 };
  1534. static const struct generic_data set_adv_on_success_test_1 = {
  1535. .setup_settings = settings_le,
  1536. .send_opcode = MGMT_OP_SET_ADVERTISING,
  1537. .send_param = set_adv_on_param,
  1538. .send_len = sizeof(set_adv_on_param),
  1539. .expect_status = MGMT_STATUS_SUCCESS,
  1540. .expect_param = set_adv_settings_param_1,
  1541. .expect_len = sizeof(set_adv_settings_param_1),
  1542. .expect_settings_set = MGMT_SETTING_ADVERTISING,
  1543. };
  1544. static const struct generic_data set_adv_on_success_test_2 = {
  1545. .setup_settings = settings_powered_le,
  1546. .send_opcode = MGMT_OP_SET_ADVERTISING,
  1547. .send_param = set_adv_on_param,
  1548. .send_len = sizeof(set_adv_on_param),
  1549. .expect_status = MGMT_STATUS_SUCCESS,
  1550. .expect_param = set_adv_settings_param_2,
  1551. .expect_len = sizeof(set_adv_settings_param_2),
  1552. .expect_settings_set = MGMT_SETTING_ADVERTISING,
  1553. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_ENABLE,
  1554. .expect_hci_param = set_adv_on_set_adv_enable_param,
  1555. .expect_hci_len = sizeof(set_adv_on_set_adv_enable_param),
  1556. };
  1557. static const struct generic_data set_adv_on_rejected_test_1 = {
  1558. .setup_settings = settings_powered,
  1559. .send_opcode = MGMT_OP_SET_ADVERTISING,
  1560. .send_param = set_adv_on_param,
  1561. .send_len = sizeof(set_adv_on_param),
  1562. .expect_status = MGMT_STATUS_REJECTED,
  1563. };
  1564. static const uint8_t set_adv_set_appearance_param[2] = { 0x54, 0x65 };
  1565. static const uint8_t set_adv_scan_rsp_data_appear_1[] = {
  1566. 0x04, /* Scan rsp data len */
  1567. 0x03, /* Local name data len */
  1568. 0x19, /* Complete name */
  1569. 0x54, 0x65,
  1570. /* padding */
  1571. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1572. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1573. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1574. };
  1575. static const struct generic_data set_adv_on_appearance_test_1 = {
  1576. .setup_settings = settings_powered_le,
  1577. .setup_send_opcode = MGMT_OP_SET_APPEARANCE,
  1578. .setup_send_param = set_adv_set_appearance_param,
  1579. .setup_send_len = sizeof(set_adv_set_appearance_param),
  1580. .send_opcode = MGMT_OP_SET_ADVERTISING,
  1581. .send_param = set_adv_on_param,
  1582. .expect_param = set_adv_settings_param_2,
  1583. .expect_len = sizeof(set_adv_settings_param_2),
  1584. .send_len = sizeof(set_adv_on_param),
  1585. .expect_status = MGMT_STATUS_SUCCESS,
  1586. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_RSP_DATA,
  1587. .expect_hci_param = set_adv_scan_rsp_data_appear_1,
  1588. .expect_hci_len = sizeof(set_adv_scan_rsp_data_appear_1),
  1589. };
  1590. static const char set_adv_set_local_name_param[260] = { 'T', 'e', 's', 't', ' ',
  1591. 'n', 'a', 'm', 'e' };
  1592. static const uint8_t set_adv_scan_rsp_data_name_1[] = {
  1593. 0x0c, /* Scan rsp data len */
  1594. 0x0b, /* Local name data len */
  1595. 0x09, /* Complete name */
  1596. 0x54, 0x65, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, /* "Test name" */
  1597. 0x00, /* null */
  1598. /* padding */
  1599. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1600. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1601. };
  1602. static const struct generic_data set_adv_on_local_name_test_1 = {
  1603. .setup_settings = settings_powered_le,
  1604. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  1605. .setup_send_param = set_adv_set_local_name_param,
  1606. .setup_send_len = sizeof(set_adv_set_local_name_param),
  1607. .send_opcode = MGMT_OP_SET_ADVERTISING,
  1608. .send_param = set_adv_on_param,
  1609. .expect_param = set_adv_settings_param_2,
  1610. .expect_len = sizeof(set_adv_settings_param_2),
  1611. .send_len = sizeof(set_adv_on_param),
  1612. .expect_status = MGMT_STATUS_SUCCESS,
  1613. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_RSP_DATA,
  1614. .expect_hci_param = set_adv_scan_rsp_data_name_1,
  1615. .expect_hci_len = sizeof(set_adv_scan_rsp_data_name_1),
  1616. };
  1617. static const struct setup_mgmt_cmd set_advertising_mgmt_cmd_arr[] = {
  1618. {
  1619. .send_opcode = MGMT_OP_SET_APPEARANCE,
  1620. .send_param = set_adv_set_appearance_param,
  1621. .send_len = sizeof(set_adv_set_appearance_param),
  1622. },
  1623. {
  1624. .send_opcode = MGMT_OP_SET_LOCAL_NAME,
  1625. .send_param = set_adv_set_local_name_param,
  1626. .send_len = sizeof(set_adv_set_local_name_param),
  1627. },
  1628. { /* last element should always have opcode 0x00 */
  1629. .send_opcode = 0x00,
  1630. .send_param = NULL,
  1631. .send_len = 0,
  1632. }
  1633. };
  1634. static const uint8_t set_adv_scan_rsp_data_name_and_appearance[] = {
  1635. 0x10, /* scan rsp data len */
  1636. 0x03, /* appearance data len */
  1637. 0x19, /* eir_appearance */
  1638. 0x54, 0x65, /* appearance value */
  1639. 0x0b, /* local name data len */
  1640. 0x09, /* complete name */
  1641. 0x54, 0x65, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, /* "test name" */
  1642. 0x00, /* null */
  1643. /* padding */
  1644. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1645. 0x00, 0x00, 0x00, 0x00, 0x00,
  1646. };
  1647. static const struct generic_data set_adv_on_local_name_appear_test_1 = {
  1648. .setup_settings = settings_powered_le,
  1649. .setup_mgmt_cmd_arr = set_advertising_mgmt_cmd_arr,
  1650. .send_opcode = MGMT_OP_SET_ADVERTISING,
  1651. .send_param = set_adv_on_param,
  1652. .expect_param = set_adv_settings_param_2,
  1653. .expect_len = sizeof(set_adv_settings_param_2),
  1654. .send_len = sizeof(set_adv_on_param),
  1655. .expect_status = MGMT_STATUS_SUCCESS,
  1656. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_RSP_DATA,
  1657. .expect_hci_param = set_adv_scan_rsp_data_name_and_appearance,
  1658. .expect_hci_len = sizeof(set_adv_scan_rsp_data_name_and_appearance),
  1659. };
  1660. static const char set_bredr_off_param[] = { 0x00 };
  1661. static const char set_bredr_on_param[] = { 0x01 };
  1662. static const char set_bredr_invalid_param[] = { 0x02 };
  1663. static const char set_bredr_settings_param_1[] = { 0x00, 0x02, 0x00, 0x00 };
  1664. static const char set_bredr_settings_param_2[] = { 0x80, 0x02, 0x00, 0x00 };
  1665. static const char set_bredr_settings_param_3[] = { 0x81, 0x02, 0x00, 0x00 };
  1666. static const struct generic_data set_bredr_off_success_test_1 = {
  1667. .setup_settings = settings_le,
  1668. .send_opcode = MGMT_OP_SET_BREDR,
  1669. .send_param = set_bredr_off_param,
  1670. .send_len = sizeof(set_bredr_off_param),
  1671. .expect_status = MGMT_STATUS_SUCCESS,
  1672. .expect_param = set_bredr_settings_param_1,
  1673. .expect_len = sizeof(set_bredr_settings_param_1),
  1674. .expect_settings_unset = MGMT_SETTING_BREDR,
  1675. };
  1676. static const struct generic_data set_bredr_on_success_test_1 = {
  1677. .setup_settings = settings_le,
  1678. .setup_nobredr = true,
  1679. .send_opcode = MGMT_OP_SET_BREDR,
  1680. .send_param = set_bredr_on_param,
  1681. .send_len = sizeof(set_bredr_on_param),
  1682. .expect_status = MGMT_STATUS_SUCCESS,
  1683. .expect_param = set_bredr_settings_param_2,
  1684. .expect_len = sizeof(set_bredr_settings_param_2),
  1685. .expect_settings_set = MGMT_SETTING_BREDR,
  1686. };
  1687. static const struct generic_data set_bredr_on_success_test_2 = {
  1688. .setup_settings = settings_powered_le,
  1689. .setup_nobredr = true,
  1690. .send_opcode = MGMT_OP_SET_BREDR,
  1691. .send_param = set_bredr_on_param,
  1692. .send_len = sizeof(set_bredr_on_param),
  1693. .expect_status = MGMT_STATUS_SUCCESS,
  1694. .expect_param = set_bredr_settings_param_3,
  1695. .expect_len = sizeof(set_bredr_settings_param_3),
  1696. .expect_settings_set = MGMT_SETTING_BREDR,
  1697. };
  1698. static const struct generic_data set_bredr_off_notsupp_test = {
  1699. .send_opcode = MGMT_OP_SET_BREDR,
  1700. .send_param = set_bredr_off_param,
  1701. .send_len = sizeof(set_bredr_off_param),
  1702. .expect_status = MGMT_STATUS_NOT_SUPPORTED,
  1703. };
  1704. static const struct generic_data set_bredr_off_failure_test_1 = {
  1705. .setup_settings = settings_powered_le,
  1706. .send_opcode = MGMT_OP_SET_BREDR,
  1707. .send_param = set_bredr_off_param,
  1708. .send_len = sizeof(set_bredr_off_param),
  1709. .expect_status = MGMT_STATUS_REJECTED,
  1710. };
  1711. static const struct generic_data set_bredr_off_failure_test_2 = {
  1712. .setup_settings = settings_powered,
  1713. .send_opcode = MGMT_OP_SET_BREDR,
  1714. .send_param = set_bredr_off_param,
  1715. .send_len = sizeof(set_bredr_off_param),
  1716. .expect_status = MGMT_STATUS_REJECTED,
  1717. };
  1718. static const struct generic_data set_bredr_off_failure_test_3 = {
  1719. .setup_settings = settings_le,
  1720. .send_opcode = MGMT_OP_SET_BREDR,
  1721. .send_param = set_bredr_invalid_param,
  1722. .send_len = sizeof(set_bredr_invalid_param),
  1723. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1724. };
  1725. static const char set_local_name_param[260] = { 'T', 'e', 's', 't', ' ',
  1726. 'n', 'a', 'm', 'e' };
  1727. static const char write_local_name_hci[248] = { 'T', 'e', 's', 't', ' ',
  1728. 'n', 'a', 'm', 'e' };
  1729. static const char write_eir_local_name_hci_1[241] = { 0x00,
  1730. 0x0a, 0x09, 'T', 'e', 's', 't', ' ', 'n', 'a', 'm', 'e',
  1731. 0x02, 0x0a, 0x00, };
  1732. static const struct mgmt_cp_set_local_name set_local_name_cp = {
  1733. .name = {'T', 'e', 's', 't', ' ', 'n', 'a', 'm', 'e'},
  1734. .short_name = {'T', 'e', 's', 't'},
  1735. };
  1736. static const struct mgmt_cp_set_local_name set_local_name_longer_cp = {
  1737. .name = {'T', 'e', 's', 't', ' ', 'n', 'a', 'm', 'e', '1', '2', '3'},
  1738. };
  1739. static const struct mgmt_cp_set_local_name set_local_name_long_short_cp = {
  1740. .name = {'T', 'e', 's', 't', ' ', 'n', 'a', 'm', 'e', '1', '2', '3'},
  1741. .short_name = {'T', 'e', 's', 't'},
  1742. };
  1743. static const struct generic_data set_local_name_test_1 = {
  1744. .send_opcode = MGMT_OP_SET_LOCAL_NAME,
  1745. .send_param = set_local_name_param,
  1746. .send_len = sizeof(set_local_name_param),
  1747. .expect_status = MGMT_STATUS_SUCCESS,
  1748. .expect_param = set_local_name_param,
  1749. .expect_len = sizeof(set_local_name_param),
  1750. .expect_alt_ev = MGMT_EV_LOCAL_NAME_CHANGED,
  1751. .expect_alt_ev_param = set_local_name_param,
  1752. .expect_alt_ev_len = sizeof(set_local_name_param),
  1753. };
  1754. static const struct generic_data set_local_name_test_2 = {
  1755. .setup_settings = settings_powered,
  1756. .send_opcode = MGMT_OP_SET_LOCAL_NAME,
  1757. .send_param = set_local_name_param,
  1758. .send_len = sizeof(set_local_name_param),
  1759. .expect_status = MGMT_STATUS_SUCCESS,
  1760. .expect_param = set_local_name_param,
  1761. .expect_len = sizeof(set_local_name_param),
  1762. .expect_hci_command = BT_HCI_CMD_WRITE_LOCAL_NAME,
  1763. .expect_hci_param = write_local_name_hci,
  1764. .expect_hci_len = sizeof(write_local_name_hci),
  1765. .expect_alt_ev = MGMT_EV_LOCAL_NAME_CHANGED,
  1766. .expect_alt_ev_param = set_local_name_param,
  1767. .expect_alt_ev_len = sizeof(set_local_name_param),
  1768. };
  1769. static const struct generic_data set_local_name_test_3 = {
  1770. .setup_settings = settings_powered_ssp,
  1771. .send_opcode = MGMT_OP_SET_LOCAL_NAME,
  1772. .send_param = set_local_name_param,
  1773. .send_len = sizeof(set_local_name_param),
  1774. .expect_status = MGMT_STATUS_SUCCESS,
  1775. .expect_param = set_local_name_param,
  1776. .expect_len = sizeof(set_local_name_param),
  1777. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  1778. .expect_hci_param = write_eir_local_name_hci_1,
  1779. .expect_hci_len = sizeof(write_eir_local_name_hci_1),
  1780. .expect_alt_ev = MGMT_EV_LOCAL_NAME_CHANGED,
  1781. .expect_alt_ev_param = set_local_name_param,
  1782. .expect_alt_ev_len = sizeof(set_local_name_param),
  1783. };
  1784. static const char start_discovery_invalid_param[] = { 0x00 };
  1785. static const char start_discovery_bredr_param[] = { 0x01 };
  1786. static const char start_discovery_le_param[] = { 0x06 };
  1787. static const char start_discovery_bredrle_param[] = { 0x07 };
  1788. static const char start_discovery_valid_hci[] = { 0x01, 0x01 };
  1789. static const char start_discovery_evt[] = { 0x07, 0x01 };
  1790. static const char start_discovery_le_evt[] = { 0x06, 0x01 };
  1791. static const struct generic_data start_discovery_not_powered_test_1 = {
  1792. .send_opcode = MGMT_OP_START_DISCOVERY,
  1793. .send_param = start_discovery_bredr_param,
  1794. .send_len = sizeof(start_discovery_bredr_param),
  1795. .expect_status = MGMT_STATUS_NOT_POWERED,
  1796. .expect_param = start_discovery_bredr_param,
  1797. .expect_len = sizeof(start_discovery_bredr_param),
  1798. };
  1799. static const struct generic_data start_discovery_invalid_param_test_1 = {
  1800. .setup_settings = settings_powered,
  1801. .send_opcode = MGMT_OP_START_DISCOVERY,
  1802. .send_param = start_discovery_invalid_param,
  1803. .send_len = sizeof(start_discovery_invalid_param),
  1804. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1805. .expect_param = start_discovery_invalid_param,
  1806. .expect_len = sizeof(start_discovery_invalid_param),
  1807. };
  1808. static const struct generic_data start_discovery_not_supported_test_1 = {
  1809. .setup_settings = settings_powered,
  1810. .send_opcode = MGMT_OP_START_DISCOVERY,
  1811. .send_param = start_discovery_le_param,
  1812. .send_len = sizeof(start_discovery_le_param),
  1813. .expect_status = MGMT_STATUS_REJECTED,
  1814. .expect_param = start_discovery_le_param,
  1815. .expect_len = sizeof(start_discovery_le_param),
  1816. };
  1817. static const struct generic_data start_discovery_valid_param_test_1 = {
  1818. .setup_settings = settings_powered_le,
  1819. .send_opcode = MGMT_OP_START_DISCOVERY,
  1820. .send_param = start_discovery_bredrle_param,
  1821. .send_len = sizeof(start_discovery_bredrle_param),
  1822. .expect_status = MGMT_STATUS_SUCCESS,
  1823. .expect_param = start_discovery_bredrle_param,
  1824. .expect_len = sizeof(start_discovery_bredrle_param),
  1825. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_ENABLE,
  1826. .expect_hci_param = start_discovery_valid_hci,
  1827. .expect_hci_len = sizeof(start_discovery_valid_hci),
  1828. .expect_alt_ev = MGMT_EV_DISCOVERING,
  1829. .expect_alt_ev_param = start_discovery_evt,
  1830. .expect_alt_ev_len = sizeof(start_discovery_evt),
  1831. };
  1832. static const struct generic_data start_discovery_valid_param_test_2 = {
  1833. .setup_settings = settings_powered,
  1834. .send_opcode = MGMT_OP_START_DISCOVERY,
  1835. .send_param = start_discovery_le_param,
  1836. .send_len = sizeof(start_discovery_le_param),
  1837. .expect_status = MGMT_STATUS_SUCCESS,
  1838. .expect_param = start_discovery_le_param,
  1839. .expect_len = sizeof(start_discovery_le_param),
  1840. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_ENABLE,
  1841. .expect_hci_param = start_discovery_valid_hci,
  1842. .expect_hci_len = sizeof(start_discovery_valid_hci),
  1843. .expect_alt_ev = MGMT_EV_DISCOVERING,
  1844. .expect_alt_ev_param = start_discovery_le_evt,
  1845. .expect_alt_ev_len = sizeof(start_discovery_le_evt),
  1846. };
  1847. static const struct generic_data start_discovery_valid_param_power_off_1 = {
  1848. .setup_settings = settings_le,
  1849. .send_opcode = MGMT_OP_START_DISCOVERY,
  1850. .send_param = start_discovery_bredrle_param,
  1851. .send_len = sizeof(start_discovery_bredrle_param),
  1852. .expect_status = MGMT_STATUS_NOT_POWERED,
  1853. .force_power_off = true,
  1854. .expect_param = start_discovery_bredrle_param,
  1855. .expect_len = sizeof(start_discovery_bredrle_param),
  1856. };
  1857. static const char set_resolv_off_param[] = { 0x00 };
  1858. static const char set_resolv_on_param[] = { 0x01 };
  1859. static const struct generic_data start_discovery_ll_privacy_disable_resolv = {
  1860. .send_opcode = MGMT_OP_START_DISCOVERY,
  1861. .send_param = start_discovery_le_param,
  1862. .send_len = sizeof(start_discovery_le_param),
  1863. .expect_status = MGMT_STATUS_SUCCESS,
  1864. .expect_param = start_discovery_le_param,
  1865. .expect_len = sizeof(start_discovery_le_param),
  1866. .setup_expect_hci_command = BT_HCI_CMD_LE_SET_RESOLV_ENABLE,
  1867. .setup_expect_hci_param = set_resolv_on_param,
  1868. .setup_expect_hci_len = sizeof(set_resolv_on_param),
  1869. .expect_hci_command = BT_HCI_CMD_LE_SET_RESOLV_ENABLE,
  1870. .expect_hci_param = set_resolv_off_param,
  1871. .expect_hci_len = sizeof(set_resolv_off_param),
  1872. };
  1873. static const char stop_discovery_bredrle_param[] = { 0x07 };
  1874. static const char stop_discovery_bredrle_invalid_param[] = { 0x06 };
  1875. static const char stop_discovery_valid_hci[] = { 0x00, 0x00 };
  1876. static const char stop_discovery_evt[] = { 0x07, 0x00 };
  1877. static const char stop_discovery_bredr_param[] = { 0x01 };
  1878. static const char stop_discovery_bredr_discovering[] = { 0x01, 0x00 };
  1879. static const struct generic_data stop_discovery_success_test_1 = {
  1880. .setup_settings = settings_powered_le,
  1881. .setup_send_opcode = MGMT_OP_START_DISCOVERY,
  1882. .setup_send_param = start_discovery_bredrle_param,
  1883. .setup_send_len = sizeof(start_discovery_bredrle_param),
  1884. .send_opcode = MGMT_OP_STOP_DISCOVERY,
  1885. .send_param = stop_discovery_bredrle_param,
  1886. .send_len = sizeof(stop_discovery_bredrle_param),
  1887. .expect_status = MGMT_STATUS_SUCCESS,
  1888. .expect_param = stop_discovery_bredrle_param,
  1889. .expect_len = sizeof(stop_discovery_bredrle_param),
  1890. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_ENABLE,
  1891. .expect_hci_param = stop_discovery_valid_hci,
  1892. .expect_hci_len = sizeof(stop_discovery_valid_hci),
  1893. .expect_alt_ev = MGMT_EV_DISCOVERING,
  1894. .expect_alt_ev_param = stop_discovery_evt,
  1895. .expect_alt_ev_len = sizeof(stop_discovery_evt),
  1896. };
  1897. static const struct generic_data stop_discovery_bredr_success_test_1 = {
  1898. .setup_settings = settings_powered,
  1899. .setup_send_opcode = MGMT_OP_START_DISCOVERY,
  1900. .setup_send_param = start_discovery_bredr_param,
  1901. .setup_send_len = sizeof(start_discovery_bredr_param),
  1902. .send_opcode = MGMT_OP_STOP_DISCOVERY,
  1903. .send_param = stop_discovery_bredr_param,
  1904. .send_len = sizeof(stop_discovery_bredr_param),
  1905. .expect_status = MGMT_STATUS_SUCCESS,
  1906. .expect_param = stop_discovery_bredr_param,
  1907. .expect_len = sizeof(stop_discovery_bredr_param),
  1908. .expect_hci_command = BT_HCI_CMD_INQUIRY_CANCEL,
  1909. .expect_alt_ev = MGMT_EV_DISCOVERING,
  1910. .expect_alt_ev_param = stop_discovery_bredr_discovering,
  1911. .expect_alt_ev_len = sizeof(stop_discovery_bredr_discovering),
  1912. };
  1913. static const struct generic_data stop_discovery_rejected_test_1 = {
  1914. .setup_settings = settings_powered_le,
  1915. .send_opcode = MGMT_OP_STOP_DISCOVERY,
  1916. .send_param = stop_discovery_bredrle_param,
  1917. .send_len = sizeof(stop_discovery_bredrle_param),
  1918. .expect_status = MGMT_STATUS_REJECTED,
  1919. .expect_param = stop_discovery_bredrle_param,
  1920. .expect_len = sizeof(stop_discovery_bredrle_param),
  1921. };
  1922. static const struct generic_data stop_discovery_invalid_param_test_1 = {
  1923. .setup_settings = settings_powered_le,
  1924. .setup_send_opcode = MGMT_OP_START_DISCOVERY,
  1925. .setup_send_param = start_discovery_bredrle_param,
  1926. .setup_send_len = sizeof(start_discovery_bredrle_param),
  1927. .send_opcode = MGMT_OP_STOP_DISCOVERY,
  1928. .send_param = stop_discovery_bredrle_invalid_param,
  1929. .send_len = sizeof(stop_discovery_bredrle_invalid_param),
  1930. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1931. .expect_param = stop_discovery_bredrle_invalid_param,
  1932. .expect_len = sizeof(stop_discovery_bredrle_invalid_param),
  1933. };
  1934. static const char start_service_discovery_invalid_param[] = { 0x00, 0x00, 0x00, 0x00 };
  1935. static const char start_service_discovery_invalid_resp[] = { 0x00 };
  1936. static const char start_service_discovery_bredr_param[] = { 0x01, 0x00, 0x00, 0x00};
  1937. static const char start_service_discovery_bredr_resp[] = { 0x01 };
  1938. static const char start_service_discovery_le_param[] = { 0x06, 0x00, 0x01, 0x00,
  1939. 0xfa, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00,
  1940. 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 };
  1941. static const char start_service_discovery_le_resp[] = { 0x06 };
  1942. static const char start_service_discovery_bredrle_param[] = { 0x07, 0x00, 0x01, 0x00,
  1943. 0xfa, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00,
  1944. 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 };
  1945. static const char start_service_discovery_bredrle_resp[] = { 0x07 };
  1946. static const char start_service_discovery_valid_hci[] = { 0x01, 0x01 };
  1947. static const char start_service_discovery_evt[] = { 0x07, 0x01 };
  1948. static const char start_service_discovery_le_evt[] = { 0x06, 0x01 };
  1949. static const struct generic_data start_service_discovery_not_powered_test_1 = {
  1950. .send_opcode = MGMT_OP_START_SERVICE_DISCOVERY,
  1951. .send_param = start_service_discovery_bredr_param,
  1952. .send_len = sizeof(start_service_discovery_bredr_param),
  1953. .expect_status = MGMT_STATUS_NOT_POWERED,
  1954. .expect_param = start_service_discovery_bredr_resp,
  1955. .expect_len = sizeof(start_service_discovery_bredr_resp),
  1956. };
  1957. static const struct generic_data start_service_discovery_invalid_param_test_1 = {
  1958. .setup_settings = settings_powered,
  1959. .send_opcode = MGMT_OP_START_SERVICE_DISCOVERY,
  1960. .send_param = start_service_discovery_invalid_param,
  1961. .send_len = sizeof(start_service_discovery_invalid_param),
  1962. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  1963. .expect_param = start_service_discovery_invalid_resp,
  1964. .expect_len = sizeof(start_service_discovery_invalid_resp),
  1965. };
  1966. static const struct generic_data start_service_discovery_not_supported_test_1 = {
  1967. .setup_settings = settings_powered,
  1968. .send_opcode = MGMT_OP_START_SERVICE_DISCOVERY,
  1969. .send_param = start_service_discovery_le_param,
  1970. .send_len = sizeof(start_service_discovery_le_param),
  1971. .expect_status = MGMT_STATUS_REJECTED,
  1972. .expect_param = start_service_discovery_le_resp,
  1973. .expect_len = sizeof(start_service_discovery_le_resp),
  1974. };
  1975. static const struct generic_data start_service_discovery_valid_param_test_1 = {
  1976. .setup_settings = settings_powered_le,
  1977. .send_opcode = MGMT_OP_START_SERVICE_DISCOVERY,
  1978. .send_param = start_service_discovery_bredrle_param,
  1979. .send_len = sizeof(start_service_discovery_bredrle_param),
  1980. .expect_status = MGMT_STATUS_SUCCESS,
  1981. .expect_param = start_service_discovery_bredrle_resp,
  1982. .expect_len = sizeof(start_service_discovery_bredrle_resp),
  1983. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_ENABLE,
  1984. .expect_hci_param = start_service_discovery_valid_hci,
  1985. .expect_hci_len = sizeof(start_service_discovery_valid_hci),
  1986. .expect_alt_ev = MGMT_EV_DISCOVERING,
  1987. .expect_alt_ev_param = start_service_discovery_evt,
  1988. .expect_alt_ev_len = sizeof(start_service_discovery_evt),
  1989. };
  1990. static const struct generic_data start_service_discovery_valid_param_test_2 = {
  1991. .setup_settings = settings_powered,
  1992. .send_opcode = MGMT_OP_START_SERVICE_DISCOVERY,
  1993. .send_param = start_service_discovery_le_param,
  1994. .send_len = sizeof(start_service_discovery_le_param),
  1995. .expect_status = MGMT_STATUS_SUCCESS,
  1996. .expect_param = start_service_discovery_le_resp,
  1997. .expect_len = sizeof(start_service_discovery_le_resp),
  1998. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_ENABLE,
  1999. .expect_hci_param = start_service_discovery_valid_hci,
  2000. .expect_hci_len = sizeof(start_service_discovery_valid_hci),
  2001. .expect_alt_ev = MGMT_EV_DISCOVERING,
  2002. .expect_alt_ev_param = start_service_discovery_le_evt,
  2003. .expect_alt_ev_len = sizeof(start_service_discovery_le_evt),
  2004. };
  2005. static const char set_dev_class_valid_param[] = { 0x01, 0x0c };
  2006. static const char set_dev_class_zero_rsp[] = { 0x00, 0x00, 0x00 };
  2007. static const char set_dev_class_valid_rsp[] = { 0x0c, 0x01, 0x00 };
  2008. static const char set_dev_class_valid_hci[] = { 0x0c, 0x01, 0x00 };
  2009. static const char set_dev_class_invalid_param[] = { 0x01, 0x01 };
  2010. static const struct generic_data set_dev_class_valid_param_test_1 = {
  2011. .send_opcode = MGMT_OP_SET_DEV_CLASS,
  2012. .send_param = set_dev_class_valid_param,
  2013. .send_len = sizeof(set_dev_class_valid_param),
  2014. .expect_status = MGMT_STATUS_SUCCESS,
  2015. .expect_param = set_dev_class_zero_rsp,
  2016. .expect_len = sizeof(set_dev_class_zero_rsp),
  2017. };
  2018. static const struct generic_data set_dev_class_valid_param_test_2 = {
  2019. .setup_settings = settings_powered,
  2020. .send_opcode = MGMT_OP_SET_DEV_CLASS,
  2021. .send_param = set_dev_class_valid_param,
  2022. .send_len = sizeof(set_dev_class_valid_param),
  2023. .expect_status = MGMT_STATUS_SUCCESS,
  2024. .expect_param = set_dev_class_valid_rsp,
  2025. .expect_len = sizeof(set_dev_class_valid_rsp),
  2026. .expect_alt_ev = MGMT_EV_CLASS_OF_DEV_CHANGED,
  2027. .expect_alt_ev_param = set_dev_class_valid_rsp,
  2028. .expect_alt_ev_len = sizeof(set_dev_class_valid_rsp),
  2029. .expect_hci_command = BT_HCI_CMD_WRITE_CLASS_OF_DEV,
  2030. .expect_hci_param = set_dev_class_valid_hci,
  2031. .expect_hci_len = sizeof(set_dev_class_valid_hci),
  2032. };
  2033. static const struct generic_data set_dev_class_invalid_param_test_1 = {
  2034. .send_opcode = MGMT_OP_SET_DEV_CLASS,
  2035. .send_param = set_dev_class_invalid_param,
  2036. .send_len = sizeof(set_dev_class_invalid_param),
  2037. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  2038. };
  2039. static const char add_spp_uuid_param[] = {
  2040. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
  2041. 0x00, 0x10, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00,
  2042. 0x00 };
  2043. static const char add_dun_uuid_param[] = {
  2044. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
  2045. 0x00, 0x10, 0x00, 0x00, 0x03, 0x11, 0x00, 0x00,
  2046. 0x00 };
  2047. static const char add_sync_uuid_param[] = {
  2048. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
  2049. 0x00, 0x10, 0x00, 0x00, 0x04, 0x11, 0x00, 0x00,
  2050. 0x00 };
  2051. static const char add_opp_uuid_param[] = {
  2052. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
  2053. 0x00, 0x10, 0x00, 0x00, 0x05, 0x11, 0x00, 0x00,
  2054. 0x00 };
  2055. static const char write_eir_uuid16_hci[241] = { 0x00,
  2056. 0x02, 0x0a, 0x00, 0x03, 0x03, 0x01, 0x11 };
  2057. static const char write_eir_multi_uuid16_hci_1[241] = { 0x00,
  2058. 0x02, 0x0a, 0x00, 0x09, 0x03, 0x01, 0x11, 0x03,
  2059. 0x11, 0x04, 0x11, 0x05, 0x11 };
  2060. static const char write_eir_multi_uuid16_hci_2[241] = { 0x00,
  2061. 0x02, 0x0a, 0x00, 0xeb, 0x02, 0x00, 0x20, 0x01,
  2062. 0x20, 0x02, 0x20, 0x03, 0x20, 0x04, 0x20, 0x05,
  2063. 0x20, 0x06, 0x20, 0x07, 0x20, 0x08, 0x20, 0x09,
  2064. 0x20, 0x0a, 0x20, 0x0b, 0x20, 0x0c, 0x20, 0x0d,
  2065. 0x20, 0x0e, 0x20, 0x0f, 0x20, 0x10, 0x20, 0x11,
  2066. 0x20, 0x12, 0x20, 0x13, 0x20, 0x14, 0x20, 0x15,
  2067. 0x20, 0x16, 0x20, 0x17, 0x20, 0x18, 0x20, 0x19,
  2068. 0x20, 0x1a, 0x20, 0x1b, 0x20, 0x1c, 0x20, 0x1d,
  2069. 0x20, 0x1e, 0x20, 0x1f, 0x20, 0x20, 0x20, 0x21,
  2070. 0x20, 0x22, 0x20, 0x23, 0x20, 0x24, 0x20, 0x25,
  2071. 0x20, 0x26, 0x20, 0x27, 0x20, 0x28, 0x20, 0x29,
  2072. 0x20, 0x2a, 0x20, 0x2b, 0x20, 0x2c, 0x20, 0x2d,
  2073. 0x20, 0x2e, 0x20, 0x2f, 0x20, 0x30, 0x20, 0x31,
  2074. 0x20, 0x32, 0x20, 0x33, 0x20, 0x34, 0x20, 0x35,
  2075. 0x20, 0x36, 0x20, 0x37, 0x20, 0x38, 0x20, 0x39,
  2076. 0x20, 0x3a, 0x20, 0x3b, 0x20, 0x3c, 0x20, 0x3d,
  2077. 0x20, 0x3e, 0x20, 0x3f, 0x20, 0x40, 0x20, 0x41,
  2078. 0x20, 0x42, 0x20, 0x43, 0x20, 0x44, 0x20, 0x45,
  2079. 0x20, 0x46, 0x20, 0x47, 0x20, 0x48, 0x20, 0x49,
  2080. 0x20, 0x4a, 0x20, 0x4b, 0x20, 0x4c, 0x20, 0x4d,
  2081. 0x20, 0x4e, 0x20, 0x4f, 0x20, 0x50, 0x20, 0x51,
  2082. 0x20, 0x52, 0x20, 0x53, 0x20, 0x54, 0x20, 0x55,
  2083. 0x20, 0x56, 0x20, 0x57, 0x20, 0x58, 0x20, 0x59,
  2084. 0x20, 0x5a, 0x20, 0x5b, 0x20, 0x5c, 0x20, 0x5d,
  2085. 0x20, 0x5e, 0x20, 0x5f, 0x20, 0x60, 0x20, 0x61,
  2086. 0x20, 0x62, 0x20, 0x63, 0x20, 0x64, 0x20, 0x65,
  2087. 0x20, 0x66, 0x20, 0x67, 0x20, 0x68, 0x20, 0x69,
  2088. 0x20, 0x6a, 0x20, 0x6b, 0x20, 0x6c, 0x20, 0x6d,
  2089. 0x20, 0x6e, 0x20, 0x6f, 0x20, 0x70, 0x20, 0x71,
  2090. 0x20, 0x72, 0x20, 0x73, 0x20, 0x74, 0x20, 0x00 };
  2091. static const char add_uuid32_param_1[] = {
  2092. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
  2093. 0x00, 0x10, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12,
  2094. 0x00 };
  2095. static const char add_uuid32_param_2[] = {
  2096. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
  2097. 0x00, 0x10, 0x00, 0x00, 0xef, 0xcd, 0xbc, 0x9a,
  2098. 0x00 };
  2099. static const char add_uuid32_param_3[] = {
  2100. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
  2101. 0x00, 0x10, 0x00, 0x00, 0xff, 0xee, 0xdd, 0xcc,
  2102. 0x00 };
  2103. static const char add_uuid32_param_4[] = {
  2104. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
  2105. 0x00, 0x10, 0x00, 0x00, 0x11, 0x22, 0x33, 0x44,
  2106. 0x00 };
  2107. static const char write_eir_uuid32_hci[241] = { 0x00,
  2108. 0x02, 0x0a, 0x00, 0x05, 0x05, 0x78, 0x56, 0x34,
  2109. 0x12 };
  2110. static const char write_eir_uuid32_multi_hci[241] = { 0x00,
  2111. 0x02, 0x0a, 0x00, 0x11, 0x05, 0x78, 0x56, 0x34,
  2112. 0x12, 0xef, 0xcd, 0xbc, 0x9a, 0xff, 0xee, 0xdd,
  2113. 0xcc, 0x11, 0x22, 0x33, 0x44 };
  2114. static const char write_eir_uuid32_multi_hci_2[] = { 0x00,
  2115. 0x02, 0x0a, 0x00, 0xe9, 0x04, 0xff, 0xff, 0xff,
  2116. 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff,
  2117. 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
  2118. 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff,
  2119. 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
  2120. 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff,
  2121. 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff,
  2122. 0xff, 0xf2, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff,
  2123. 0xff, 0xf0, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
  2124. 0xff, 0xee, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff,
  2125. 0xff, 0xec, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xff,
  2126. 0xff, 0xea, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xff,
  2127. 0xff, 0xe8, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff,
  2128. 0xff, 0xe6, 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff,
  2129. 0xff, 0xe4, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff,
  2130. 0xff, 0xe2, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff,
  2131. 0xff, 0xe0, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff,
  2132. 0xff, 0xde, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff,
  2133. 0xff, 0xdc, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xff,
  2134. 0xff, 0xda, 0xff, 0xff, 0xff, 0xd9, 0xff, 0xff,
  2135. 0xff, 0xd8, 0xff, 0xff, 0xff, 0xd7, 0xff, 0xff,
  2136. 0xff, 0xd6, 0xff, 0xff, 0xff, 0xd5, 0xff, 0xff,
  2137. 0xff, 0xd4, 0xff, 0xff, 0xff, 0xd3, 0xff, 0xff,
  2138. 0xff, 0xd2, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff,
  2139. 0xff, 0xd0, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff,
  2140. 0xff, 0xce, 0xff, 0xff, 0xff, 0xcd, 0xff, 0xff,
  2141. 0xff, 0xcc, 0xff, 0xff, 0xff, 0xcb, 0xff, 0xff,
  2142. 0xff, 0xca, 0xff, 0xff, 0xff, 0xc9, 0xff, 0xff,
  2143. 0xff, 0xc8, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff,
  2144. 0xff, 0xc6, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 };
  2145. static const char add_uuid128_param_1[] = {
  2146. 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
  2147. 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
  2148. 0x00 };
  2149. static const char add_uuid128_param_2[] = {
  2150. 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88,
  2151. 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00,
  2152. 0x00 };
  2153. static const char write_eir_uuid128_hci[241] = { 0x00,
  2154. 0x02, 0x0a, 0x00, 0x11, 0x07, 0x00, 0x11, 0x22,
  2155. 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa,
  2156. 0xbb, 0xcc, 0xdd, 0xee, 0xff };
  2157. static const char write_eir_uuid128_multi_hci[241] = { 0x00,
  2158. 0x02, 0x0a, 0x00, 0x21, 0x07, 0x00, 0x11, 0x22,
  2159. 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa,
  2160. 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0xff, 0xee, 0xdd,
  2161. 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55,
  2162. 0x44, 0x33, 0x22, 0x11 };
  2163. static const char write_eir_uuid128_multi_hci_2[] = { 0x00,
  2164. 0x02, 0x0a, 0x00, 0xe1, 0x07, 0x11, 0x22, 0x33,
  2165. 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
  2166. 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33,
  2167. 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
  2168. 0xcc, 0xdd, 0xee, 0xff, 0x01, 0x11, 0x22, 0x33,
  2169. 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
  2170. 0xcc, 0xdd, 0xee, 0xff, 0x02, 0x11, 0x22, 0x33,
  2171. 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
  2172. 0xcc, 0xdd, 0xee, 0xff, 0x03, 0x11, 0x22, 0x33,
  2173. 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
  2174. 0xcc, 0xdd, 0xee, 0xff, 0x04, 0x11, 0x22, 0x33,
  2175. 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
  2176. 0xcc, 0xdd, 0xee, 0xff, 0x05, 0x11, 0x22, 0x33,
  2177. 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
  2178. 0xcc, 0xdd, 0xee, 0xff, 0x06, 0x11, 0x22, 0x33,
  2179. 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
  2180. 0xcc, 0xdd, 0xee, 0xff, 0x07, 0x11, 0x22, 0x33,
  2181. 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
  2182. 0xcc, 0xdd, 0xee, 0xff, 0x08, 0x11, 0x22, 0x33,
  2183. 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
  2184. 0xcc, 0xdd, 0xee, 0xff, 0x09, 0x11, 0x22, 0x33,
  2185. 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
  2186. 0xcc, 0xdd, 0xee, 0xff, 0x0a, 0x11, 0x22, 0x33,
  2187. 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
  2188. 0xcc, 0xdd, 0xee, 0xff, 0x0b, 0x11, 0x22, 0x33,
  2189. 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb,
  2190. 0xcc, 0xdd, 0xee, 0xff, 0x0c, 0xff, 0xee, 0xdd,
  2191. 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55,
  2192. 0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00,
  2193. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  2194. static const char write_eir_uuid_mix_hci[241] = { 0x00,
  2195. 0x02, 0x0a, 0x00, 0x05, 0x03, 0x01, 0x11, 0x03,
  2196. 0x11, 0x09, 0x05, 0x78, 0x56, 0x34, 0x12, 0xef,
  2197. 0xcd, 0xbc, 0x9a, 0x21, 0x07, 0x00, 0x11, 0x22,
  2198. 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa,
  2199. 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0xff, 0xee, 0xdd,
  2200. 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55,
  2201. 0x44, 0x33, 0x22, 0x11 };
  2202. static const struct generic_data add_uuid16_test_1 = {
  2203. .setup_settings = settings_powered_ssp,
  2204. .send_opcode = MGMT_OP_ADD_UUID,
  2205. .send_param = add_spp_uuid_param,
  2206. .send_len = sizeof(add_spp_uuid_param),
  2207. .expect_status = MGMT_STATUS_SUCCESS,
  2208. .expect_param = set_dev_class_zero_rsp,
  2209. .expect_len = sizeof(set_dev_class_zero_rsp),
  2210. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  2211. .expect_hci_param = write_eir_uuid16_hci,
  2212. .expect_hci_len = sizeof(write_eir_uuid16_hci),
  2213. };
  2214. static const struct generic_data add_multi_uuid16_test_1 = {
  2215. .send_opcode = MGMT_OP_ADD_UUID,
  2216. .send_param = add_opp_uuid_param,
  2217. .send_len = sizeof(add_opp_uuid_param),
  2218. .expect_status = MGMT_STATUS_SUCCESS,
  2219. .expect_param = set_dev_class_zero_rsp,
  2220. .expect_len = sizeof(set_dev_class_zero_rsp),
  2221. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  2222. .expect_hci_param = write_eir_multi_uuid16_hci_1,
  2223. .expect_hci_len = sizeof(write_eir_multi_uuid16_hci_1),
  2224. };
  2225. static const struct generic_data add_multi_uuid16_test_2 = {
  2226. .send_opcode = MGMT_OP_ADD_UUID,
  2227. .send_param = add_opp_uuid_param,
  2228. .send_len = sizeof(add_opp_uuid_param),
  2229. .expect_status = MGMT_STATUS_SUCCESS,
  2230. .expect_param = set_dev_class_zero_rsp,
  2231. .expect_len = sizeof(set_dev_class_zero_rsp),
  2232. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  2233. .expect_hci_param = write_eir_multi_uuid16_hci_2,
  2234. .expect_hci_len = sizeof(write_eir_multi_uuid16_hci_2),
  2235. };
  2236. static const struct generic_data add_uuid32_test_1 = {
  2237. .setup_settings = settings_powered_ssp,
  2238. .send_opcode = MGMT_OP_ADD_UUID,
  2239. .send_param = add_uuid32_param_1,
  2240. .send_len = sizeof(add_uuid32_param_1),
  2241. .expect_status = MGMT_STATUS_SUCCESS,
  2242. .expect_param = set_dev_class_zero_rsp,
  2243. .expect_len = sizeof(set_dev_class_zero_rsp),
  2244. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  2245. .expect_hci_param = write_eir_uuid32_hci,
  2246. .expect_hci_len = sizeof(write_eir_uuid32_hci),
  2247. };
  2248. static const struct generic_data add_uuid32_multi_test_1 = {
  2249. .send_opcode = MGMT_OP_ADD_UUID,
  2250. .send_param = add_uuid32_param_4,
  2251. .send_len = sizeof(add_uuid32_param_4),
  2252. .expect_status = MGMT_STATUS_SUCCESS,
  2253. .expect_param = set_dev_class_zero_rsp,
  2254. .expect_len = sizeof(set_dev_class_zero_rsp),
  2255. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  2256. .expect_hci_param = write_eir_uuid32_multi_hci,
  2257. .expect_hci_len = sizeof(write_eir_uuid32_multi_hci),
  2258. };
  2259. static const struct generic_data add_uuid32_multi_test_2 = {
  2260. .send_opcode = MGMT_OP_ADD_UUID,
  2261. .send_param = add_uuid32_param_4,
  2262. .send_len = sizeof(add_uuid32_param_4),
  2263. .expect_status = MGMT_STATUS_SUCCESS,
  2264. .expect_param = set_dev_class_zero_rsp,
  2265. .expect_len = sizeof(set_dev_class_zero_rsp),
  2266. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  2267. .expect_hci_param = write_eir_uuid32_multi_hci_2,
  2268. .expect_hci_len = sizeof(write_eir_uuid32_multi_hci_2),
  2269. };
  2270. static const struct generic_data add_uuid128_test_1 = {
  2271. .setup_settings = settings_powered_ssp,
  2272. .send_opcode = MGMT_OP_ADD_UUID,
  2273. .send_param = add_uuid128_param_1,
  2274. .send_len = sizeof(add_uuid128_param_1),
  2275. .expect_status = MGMT_STATUS_SUCCESS,
  2276. .expect_param = set_dev_class_zero_rsp,
  2277. .expect_len = sizeof(set_dev_class_zero_rsp),
  2278. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  2279. .expect_hci_param = write_eir_uuid128_hci,
  2280. .expect_hci_len = sizeof(write_eir_uuid128_hci),
  2281. };
  2282. static const struct generic_data add_uuid128_multi_test_1 = {
  2283. .send_opcode = MGMT_OP_ADD_UUID,
  2284. .send_param = add_uuid128_param_2,
  2285. .send_len = sizeof(add_uuid32_param_2),
  2286. .expect_status = MGMT_STATUS_SUCCESS,
  2287. .expect_param = set_dev_class_zero_rsp,
  2288. .expect_len = sizeof(set_dev_class_zero_rsp),
  2289. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  2290. .expect_hci_param = write_eir_uuid128_multi_hci,
  2291. .expect_hci_len = sizeof(write_eir_uuid128_multi_hci),
  2292. };
  2293. static const struct generic_data add_uuid128_multi_test_2 = {
  2294. .send_opcode = MGMT_OP_ADD_UUID,
  2295. .send_param = add_uuid128_param_2,
  2296. .send_len = sizeof(add_uuid128_param_2),
  2297. .expect_status = MGMT_STATUS_SUCCESS,
  2298. .expect_param = set_dev_class_zero_rsp,
  2299. .expect_len = sizeof(set_dev_class_zero_rsp),
  2300. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  2301. .expect_hci_param = write_eir_uuid128_multi_hci_2,
  2302. .expect_hci_len = sizeof(write_eir_uuid128_multi_hci_2),
  2303. };
  2304. static const struct generic_data add_uuid_mix_test_1 = {
  2305. .send_opcode = MGMT_OP_ADD_UUID,
  2306. .send_param = add_uuid128_param_2,
  2307. .send_len = sizeof(add_uuid128_param_2),
  2308. .expect_status = MGMT_STATUS_SUCCESS,
  2309. .expect_param = set_dev_class_zero_rsp,
  2310. .expect_len = sizeof(set_dev_class_zero_rsp),
  2311. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  2312. .expect_hci_param = write_eir_uuid_mix_hci,
  2313. .expect_hci_len = sizeof(write_eir_uuid_mix_hci),
  2314. };
  2315. static const char remove_dun_uuid_param[] = {
  2316. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
  2317. 0x00, 0x10, 0x00, 0x00, 0x03, 0x11, 0x00, 0x00 };
  2318. static const char write_eir_remove_dun_hci[241] = {
  2319. 0x00, 0x02, 0x0a, 0x00, 0x05, 0x03, 0x01, 0x11, 0x04,
  2320. 0x11 };
  2321. static const struct generic_data remove_uuid_success_1 = {
  2322. .send_opcode = MGMT_OP_REMOVE_UUID,
  2323. .send_param = remove_dun_uuid_param,
  2324. .send_len = sizeof(remove_dun_uuid_param),
  2325. .expect_status = MGMT_STATUS_SUCCESS,
  2326. .expect_param = set_dev_class_zero_rsp,
  2327. .expect_len = sizeof(set_dev_class_zero_rsp),
  2328. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  2329. .expect_hci_param = write_eir_remove_dun_hci,
  2330. .expect_hci_len = sizeof(write_eir_remove_dun_hci),
  2331. };
  2332. static const char remove_all_uuid_param[16] = { 0x00 };
  2333. static const struct generic_data remove_uuid_all_success_2 = {
  2334. .send_opcode = MGMT_OP_REMOVE_UUID,
  2335. .send_param = remove_all_uuid_param,
  2336. .send_len = sizeof(remove_all_uuid_param),
  2337. .expect_status = MGMT_STATUS_SUCCESS,
  2338. .expect_param = set_dev_class_zero_rsp,
  2339. .expect_len = sizeof(set_dev_class_zero_rsp),
  2340. };
  2341. static const struct generic_data remove_uuid_power_off_success_3 = {
  2342. .send_opcode = MGMT_OP_REMOVE_UUID,
  2343. .send_param = remove_dun_uuid_param,
  2344. .send_len = sizeof(remove_dun_uuid_param),
  2345. .expect_status = MGMT_STATUS_SUCCESS,
  2346. .expect_param = set_dev_class_zero_rsp,
  2347. .expect_len = sizeof(set_dev_class_zero_rsp),
  2348. };
  2349. static const struct generic_data remove_uuid_power_off_on_success_4 = {
  2350. .send_opcode = MGMT_OP_SET_POWERED,
  2351. .send_param = set_powered_on_param,
  2352. .send_len = sizeof(set_powered_on_param),
  2353. .expect_status = MGMT_STATUS_SUCCESS,
  2354. .expect_param = set_ssp_settings_param_2,
  2355. .expect_len = sizeof(set_ssp_settings_param_2),
  2356. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  2357. .expect_hci_param = write_eir_remove_dun_hci,
  2358. .expect_hci_len = sizeof(write_eir_remove_dun_hci),
  2359. };
  2360. static const struct generic_data remove_uuid_invalid_params_1 = {
  2361. .send_opcode = MGMT_OP_REMOVE_UUID,
  2362. .send_param = add_opp_uuid_param,
  2363. .send_len = sizeof(add_opp_uuid_param),
  2364. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  2365. };
  2366. static const char load_link_keys_valid_param_1[] = { 0x00, 0x00, 0x00 };
  2367. static const char load_link_keys_valid_param_2[] = { 0x01, 0x00, 0x00 };
  2368. static const char load_link_keys_invalid_param_1[] = { 0x02, 0x00, 0x00 };
  2369. static const char load_link_keys_invalid_param_2[] = { 0x00, 0x01, 0x00 };
  2370. /* Invalid bdaddr type */
  2371. static const char load_link_keys_invalid_param_3[] = { 0x00, 0x01, 0x00,
  2372. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* addr */
  2373. 0x01, /* addr type */
  2374. 0x00, /* key type */
  2375. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2376. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2377. 0x04, /* PIN length */
  2378. };
  2379. static const struct generic_data load_link_keys_success_test_1 = {
  2380. .send_opcode = MGMT_OP_LOAD_LINK_KEYS,
  2381. .send_param = load_link_keys_valid_param_1,
  2382. .send_len = sizeof(load_link_keys_valid_param_1),
  2383. .expect_status = MGMT_STATUS_SUCCESS,
  2384. };
  2385. static const struct generic_data load_link_keys_success_test_2 = {
  2386. .send_opcode = MGMT_OP_LOAD_LINK_KEYS,
  2387. .send_param = load_link_keys_valid_param_2,
  2388. .send_len = sizeof(load_link_keys_valid_param_2),
  2389. .expect_status = MGMT_STATUS_SUCCESS,
  2390. };
  2391. static const struct generic_data load_link_keys_invalid_params_test_1 = {
  2392. .send_opcode = MGMT_OP_LOAD_LINK_KEYS,
  2393. .send_param = load_link_keys_invalid_param_1,
  2394. .send_len = sizeof(load_link_keys_invalid_param_1),
  2395. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  2396. };
  2397. static const struct generic_data load_link_keys_invalid_params_test_2 = {
  2398. .send_opcode = MGMT_OP_LOAD_LINK_KEYS,
  2399. .send_param = load_link_keys_invalid_param_2,
  2400. .send_len = sizeof(load_link_keys_invalid_param_2),
  2401. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  2402. };
  2403. static const struct generic_data load_link_keys_invalid_params_test_3 = {
  2404. .send_opcode = MGMT_OP_LOAD_LINK_KEYS,
  2405. .send_param = load_link_keys_invalid_param_3,
  2406. .send_len = sizeof(load_link_keys_invalid_param_3),
  2407. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  2408. };
  2409. static const char load_ltks_valid_param_1[] = { 0x00, 0x00 };
  2410. static const char load_ltks_valid_param_2[] = {
  2411. 0x01, 0x00, /* count */
  2412. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2413. 0x01, /* addr type */
  2414. 0x00, /* authenticated */
  2415. 0x00, /* master */
  2416. 0x00, /* encryption size */
  2417. 0x00, 0x00, /* diversifier */
  2418. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2419. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2420. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2421. };
  2422. /* 20 keys at once */
  2423. static const char load_ltks_valid_param_20[] = {
  2424. 0x14, 0x00, /* count */
  2425. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2426. 0x01, /* addr type */
  2427. 0x00, /* authenticated */
  2428. 0x00, /* master */
  2429. 0x00, /* encryption size */
  2430. 0x00, 0x00, /* diversifier */
  2431. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2432. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2433. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2434. 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2435. 0x01, /* addr type */
  2436. 0x00, /* authenticated */
  2437. 0x00, /* master */
  2438. 0x00, /* encryption size */
  2439. 0x00, 0x00, /* diversifier */
  2440. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2441. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2442. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2443. 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2444. 0x01, /* addr type */
  2445. 0x00, /* authenticated */
  2446. 0x00, /* master */
  2447. 0x00, /* encryption size */
  2448. 0x00, 0x00, /* diversifier */
  2449. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2450. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2451. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2452. 0x03, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2453. 0x01, /* addr type */
  2454. 0x00, /* authenticated */
  2455. 0x00, /* master */
  2456. 0x00, /* encryption size */
  2457. 0x00, 0x00, /* diversifier */
  2458. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2459. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2460. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2461. 0x04, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2462. 0x01, /* addr type */
  2463. 0x00, /* authenticated */
  2464. 0x00, /* master */
  2465. 0x00, /* encryption size */
  2466. 0x00, 0x00, /* diversifier */
  2467. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2468. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2469. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2470. 0x05, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2471. 0x01, /* addr type */
  2472. 0x00, /* authenticated */
  2473. 0x00, /* master */
  2474. 0x00, /* encryption size */
  2475. 0x00, 0x00, /* diversifier */
  2476. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2477. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2478. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2479. 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2480. 0x01, /* addr type */
  2481. 0x00, /* authenticated */
  2482. 0x00, /* master */
  2483. 0x00, /* encryption size */
  2484. 0x00, 0x00, /* diversifier */
  2485. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2486. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2487. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2488. 0x07, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2489. 0x01, /* addr type */
  2490. 0x00, /* authenticated */
  2491. 0x00, /* master */
  2492. 0x00, /* encryption size */
  2493. 0x00, 0x00, /* diversifier */
  2494. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2495. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2496. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2497. 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2498. 0x01, /* addr type */
  2499. 0x00, /* authenticated */
  2500. 0x00, /* master */
  2501. 0x00, /* encryption size */
  2502. 0x00, 0x00, /* diversifier */
  2503. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2504. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2505. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2506. 0x09, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2507. 0x01, /* addr type */
  2508. 0x00, /* authenticated */
  2509. 0x00, /* master */
  2510. 0x00, /* encryption size */
  2511. 0x00, 0x00, /* diversifier */
  2512. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2513. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2514. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2515. 0x0a, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2516. 0x01, /* addr type */
  2517. 0x00, /* authenticated */
  2518. 0x00, /* master */
  2519. 0x00, /* encryption size */
  2520. 0x00, 0x00, /* diversifier */
  2521. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2522. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2523. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2524. 0x0b, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2525. 0x01, /* addr type */
  2526. 0x00, /* authenticated */
  2527. 0x00, /* master */
  2528. 0x00, /* encryption size */
  2529. 0x00, 0x00, /* diversifier */
  2530. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2531. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2532. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2533. 0x0c, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2534. 0x01, /* addr type */
  2535. 0x00, /* authenticated */
  2536. 0x00, /* master */
  2537. 0x00, /* encryption size */
  2538. 0x00, 0x00, /* diversifier */
  2539. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2540. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2541. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2542. 0x0d, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2543. 0x01, /* addr type */
  2544. 0x00, /* authenticated */
  2545. 0x00, /* master */
  2546. 0x00, /* encryption size */
  2547. 0x00, 0x00, /* diversifier */
  2548. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2549. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2550. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2551. 0x0e, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2552. 0x01, /* addr type */
  2553. 0x00, /* authenticated */
  2554. 0x00, /* master */
  2555. 0x00, /* encryption size */
  2556. 0x00, 0x00, /* diversifier */
  2557. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2558. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2559. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2560. 0x0f, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2561. 0x01, /* addr type */
  2562. 0x00, /* authenticated */
  2563. 0x00, /* master */
  2564. 0x00, /* encryption size */
  2565. 0x00, 0x00, /* diversifier */
  2566. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2567. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2568. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2569. 0x10, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2570. 0x01, /* addr type */
  2571. 0x00, /* authenticated */
  2572. 0x00, /* master */
  2573. 0x00, /* encryption size */
  2574. 0x00, 0x00, /* diversifier */
  2575. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2576. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2577. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2578. 0x11, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2579. 0x01, /* addr type */
  2580. 0x00, /* authenticated */
  2581. 0x00, /* master */
  2582. 0x00, /* encryption size */
  2583. 0x00, 0x00, /* diversifier */
  2584. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2585. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2586. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2587. 0x12, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2588. 0x01, /* addr type */
  2589. 0x00, /* authenticated */
  2590. 0x00, /* master */
  2591. 0x00, /* encryption size */
  2592. 0x00, 0x00, /* diversifier */
  2593. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2594. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2595. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2596. 0x13, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2597. 0x01, /* addr type */
  2598. 0x00, /* authenticated */
  2599. 0x00, /* master */
  2600. 0x00, /* encryption size */
  2601. 0x00, 0x00, /* diversifier */
  2602. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2603. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2604. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2605. };
  2606. /* Invalid key count */
  2607. static const char load_ltks_invalid_param_1[] = { 0x01, 0x00 };
  2608. /* Invalid addr type */
  2609. static const char load_ltks_invalid_param_2[] = {
  2610. 0x01, 0x00, /* count */
  2611. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2612. 0x00, /* addr type */
  2613. 0x00, /* authenticated */
  2614. 0x00, /* central */
  2615. 0x00, /* encryption size */
  2616. 0x00, 0x00, /* diversifier */
  2617. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2618. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2619. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2620. };
  2621. /* Invalid central value */
  2622. static const char load_ltks_invalid_param_3[] = {
  2623. 0x01, 0x00, /* count */
  2624. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */
  2625. 0x01, /* addr type */
  2626. 0x00, /* authenticated */
  2627. 0x02, /* central */
  2628. 0x00, /* encryption size */
  2629. 0x00, 0x00, /* diversifier */
  2630. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */
  2631. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */
  2632. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */
  2633. };
  2634. static const struct generic_data load_ltks_success_test_1 = {
  2635. .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS,
  2636. .send_param = load_ltks_valid_param_1,
  2637. .send_len = sizeof(load_ltks_valid_param_1),
  2638. .expect_status = MGMT_STATUS_SUCCESS,
  2639. };
  2640. static const struct generic_data load_ltks_success_test_2 = {
  2641. .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS,
  2642. .send_param = load_ltks_valid_param_2,
  2643. .send_len = sizeof(load_ltks_valid_param_2),
  2644. .expect_status = MGMT_STATUS_SUCCESS,
  2645. };
  2646. static const struct generic_data load_ltks_success_test_3 = {
  2647. .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS,
  2648. .send_param = load_ltks_valid_param_2,
  2649. .send_len = sizeof(load_ltks_valid_param_2),
  2650. .expect_status = MGMT_STATUS_SUCCESS,
  2651. };
  2652. static const struct generic_data load_ltks_success_test_4 = {
  2653. .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS,
  2654. .send_param = load_ltks_valid_param_20,
  2655. .send_len = sizeof(load_ltks_valid_param_20),
  2656. .expect_status = MGMT_STATUS_SUCCESS,
  2657. };
  2658. static const struct generic_data load_ltks_success_test_5 = {
  2659. .setup_settings = settings_powered_le,
  2660. .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS,
  2661. .send_param = load_ltks_valid_param_20,
  2662. .send_len = sizeof(load_ltks_valid_param_20),
  2663. .expect_status = MGMT_STATUS_SUCCESS,
  2664. };
  2665. static const struct generic_data load_ltks_invalid_params_test_1 = {
  2666. .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS,
  2667. .send_param = load_ltks_invalid_param_1,
  2668. .send_len = sizeof(load_ltks_invalid_param_1),
  2669. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  2670. };
  2671. static const struct generic_data load_ltks_invalid_params_test_2 = {
  2672. .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS,
  2673. .send_param = load_ltks_invalid_param_2,
  2674. .send_len = sizeof(load_ltks_invalid_param_2),
  2675. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  2676. };
  2677. static const struct generic_data load_ltks_invalid_params_test_3 = {
  2678. .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS,
  2679. .send_param = load_ltks_invalid_param_3,
  2680. .send_len = sizeof(load_ltks_invalid_param_3),
  2681. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  2682. };
  2683. static const char load_ltks_invalid_param_4[22] = { 0x1d, 0x07 };
  2684. static const struct generic_data load_ltks_invalid_params_test_4 = {
  2685. .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS,
  2686. .send_param = load_ltks_invalid_param_4,
  2687. .send_len = sizeof(load_ltks_invalid_param_4),
  2688. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  2689. };
  2690. static const char set_io_cap_invalid_param_1[] = { 0xff };
  2691. static const struct generic_data set_io_cap_invalid_param_test_1 = {
  2692. .send_opcode = MGMT_OP_SET_IO_CAPABILITY,
  2693. .send_param = set_io_cap_invalid_param_1,
  2694. .send_len = sizeof(set_io_cap_invalid_param_1),
  2695. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  2696. };
  2697. static const char pair_device_param[] = {
  2698. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x00 };
  2699. static const char pair_device_rsp[] = {
  2700. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00 };
  2701. static const char pair_device_invalid_param_1[] = {
  2702. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff, 0x00 };
  2703. static const char pair_device_invalid_param_rsp_1[] = {
  2704. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff };
  2705. static const char pair_device_invalid_param_2[] = {
  2706. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x05 };
  2707. static const char pair_device_invalid_param_rsp_2[] = {
  2708. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00 };
  2709. static const struct generic_data pair_device_not_powered_test_1 = {
  2710. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2711. .send_param = pair_device_param,
  2712. .send_len = sizeof(pair_device_param),
  2713. .expect_status = MGMT_STATUS_NOT_POWERED,
  2714. .expect_param = pair_device_rsp,
  2715. .expect_len = sizeof(pair_device_rsp),
  2716. };
  2717. static const struct generic_data pair_device_invalid_param_test_1 = {
  2718. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2719. .send_param = pair_device_invalid_param_1,
  2720. .send_len = sizeof(pair_device_invalid_param_1),
  2721. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  2722. .expect_param = pair_device_invalid_param_rsp_1,
  2723. .expect_len = sizeof(pair_device_invalid_param_rsp_1),
  2724. };
  2725. static const struct generic_data pair_device_invalid_param_test_2 = {
  2726. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2727. .send_param = pair_device_invalid_param_2,
  2728. .send_len = sizeof(pair_device_invalid_param_2),
  2729. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  2730. .expect_param = pair_device_invalid_param_rsp_2,
  2731. .expect_len = sizeof(pair_device_invalid_param_rsp_2),
  2732. };
  2733. static const void *pair_device_send_param_func(uint16_t *len)
  2734. {
  2735. struct test_data *data = tester_get_data();
  2736. const struct generic_data *test = data->test_data;
  2737. static uint8_t param[8];
  2738. memcpy(param, hciemu_get_client_bdaddr(data->hciemu), 6);
  2739. if (test->addr_type_avail)
  2740. param[6] = test->addr_type;
  2741. else if (data->hciemu_type == HCIEMU_TYPE_LE)
  2742. param[6] = 0x01; /* Address type */
  2743. else
  2744. param[6] = 0x00; /* Address type */
  2745. param[7] = test->io_cap;
  2746. *len = sizeof(param);
  2747. return param;
  2748. }
  2749. static const void *pair_device_expect_param_func(uint16_t *len)
  2750. {
  2751. struct test_data *data = tester_get_data();
  2752. const struct generic_data *test = data->test_data;
  2753. static uint8_t param[7];
  2754. memcpy(param, hciemu_get_client_bdaddr(data->hciemu), 6);
  2755. if (test->addr_type_avail)
  2756. param[6] = test->addr_type;
  2757. else if (data->hciemu_type == HCIEMU_TYPE_LE)
  2758. param[6] = 0x01; /* Address type */
  2759. else
  2760. param[6] = 0x00; /* Address type */
  2761. *len = sizeof(param);
  2762. return param;
  2763. }
  2764. static uint16_t settings_powered_bondable[] = { MGMT_OP_SET_BONDABLE,
  2765. MGMT_OP_SET_POWERED, 0 };
  2766. static uint8_t auth_req_param[] = { 0x2a, 0x00 };
  2767. static uint8_t pair_device_pin[] = { 0x30, 0x30, 0x30, 0x30 }; /* "0000" */
  2768. static const struct generic_data pair_device_success_test_1 = {
  2769. .setup_settings = settings_powered_bondable,
  2770. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2771. .send_func = pair_device_send_param_func,
  2772. .expect_status = MGMT_STATUS_SUCCESS,
  2773. .expect_func = pair_device_expect_param_func,
  2774. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  2775. .expect_alt_ev_len = 26,
  2776. .expect_hci_command = BT_HCI_CMD_AUTH_REQUESTED,
  2777. .expect_hci_param = auth_req_param,
  2778. .expect_hci_len = sizeof(auth_req_param),
  2779. .pin = pair_device_pin,
  2780. .pin_len = sizeof(pair_device_pin),
  2781. .client_pin = pair_device_pin,
  2782. .client_pin_len = sizeof(pair_device_pin),
  2783. };
  2784. static uint16_t settings_powered_bondable_linksec[] = { MGMT_OP_SET_BONDABLE,
  2785. MGMT_OP_SET_POWERED,
  2786. MGMT_OP_SET_LINK_SECURITY,
  2787. 0 };
  2788. static const struct generic_data pair_device_success_test_2 = {
  2789. .setup_settings = settings_powered_bondable_linksec,
  2790. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2791. .send_func = pair_device_send_param_func,
  2792. .expect_status = MGMT_STATUS_SUCCESS,
  2793. .expect_func = pair_device_expect_param_func,
  2794. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  2795. .expect_alt_ev_len = 26,
  2796. .expect_hci_command = BT_HCI_CMD_AUTH_REQUESTED,
  2797. .expect_hci_param = auth_req_param,
  2798. .expect_hci_len = sizeof(auth_req_param),
  2799. .pin = pair_device_pin,
  2800. .pin_len = sizeof(pair_device_pin),
  2801. .client_pin = pair_device_pin,
  2802. .client_pin_len = sizeof(pair_device_pin),
  2803. };
  2804. static const struct generic_data pair_device_legacy_nonbondable_1 = {
  2805. .setup_settings = settings_powered,
  2806. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2807. .send_func = pair_device_send_param_func,
  2808. .expect_status = MGMT_STATUS_SUCCESS,
  2809. .expect_func = pair_device_expect_param_func,
  2810. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  2811. .expect_alt_ev_len = 26,
  2812. .pin = pair_device_pin,
  2813. .pin_len = sizeof(pair_device_pin),
  2814. .client_pin = pair_device_pin,
  2815. .client_pin_len = sizeof(pair_device_pin),
  2816. };
  2817. static const struct generic_data pair_device_power_off_test_1 = {
  2818. .setup_settings = settings_powered_bondable,
  2819. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2820. .send_func = pair_device_send_param_func,
  2821. .force_power_off = true,
  2822. .expect_status = MGMT_STATUS_NOT_POWERED,
  2823. .expect_func = pair_device_expect_param_func,
  2824. };
  2825. static const void *client_bdaddr_param_func(uint8_t *len)
  2826. {
  2827. struct test_data *data = tester_get_data();
  2828. static uint8_t bdaddr[6];
  2829. memcpy(bdaddr, hciemu_get_client_bdaddr(data->hciemu), 6);
  2830. *len = sizeof(bdaddr);
  2831. return bdaddr;
  2832. }
  2833. static const struct generic_data pair_device_not_supported_test_1 = {
  2834. .setup_settings = settings_powered_bondable,
  2835. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2836. .send_func = pair_device_send_param_func,
  2837. .expect_status = MGMT_STATUS_NOT_SUPPORTED,
  2838. .expect_func = pair_device_expect_param_func,
  2839. .addr_type_avail = true,
  2840. .addr_type = BDADDR_BREDR,
  2841. };
  2842. static const struct generic_data pair_device_not_supported_test_2 = {
  2843. .setup_settings = settings_powered_bondable,
  2844. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2845. .send_func = pair_device_send_param_func,
  2846. .expect_status = MGMT_STATUS_NOT_SUPPORTED,
  2847. .expect_func = pair_device_expect_param_func,
  2848. .addr_type_avail = true,
  2849. .addr_type = BDADDR_LE_PUBLIC,
  2850. };
  2851. static uint16_t settings_powered_bondable_le[] = { MGMT_OP_SET_LE,
  2852. MGMT_OP_SET_BONDABLE,
  2853. MGMT_OP_SET_POWERED,
  2854. 0 };
  2855. static const struct generic_data pair_device_reject_transport_not_enabled_1 = {
  2856. .setup_settings = settings_powered_bondable_le,
  2857. .setup_nobredr = true,
  2858. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2859. .send_func = pair_device_send_param_func,
  2860. .expect_status = MGMT_STATUS_REJECTED,
  2861. .expect_func = pair_device_expect_param_func,
  2862. .addr_type_avail = true,
  2863. .addr_type = BDADDR_BREDR,
  2864. };
  2865. static const struct generic_data pair_device_reject_transport_not_enabled_2 = {
  2866. .setup_settings = settings_powered_bondable,
  2867. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2868. .send_func = pair_device_send_param_func,
  2869. .expect_status = MGMT_STATUS_REJECTED,
  2870. .expect_func = pair_device_expect_param_func,
  2871. .addr_type_avail = true,
  2872. .addr_type = BDADDR_LE_PUBLIC,
  2873. };
  2874. static const struct generic_data pair_device_reject_test_1 = {
  2875. .setup_settings = settings_powered_bondable,
  2876. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2877. .send_func = pair_device_send_param_func,
  2878. .expect_status = MGMT_STATUS_AUTH_FAILED,
  2879. .expect_func = pair_device_expect_param_func,
  2880. .expect_alt_ev = MGMT_EV_AUTH_FAILED,
  2881. .expect_alt_ev_len = 8,
  2882. .expect_hci_command = BT_HCI_CMD_PIN_CODE_REQUEST_NEG_REPLY,
  2883. .expect_hci_func = client_bdaddr_param_func,
  2884. .expect_pin = true,
  2885. .client_pin = pair_device_pin,
  2886. .client_pin_len = sizeof(pair_device_pin),
  2887. };
  2888. static const struct generic_data pair_device_reject_test_2 = {
  2889. .setup_settings = settings_powered_bondable,
  2890. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2891. .send_func = pair_device_send_param_func,
  2892. .expect_status = MGMT_STATUS_AUTH_FAILED,
  2893. .expect_func = pair_device_expect_param_func,
  2894. .expect_alt_ev = MGMT_EV_AUTH_FAILED,
  2895. .expect_alt_ev_len = 8,
  2896. .expect_hci_command = BT_HCI_CMD_AUTH_REQUESTED,
  2897. .expect_hci_param = auth_req_param,
  2898. .expect_hci_len = sizeof(auth_req_param),
  2899. .pin = pair_device_pin,
  2900. .pin_len = sizeof(pair_device_pin),
  2901. };
  2902. static const struct generic_data pair_device_reject_test_3 = {
  2903. .setup_settings = settings_powered_bondable_linksec,
  2904. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2905. .send_func = pair_device_send_param_func,
  2906. .expect_status = MGMT_STATUS_AUTH_FAILED,
  2907. .expect_func = pair_device_expect_param_func,
  2908. .expect_hci_command = BT_HCI_CMD_PIN_CODE_REQUEST_NEG_REPLY,
  2909. .expect_hci_func = client_bdaddr_param_func,
  2910. .expect_pin = true,
  2911. .client_pin = pair_device_pin,
  2912. .client_pin_len = sizeof(pair_device_pin),
  2913. };
  2914. static const struct generic_data pair_device_reject_test_4 = {
  2915. .setup_settings = settings_powered_bondable_linksec,
  2916. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2917. .send_func = pair_device_send_param_func,
  2918. .expect_status = MGMT_STATUS_AUTH_FAILED,
  2919. .expect_func = pair_device_expect_param_func,
  2920. .pin = pair_device_pin,
  2921. .pin_len = sizeof(pair_device_pin),
  2922. };
  2923. static uint16_t settings_powered_bondable_ssp[] = { MGMT_OP_SET_BONDABLE,
  2924. MGMT_OP_SET_SSP,
  2925. MGMT_OP_SET_POWERED,
  2926. 0 };
  2927. static const struct generic_data pair_device_ssp_test_1 = {
  2928. .setup_settings = settings_powered_bondable_ssp,
  2929. .client_enable_ssp = true,
  2930. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2931. .send_func = pair_device_send_param_func,
  2932. .expect_status = MGMT_STATUS_SUCCESS,
  2933. .expect_func = pair_device_expect_param_func,
  2934. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  2935. .expect_alt_ev_len = 26,
  2936. .expect_hci_command = BT_HCI_CMD_USER_CONFIRM_REQUEST_REPLY,
  2937. .expect_hci_func = client_bdaddr_param_func,
  2938. .io_cap = 0x03, /* NoInputNoOutput */
  2939. .client_io_cap = 0x03, /* NoInputNoOutput */
  2940. };
  2941. static const void *client_io_cap_param_func(uint8_t *len)
  2942. {
  2943. struct test_data *data = tester_get_data();
  2944. const struct generic_data *test = data->test_data;
  2945. static uint8_t param[9];
  2946. memcpy(param, hciemu_get_client_bdaddr(data->hciemu), 6);
  2947. memcpy(&param[6], test->expect_hci_param, 3);
  2948. *len = sizeof(param);
  2949. return param;
  2950. }
  2951. const uint8_t no_bonding_io_cap[] = { 0x03, 0x00, 0x00 };
  2952. static const struct generic_data pair_device_ssp_test_2 = {
  2953. .setup_settings = settings_powered_ssp,
  2954. .client_enable_ssp = true,
  2955. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2956. .send_func = pair_device_send_param_func,
  2957. .expect_status = MGMT_STATUS_SUCCESS,
  2958. .expect_func = pair_device_expect_param_func,
  2959. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  2960. .expect_alt_ev_len = 26,
  2961. .expect_hci_command = BT_HCI_CMD_IO_CAPABILITY_REQUEST_REPLY,
  2962. .expect_hci_func = client_io_cap_param_func,
  2963. .expect_hci_param = no_bonding_io_cap,
  2964. .expect_hci_len = sizeof(no_bonding_io_cap),
  2965. .io_cap = 0x03, /* NoInputNoOutput */
  2966. .client_io_cap = 0x03, /* NoInputNoOutput */
  2967. };
  2968. const uint8_t bonding_io_cap[] = { 0x03, 0x00, 0x02 };
  2969. static const struct generic_data pair_device_ssp_test_3 = {
  2970. .setup_settings = settings_powered_bondable_ssp,
  2971. .client_enable_ssp = true,
  2972. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2973. .send_func = pair_device_send_param_func,
  2974. .expect_status = MGMT_STATUS_SUCCESS,
  2975. .expect_func = pair_device_expect_param_func,
  2976. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  2977. .expect_alt_ev_len = 26,
  2978. .expect_hci_command = BT_HCI_CMD_IO_CAPABILITY_REQUEST_REPLY,
  2979. .expect_hci_func = client_io_cap_param_func,
  2980. .expect_hci_param = bonding_io_cap,
  2981. .expect_hci_len = sizeof(bonding_io_cap),
  2982. .io_cap = 0x03, /* NoInputNoOutput */
  2983. .client_io_cap = 0x03, /* NoInputNoOutput */
  2984. };
  2985. static const struct generic_data pair_device_ssp_test_4 = {
  2986. .setup_settings = settings_powered_bondable_ssp,
  2987. .client_enable_ssp = true,
  2988. .send_opcode = MGMT_OP_PAIR_DEVICE,
  2989. .send_func = pair_device_send_param_func,
  2990. .expect_status = MGMT_STATUS_SUCCESS,
  2991. .expect_func = pair_device_expect_param_func,
  2992. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  2993. .expect_alt_ev_len = 26,
  2994. .expect_hci_command = BT_HCI_CMD_USER_CONFIRM_REQUEST_REPLY,
  2995. .expect_hci_func = client_bdaddr_param_func,
  2996. .io_cap = 0x01, /* DisplayYesNo */
  2997. .client_io_cap = 0x01, /* DisplayYesNo */
  2998. };
  2999. const uint8_t mitm_no_bonding_io_cap[] = { 0x01, 0x00, 0x01 };
  3000. static const struct generic_data pair_device_ssp_test_5 = {
  3001. .setup_settings = settings_powered_ssp,
  3002. .client_enable_ssp = true,
  3003. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3004. .send_func = pair_device_send_param_func,
  3005. .expect_status = MGMT_STATUS_SUCCESS,
  3006. .expect_func = pair_device_expect_param_func,
  3007. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  3008. .expect_alt_ev_len = 26,
  3009. .expect_hci_command = BT_HCI_CMD_IO_CAPABILITY_REQUEST_REPLY,
  3010. .expect_hci_func = client_io_cap_param_func,
  3011. .expect_hci_param = mitm_no_bonding_io_cap,
  3012. .expect_hci_len = sizeof(mitm_no_bonding_io_cap),
  3013. .io_cap = 0x01, /* DisplayYesNo */
  3014. .client_io_cap = 0x01, /* DisplayYesNo */
  3015. };
  3016. const uint8_t mitm_bonding_io_cap[] = { 0x01, 0x00, 0x03 };
  3017. static const struct generic_data pair_device_ssp_test_6 = {
  3018. .setup_settings = settings_powered_bondable_ssp,
  3019. .client_enable_ssp = true,
  3020. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3021. .send_func = pair_device_send_param_func,
  3022. .expect_status = MGMT_STATUS_SUCCESS,
  3023. .expect_func = pair_device_expect_param_func,
  3024. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  3025. .expect_alt_ev_len = 26,
  3026. .expect_hci_command = BT_HCI_CMD_IO_CAPABILITY_REQUEST_REPLY,
  3027. .expect_hci_func = client_io_cap_param_func,
  3028. .expect_hci_param = mitm_bonding_io_cap,
  3029. .expect_hci_len = sizeof(mitm_bonding_io_cap),
  3030. .io_cap = 0x01, /* DisplayYesNo */
  3031. .client_io_cap = 0x01, /* DisplayYesNo */
  3032. };
  3033. static const struct generic_data pair_device_ssp_reject_1 = {
  3034. .setup_settings = settings_powered_bondable_ssp,
  3035. .client_enable_ssp = true,
  3036. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3037. .send_func = pair_device_send_param_func,
  3038. .expect_status = MGMT_STATUS_AUTH_FAILED,
  3039. .expect_func = pair_device_expect_param_func,
  3040. .expect_alt_ev = MGMT_EV_AUTH_FAILED,
  3041. .expect_alt_ev_len = 8,
  3042. .expect_hci_command = BT_HCI_CMD_USER_CONFIRM_REQUEST_NEG_REPLY,
  3043. .expect_hci_func = client_bdaddr_param_func,
  3044. .io_cap = 0x01, /* DisplayYesNo */
  3045. .client_io_cap = 0x01, /* DisplayYesNo */
  3046. .client_auth_req = 0x01, /* No Bonding - MITM */
  3047. .reject_confirm = true,
  3048. };
  3049. static const struct generic_data pair_device_ssp_reject_2 = {
  3050. .setup_settings = settings_powered_bondable_ssp,
  3051. .client_enable_ssp = true,
  3052. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3053. .send_func = pair_device_send_param_func,
  3054. .expect_status = MGMT_STATUS_AUTH_FAILED,
  3055. .expect_func = pair_device_expect_param_func,
  3056. .expect_alt_ev = MGMT_EV_AUTH_FAILED,
  3057. .expect_alt_ev_len = 8,
  3058. .expect_hci_command = BT_HCI_CMD_USER_CONFIRM_REQUEST_REPLY,
  3059. .expect_hci_func = client_bdaddr_param_func,
  3060. .io_cap = 0x01, /* DisplayYesNo */
  3061. .client_io_cap = 0x01, /* DisplayYesNo */
  3062. .client_reject_confirm = true,
  3063. };
  3064. static const struct generic_data pair_device_ssp_nonbondable_1 = {
  3065. .setup_settings = settings_powered_ssp,
  3066. .client_enable_ssp = true,
  3067. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3068. .send_func = pair_device_send_param_func,
  3069. .expect_status = MGMT_STATUS_SUCCESS,
  3070. .expect_func = pair_device_expect_param_func,
  3071. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  3072. .expect_alt_ev_len = 26,
  3073. .expect_hci_command = BT_HCI_CMD_USER_CONFIRM_REQUEST_REPLY,
  3074. .expect_hci_func = client_bdaddr_param_func,
  3075. .io_cap = 0x01, /* DisplayYesNo */
  3076. .client_io_cap = 0x01, /* DisplayYesNo */
  3077. };
  3078. static const struct generic_data pair_device_le_success_test_1 = {
  3079. .setup_settings = settings_powered_bondable,
  3080. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3081. .send_func = pair_device_send_param_func,
  3082. .just_works = true,
  3083. .expect_status = MGMT_STATUS_SUCCESS,
  3084. .expect_func = pair_device_expect_param_func,
  3085. .expect_alt_ev = MGMT_EV_NEW_LONG_TERM_KEY,
  3086. .expect_alt_ev_len = sizeof(struct mgmt_ev_new_long_term_key),
  3087. };
  3088. static bool ltk_is_authenticated(const struct mgmt_ltk_info *ltk)
  3089. {
  3090. switch (ltk->type) {
  3091. case 0x01:
  3092. case 0x03:
  3093. return true;
  3094. default:
  3095. return false;
  3096. }
  3097. }
  3098. static bool ltk_is_sc(const struct mgmt_ltk_info *ltk)
  3099. {
  3100. switch (ltk->type) {
  3101. case 0x02:
  3102. case 0x03:
  3103. case 0x04:
  3104. return true;
  3105. default:
  3106. return false;
  3107. }
  3108. }
  3109. static bool verify_ltk(const void *param, uint16_t length)
  3110. {
  3111. struct test_data *data = tester_get_data();
  3112. const struct generic_data *test = data->test_data;
  3113. const struct mgmt_ev_new_long_term_key *ev = param;
  3114. if (length != sizeof(struct mgmt_ev_new_long_term_key)) {
  3115. tester_warn("Invalid new ltk length %u != %zu", length,
  3116. sizeof(struct mgmt_ev_new_long_term_key));
  3117. return false;
  3118. }
  3119. if (test->just_works && ltk_is_authenticated(&ev->key)) {
  3120. tester_warn("Authenticated key for just-works");
  3121. return false;
  3122. }
  3123. if (!test->just_works && !ltk_is_authenticated(&ev->key)) {
  3124. tester_warn("Unauthenticated key for MITM");
  3125. return false;
  3126. }
  3127. if (test->expect_sc_key && !ltk_is_sc(&ev->key)) {
  3128. tester_warn("Non-LE SC key for SC pairing");
  3129. return false;
  3130. }
  3131. if (!test->expect_sc_key && ltk_is_sc(&ev->key)) {
  3132. tester_warn("SC key for Non-SC pairing");
  3133. return false;
  3134. }
  3135. return true;
  3136. }
  3137. static const struct generic_data pair_device_le_success_test_2 = {
  3138. .setup_settings = settings_powered_bondable,
  3139. .io_cap = 0x02, /* KeyboardOnly */
  3140. .client_io_cap = 0x04, /* KeyboardDisplay */
  3141. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3142. .send_func = pair_device_send_param_func,
  3143. .expect_status = MGMT_STATUS_SUCCESS,
  3144. .expect_func = pair_device_expect_param_func,
  3145. .expect_alt_ev = MGMT_EV_NEW_LONG_TERM_KEY,
  3146. .expect_alt_ev_len = sizeof(struct mgmt_ev_new_long_term_key),
  3147. .verify_alt_ev_func = verify_ltk,
  3148. };
  3149. static uint16_t settings_powered_sc_bondable_le_ssp[] = {
  3150. MGMT_OP_SET_BONDABLE,
  3151. MGMT_OP_SET_LE,
  3152. MGMT_OP_SET_SSP,
  3153. MGMT_OP_SET_SECURE_CONN,
  3154. MGMT_OP_SET_POWERED,
  3155. 0 };
  3156. static const struct generic_data pair_device_smp_bredr_test_1 = {
  3157. .setup_settings = settings_powered_sc_bondable_le_ssp,
  3158. .client_enable_ssp = true,
  3159. .client_enable_le = true,
  3160. .client_enable_sc = true,
  3161. .expect_sc_key = true,
  3162. .just_works = true,
  3163. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3164. .send_func = pair_device_send_param_func,
  3165. .expect_status = MGMT_STATUS_SUCCESS,
  3166. .expect_func = pair_device_expect_param_func,
  3167. .expect_alt_ev = MGMT_EV_NEW_LONG_TERM_KEY,
  3168. .expect_alt_ev_len = sizeof(struct mgmt_ev_new_long_term_key),
  3169. .verify_alt_ev_func = verify_ltk,
  3170. .expect_hci_command = BT_HCI_CMD_USER_CONFIRM_REQUEST_REPLY,
  3171. .expect_hci_func = client_bdaddr_param_func,
  3172. .io_cap = 0x03, /* NoInputNoOutput */
  3173. .client_io_cap = 0x03, /* NoInputNoOutput */
  3174. };
  3175. static const struct generic_data pair_device_smp_bredr_test_2 = {
  3176. .setup_settings = settings_powered_sc_bondable_le_ssp,
  3177. .client_enable_ssp = true,
  3178. .client_enable_le = true,
  3179. .client_enable_sc = true,
  3180. .expect_sc_key = true,
  3181. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3182. .send_func = pair_device_send_param_func,
  3183. .expect_status = MGMT_STATUS_SUCCESS,
  3184. .expect_func = pair_device_expect_param_func,
  3185. .expect_alt_ev = MGMT_EV_NEW_LONG_TERM_KEY,
  3186. .expect_alt_ev_len = sizeof(struct mgmt_ev_new_long_term_key),
  3187. .verify_alt_ev_func = verify_ltk,
  3188. .expect_hci_command = BT_HCI_CMD_USER_CONFIRM_REQUEST_REPLY,
  3189. .expect_hci_func = client_bdaddr_param_func,
  3190. .io_cap = 0x01, /* DisplayYesNo */
  3191. .client_io_cap = 0x01, /* DisplayYesNo */
  3192. };
  3193. static const struct generic_data pair_device_le_reject_test_1 = {
  3194. .setup_settings = settings_powered_bondable,
  3195. .io_cap = 0x02, /* KeyboardOnly */
  3196. .client_io_cap = 0x04, /* KeyboardDisplay */
  3197. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3198. .send_func = pair_device_send_param_func,
  3199. .expect_status = MGMT_STATUS_AUTH_FAILED,
  3200. .expect_func = pair_device_expect_param_func,
  3201. .expect_alt_ev = MGMT_EV_AUTH_FAILED,
  3202. .expect_alt_ev_len = sizeof(struct mgmt_ev_auth_failed),
  3203. .reject_confirm = true,
  3204. };
  3205. static uint16_t settings_powered_sc_bondable[] = { MGMT_OP_SET_BONDABLE,
  3206. MGMT_OP_SET_SECURE_CONN,
  3207. MGMT_OP_SET_POWERED, 0 };
  3208. static const struct generic_data pair_device_le_sc_legacy_test_1 = {
  3209. .setup_settings = settings_powered_sc_bondable,
  3210. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3211. .send_func = pair_device_send_param_func,
  3212. .just_works = true,
  3213. .expect_status = MGMT_STATUS_SUCCESS,
  3214. .expect_func = pair_device_expect_param_func,
  3215. .expect_alt_ev = MGMT_EV_NEW_LONG_TERM_KEY,
  3216. .expect_alt_ev_len = sizeof(struct mgmt_ev_new_long_term_key),
  3217. .verify_alt_ev_func = verify_ltk,
  3218. };
  3219. static const struct generic_data pair_device_le_sc_success_test_1 = {
  3220. .setup_settings = settings_powered_sc_bondable,
  3221. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3222. .send_func = pair_device_send_param_func,
  3223. .just_works = true,
  3224. .client_enable_sc = true,
  3225. .expect_sc_key = true,
  3226. .expect_status = MGMT_STATUS_SUCCESS,
  3227. .expect_func = pair_device_expect_param_func,
  3228. .expect_alt_ev = MGMT_EV_NEW_LONG_TERM_KEY,
  3229. .expect_alt_ev_len = sizeof(struct mgmt_ev_new_long_term_key),
  3230. .verify_alt_ev_func = verify_ltk,
  3231. };
  3232. static const struct generic_data pair_device_le_sc_success_test_2 = {
  3233. .setup_settings = settings_powered_sc_bondable,
  3234. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3235. .send_func = pair_device_send_param_func,
  3236. .client_enable_sc = true,
  3237. .expect_sc_key = true,
  3238. .io_cap = 0x02, /* KeyboardOnly */
  3239. .client_io_cap = 0x02, /* KeyboardOnly */
  3240. .expect_status = MGMT_STATUS_SUCCESS,
  3241. .expect_func = pair_device_expect_param_func,
  3242. .expect_alt_ev = MGMT_EV_NEW_LONG_TERM_KEY,
  3243. .expect_alt_ev_len = sizeof(struct mgmt_ev_new_long_term_key),
  3244. .verify_alt_ev_func = verify_ltk,
  3245. };
  3246. static bool lk_is_authenticated(const struct mgmt_link_key_info *lk)
  3247. {
  3248. switch (lk->type) {
  3249. case 0x00: /* Combination Key */
  3250. case 0x01: /* Local Unit Key */
  3251. case 0x02: /* Remote Unit Key */
  3252. case 0x03: /* Debug Combination Key */
  3253. if (lk->pin_len == 16)
  3254. return true;
  3255. return false;
  3256. case 0x05: /* Authenticated Combination Key generated from P-192 */
  3257. case 0x08: /* Authenticated Combination Key generated from P-256 */
  3258. return true;
  3259. default:
  3260. return false;
  3261. }
  3262. }
  3263. static bool lk_is_sc(const struct mgmt_link_key_info *lk)
  3264. {
  3265. switch (lk->type) {
  3266. case 0x07: /* Unauthenticated Combination Key generated from P-256 */
  3267. case 0x08: /* Authenticated Combination Key generated from P-256 */
  3268. return true;
  3269. default:
  3270. return false;
  3271. }
  3272. }
  3273. static bool verify_link_key(const void *param, uint16_t length)
  3274. {
  3275. struct test_data *data = tester_get_data();
  3276. const struct generic_data *test = data->test_data;
  3277. const struct mgmt_ev_new_link_key *ev = param;
  3278. if (length != sizeof(struct mgmt_ev_new_link_key)) {
  3279. tester_warn("Invalid new Link Key length %u != %zu", length,
  3280. sizeof(struct mgmt_ev_new_link_key));
  3281. return false;
  3282. }
  3283. if (test->just_works && lk_is_authenticated(&ev->key)) {
  3284. tester_warn("Authenticated key for just-works");
  3285. return false;
  3286. }
  3287. if (!test->just_works && !lk_is_authenticated(&ev->key)) {
  3288. tester_warn("Unauthenticated key for MITM");
  3289. return false;
  3290. }
  3291. if (test->expect_sc_key && !lk_is_sc(&ev->key)) {
  3292. tester_warn("Non-LE SC key for SC pairing");
  3293. return false;
  3294. }
  3295. if (!test->expect_sc_key && lk_is_sc(&ev->key)) {
  3296. tester_warn("SC key for Non-SC pairing");
  3297. return false;
  3298. }
  3299. return true;
  3300. }
  3301. static uint16_t settings_powered_le_sc_bondable[] = {
  3302. MGMT_OP_SET_LE,
  3303. MGMT_OP_SET_SSP,
  3304. MGMT_OP_SET_BONDABLE,
  3305. MGMT_OP_SET_SECURE_CONN,
  3306. MGMT_OP_SET_POWERED, 0 };
  3307. static const struct generic_data pair_device_le_sc_success_test_3 = {
  3308. .setup_settings = settings_powered_le_sc_bondable,
  3309. .send_opcode = MGMT_OP_PAIR_DEVICE,
  3310. .send_func = pair_device_send_param_func,
  3311. .addr_type_avail = true,
  3312. .addr_type = 0x01,
  3313. .client_enable_sc = true,
  3314. .client_enable_ssp = true,
  3315. .client_enable_adv = true,
  3316. .expect_sc_key = true,
  3317. .io_cap = 0x02, /* KeyboardOnly */
  3318. .client_io_cap = 0x02, /* KeyboardOnly */
  3319. .expect_status = MGMT_STATUS_SUCCESS,
  3320. .expect_func = pair_device_expect_param_func,
  3321. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  3322. .expect_alt_ev_len = 26,
  3323. .verify_alt_ev_func = verify_link_key,
  3324. };
  3325. static uint16_t settings_powered_connectable_bondable[] = {
  3326. MGMT_OP_SET_BONDABLE,
  3327. MGMT_OP_SET_CONNECTABLE,
  3328. MGMT_OP_SET_POWERED, 0 };
  3329. static const struct generic_data pairing_acceptor_legacy_1 = {
  3330. .setup_settings = settings_powered_connectable_bondable,
  3331. .pin = pair_device_pin,
  3332. .pin_len = sizeof(pair_device_pin),
  3333. .client_pin = pair_device_pin,
  3334. .client_pin_len = sizeof(pair_device_pin),
  3335. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  3336. .expect_alt_ev_len = 26,
  3337. };
  3338. static const struct generic_data pairing_acceptor_legacy_2 = {
  3339. .setup_settings = settings_powered_connectable_bondable,
  3340. .expect_pin = true,
  3341. .client_pin = pair_device_pin,
  3342. .client_pin_len = sizeof(pair_device_pin),
  3343. .expect_alt_ev = MGMT_EV_AUTH_FAILED,
  3344. .expect_alt_ev_len = 8,
  3345. };
  3346. static const struct generic_data pairing_acceptor_legacy_3 = {
  3347. .setup_settings = settings_powered_connectable,
  3348. .client_pin = pair_device_pin,
  3349. .client_pin_len = sizeof(pair_device_pin),
  3350. .expect_alt_ev = MGMT_EV_AUTH_FAILED,
  3351. .expect_alt_ev_len = 8,
  3352. .expect_hci_command = BT_HCI_CMD_PIN_CODE_REQUEST_NEG_REPLY,
  3353. .expect_hci_func = client_bdaddr_param_func,
  3354. };
  3355. static uint16_t settings_powered_connectable_bondable_linksec[] = {
  3356. MGMT_OP_SET_BONDABLE,
  3357. MGMT_OP_SET_CONNECTABLE,
  3358. MGMT_OP_SET_LINK_SECURITY,
  3359. MGMT_OP_SET_POWERED, 0 };
  3360. static const struct generic_data pairing_acceptor_linksec_1 = {
  3361. .setup_settings = settings_powered_connectable_bondable_linksec,
  3362. .pin = pair_device_pin,
  3363. .pin_len = sizeof(pair_device_pin),
  3364. .client_pin = pair_device_pin,
  3365. .client_pin_len = sizeof(pair_device_pin),
  3366. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  3367. .expect_alt_ev_len = 26,
  3368. };
  3369. static const struct generic_data pairing_acceptor_linksec_2 = {
  3370. .setup_settings = settings_powered_connectable_bondable_linksec,
  3371. .expect_pin = true,
  3372. .client_pin = pair_device_pin,
  3373. .client_pin_len = sizeof(pair_device_pin),
  3374. .expect_alt_ev = MGMT_EV_CONNECT_FAILED,
  3375. .expect_alt_ev_len = 8,
  3376. };
  3377. static uint16_t settings_powered_connectable_bondable_ssp[] = {
  3378. MGMT_OP_SET_BONDABLE,
  3379. MGMT_OP_SET_CONNECTABLE,
  3380. MGMT_OP_SET_SSP,
  3381. MGMT_OP_SET_POWERED, 0 };
  3382. static const struct generic_data pairing_acceptor_ssp_1 = {
  3383. .setup_settings = settings_powered_connectable_bondable_ssp,
  3384. .client_enable_ssp = true,
  3385. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  3386. .expect_alt_ev_len = 26,
  3387. .expect_hci_command = BT_HCI_CMD_USER_CONFIRM_REQUEST_REPLY,
  3388. .expect_hci_func = client_bdaddr_param_func,
  3389. .io_cap = 0x03, /* NoInputNoOutput */
  3390. .client_io_cap = 0x03, /* NoInputNoOutput */
  3391. .just_works = true,
  3392. };
  3393. static const struct generic_data pairing_acceptor_ssp_2 = {
  3394. .setup_settings = settings_powered_connectable_bondable_ssp,
  3395. .client_enable_ssp = true,
  3396. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  3397. .expect_alt_ev_len = 26,
  3398. .expect_hci_command = BT_HCI_CMD_USER_CONFIRM_REQUEST_REPLY,
  3399. .expect_hci_func = client_bdaddr_param_func,
  3400. .io_cap = 0x01, /* DisplayYesNo */
  3401. .client_io_cap = 0x01, /* DisplayYesNo */
  3402. };
  3403. static const struct generic_data pairing_acceptor_ssp_3 = {
  3404. .setup_settings = settings_powered_connectable_bondable_ssp,
  3405. .client_enable_ssp = true,
  3406. .expect_alt_ev = MGMT_EV_NEW_LINK_KEY,
  3407. .expect_alt_ev_len = 26,
  3408. .expect_hci_command = BT_HCI_CMD_USER_CONFIRM_REQUEST_REPLY,
  3409. .expect_hci_func = client_bdaddr_param_func,
  3410. .io_cap = 0x01, /* DisplayYesNo */
  3411. .client_io_cap = 0x01, /* DisplayYesNo */
  3412. .just_works = true,
  3413. };
  3414. static const void *client_io_cap_reject_param_func(uint8_t *len)
  3415. {
  3416. struct test_data *data = tester_get_data();
  3417. static uint8_t param[7];
  3418. memcpy(param, hciemu_get_client_bdaddr(data->hciemu), 6);
  3419. param[6] = 0x18; /* Pairing Not Allowed */
  3420. *len = sizeof(param);
  3421. return param;
  3422. }
  3423. static uint16_t settings_powered_connectable_ssp[] = {
  3424. MGMT_OP_SET_CONNECTABLE,
  3425. MGMT_OP_SET_SSP,
  3426. MGMT_OP_SET_POWERED, 0 };
  3427. static const struct generic_data pairing_acceptor_ssp_4 = {
  3428. .setup_settings = settings_powered_connectable_ssp,
  3429. .client_enable_ssp = true,
  3430. .expect_alt_ev = MGMT_EV_AUTH_FAILED,
  3431. .expect_alt_ev_len = 8,
  3432. .expect_hci_command = BT_HCI_CMD_IO_CAPABILITY_REQUEST_NEG_REPLY,
  3433. .expect_hci_func = client_io_cap_reject_param_func,
  3434. .io_cap = 0x01, /* DisplayYesNo */
  3435. .client_io_cap = 0x01, /* DisplayYesNo */
  3436. .client_auth_req = 0x02, /* Dedicated Bonding - No MITM */
  3437. };
  3438. static uint16_t settings_powered_sc_bondable_connectable_le_ssp[] = {
  3439. MGMT_OP_SET_BONDABLE,
  3440. MGMT_OP_SET_CONNECTABLE,
  3441. MGMT_OP_SET_LE,
  3442. MGMT_OP_SET_SSP,
  3443. MGMT_OP_SET_SECURE_CONN,
  3444. MGMT_OP_SET_POWERED,
  3445. 0 };
  3446. static const struct generic_data pairing_acceptor_smp_bredr_1 = {
  3447. .setup_settings = settings_powered_sc_bondable_connectable_le_ssp,
  3448. .client_enable_ssp = true,
  3449. .client_enable_le = true,
  3450. .client_enable_sc = true,
  3451. .expect_sc_key = true,
  3452. .expect_alt_ev = MGMT_EV_NEW_LONG_TERM_KEY,
  3453. .expect_alt_ev_len = sizeof(struct mgmt_ev_new_long_term_key),
  3454. .verify_alt_ev_func = verify_ltk,
  3455. .just_works = true,
  3456. .io_cap = 0x03, /* NoInputNoOutput */
  3457. .client_io_cap = 0x03, /* No InputNoOutput */
  3458. .client_auth_req = 0x00, /* No Bonding - No MITM */
  3459. };
  3460. static const struct generic_data pairing_acceptor_smp_bredr_2 = {
  3461. .setup_settings = settings_powered_sc_bondable_connectable_le_ssp,
  3462. .client_enable_ssp = true,
  3463. .client_enable_le = true,
  3464. .client_enable_sc = true,
  3465. .expect_sc_key = true,
  3466. .expect_alt_ev = MGMT_EV_NEW_LONG_TERM_KEY,
  3467. .expect_alt_ev_len = sizeof(struct mgmt_ev_new_long_term_key),
  3468. .verify_alt_ev_func = verify_ltk,
  3469. .io_cap = 0x01, /* DisplayYesNo */
  3470. .client_io_cap = 0x01, /* DisplayYesNo */
  3471. .client_auth_req = 0x02, /* Dedicated Bonding - No MITM */
  3472. };
  3473. static uint16_t settings_powered_bondable_connectable_advertising[] = {
  3474. MGMT_OP_SET_BONDABLE,
  3475. MGMT_OP_SET_CONNECTABLE,
  3476. MGMT_OP_SET_ADVERTISING,
  3477. MGMT_OP_SET_POWERED, 0 };
  3478. static const struct generic_data pairing_acceptor_le_1 = {
  3479. .setup_settings = settings_powered_bondable_connectable_advertising,
  3480. .io_cap = 0x03, /* NoInputNoOutput */
  3481. .client_io_cap = 0x03, /* NoInputNoOutput */
  3482. .just_works = true,
  3483. .expect_alt_ev = MGMT_EV_NEW_LONG_TERM_KEY,
  3484. .expect_alt_ev_len = sizeof(struct mgmt_ev_new_long_term_key),
  3485. .verify_alt_ev_func = verify_ltk,
  3486. };
  3487. static const struct generic_data pairing_acceptor_le_2 = {
  3488. .setup_settings = settings_powered_bondable_connectable_advertising,
  3489. .io_cap = 0x04, /* KeyboardDisplay */
  3490. .client_io_cap = 0x04, /* KeyboardDisplay */
  3491. .client_auth_req = 0x05, /* Bonding - MITM */
  3492. .expect_alt_ev = MGMT_EV_NEW_LONG_TERM_KEY,
  3493. .expect_alt_ev_len = sizeof(struct mgmt_ev_new_long_term_key),
  3494. .verify_alt_ev_func = verify_ltk,
  3495. };
  3496. static const struct generic_data pairing_acceptor_le_3 = {
  3497. .setup_settings = settings_powered_bondable_connectable_advertising,
  3498. .io_cap = 0x04, /* KeyboardDisplay */
  3499. .client_io_cap = 0x04, /* KeyboardDisplay */
  3500. .expect_alt_ev = MGMT_EV_AUTH_FAILED,
  3501. .expect_alt_ev_len = sizeof(struct mgmt_ev_auth_failed),
  3502. .reject_confirm = true,
  3503. };
  3504. static const struct generic_data pairing_acceptor_le_4 = {
  3505. .setup_settings = settings_powered_bondable_connectable_advertising,
  3506. .io_cap = 0x02, /* KeyboardOnly */
  3507. .client_io_cap = 0x04, /* KeyboardDisplay */
  3508. .client_auth_req = 0x05, /* Bonding - MITM */
  3509. .expect_alt_ev = MGMT_EV_NEW_LONG_TERM_KEY,
  3510. .expect_alt_ev_len = sizeof(struct mgmt_ev_new_long_term_key),
  3511. .verify_alt_ev_func = verify_ltk,
  3512. };
  3513. static const struct generic_data pairing_acceptor_le_5 = {
  3514. .setup_settings = settings_powered_bondable_connectable_advertising,
  3515. .io_cap = 0x02, /* KeyboardOnly */
  3516. .client_io_cap = 0x04, /* KeyboardDisplay */
  3517. .client_auth_req = 0x05, /* Bonding - MITM */
  3518. .reject_confirm = true,
  3519. .expect_alt_ev = MGMT_EV_AUTH_FAILED,
  3520. .expect_alt_ev_len = sizeof(struct mgmt_ev_auth_failed),
  3521. };
  3522. static const char unpair_device_param[] = {
  3523. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x00 };
  3524. static const char unpair_device_rsp[] = {
  3525. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00 };
  3526. static const char unpair_device_invalid_param_1[] = {
  3527. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff, 0x00 };
  3528. static const char unpair_device_invalid_param_rsp_1[] = {
  3529. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff };
  3530. static const char unpair_device_invalid_param_2[] = {
  3531. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x02 };
  3532. static const char unpair_device_invalid_param_rsp_2[] = {
  3533. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00 };
  3534. static const struct generic_data unpair_device_not_powered_test_1 = {
  3535. .send_opcode = MGMT_OP_UNPAIR_DEVICE,
  3536. .send_param = unpair_device_param,
  3537. .send_len = sizeof(unpair_device_param),
  3538. .expect_status = MGMT_STATUS_NOT_POWERED,
  3539. .expect_param = unpair_device_rsp,
  3540. .expect_len = sizeof(unpair_device_rsp),
  3541. };
  3542. static const struct generic_data unpair_device_invalid_param_test_1 = {
  3543. .send_opcode = MGMT_OP_UNPAIR_DEVICE,
  3544. .send_param = unpair_device_invalid_param_1,
  3545. .send_len = sizeof(unpair_device_invalid_param_1),
  3546. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3547. .expect_param = unpair_device_invalid_param_rsp_1,
  3548. .expect_len = sizeof(unpair_device_invalid_param_rsp_1),
  3549. };
  3550. static const struct generic_data unpair_device_invalid_param_test_2 = {
  3551. .send_opcode = MGMT_OP_UNPAIR_DEVICE,
  3552. .send_param = unpair_device_invalid_param_2,
  3553. .send_len = sizeof(unpair_device_invalid_param_2),
  3554. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3555. .expect_param = unpair_device_invalid_param_rsp_2,
  3556. .expect_len = sizeof(unpair_device_invalid_param_rsp_2),
  3557. };
  3558. static const char disconnect_invalid_param_1[] = {
  3559. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff };
  3560. static const char disconnect_invalid_param_rsp_1[] = {
  3561. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff };
  3562. static const struct generic_data disconnect_invalid_param_test_1 = {
  3563. .send_opcode = MGMT_OP_DISCONNECT,
  3564. .send_param = disconnect_invalid_param_1,
  3565. .send_len = sizeof(disconnect_invalid_param_1),
  3566. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3567. .expect_param = disconnect_invalid_param_rsp_1,
  3568. .expect_len = sizeof(disconnect_invalid_param_rsp_1),
  3569. };
  3570. static const char block_device_invalid_param_1[] = {
  3571. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff };
  3572. static const char block_device_invalid_param_rsp_1[] = {
  3573. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff };
  3574. static const struct generic_data block_device_invalid_param_test_1 = {
  3575. .send_opcode = MGMT_OP_BLOCK_DEVICE,
  3576. .send_param = block_device_invalid_param_1,
  3577. .send_len = sizeof(block_device_invalid_param_1),
  3578. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3579. .expect_param = block_device_invalid_param_rsp_1,
  3580. .expect_len = sizeof(block_device_invalid_param_rsp_1),
  3581. };
  3582. static const char unblock_device_invalid_param_1[] = {
  3583. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff };
  3584. static const char unblock_device_invalid_param_rsp_1[] = {
  3585. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff };
  3586. static const struct generic_data unblock_device_invalid_param_test_1 = {
  3587. .send_opcode = MGMT_OP_UNBLOCK_DEVICE,
  3588. .send_param = unblock_device_invalid_param_1,
  3589. .send_len = sizeof(unblock_device_invalid_param_1),
  3590. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3591. .expect_param = unblock_device_invalid_param_rsp_1,
  3592. .expect_len = sizeof(unblock_device_invalid_param_rsp_1),
  3593. };
  3594. static const char set_static_addr_valid_param[] = {
  3595. 0x11, 0x22, 0x33, 0x44, 0x55, 0xc0 };
  3596. static const char set_static_addr_settings[] = { 0x00, 0x82, 0x00, 0x00 };
  3597. static const struct generic_data set_static_addr_success_test = {
  3598. .send_opcode = MGMT_OP_SET_STATIC_ADDRESS,
  3599. .send_param = set_static_addr_valid_param,
  3600. .send_len = sizeof(set_static_addr_valid_param),
  3601. .expect_status = MGMT_STATUS_SUCCESS,
  3602. .expect_param = set_static_addr_settings,
  3603. .expect_len = sizeof(set_static_addr_settings),
  3604. .expect_settings_set = MGMT_SETTING_STATIC_ADDRESS,
  3605. };
  3606. static const char set_static_addr_settings_dual[] = { 0x80, 0x00, 0x00, 0x00 };
  3607. static const struct generic_data set_static_addr_success_test_2 = {
  3608. .send_opcode = MGMT_OP_SET_STATIC_ADDRESS,
  3609. .send_param = set_static_addr_valid_param,
  3610. .send_len = sizeof(set_static_addr_valid_param),
  3611. .expect_status = MGMT_STATUS_SUCCESS,
  3612. .expect_param = set_static_addr_settings_dual,
  3613. .expect_len = sizeof(set_static_addr_settings_dual),
  3614. };
  3615. static const struct generic_data set_static_addr_failure_test = {
  3616. .setup_settings = settings_powered,
  3617. .send_opcode = MGMT_OP_SET_STATIC_ADDRESS,
  3618. .send_param = set_static_addr_valid_param,
  3619. .send_len = sizeof(set_static_addr_valid_param),
  3620. .expect_status = MGMT_STATUS_REJECTED,
  3621. };
  3622. static const struct generic_data set_static_addr_failure_test_2 = {
  3623. .setup_settings = settings_powered,
  3624. .send_opcode = MGMT_OP_SET_STATIC_ADDRESS,
  3625. .send_param = set_static_addr_valid_param,
  3626. .send_len = sizeof(set_static_addr_valid_param),
  3627. .expect_status = MGMT_STATUS_NOT_SUPPORTED,
  3628. };
  3629. static const char set_scan_params_valid_param[] = { 0x60, 0x00, 0x30, 0x00 };
  3630. static const struct generic_data set_scan_params_success_test = {
  3631. .send_opcode = MGMT_OP_SET_SCAN_PARAMS,
  3632. .send_param = set_scan_params_valid_param,
  3633. .send_len = sizeof(set_scan_params_valid_param),
  3634. .expect_status = MGMT_STATUS_SUCCESS,
  3635. };
  3636. static const char load_irks_empty_list[] = { 0x00, 0x00 };
  3637. static const struct generic_data load_irks_success1_test = {
  3638. .send_opcode = MGMT_OP_LOAD_IRKS,
  3639. .send_param = load_irks_empty_list,
  3640. .send_len = sizeof(load_irks_empty_list),
  3641. .expect_status = MGMT_STATUS_SUCCESS,
  3642. };
  3643. static const char load_irks_one_irk[] = { 0x01, 0x00,
  3644. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x01,
  3645. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  3646. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
  3647. static const struct generic_data load_irks_success2_test = {
  3648. .send_opcode = MGMT_OP_LOAD_IRKS,
  3649. .send_param = load_irks_one_irk,
  3650. .send_len = sizeof(load_irks_one_irk),
  3651. .expect_status = MGMT_STATUS_SUCCESS,
  3652. };
  3653. static const char load_irks_nval_addr_type[] = { 0x01, 0x00,
  3654. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00,
  3655. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  3656. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
  3657. static const struct generic_data load_irks_nval_param1_test = {
  3658. .send_opcode = MGMT_OP_LOAD_IRKS,
  3659. .send_param = load_irks_nval_addr_type,
  3660. .send_len = sizeof(load_irks_nval_addr_type),
  3661. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3662. };
  3663. static const char load_irks_nval_rand_addr[] = { 0x01, 0x00,
  3664. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x02,
  3665. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  3666. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
  3667. static const struct generic_data load_irks_nval_param2_test = {
  3668. .send_opcode = MGMT_OP_LOAD_IRKS,
  3669. .send_param = load_irks_nval_rand_addr,
  3670. .send_len = sizeof(load_irks_nval_rand_addr),
  3671. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3672. };
  3673. static const char load_irks_nval_len[] = { 0x02, 0x00, 0xff, 0xff };
  3674. static const struct generic_data load_irks_nval_param3_test = {
  3675. .send_opcode = MGMT_OP_LOAD_IRKS,
  3676. .send_param = load_irks_nval_len,
  3677. .send_len = sizeof(load_irks_nval_len),
  3678. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3679. };
  3680. static const struct generic_data load_irks_not_supported_test = {
  3681. .send_opcode = MGMT_OP_LOAD_IRKS,
  3682. .send_param = load_irks_empty_list,
  3683. .send_len = sizeof(load_irks_empty_list),
  3684. .expect_status = MGMT_STATUS_NOT_SUPPORTED,
  3685. };
  3686. static const char set_privacy_valid_param[] = { 0x01,
  3687. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  3688. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
  3689. static const char set_privacy_settings_param[] = { 0x80, 0x20, 0x00, 0x00 };
  3690. static const struct generic_data set_privacy_success_test = {
  3691. .send_opcode = MGMT_OP_SET_PRIVACY,
  3692. .send_param = set_privacy_valid_param,
  3693. .send_len = sizeof(set_privacy_valid_param),
  3694. .expect_status = MGMT_STATUS_SUCCESS,
  3695. .expect_param = set_privacy_settings_param,
  3696. .expect_len = sizeof(set_privacy_settings_param),
  3697. .expect_settings_set = MGMT_SETTING_PRIVACY,
  3698. };
  3699. static const struct generic_data set_privacy_powered_test = {
  3700. .setup_settings = settings_powered,
  3701. .send_opcode = MGMT_OP_SET_PRIVACY,
  3702. .send_param = set_privacy_valid_param,
  3703. .send_len = sizeof(set_privacy_valid_param),
  3704. .expect_status = MGMT_STATUS_REJECTED,
  3705. };
  3706. static const char set_privacy_nval_param[] = { 0xff,
  3707. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  3708. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
  3709. static const struct generic_data set_privacy_nval_param_test = {
  3710. .send_opcode = MGMT_OP_SET_PRIVACY,
  3711. .send_param = set_privacy_nval_param,
  3712. .send_len = sizeof(set_privacy_nval_param),
  3713. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3714. };
  3715. static const void *get_clock_info_send_param_func(uint16_t *len)
  3716. {
  3717. struct test_data *data = tester_get_data();
  3718. static uint8_t param[7];
  3719. memcpy(param, hciemu_get_client_bdaddr(data->hciemu), 6);
  3720. param[6] = 0x00; /* Address type */
  3721. *len = sizeof(param);
  3722. return param;
  3723. }
  3724. static const void *get_clock_info_expect_param_func(uint16_t *len)
  3725. {
  3726. struct test_data *data = tester_get_data();
  3727. static uint8_t param[17];
  3728. struct mgmt_rp_get_clock_info *rp;
  3729. rp = (struct mgmt_rp_get_clock_info *)param;
  3730. memset(param, 0, sizeof(param));
  3731. memcpy(param, hciemu_get_client_bdaddr(data->hciemu), 6);
  3732. param[6] = 0x00; /* Address type */
  3733. rp->local_clock = 0x11223344;
  3734. rp->piconet_clock = 0x11223344;
  3735. rp->accuracy = 0x5566;
  3736. *len = sizeof(param);
  3737. return param;
  3738. }
  3739. static const void *get_clock_info_expect_param_not_powered_func(uint16_t *len)
  3740. {
  3741. struct test_data *data = tester_get_data();
  3742. static uint8_t param[17];
  3743. memset(param, 0, sizeof(param));
  3744. memcpy(param, hciemu_get_client_bdaddr(data->hciemu), 6);
  3745. param[6] = 0x00; /* Address type */
  3746. *len = sizeof(param);
  3747. return param;
  3748. }
  3749. static const void *get_conn_info_send_param_func(uint16_t *len)
  3750. {
  3751. struct test_data *data = tester_get_data();
  3752. static uint8_t param[7];
  3753. memcpy(param, hciemu_get_client_bdaddr(data->hciemu), 6);
  3754. param[6] = 0x00; /* Address type */
  3755. *len = sizeof(param);
  3756. return param;
  3757. }
  3758. static const void *get_conn_info_expect_param_func(uint16_t *len)
  3759. {
  3760. struct test_data *data = tester_get_data();
  3761. static uint8_t param[10];
  3762. memcpy(param, hciemu_get_client_bdaddr(data->hciemu), 6);
  3763. param[6] = 0x00; /* Address type */
  3764. param[7] = 0xff; /* RSSI (= -1) */
  3765. param[8] = 0xff; /* TX power (= -1) */
  3766. param[9] = 0x04; /* max TX power */
  3767. *len = sizeof(param);
  3768. return param;
  3769. }
  3770. static const void *get_conn_info_error_expect_param_func(uint16_t *len)
  3771. {
  3772. struct test_data *data = tester_get_data();
  3773. static uint8_t param[10];
  3774. /* All unset parameters shall be 0 in case of error */
  3775. memset(param, 0, sizeof(param));
  3776. memcpy(param, hciemu_get_client_bdaddr(data->hciemu), 6);
  3777. param[6] = 0x00; /* Address type */
  3778. *len = sizeof(param);
  3779. return param;
  3780. }
  3781. static const struct generic_data get_clock_info_succes1_test = {
  3782. .setup_settings = settings_powered_connectable_bondable_ssp,
  3783. .send_opcode = MGMT_OP_GET_CLOCK_INFO,
  3784. .send_func = get_clock_info_send_param_func,
  3785. .expect_status = MGMT_STATUS_SUCCESS,
  3786. .expect_func = get_clock_info_expect_param_func,
  3787. };
  3788. static const struct generic_data get_clock_info_fail1_test = {
  3789. .send_opcode = MGMT_OP_GET_CLOCK_INFO,
  3790. .send_func = get_clock_info_send_param_func,
  3791. .expect_status = MGMT_STATUS_NOT_POWERED,
  3792. .expect_func = get_clock_info_expect_param_not_powered_func,
  3793. };
  3794. static const struct generic_data get_conn_info_succes1_test = {
  3795. .setup_settings = settings_powered_connectable_bondable_ssp,
  3796. .send_opcode = MGMT_OP_GET_CONN_INFO,
  3797. .send_func = get_conn_info_send_param_func,
  3798. .expect_status = MGMT_STATUS_SUCCESS,
  3799. .expect_func = get_conn_info_expect_param_func,
  3800. };
  3801. static const struct generic_data get_conn_info_ncon_test = {
  3802. .setup_settings = settings_powered_connectable_bondable_ssp,
  3803. .send_opcode = MGMT_OP_GET_CONN_INFO,
  3804. .send_func = get_conn_info_send_param_func,
  3805. .expect_status = MGMT_STATUS_NOT_CONNECTED,
  3806. .expect_func = get_conn_info_error_expect_param_func,
  3807. };
  3808. static const void *get_conn_info_expect_param_power_off_func(uint16_t *len)
  3809. {
  3810. struct test_data *data = tester_get_data();
  3811. static uint8_t param[10];
  3812. memcpy(param, hciemu_get_client_bdaddr(data->hciemu), 6);
  3813. param[6] = 0x00; /* Address type */
  3814. param[7] = 127; /* RSSI */
  3815. param[8] = 127; /* TX power */
  3816. param[9] = 127; /* max TX power */
  3817. *len = sizeof(param);
  3818. return param;
  3819. }
  3820. static const struct generic_data get_conn_info_power_off_test = {
  3821. .setup_settings = settings_powered_connectable_bondable_ssp,
  3822. .send_opcode = MGMT_OP_GET_CONN_INFO,
  3823. .send_func = get_conn_info_send_param_func,
  3824. .force_power_off = true,
  3825. .expect_status = MGMT_STATUS_NOT_POWERED,
  3826. .expect_func = get_conn_info_expect_param_power_off_func,
  3827. .fail_tolerant = true,
  3828. };
  3829. static const uint8_t load_conn_param_nval_1[16] = { 0x12, 0x11 };
  3830. static const struct generic_data load_conn_params_fail_1 = {
  3831. .send_opcode = MGMT_OP_LOAD_CONN_PARAM,
  3832. .send_param = load_conn_param_nval_1,
  3833. .send_len = sizeof(load_conn_param_nval_1),
  3834. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3835. };
  3836. static const uint8_t add_device_nval_1[] = {
  3837. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  3838. 0x00,
  3839. 0x00,
  3840. };
  3841. static const uint8_t add_device_rsp[] = {
  3842. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  3843. 0x00,
  3844. };
  3845. static const struct generic_data add_device_fail_1 = {
  3846. .send_opcode = MGMT_OP_ADD_DEVICE,
  3847. .send_param = add_device_nval_1,
  3848. .send_len = sizeof(add_device_nval_1),
  3849. .expect_param = add_device_rsp,
  3850. .expect_len = sizeof(add_device_rsp),
  3851. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3852. };
  3853. static const uint8_t add_device_nval_2[] = {
  3854. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  3855. 0x00,
  3856. 0x02,
  3857. };
  3858. static const struct generic_data add_device_fail_2 = {
  3859. .send_opcode = MGMT_OP_ADD_DEVICE,
  3860. .send_param = add_device_nval_2,
  3861. .send_len = sizeof(add_device_nval_2),
  3862. .expect_param = add_device_rsp,
  3863. .expect_len = sizeof(add_device_rsp),
  3864. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3865. };
  3866. static const uint8_t add_device_nval_3[] = {
  3867. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  3868. 0x00,
  3869. 0xff,
  3870. };
  3871. static const struct generic_data add_device_fail_3 = {
  3872. .send_opcode = MGMT_OP_ADD_DEVICE,
  3873. .send_param = add_device_nval_3,
  3874. .send_len = sizeof(add_device_nval_3),
  3875. .expect_param = add_device_rsp,
  3876. .expect_len = sizeof(add_device_rsp),
  3877. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3878. };
  3879. static const uint8_t add_device_nval_4[] = {
  3880. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  3881. 0x02,
  3882. 0x02,
  3883. };
  3884. static const uint8_t add_device_rsp_4[] = {
  3885. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  3886. 0x02,
  3887. };
  3888. static const struct generic_data add_device_fail_4 = {
  3889. .send_opcode = MGMT_OP_ADD_DEVICE,
  3890. .send_param = add_device_nval_4,
  3891. .send_len = sizeof(add_device_nval_4),
  3892. .expect_param = add_device_rsp_4,
  3893. .expect_len = sizeof(add_device_rsp_4),
  3894. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  3895. };
  3896. static const uint8_t add_device_success_param_1[] = {
  3897. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  3898. 0x00,
  3899. 0x01,
  3900. };
  3901. static const struct generic_data add_device_success_1 = {
  3902. .send_opcode = MGMT_OP_ADD_DEVICE,
  3903. .send_param = add_device_success_param_1,
  3904. .send_len = sizeof(add_device_success_param_1),
  3905. .expect_param = add_device_rsp,
  3906. .expect_len = sizeof(add_device_rsp),
  3907. .expect_status = MGMT_STATUS_SUCCESS,
  3908. .expect_alt_ev = MGMT_EV_DEVICE_ADDED,
  3909. .expect_alt_ev_param = add_device_success_param_1,
  3910. .expect_alt_ev_len = sizeof(add_device_success_param_1),
  3911. };
  3912. static const uint8_t add_device_success_param_2[] = {
  3913. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  3914. 0x01,
  3915. 0x00,
  3916. };
  3917. static const uint8_t add_device_rsp_le[] = {
  3918. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  3919. 0x01,
  3920. };
  3921. static const struct generic_data add_device_success_2 = {
  3922. .send_opcode = MGMT_OP_ADD_DEVICE,
  3923. .send_param = add_device_success_param_2,
  3924. .send_len = sizeof(add_device_success_param_2),
  3925. .expect_param = add_device_rsp_le,
  3926. .expect_len = sizeof(add_device_rsp_le),
  3927. .expect_status = MGMT_STATUS_SUCCESS,
  3928. .expect_alt_ev = MGMT_EV_DEVICE_ADDED,
  3929. .expect_alt_ev_param = add_device_success_param_2,
  3930. .expect_alt_ev_len = sizeof(add_device_success_param_2),
  3931. };
  3932. static const uint8_t add_device_success_param_3[] = {
  3933. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  3934. 0x01,
  3935. 0x02,
  3936. };
  3937. static const struct generic_data add_device_success_3 = {
  3938. .send_opcode = MGMT_OP_ADD_DEVICE,
  3939. .send_param = add_device_success_param_3,
  3940. .send_len = sizeof(add_device_success_param_3),
  3941. .expect_param = add_device_rsp_le,
  3942. .expect_len = sizeof(add_device_rsp_le),
  3943. .expect_status = MGMT_STATUS_SUCCESS,
  3944. .expect_alt_ev = MGMT_EV_DEVICE_ADDED,
  3945. .expect_alt_ev_param = add_device_success_param_3,
  3946. .expect_alt_ev_len = sizeof(add_device_success_param_3),
  3947. };
  3948. static const struct generic_data add_device_success_4 = {
  3949. .setup_settings = settings_powered,
  3950. .send_opcode = MGMT_OP_ADD_DEVICE,
  3951. .send_param = add_device_success_param_1,
  3952. .send_len = sizeof(add_device_success_param_1),
  3953. .expect_param = add_device_rsp,
  3954. .expect_len = sizeof(add_device_rsp),
  3955. .expect_status = MGMT_STATUS_SUCCESS,
  3956. .expect_alt_ev = MGMT_EV_DEVICE_ADDED,
  3957. .expect_alt_ev_param = add_device_success_param_1,
  3958. .expect_alt_ev_len = sizeof(add_device_success_param_1),
  3959. .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE,
  3960. .expect_hci_param = set_connectable_scan_enable_param,
  3961. .expect_hci_len = sizeof(set_connectable_scan_enable_param),
  3962. };
  3963. static const uint8_t le_scan_enable[] = { 0x01, 0x01 };
  3964. static const struct generic_data add_device_success_5 = {
  3965. .setup_settings = settings_powered_le,
  3966. .send_opcode = MGMT_OP_ADD_DEVICE,
  3967. .send_param = add_device_success_param_2,
  3968. .send_len = sizeof(add_device_success_param_2),
  3969. .expect_param = add_device_rsp_le,
  3970. .expect_len = sizeof(add_device_rsp_le),
  3971. .expect_status = MGMT_STATUS_SUCCESS,
  3972. .expect_alt_ev = MGMT_EV_DEVICE_ADDED,
  3973. .expect_alt_ev_param = add_device_success_param_2,
  3974. .expect_alt_ev_len = sizeof(add_device_success_param_2),
  3975. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_ENABLE,
  3976. .expect_hci_param = le_scan_enable,
  3977. .expect_hci_len = sizeof(le_scan_enable),
  3978. };
  3979. static const uint8_t add_device_success_param_6[] = {
  3980. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  3981. 0x01,
  3982. 0x02,
  3983. };
  3984. static const uint8_t le_add_to_accept_list_param[] = {
  3985. 0x00, /* Type */
  3986. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, /* Address */
  3987. };
  3988. static const struct generic_data add_device_success_6 = {
  3989. .setup_settings = settings_powered_le,
  3990. .send_opcode = MGMT_OP_ADD_DEVICE,
  3991. .send_param = add_device_success_param_6,
  3992. .send_len = sizeof(add_device_success_param_6),
  3993. .expect_param = add_device_rsp_le,
  3994. .expect_len = sizeof(add_device_rsp_le),
  3995. .expect_status = MGMT_STATUS_SUCCESS,
  3996. .expect_alt_ev = MGMT_EV_DEVICE_ADDED,
  3997. .expect_alt_ev_param = add_device_success_param_6,
  3998. .expect_alt_ev_len = sizeof(add_device_success_param_6),
  3999. .expect_hci_command = BT_HCI_CMD_LE_ADD_TO_ACCEPT_LIST,
  4000. .expect_hci_param = le_add_to_accept_list_param,
  4001. .expect_hci_len = sizeof(le_add_to_accept_list_param),
  4002. };
  4003. static const uint8_t le_add_to_resolv_list_param[] = {
  4004. 0x00, /* Type */
  4005. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, /* Address */
  4006. 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, /* Peer IRK */
  4007. 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
  4008. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* Local IRK */
  4009. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  4010. };
  4011. static const struct generic_data add_device_success_7 = {
  4012. .send_opcode = MGMT_OP_ADD_DEVICE,
  4013. .send_param = add_device_success_param_6,
  4014. .send_len = sizeof(add_device_success_param_6),
  4015. .expect_param = add_device_rsp_le,
  4016. .expect_len = sizeof(add_device_rsp_le),
  4017. .expect_status = MGMT_STATUS_SUCCESS,
  4018. .expect_alt_ev = MGMT_EV_DEVICE_ADDED,
  4019. .expect_alt_ev_param = add_device_success_param_6,
  4020. .expect_alt_ev_len = sizeof(add_device_success_param_6),
  4021. .expect_hci_command = BT_HCI_CMD_LE_ADD_TO_RESOLV_LIST,
  4022. .expect_hci_param = le_add_to_resolv_list_param,
  4023. .expect_hci_len = sizeof(le_add_to_resolv_list_param),
  4024. };
  4025. static const struct generic_data add_device_success_8 = {
  4026. .send_opcode = MGMT_OP_ADD_DEVICE,
  4027. .send_param = add_device_success_param_6,
  4028. .send_len = sizeof(add_device_success_param_6),
  4029. .expect_param = add_device_rsp_le,
  4030. .expect_len = sizeof(add_device_rsp_le),
  4031. .expect_status = MGMT_STATUS_SUCCESS,
  4032. .expect_alt_ev = MGMT_EV_DEVICE_ADDED,
  4033. .expect_alt_ev_param = add_device_success_param_6,
  4034. .expect_alt_ev_len = sizeof(add_device_success_param_6),
  4035. .expect_hci_command = BT_HCI_CMD_LE_SET_RESOLV_ENABLE,
  4036. .expect_hci_param = set_resolv_on_param,
  4037. .expect_hci_len = sizeof(set_resolv_on_param),
  4038. };
  4039. static const uint8_t remove_device_nval_1[] = {
  4040. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  4041. 0xff,
  4042. };
  4043. static const struct generic_data remove_device_fail_1 = {
  4044. .send_opcode = MGMT_OP_REMOVE_DEVICE,
  4045. .send_param = remove_device_nval_1,
  4046. .send_len = sizeof(remove_device_nval_1),
  4047. .expect_param = remove_device_nval_1,
  4048. .expect_len = sizeof(remove_device_nval_1),
  4049. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4050. };
  4051. static const uint8_t remove_device_param_1[] = {
  4052. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  4053. 0x00,
  4054. };
  4055. static const struct generic_data remove_device_fail_2 = {
  4056. .send_opcode = MGMT_OP_REMOVE_DEVICE,
  4057. .send_param = remove_device_param_1,
  4058. .send_len = sizeof(remove_device_param_1),
  4059. .expect_param = remove_device_param_1,
  4060. .expect_len = sizeof(remove_device_param_1),
  4061. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4062. };
  4063. static const uint8_t remove_device_param_3[] = {
  4064. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  4065. 0x02,
  4066. };
  4067. static const struct generic_data remove_device_fail_3 = {
  4068. .send_opcode = MGMT_OP_REMOVE_DEVICE,
  4069. .send_param = remove_device_param_3,
  4070. .send_len = sizeof(remove_device_param_3),
  4071. .expect_param = remove_device_param_3,
  4072. .expect_len = sizeof(remove_device_param_3),
  4073. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4074. };
  4075. static const struct generic_data remove_device_success_1 = {
  4076. .send_opcode = MGMT_OP_REMOVE_DEVICE,
  4077. .send_param = remove_device_param_1,
  4078. .send_len = sizeof(remove_device_param_1),
  4079. .expect_param = remove_device_param_1,
  4080. .expect_len = sizeof(remove_device_param_1),
  4081. .expect_status = MGMT_STATUS_SUCCESS,
  4082. .expect_alt_ev = MGMT_EV_DEVICE_REMOVED,
  4083. .expect_alt_ev_param = remove_device_param_1,
  4084. .expect_alt_ev_len = sizeof(remove_device_param_1),
  4085. };
  4086. static const struct generic_data remove_device_success_2 = {
  4087. .send_opcode = MGMT_OP_REMOVE_DEVICE,
  4088. .send_param = remove_device_param_1,
  4089. .send_len = sizeof(remove_device_param_1),
  4090. .expect_param = remove_device_param_1,
  4091. .expect_len = sizeof(remove_device_param_1),
  4092. .expect_status = MGMT_STATUS_SUCCESS,
  4093. .expect_alt_ev = MGMT_EV_DEVICE_REMOVED,
  4094. .expect_alt_ev_param = remove_device_param_1,
  4095. .expect_alt_ev_len = sizeof(remove_device_param_1),
  4096. .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE,
  4097. .expect_hci_param = set_connectable_off_scan_enable_param,
  4098. .expect_hci_len = sizeof(set_connectable_off_scan_enable_param),
  4099. };
  4100. static const struct generic_data remove_device_success_3 = {
  4101. .setup_settings = settings_powered,
  4102. .send_opcode = MGMT_OP_REMOVE_DEVICE,
  4103. .send_param = remove_device_param_1,
  4104. .send_len = sizeof(remove_device_param_1),
  4105. .expect_param = remove_device_param_1,
  4106. .expect_len = sizeof(remove_device_param_1),
  4107. .expect_status = MGMT_STATUS_SUCCESS,
  4108. .expect_alt_ev = MGMT_EV_DEVICE_REMOVED,
  4109. .expect_alt_ev_param = remove_device_param_1,
  4110. .expect_alt_ev_len = sizeof(remove_device_param_1),
  4111. };
  4112. static const uint8_t remove_device_param_2[] = {
  4113. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc,
  4114. 0x01,
  4115. };
  4116. static const struct generic_data remove_device_success_4 = {
  4117. .setup_settings = settings_powered,
  4118. .send_opcode = MGMT_OP_REMOVE_DEVICE,
  4119. .send_param = remove_device_param_2,
  4120. .send_len = sizeof(remove_device_param_2),
  4121. .expect_param = remove_device_param_2,
  4122. .expect_len = sizeof(remove_device_param_2),
  4123. .expect_status = MGMT_STATUS_SUCCESS,
  4124. .expect_alt_ev = MGMT_EV_DEVICE_REMOVED,
  4125. .expect_alt_ev_param = remove_device_param_2,
  4126. .expect_alt_ev_len = sizeof(remove_device_param_2),
  4127. };
  4128. static const struct generic_data remove_device_success_5 = {
  4129. .send_opcode = MGMT_OP_REMOVE_DEVICE,
  4130. .send_param = remove_device_param_2,
  4131. .send_len = sizeof(remove_device_param_2),
  4132. .expect_param = remove_device_param_2,
  4133. .expect_len = sizeof(remove_device_param_2),
  4134. .expect_status = MGMT_STATUS_SUCCESS,
  4135. .expect_alt_ev = MGMT_EV_DEVICE_REMOVED,
  4136. .expect_alt_ev_param = remove_device_param_2,
  4137. .expect_alt_ev_len = sizeof(remove_device_param_2),
  4138. };
  4139. static const uint8_t remove_device_param_all[7] = { 0x00 };
  4140. static const struct generic_data remove_device_success_6 = {
  4141. .send_opcode = MGMT_OP_REMOVE_DEVICE,
  4142. .send_param = remove_device_param_all,
  4143. .send_len = sizeof(remove_device_param_all),
  4144. .expect_param = remove_device_param_all,
  4145. .expect_len = sizeof(remove_device_param_all),
  4146. .expect_status = MGMT_STATUS_SUCCESS,
  4147. };
  4148. static const struct generic_data remove_device_success_7 = {
  4149. .send_opcode = MGMT_OP_REMOVE_DEVICE,
  4150. .send_param = remove_device_param_2,
  4151. .send_len = sizeof(remove_device_param_2),
  4152. .expect_param = remove_device_param_2,
  4153. .expect_len = sizeof(remove_device_param_2),
  4154. .expect_status = MGMT_STATUS_SUCCESS,
  4155. .expect_hci_command = BT_HCI_CMD_LE_REMOVE_FROM_ACCEPT_LIST,
  4156. .expect_hci_param = le_add_to_accept_list_param,
  4157. .expect_hci_len = sizeof(le_add_to_accept_list_param),
  4158. .expect_alt_ev = MGMT_EV_DEVICE_REMOVED,
  4159. .expect_alt_ev_param = remove_device_param_2,
  4160. .expect_alt_ev_len = sizeof(remove_device_param_2),
  4161. };
  4162. static const struct generic_data remove_device_success_8 = {
  4163. .send_opcode = MGMT_OP_REMOVE_DEVICE,
  4164. .send_param = remove_device_param_2,
  4165. .send_len = sizeof(remove_device_param_2),
  4166. .expect_param = remove_device_param_2,
  4167. .expect_len = sizeof(remove_device_param_2),
  4168. .expect_status = MGMT_STATUS_SUCCESS,
  4169. .expect_hci_command = BT_HCI_CMD_LE_REMOVE_FROM_RESOLV_LIST,
  4170. .expect_hci_param = le_add_to_accept_list_param,
  4171. .expect_hci_len = sizeof(le_add_to_accept_list_param),
  4172. .expect_alt_ev = MGMT_EV_DEVICE_REMOVED,
  4173. .expect_alt_ev_param = remove_device_param_2,
  4174. .expect_alt_ev_len = sizeof(remove_device_param_2),
  4175. };
  4176. static const struct generic_data read_adv_features_invalid_param_test = {
  4177. .send_opcode = MGMT_OP_READ_ADV_FEATURES,
  4178. .send_param = dummy_data,
  4179. .send_len = sizeof(dummy_data),
  4180. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4181. };
  4182. static const struct generic_data read_adv_features_invalid_index_test = {
  4183. .send_index_none = true,
  4184. .send_opcode = MGMT_OP_READ_ADV_FEATURES,
  4185. .expect_status = MGMT_STATUS_INVALID_INDEX,
  4186. };
  4187. static const uint8_t read_adv_features_rsp_1[] = {
  4188. 0x7f, 0xf0, 0x01, 0x00, /* supported flags */
  4189. 0x1f, /* max_adv_data_len */
  4190. 0x1f, /* max_scan_rsp_len */
  4191. 0x05, /* max_instances */
  4192. 0x00, /* num_instances */
  4193. };
  4194. static const struct generic_data read_adv_features_success_1 = {
  4195. .send_opcode = MGMT_OP_READ_ADV_FEATURES,
  4196. .expect_param = read_adv_features_rsp_1,
  4197. .expect_len = sizeof(read_adv_features_rsp_1),
  4198. .expect_status = MGMT_STATUS_SUCCESS,
  4199. };
  4200. static const uint8_t read_adv_features_rsp_2[] = {
  4201. 0x7f, 0xf0, 0x01, 0x00, /* supported flags */
  4202. 0x1f, /* max_adv_data_len */
  4203. 0x1f, /* max_scan_rsp_len */
  4204. 0x05, /* max_instances */
  4205. 0x01, /* num_instances */
  4206. 0x01, /* instance identifiers */
  4207. };
  4208. static const struct generic_data read_adv_features_success_2 = {
  4209. .send_opcode = MGMT_OP_READ_ADV_FEATURES,
  4210. .expect_param = read_adv_features_rsp_2,
  4211. .expect_len = sizeof(read_adv_features_rsp_2),
  4212. .expect_status = MGMT_STATUS_SUCCESS,
  4213. };
  4214. /* simple add advertising command */
  4215. static const uint8_t add_advertising_param_uuid[] = {
  4216. 0x01, /* adv instance */
  4217. 0x00, 0x00, 0x00, 0x00, /* flags: none */
  4218. 0x00, 0x00, /* duration: default */
  4219. 0x00, 0x00, /* timeout: none */
  4220. 0x09, /* adv data len */
  4221. 0x00, /* scan rsp len */
  4222. /* adv data: */
  4223. 0x03, /* AD len */
  4224. 0x02, /* AD type: some 16 bit service class UUIDs */
  4225. 0x0d, 0x18, /* heart rate monitor */
  4226. 0x04, /* AD len */
  4227. 0xff, /* AD type: manufacturer specific data */
  4228. 0x01, 0x02, 0x03, /* custom advertising data */
  4229. };
  4230. /* add advertising with scan response data */
  4231. static const uint8_t add_advertising_param_scanrsp[] = {
  4232. /* instance, flags, duration, timeout, adv data len: same as before */
  4233. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
  4234. 0x0a, /* scan rsp len */
  4235. /* adv data: same as before */
  4236. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  4237. /* scan rsp data: */
  4238. 0x03, /* AD len */
  4239. 0x19, /* AD type: external appearance */
  4240. 0x40, 0x03, /* some custom appearance */
  4241. 0x05, /* AD len */
  4242. 0x03, /* AD type: all 16 bit service class UUIDs */
  4243. 0x0d, 0x18, /* heart rate monitor */
  4244. 0x0f, 0x18, /* battery service */
  4245. };
  4246. /* add advertising with timeout */
  4247. static const uint8_t add_advertising_param_timeout[] = {
  4248. /* instance, flags, duration: same as before */
  4249. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4250. 0x05, 0x00, /* timeout: 5 seconds */
  4251. /* adv data: same as before */
  4252. 0x09, 0x00, 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  4253. };
  4254. /* add advertising with connectable flag */
  4255. static const uint8_t add_advertising_param_connectable[] = {
  4256. 0x01, /* adv instance */
  4257. 0x01, 0x00, 0x00, 0x00, /* flags: connectable*/
  4258. /* duration, timeout, adv/scan data: same as before */
  4259. 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
  4260. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  4261. };
  4262. /* add advertising with general discoverable flag */
  4263. static const uint8_t add_advertising_param_general_discov[] = {
  4264. 0x01, /* adv instance */
  4265. 0x02, 0x00, 0x00, 0x00, /* flags: general discoverable*/
  4266. /* duration, timeout, adv/scan data: same as before */
  4267. 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
  4268. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  4269. };
  4270. /* add advertising with limited discoverable flag */
  4271. static const uint8_t add_advertising_param_limited_discov[] = {
  4272. 0x01, /* adv instance */
  4273. 0x04, 0x00, 0x00, 0x00, /* flags: limited discoverable */
  4274. /* duration, timeout, adv/scan data: same as before */
  4275. 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
  4276. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  4277. };
  4278. /* add advertising with managed flags */
  4279. static const uint8_t add_advertising_param_managed[] = {
  4280. 0x01, /* adv instance */
  4281. 0x08, 0x00, 0x00, 0x00, /* flags: managed flags */
  4282. /* duration, timeout, adv/scan data: same as before */
  4283. 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
  4284. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  4285. };
  4286. /* add advertising with tx power flag */
  4287. static const uint8_t add_advertising_param_txpwr[] = {
  4288. 0x01, /* adv instance */
  4289. 0x10, 0x00, 0x00, 0x00, /* flags: tx power */
  4290. /* duration, timeout, adv/scan data: same as before */
  4291. 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
  4292. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  4293. };
  4294. /* add advertising command for a second instance */
  4295. static const uint8_t add_advertising_param_test2[] = {
  4296. 0x02, /* adv instance */
  4297. 0x00, 0x00, 0x00, 0x00, /* flags: none */
  4298. 0x00, 0x00, /* duration: default */
  4299. 0x01, 0x00, /* timeout: 1 second */
  4300. 0x07, /* adv data len */
  4301. 0x00, /* scan rsp len */
  4302. /* adv data: */
  4303. 0x06, /* AD len */
  4304. 0x08, /* AD type: shortened local name */
  4305. 0x74, 0x65, 0x73, 0x74, 0x32, /* "test2" */
  4306. };
  4307. static const uint8_t advertising_instance1_param[] = {
  4308. 0x01,
  4309. };
  4310. static const uint8_t advertising_instance2_param[] = {
  4311. 0x02,
  4312. };
  4313. static const uint8_t set_adv_data_uuid[] = {
  4314. /* adv data len */
  4315. 0x09,
  4316. /* advertise heart rate monitor and manufacturer specific data */
  4317. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  4318. /* padding */
  4319. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4320. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4321. 0x00, 0x00,
  4322. };
  4323. static const uint8_t set_adv_data_test1[] = {
  4324. 0x07, /* adv data len */
  4325. 0x06, /* AD len */
  4326. 0x08, /* AD type: shortened local name */
  4327. 0x74, 0x65, 0x73, 0x74, 0x31, /* "test1" */
  4328. /* padding */
  4329. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4330. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4331. 0x00, 0x00, 0x00, 0x00,
  4332. };
  4333. static const uint8_t set_adv_data_test2[] = {
  4334. 0x07, /* adv data len */
  4335. 0x06, /* AD len */
  4336. 0x08, /* AD type: shortened local name */
  4337. 0x74, 0x65, 0x73, 0x74, 0x32, /* "test2" */
  4338. /* padding */
  4339. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4340. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4341. 0x00, 0x00, 0x00, 0x00,
  4342. };
  4343. static const uint8_t set_adv_data_txpwr[] = {
  4344. 0x03, /* adv data len */
  4345. 0x02, /* AD len */
  4346. 0x0a, /* AD type: tx power */
  4347. 0x00, /* tx power */
  4348. /* padding */
  4349. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4350. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4351. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4352. };
  4353. static const uint8_t set_adv_data_general_discov[] = {
  4354. 0x0c, /* adv data len */
  4355. 0x02, /* AD len */
  4356. 0x01, /* AD type: flags */
  4357. 0x02, /* general discoverable */
  4358. 0x03, /* AD len */
  4359. 0x02, /* AD type: some 16bit service class UUIDs */
  4360. 0x0d, 0x18, /* heart rate monitor */
  4361. 0x04, /* AD len */
  4362. 0xff, /* AD type: manufacturer specific data */
  4363. 0x01, 0x02, 0x03, /* custom advertising data */
  4364. /* padding */
  4365. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4366. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4367. };
  4368. static const uint8_t set_adv_data_limited_discov[] = {
  4369. 0x0c, /* adv data len */
  4370. 0x02, /* AD len */
  4371. 0x01, /* AD type: flags */
  4372. 0x01, /* limited discoverable */
  4373. /* rest: same as before */
  4374. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  4375. /* padding */
  4376. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4377. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4378. };
  4379. static const uint8_t set_adv_data_uuid_txpwr[] = {
  4380. 0x0c, /* adv data len */
  4381. 0x03, /* AD len */
  4382. 0x02, /* AD type: some 16bit service class UUIDs */
  4383. 0x0d, 0x18, /* heart rate monitor */
  4384. 0x04, /* AD len */
  4385. 0xff, /* AD type: manufacturer specific data */
  4386. 0x01, 0x02, 0x03, /* custom advertising data */
  4387. 0x02, /* AD len */
  4388. 0x0a, /* AD type: tx power */
  4389. 0x00, /* tx power */
  4390. /* padding */
  4391. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4392. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4393. };
  4394. static const uint8_t set_scan_rsp_uuid[] = {
  4395. 0x0a, /* scan rsp data len */
  4396. 0x03, /* AD len */
  4397. 0x19, /* AD type: external appearance */
  4398. 0x40, 0x03, /* some custom appearance */
  4399. 0x05, /* AD len */
  4400. 0x03, /* AD type: all 16 bit service class UUIDs */
  4401. 0x0d, 0x18, 0x0f, 0x18, /* heart rate monitor, battery service */
  4402. /* padding */
  4403. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4404. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  4405. 0x00,
  4406. };
  4407. static const uint8_t add_advertising_invalid_param_1[] = {
  4408. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
  4409. 0x03, 0x03, 0x0d, 0x18,
  4410. 0x19, 0xff, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
  4411. 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
  4412. 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e,
  4413. };
  4414. static const uint8_t add_advertising_invalid_param_2[] = {
  4415. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
  4416. 0x04, 0x03, 0x0d, 0x18,
  4417. 0x04, 0xff, 0x01, 0x02, 0x03,
  4418. };
  4419. static const uint8_t add_advertising_invalid_param_3[] = {
  4420. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
  4421. 0x03, 0x03, 0x0d, 0x18,
  4422. 0x02, 0xff, 0x01, 0x02, 0x03,
  4423. };
  4424. static const uint8_t add_advertising_invalid_param_4[] = {
  4425. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
  4426. 0x03, 0x03, 0x0d, 0x18,
  4427. 0x05, 0xff, 0x01, 0x02, 0x03,
  4428. };
  4429. static const uint8_t add_advertising_invalid_param_5[] = {
  4430. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00,
  4431. 0x03, 0x03, 0x0d, 0x18,
  4432. 0x19, 0xff, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
  4433. 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
  4434. 0x15, 0x16, 0x17, 0x18,
  4435. };
  4436. static const uint8_t add_advertising_invalid_param_6[] = {
  4437. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
  4438. 0x03, 0x03, 0x0d, 0x18,
  4439. 0x19, 0xff, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
  4440. 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
  4441. 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e,
  4442. };
  4443. static const uint8_t add_advertising_invalid_param_7[] = {
  4444. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
  4445. 0x04, 0x03, 0x0d, 0x18,
  4446. 0x04, 0xff, 0x01, 0x02, 0x03,
  4447. };
  4448. static const uint8_t add_advertising_invalid_param_8[] = {
  4449. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
  4450. 0x03, 0x03, 0x0d, 0x18,
  4451. 0x02, 0xff, 0x01, 0x02, 0x03,
  4452. };
  4453. static const uint8_t add_advertising_invalid_param_9[] = {
  4454. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
  4455. 0x03, 0x03, 0x0d, 0x18,
  4456. 0x05, 0xff, 0x01, 0x02, 0x03,
  4457. };
  4458. static const uint8_t add_advertising_invalid_param_10[] = {
  4459. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D,
  4460. 0x03, 0x03, 0x0d, 0x18,
  4461. 0x19, 0xff, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
  4462. 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
  4463. 0x15, 0x16, 0x17, 0x18,
  4464. };
  4465. static const struct generic_data add_advertising_fail_1 = {
  4466. .setup_settings = settings_powered,
  4467. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4468. .send_param = add_advertising_param_uuid,
  4469. .send_len = sizeof(add_advertising_param_uuid),
  4470. .expect_status = MGMT_STATUS_REJECTED,
  4471. };
  4472. static const struct generic_data add_advertising_fail_2 = {
  4473. .setup_settings = settings_powered_le,
  4474. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4475. .send_param = add_advertising_invalid_param_1,
  4476. .send_len = sizeof(add_advertising_invalid_param_1),
  4477. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4478. };
  4479. static const struct generic_data add_advertising_fail_3 = {
  4480. .setup_settings = settings_powered_le,
  4481. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4482. .send_param = add_advertising_invalid_param_2,
  4483. .send_len = sizeof(add_advertising_invalid_param_2),
  4484. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4485. };
  4486. static const struct generic_data add_advertising_fail_4 = {
  4487. .setup_settings = settings_powered_le,
  4488. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4489. .send_param = add_advertising_invalid_param_3,
  4490. .send_len = sizeof(add_advertising_invalid_param_3),
  4491. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4492. };
  4493. static const struct generic_data add_advertising_fail_5 = {
  4494. .setup_settings = settings_powered_le,
  4495. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4496. .send_param = add_advertising_invalid_param_4,
  4497. .send_len = sizeof(add_advertising_invalid_param_4),
  4498. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4499. };
  4500. static const struct generic_data add_advertising_fail_6 = {
  4501. .setup_settings = settings_powered_le,
  4502. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4503. .send_param = add_advertising_invalid_param_5,
  4504. .send_len = sizeof(add_advertising_invalid_param_5),
  4505. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4506. };
  4507. static const struct generic_data add_advertising_fail_7 = {
  4508. .setup_settings = settings_powered_le,
  4509. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4510. .send_param = add_advertising_invalid_param_6,
  4511. .send_len = sizeof(add_advertising_invalid_param_6),
  4512. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4513. };
  4514. static const struct generic_data add_advertising_fail_8 = {
  4515. .setup_settings = settings_powered_le,
  4516. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4517. .send_param = add_advertising_invalid_param_7,
  4518. .send_len = sizeof(add_advertising_invalid_param_7),
  4519. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4520. };
  4521. static const struct generic_data add_advertising_fail_9 = {
  4522. .setup_settings = settings_powered_le,
  4523. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4524. .send_param = add_advertising_invalid_param_8,
  4525. .send_len = sizeof(add_advertising_invalid_param_8),
  4526. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4527. };
  4528. static const struct generic_data add_advertising_fail_10 = {
  4529. .setup_settings = settings_powered_le,
  4530. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4531. .send_param = add_advertising_invalid_param_9,
  4532. .send_len = sizeof(add_advertising_invalid_param_9),
  4533. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4534. };
  4535. static const struct generic_data add_advertising_fail_11 = {
  4536. .setup_settings = settings_powered_le,
  4537. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4538. .send_param = add_advertising_invalid_param_10,
  4539. .send_len = sizeof(add_advertising_invalid_param_10),
  4540. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4541. };
  4542. static const struct generic_data add_advertising_fail_12 = {
  4543. .setup_settings = settings_le,
  4544. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4545. .send_param = add_advertising_param_timeout,
  4546. .send_len = sizeof(add_advertising_param_timeout),
  4547. .expect_status = MGMT_STATUS_REJECTED,
  4548. };
  4549. static const struct generic_data add_advertising_success_1 = {
  4550. .setup_settings = settings_powered_le,
  4551. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4552. .send_param = add_advertising_param_uuid,
  4553. .send_len = sizeof(add_advertising_param_uuid),
  4554. .expect_param = advertising_instance1_param,
  4555. .expect_len = sizeof(advertising_instance1_param),
  4556. .expect_status = MGMT_STATUS_SUCCESS,
  4557. .expect_alt_ev = MGMT_EV_ADVERTISING_ADDED,
  4558. .expect_alt_ev_param = advertising_instance1_param,
  4559. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  4560. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  4561. .expect_hci_param = set_adv_data_uuid,
  4562. .expect_hci_len = sizeof(set_adv_data_uuid),
  4563. };
  4564. static const char set_powered_adv_instance_settings_param[] = {
  4565. 0x81, 0x02, 0x00, 0x00,
  4566. };
  4567. static const struct generic_data add_advertising_success_pwron_data = {
  4568. .send_opcode = MGMT_OP_SET_POWERED,
  4569. .send_param = set_powered_on_param,
  4570. .send_len = sizeof(set_powered_on_param),
  4571. .expect_status = MGMT_STATUS_SUCCESS,
  4572. .expect_param = set_powered_adv_instance_settings_param,
  4573. .expect_len = sizeof(set_powered_adv_instance_settings_param),
  4574. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  4575. .expect_hci_param = set_adv_data_test1,
  4576. .expect_hci_len = sizeof(set_adv_data_test1),
  4577. };
  4578. static const struct generic_data add_advertising_success_pwron_enabled = {
  4579. .send_opcode = MGMT_OP_SET_POWERED,
  4580. .send_param = set_powered_on_param,
  4581. .send_len = sizeof(set_powered_on_param),
  4582. .expect_status = MGMT_STATUS_SUCCESS,
  4583. .expect_param = set_powered_adv_instance_settings_param,
  4584. .expect_len = sizeof(set_powered_adv_instance_settings_param),
  4585. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_ENABLE,
  4586. .expect_hci_param = set_adv_on_set_adv_enable_param,
  4587. .expect_hci_len = sizeof(set_adv_on_set_adv_enable_param),
  4588. };
  4589. static const struct generic_data add_advertising_success_4 = {
  4590. .send_opcode = MGMT_OP_SET_ADVERTISING,
  4591. .send_param = set_adv_on_param,
  4592. .send_len = sizeof(set_adv_on_param),
  4593. .expect_status = MGMT_STATUS_SUCCESS,
  4594. .expect_param = set_adv_settings_param_2,
  4595. .expect_len = sizeof(set_adv_settings_param_2),
  4596. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  4597. .expect_hci_param = set_adv_data_txpwr,
  4598. .expect_hci_len = sizeof(set_adv_data_txpwr),
  4599. };
  4600. static const struct generic_data add_advertising_success_5 = {
  4601. .send_opcode = MGMT_OP_SET_ADVERTISING,
  4602. .send_param = set_adv_off_param,
  4603. .send_len = sizeof(set_adv_off_param),
  4604. .expect_status = MGMT_STATUS_SUCCESS,
  4605. .expect_param = set_powered_adv_instance_settings_param,
  4606. .expect_len = sizeof(set_powered_adv_instance_settings_param),
  4607. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  4608. .expect_hci_param = set_adv_data_test1,
  4609. .expect_hci_len = sizeof(set_adv_data_test1),
  4610. };
  4611. static const struct generic_data add_advertising_success_6 = {
  4612. .setup_settings = settings_powered_le,
  4613. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4614. .send_param = add_advertising_param_scanrsp,
  4615. .send_len = sizeof(add_advertising_param_scanrsp),
  4616. .expect_param = advertising_instance1_param,
  4617. .expect_len = sizeof(advertising_instance1_param),
  4618. .expect_status = MGMT_STATUS_SUCCESS,
  4619. .expect_alt_ev = MGMT_EV_ADVERTISING_ADDED,
  4620. .expect_alt_ev_param = advertising_instance1_param,
  4621. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  4622. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  4623. .expect_hci_param = set_adv_data_uuid,
  4624. .expect_hci_len = sizeof(set_adv_data_uuid),
  4625. };
  4626. static const struct generic_data add_advertising_success_7 = {
  4627. .setup_settings = settings_powered_le,
  4628. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4629. .send_param = add_advertising_param_scanrsp,
  4630. .send_len = sizeof(add_advertising_param_scanrsp),
  4631. .expect_param = advertising_instance1_param,
  4632. .expect_len = sizeof(advertising_instance1_param),
  4633. .expect_status = MGMT_STATUS_SUCCESS,
  4634. .expect_alt_ev = MGMT_EV_ADVERTISING_ADDED,
  4635. .expect_alt_ev_param = advertising_instance1_param,
  4636. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  4637. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_RSP_DATA,
  4638. .expect_hci_param = set_scan_rsp_uuid,
  4639. .expect_hci_len = sizeof(set_scan_rsp_uuid),
  4640. };
  4641. static const struct generic_data add_advertising_success_8 = {
  4642. .setup_settings = settings_powered_le,
  4643. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4644. .send_param = add_advertising_param_connectable,
  4645. .send_len = sizeof(add_advertising_param_connectable),
  4646. .expect_param = advertising_instance1_param,
  4647. .expect_len = sizeof(advertising_instance1_param),
  4648. .expect_status = MGMT_STATUS_SUCCESS,
  4649. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS,
  4650. .expect_hci_param = set_connectable_on_adv_param,
  4651. .expect_hci_len = sizeof(set_connectable_on_adv_param),
  4652. };
  4653. static const struct generic_data add_advertising_success_9 = {
  4654. .setup_settings = settings_powered_le,
  4655. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4656. .send_param = add_advertising_param_general_discov,
  4657. .send_len = sizeof(add_advertising_param_general_discov),
  4658. .expect_param = advertising_instance1_param,
  4659. .expect_len = sizeof(advertising_instance1_param),
  4660. .expect_status = MGMT_STATUS_SUCCESS,
  4661. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  4662. .expect_hci_param = set_adv_data_general_discov,
  4663. .expect_hci_len = sizeof(set_adv_data_general_discov),
  4664. };
  4665. static const struct generic_data add_advertising_success_10 = {
  4666. .setup_settings = settings_powered_le,
  4667. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4668. .send_param = add_advertising_param_limited_discov,
  4669. .send_len = sizeof(add_advertising_param_limited_discov),
  4670. .expect_param = advertising_instance1_param,
  4671. .expect_len = sizeof(advertising_instance1_param),
  4672. .expect_status = MGMT_STATUS_SUCCESS,
  4673. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  4674. .expect_hci_param = set_adv_data_limited_discov,
  4675. .expect_hci_len = sizeof(set_adv_data_limited_discov),
  4676. };
  4677. static const struct generic_data add_advertising_success_11 = {
  4678. .setup_settings = settings_powered_le_discoverable,
  4679. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4680. .send_param = add_advertising_param_managed,
  4681. .send_len = sizeof(add_advertising_param_managed),
  4682. .expect_param = advertising_instance1_param,
  4683. .expect_len = sizeof(advertising_instance1_param),
  4684. .expect_status = MGMT_STATUS_SUCCESS,
  4685. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  4686. .expect_hci_param = set_adv_data_general_discov,
  4687. .expect_hci_len = sizeof(set_adv_data_general_discov),
  4688. };
  4689. static const struct generic_data add_advertising_success_12 = {
  4690. .setup_settings = settings_powered_le_discoverable,
  4691. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4692. .send_param = add_advertising_param_txpwr,
  4693. .send_len = sizeof(add_advertising_param_txpwr),
  4694. .expect_param = advertising_instance1_param,
  4695. .expect_len = sizeof(advertising_instance1_param),
  4696. .expect_status = MGMT_STATUS_SUCCESS,
  4697. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  4698. .expect_hci_param = set_adv_data_uuid_txpwr,
  4699. .expect_hci_len = sizeof(set_adv_data_uuid_txpwr),
  4700. };
  4701. static uint16_t settings_powered_le_connectable[] = {
  4702. MGMT_OP_SET_POWERED,
  4703. MGMT_OP_SET_LE,
  4704. MGMT_OP_SET_CONNECTABLE, 0 };
  4705. static const struct generic_data add_advertising_success_13 = {
  4706. .setup_settings = settings_powered_le,
  4707. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4708. .send_param = add_advertising_param_scanrsp,
  4709. .send_len = sizeof(add_advertising_param_scanrsp),
  4710. .expect_param = advertising_instance1_param,
  4711. .expect_len = sizeof(advertising_instance1_param),
  4712. .expect_status = MGMT_STATUS_SUCCESS,
  4713. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS,
  4714. .expect_hci_param = set_connectable_off_scan_adv_param,
  4715. .expect_hci_len = sizeof(set_connectable_off_scan_adv_param),
  4716. .expect_hci_param_check_func = set_connectable_off_scan_adv_check_func
  4717. };
  4718. static uint8_t set_connectable_off_adv_param[] = {
  4719. 0x64, 0x00, /* min_interval */
  4720. 0x96, 0x00, /* max_interval */
  4721. 0x03, /* type */
  4722. 0x01, /* own_addr_type */
  4723. 0x00, /* direct_addr_type */
  4724. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* direct_addr */
  4725. 0x07, /* channel_map */
  4726. 0x00, /* filter_policy */
  4727. };
  4728. static int set_connectable_off_adv_check_func(const void *param,
  4729. uint16_t length)
  4730. {
  4731. const uint8_t *received = param;
  4732. uint8_t *expected = set_connectable_off_adv_param;
  4733. /* Compare the received param with expected param, but ignore the
  4734. * min_internal and max_interval since these values are turned often
  4735. * in the kernel and we don't want to update the expected value every
  4736. * time.
  4737. */
  4738. return memcmp(&received[4], &expected[4], length - 4);
  4739. }
  4740. static const struct generic_data add_advertising_success_14 = {
  4741. .setup_settings = settings_powered_le,
  4742. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4743. .send_param = add_advertising_param_uuid,
  4744. .send_len = sizeof(add_advertising_param_uuid),
  4745. .expect_param = advertising_instance1_param,
  4746. .expect_len = sizeof(advertising_instance1_param),
  4747. .expect_status = MGMT_STATUS_SUCCESS,
  4748. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS,
  4749. .expect_hci_param = set_connectable_off_adv_param,
  4750. .expect_hci_len = sizeof(set_connectable_off_adv_param),
  4751. .expect_hci_param_check_func = set_connectable_off_adv_check_func
  4752. };
  4753. static const struct generic_data add_advertising_success_15 = {
  4754. .setup_settings = settings_powered_le_connectable,
  4755. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4756. .send_param = add_advertising_param_uuid,
  4757. .send_len = sizeof(add_advertising_param_uuid),
  4758. .expect_param = advertising_instance1_param,
  4759. .expect_len = sizeof(advertising_instance1_param),
  4760. .expect_status = MGMT_STATUS_SUCCESS,
  4761. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS,
  4762. .expect_hci_param = set_connectable_on_adv_param,
  4763. .expect_hci_len = sizeof(set_connectable_on_adv_param),
  4764. };
  4765. static const char set_connectable_settings_param_3[] = {
  4766. 0x83, 0x02, 0x00, 0x00 };
  4767. static const struct generic_data add_advertising_success_16 = {
  4768. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  4769. .send_param = set_connectable_on_param,
  4770. .send_len = sizeof(set_connectable_on_param),
  4771. .expect_status = MGMT_STATUS_SUCCESS,
  4772. .expect_param = set_connectable_settings_param_3,
  4773. .expect_len = sizeof(set_connectable_settings_param_3),
  4774. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS,
  4775. .expect_hci_param = set_connectable_on_adv_param,
  4776. .expect_hci_len = sizeof(set_connectable_on_adv_param),
  4777. };
  4778. static const struct generic_data add_advertising_success_17 = {
  4779. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  4780. .send_param = set_connectable_off_param,
  4781. .send_len = sizeof(set_connectable_off_param),
  4782. .expect_status = MGMT_STATUS_SUCCESS,
  4783. .expect_param = set_le_settings_param_2,
  4784. .expect_len = sizeof(set_le_settings_param_2),
  4785. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS,
  4786. .expect_hci_param = set_connectable_off_adv_param,
  4787. .expect_hci_len = sizeof(set_connectable_off_adv_param),
  4788. .expect_hci_param_check_func = set_connectable_off_adv_check_func
  4789. };
  4790. static const char set_powered_off_le_settings_param[] = {
  4791. 0x80, 0x02, 0x00, 0x00
  4792. };
  4793. static const struct generic_data add_advertising_power_off = {
  4794. .send_opcode = MGMT_OP_SET_POWERED,
  4795. .send_param = set_powered_off_param,
  4796. .send_len = sizeof(set_powered_off_param),
  4797. .expect_status = MGMT_STATUS_SUCCESS,
  4798. .expect_param = set_powered_off_le_settings_param,
  4799. .expect_len = sizeof(set_powered_off_le_settings_param),
  4800. .expect_alt_ev = MGMT_EV_ADVERTISING_REMOVED,
  4801. .expect_alt_ev_param = advertising_instance1_param,
  4802. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  4803. };
  4804. static const char set_le_settings_param_off[] = { 0x81, 0x00, 0x00, 0x00 };
  4805. static const struct generic_data add_advertising_le_off = {
  4806. .send_opcode = MGMT_OP_SET_LE,
  4807. .send_param = set_le_off_param,
  4808. .send_len = sizeof(set_le_off_param),
  4809. .expect_status = MGMT_STATUS_SUCCESS,
  4810. .expect_param = set_le_settings_param_off,
  4811. .expect_len = sizeof(set_le_settings_param_off),
  4812. .expect_alt_ev = MGMT_EV_ADVERTISING_REMOVED,
  4813. .expect_alt_ev_param = advertising_instance1_param,
  4814. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  4815. };
  4816. static const struct generic_data add_advertising_success_18 = {
  4817. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4818. .send_param = add_advertising_param_uuid,
  4819. .send_len = sizeof(add_advertising_param_uuid),
  4820. .expect_param = advertising_instance1_param,
  4821. .expect_len = sizeof(advertising_instance1_param),
  4822. .expect_status = MGMT_STATUS_SUCCESS,
  4823. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  4824. .expect_hci_param = set_adv_data_uuid,
  4825. .expect_hci_len = sizeof(set_adv_data_uuid),
  4826. };
  4827. static const struct generic_data add_advertising_timeout_expired = {
  4828. .expect_alt_ev = MGMT_EV_ADVERTISING_REMOVED,
  4829. .expect_alt_ev_param = advertising_instance1_param,
  4830. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  4831. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_ENABLE,
  4832. .expect_hci_param = set_adv_on_set_adv_disable_param,
  4833. .expect_hci_len = sizeof(set_adv_on_set_adv_disable_param),
  4834. };
  4835. static const uint8_t remove_advertising_param_1[] = {
  4836. 0x01,
  4837. };
  4838. static const uint8_t remove_advertising_param_2[] = {
  4839. 0x00,
  4840. };
  4841. static const struct generic_data remove_advertising_fail_1 = {
  4842. .send_opcode = MGMT_OP_REMOVE_ADVERTISING,
  4843. .send_param = remove_advertising_param_1,
  4844. .send_len = sizeof(remove_advertising_param_1),
  4845. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4846. };
  4847. static const struct generic_data remove_advertising_success_1 = {
  4848. .send_opcode = MGMT_OP_REMOVE_ADVERTISING,
  4849. .send_param = remove_advertising_param_1,
  4850. .send_len = sizeof(remove_advertising_param_1),
  4851. .expect_status = MGMT_STATUS_SUCCESS,
  4852. .expect_param = remove_advertising_param_1,
  4853. .expect_len = sizeof(remove_advertising_param_1),
  4854. .expect_alt_ev = MGMT_EV_ADVERTISING_REMOVED,
  4855. .expect_alt_ev_param = advertising_instance1_param,
  4856. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  4857. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_ENABLE,
  4858. .expect_hci_param = set_adv_off_param,
  4859. .expect_hci_len = sizeof(set_adv_off_param),
  4860. };
  4861. static const struct generic_data remove_advertising_success_2 = {
  4862. .send_opcode = MGMT_OP_REMOVE_ADVERTISING,
  4863. .send_param = remove_advertising_param_2,
  4864. .send_len = sizeof(remove_advertising_param_2),
  4865. .expect_status = MGMT_STATUS_SUCCESS,
  4866. .expect_param = remove_advertising_param_2,
  4867. .expect_len = sizeof(remove_advertising_param_2),
  4868. .expect_alt_ev = MGMT_EV_ADVERTISING_REMOVED,
  4869. .expect_alt_ev_param = advertising_instance1_param,
  4870. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  4871. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_ENABLE,
  4872. .expect_hci_param = set_adv_off_param,
  4873. .expect_hci_len = sizeof(set_adv_off_param),
  4874. };
  4875. static const struct generic_data multi_advertising_switch = {
  4876. .expect_alt_ev = MGMT_EV_ADVERTISING_REMOVED,
  4877. .expect_alt_ev_param = advertising_instance1_param,
  4878. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  4879. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  4880. .expect_hci_param = set_adv_data_test2,
  4881. .expect_hci_len = sizeof(set_adv_data_test2),
  4882. };
  4883. static const struct generic_data multi_advertising_add_second = {
  4884. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  4885. .send_param = add_advertising_param_test2,
  4886. .send_len = sizeof(add_advertising_param_test2),
  4887. .expect_param = advertising_instance2_param,
  4888. .expect_len = sizeof(advertising_instance2_param),
  4889. .expect_status = MGMT_STATUS_SUCCESS,
  4890. .expect_alt_ev = MGMT_EV_ADVERTISING_ADDED,
  4891. .expect_alt_ev_param = advertising_instance2_param,
  4892. .expect_alt_ev_len = sizeof(advertising_instance2_param),
  4893. .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA,
  4894. .expect_hci_param = set_adv_data_test2,
  4895. .expect_hci_len = sizeof(set_adv_data_test2),
  4896. };
  4897. /* based on G-Tag ADV_DATA */
  4898. static const uint8_t adv_data_invalid_significant_len[] = { 0x02, 0x01, 0x06,
  4899. 0x0d, 0xff, 0x80, 0x01, 0x02, 0x15, 0x12, 0x34, 0x80, 0x91,
  4900. 0xd0, 0xf2, 0xbb, 0xc5, 0x03, 0x02, 0x0f, 0x18, 0x00, 0x00,
  4901. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  4902. static const char device_found_valid[] = { 0x00, 0x00, 0x01, 0x01, 0xaa, 0x00,
  4903. 0x01, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x02, 0x01,
  4904. 0x06, 0x0d, 0xff, 0x80, 0x01, 0x02, 0x15, 0x12, 0x34, 0x80,
  4905. 0x91, 0xd0, 0xf2, 0xbb, 0xc5, 0x03, 0x02, 0x0f, 0x18 };
  4906. static const struct generic_data device_found_gtag = {
  4907. .setup_settings = settings_powered_le,
  4908. .send_opcode = MGMT_OP_START_DISCOVERY,
  4909. .send_param = start_discovery_le_param,
  4910. .send_len = sizeof(start_discovery_le_param),
  4911. .expect_status = MGMT_STATUS_SUCCESS,
  4912. .expect_param = start_discovery_le_param,
  4913. .expect_len = sizeof(start_discovery_le_param),
  4914. .expect_alt_ev = MGMT_EV_DEVICE_FOUND,
  4915. .expect_alt_ev_param = device_found_valid,
  4916. .expect_alt_ev_len = sizeof(device_found_valid),
  4917. .set_adv = true,
  4918. .adv_data_len = sizeof(adv_data_invalid_significant_len),
  4919. .adv_data = adv_data_invalid_significant_len,
  4920. };
  4921. static const uint8_t adv_data_invalid_field_len[] = { 0x02, 0x01, 0x01,
  4922. 0x05, 0x09, 0x74, 0x65, 0x73, 0x74,
  4923. 0xa0, 0xff, 0x01, 0x02, 0x03, 0x04, 0x05};
  4924. static const char device_found_valid2[] = { 0x00, 0x00, 0x01, 0x01, 0xaa, 0x00,
  4925. 0x01, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x01,
  4926. 0x01, 0x05, 0x09, 0x74, 0x65, 0x73, 0x74};
  4927. static const struct generic_data device_found_invalid_field = {
  4928. .setup_settings = settings_powered_le,
  4929. .send_opcode = MGMT_OP_START_DISCOVERY,
  4930. .send_param = start_discovery_le_param,
  4931. .send_len = sizeof(start_discovery_le_param),
  4932. .expect_status = MGMT_STATUS_SUCCESS,
  4933. .expect_param = start_discovery_le_param,
  4934. .expect_len = sizeof(start_discovery_le_param),
  4935. .expect_alt_ev = MGMT_EV_DEVICE_FOUND,
  4936. .expect_alt_ev_param = device_found_valid2,
  4937. .expect_alt_ev_len = sizeof(device_found_valid2),
  4938. .set_adv = true,
  4939. .adv_data_len = sizeof(adv_data_invalid_field_len),
  4940. .adv_data = adv_data_invalid_field_len,
  4941. };
  4942. static const struct generic_data read_local_oob_not_powered_test = {
  4943. .send_opcode = MGMT_OP_READ_LOCAL_OOB_DATA,
  4944. .expect_status = MGMT_STATUS_NOT_POWERED,
  4945. };
  4946. static const struct generic_data read_local_oob_invalid_param_test = {
  4947. .send_opcode = MGMT_OP_READ_LOCAL_OOB_DATA,
  4948. .send_param = dummy_data,
  4949. .send_len = sizeof(dummy_data),
  4950. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  4951. };
  4952. static const struct generic_data read_local_oob_invalid_index_test = {
  4953. .send_index_none = true,
  4954. .send_opcode = MGMT_OP_READ_LOCAL_OOB_DATA,
  4955. .expect_status = MGMT_STATUS_INVALID_INDEX,
  4956. };
  4957. static const struct generic_data read_local_oob_legacy_pairing_test = {
  4958. .setup_settings = settings_powered,
  4959. .send_opcode = MGMT_OP_READ_LOCAL_OOB_DATA,
  4960. .expect_status = MGMT_STATUS_NOT_SUPPORTED,
  4961. };
  4962. static const struct generic_data read_local_oob_success_ssp_test = {
  4963. .setup_settings = settings_powered_ssp,
  4964. .send_opcode = MGMT_OP_READ_LOCAL_OOB_DATA,
  4965. .expect_status = MGMT_STATUS_SUCCESS,
  4966. .expect_ignore_param = true,
  4967. .expect_hci_command = BT_HCI_CMD_READ_LOCAL_OOB_DATA,
  4968. };
  4969. static const struct generic_data read_local_oob_success_sc_test = {
  4970. .setup_settings = settings_powered_sc,
  4971. .send_opcode = MGMT_OP_READ_LOCAL_OOB_DATA,
  4972. .expect_status = MGMT_STATUS_SUCCESS,
  4973. .expect_ignore_param = true,
  4974. .expect_hci_command = BT_HCI_CMD_READ_LOCAL_OOB_EXT_DATA,
  4975. };
  4976. static const uint8_t oob_type_bredr[] = { 0x01 };
  4977. static const struct generic_data read_local_oob_ext_invalid_index_test = {
  4978. .send_index_none = true,
  4979. .send_opcode = MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
  4980. .send_param = oob_type_bredr,
  4981. .send_len = sizeof(oob_type_bredr),
  4982. .expect_status = MGMT_STATUS_INVALID_INDEX,
  4983. };
  4984. static const struct generic_data read_local_oob_ext_legacy_pairing_test = {
  4985. .setup_settings = settings_powered,
  4986. .send_opcode = MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
  4987. .send_param = oob_type_bredr,
  4988. .send_len = sizeof(oob_type_bredr),
  4989. .expect_ignore_param = true,
  4990. .expect_status = MGMT_STATUS_NOT_SUPPORTED,
  4991. };
  4992. static const struct generic_data read_local_oob_ext_success_ssp_test = {
  4993. .setup_settings = settings_powered_ssp,
  4994. .send_opcode = MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
  4995. .send_param = oob_type_bredr,
  4996. .send_len = sizeof(oob_type_bredr),
  4997. .expect_status = MGMT_STATUS_SUCCESS,
  4998. .expect_ignore_param = true,
  4999. .expect_hci_command = BT_HCI_CMD_READ_LOCAL_OOB_DATA,
  5000. };
  5001. static const struct generic_data read_local_oob_ext_success_sc_test = {
  5002. .setup_settings = settings_powered_sc,
  5003. .send_opcode = MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
  5004. .send_param = oob_type_bredr,
  5005. .send_len = sizeof(oob_type_bredr),
  5006. .expect_status = MGMT_STATUS_SUCCESS,
  5007. .expect_ignore_param = true,
  5008. .expect_hci_command = BT_HCI_CMD_READ_LOCAL_OOB_EXT_DATA,
  5009. };
  5010. static const uint8_t le_states_conn_peripheral_adv_connectable[] = {
  5011. 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00};
  5012. static const uint8_t le_states_conn_peripheral_adv_non_connectable[] = {
  5013. 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00};
  5014. static const uint8_t le_states_conn_central_adv_connectable[] = {
  5015. 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00};
  5016. static const uint8_t le_states_conn_central_adv_non_connectable[] = {
  5017. 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00};
  5018. static const struct generic_data conn_peripheral_adv_connectable_test = {
  5019. .setup_le_states = true,
  5020. .le_states = le_states_conn_peripheral_adv_connectable,
  5021. .setup_settings = settings_powered_le,
  5022. .client_enable_le = true
  5023. };
  5024. static const struct generic_data conn_peripheral_adv_non_connectable_test = {
  5025. .setup_le_states = true,
  5026. .le_states = le_states_conn_peripheral_adv_non_connectable,
  5027. .setup_settings = settings_powered_le,
  5028. .client_enable_le = true
  5029. };
  5030. static const struct generic_data conn_central_adv_connectable_test = {
  5031. .setup_le_states = true,
  5032. .le_states = le_states_conn_central_adv_connectable,
  5033. .setup_settings = settings_powered_le,
  5034. .client_enable_le = true,
  5035. .client_enable_adv = 1
  5036. };
  5037. static const struct generic_data conn_central_adv_non_connectable_test = {
  5038. .setup_le_states = true,
  5039. .le_states = le_states_conn_central_adv_non_connectable,
  5040. .setup_settings = settings_powered_le,
  5041. .client_enable_le = true,
  5042. .client_enable_adv = 1
  5043. };
  5044. static const char ext_ctrl_info1[] = {
  5045. 0x00, 0x00, 0x00, 0x01, 0xaa, 0x00, /* btaddr */
  5046. 0x09, /* version */
  5047. 0x3f, 0x00, /* manufacturer */
  5048. 0xff, 0xbf, 0x01, 0x00, /* supported settings */
  5049. 0x80, 0x00, 0x00, 0x00, /* current settings */
  5050. 0x09, 0x00, /* eir length */
  5051. 0x04, /* dev class length */
  5052. 0x0d, /* dev class info */
  5053. 0x00, /* minor */
  5054. 0x00, /* major */
  5055. 0x00, /* service classes */
  5056. 0x01, /* complete name data length */
  5057. 0x09, /* complete name flag */
  5058. 0x01, /* short name data length */
  5059. 0x08, /* short name flag */
  5060. };
  5061. static const struct generic_data read_ext_ctrl_info1 = {
  5062. .send_opcode = MGMT_OP_READ_EXT_INFO,
  5063. .expect_status = MGMT_STATUS_SUCCESS,
  5064. .expect_param = ext_ctrl_info1,
  5065. .expect_len = sizeof(ext_ctrl_info1),
  5066. };
  5067. static const char set_dev_class1[] = { 0x03, 0xe0 };
  5068. static const struct setup_mgmt_cmd set_dev_class_cmd_arr1[] = {
  5069. {
  5070. .send_opcode = MGMT_OP_SET_DEV_CLASS,
  5071. .send_param = set_dev_class1,
  5072. .send_len = sizeof(set_dev_class1),
  5073. },
  5074. {
  5075. .send_opcode = MGMT_OP_ADD_UUID,
  5076. .send_param = add_spp_uuid_param,
  5077. .send_len = sizeof(add_spp_uuid_param),
  5078. },
  5079. { /* last element should always have opcode 0x00 */
  5080. .send_opcode = 0x00,
  5081. .send_param = NULL,
  5082. .send_len = 0,
  5083. }
  5084. };
  5085. static const char ext_ctrl_info2[] = {
  5086. 0x00, 0x00, 0x00, 0x01, 0xaa, 0x00, /* btaddr */
  5087. 0x09, /* version */
  5088. 0x3f, 0x00, /* manufacturer */
  5089. 0xff, 0xbf, 0x01, 0x00, /* supported settings */
  5090. 0x81, 0x02, 0x00, 0x00, /* current settings */
  5091. 0x0D, 0x00, /* eir length */
  5092. 0x04, /* dev class length */
  5093. 0x0d, /* dev class info */
  5094. 0xe0, /* minor */
  5095. 0x03, /* major */
  5096. 0x00, /* service classes */
  5097. 0x03, /* appearance length */
  5098. 0x19, /* EIR_APPEARANCE */
  5099. 0x00, /* Appearance value */
  5100. 0x00,
  5101. 0x01, /* complete name data length */
  5102. 0x09, /* complete name flag */
  5103. 0x01, /* short name data length */
  5104. 0x08, /* short name flag */
  5105. };
  5106. static const struct generic_data read_ext_ctrl_info2 = {
  5107. .setup_settings = settings_powered_le,
  5108. .setup_mgmt_cmd_arr = set_dev_class_cmd_arr1,
  5109. .send_opcode = MGMT_OP_READ_EXT_INFO,
  5110. .expect_status = MGMT_STATUS_SUCCESS,
  5111. .expect_param = ext_ctrl_info2,
  5112. .expect_len = sizeof(ext_ctrl_info2),
  5113. };
  5114. static const char ext_ctrl_info3[] = {
  5115. 0x00, 0x00, 0x00, 0x01, 0xaa, 0x00, /* btaddr */
  5116. 0x09, /* version */
  5117. 0x3f, 0x00, /* manufacturer */
  5118. 0xff, 0xbf, 0x01, 0x00, /* supported settings */
  5119. 0x80, 0x02, 0x00, 0x00, /* current settings */
  5120. 0x16, 0x00, /* eir length */
  5121. 0x04, /* dev class length */
  5122. 0x0d, /* dev class info */
  5123. 0x00, /* minor */
  5124. 0x00, /* major */
  5125. 0x00, /* service classes */
  5126. 0x03, /* appearance length */
  5127. 0x19, /* EIR_APPEARANCE */
  5128. 0x00, /* Appearance value */
  5129. 0x00,
  5130. 0x0A, /* Local name length */
  5131. 0x09, /* Complete name */
  5132. 0x54, 0x65, 0x73, 0x74,
  5133. 0x20, 0x6E, 0x61, 0x6D, 0x65, /* "Test name" */
  5134. 0x01, /* short name data length */
  5135. 0x08, /* short name flag */
  5136. };
  5137. static const struct generic_data read_ext_ctrl_info3 = {
  5138. .setup_settings = settings_le,
  5139. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  5140. .setup_send_param = set_local_name_param,
  5141. .setup_send_len = sizeof(set_local_name_param),
  5142. .send_opcode = MGMT_OP_READ_EXT_INFO,
  5143. .expect_status = MGMT_STATUS_SUCCESS,
  5144. .expect_param = ext_ctrl_info3,
  5145. .expect_len = sizeof(ext_ctrl_info3),
  5146. };
  5147. static const char ext_ctrl_info4[] = {
  5148. 0x00, 0x00, 0x00, 0x01, 0xaa, 0x00, /* btaddr */
  5149. 0x09, /* version */
  5150. 0x3f, 0x00, /* manufacturer */
  5151. 0xff, 0xbf, 0x01, 0x00, /* supported settings */
  5152. 0x80, 0x02, 0x00, 0x00, /* current settings */
  5153. 0x1a, 0x00, /* eir length */
  5154. 0x04, /* dev class length */
  5155. 0x0d, /* dev class info */
  5156. 0x00, /* minor */
  5157. 0x00, /* major */
  5158. 0x00, /* service classes */
  5159. 0x03, /* appearance length */
  5160. 0x19, /* EIR_APPEARANCE */
  5161. 0x00, /* Appearance value */
  5162. 0x00,
  5163. 0x0A, /* Complete Local name len */
  5164. 0x09, /* Complete name */
  5165. 0x54, 0x65, 0x73, 0x74,
  5166. 0x20, 0x6E, 0x61, 0x6D, 0x65, /* "Test name" */
  5167. 0x05, /* Short Local name len */
  5168. 0x08, /* Short name */
  5169. 0x54, 0x65, 0x73, 0x74, /* "Test" */
  5170. };
  5171. static const struct generic_data read_ext_ctrl_info4 = {
  5172. .setup_settings = settings_le,
  5173. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  5174. .setup_send_param = &set_local_name_cp,
  5175. .setup_send_len = sizeof(set_local_name_cp),
  5176. .send_opcode = MGMT_OP_READ_EXT_INFO,
  5177. .expect_status = MGMT_STATUS_SUCCESS,
  5178. .expect_param = ext_ctrl_info4,
  5179. .expect_len = sizeof(ext_ctrl_info4),
  5180. };
  5181. static const struct setup_mgmt_cmd set_dev_class_cmd_arr2[] = {
  5182. {
  5183. .send_opcode = MGMT_OP_SET_DEV_CLASS,
  5184. .send_param = set_dev_class1,
  5185. .send_len = sizeof(set_dev_class1),
  5186. },
  5187. {
  5188. .send_opcode = MGMT_OP_ADD_UUID,
  5189. .send_param = add_spp_uuid_param,
  5190. .send_len = sizeof(add_spp_uuid_param),
  5191. },
  5192. {
  5193. .send_opcode = MGMT_OP_SET_LOCAL_NAME,
  5194. .send_param = &set_local_name_cp,
  5195. .send_len = sizeof(set_local_name_cp),
  5196. },
  5197. { /* last element should always have opcode 0x00 */
  5198. .send_opcode = 0x00,
  5199. .send_param = NULL,
  5200. .send_len = 0,
  5201. }
  5202. };
  5203. static const char ext_ctrl_info5[] = {
  5204. 0x00, 0x00, 0x00, 0x01, 0xaa, 0x00, /* btaddr */
  5205. 0x09, /* version */
  5206. 0x3f, 0x00, /* manufacturer */
  5207. 0xff, 0xbf, 0x01, 0x00, /* supported settings */
  5208. 0x81, 0x02, 0x00, 0x00, /* current settings */
  5209. 0x1a, 0x00, /* eir len */
  5210. 0x04, /* dev class len */
  5211. 0x0d, /* dev class info */
  5212. 0xe0, /* minor */
  5213. 0x03, /* major */
  5214. 0x00, /* service classes */
  5215. 0x03, /* appearance length */
  5216. 0x19, /* EIR_APPEARANCE */
  5217. 0x00, /* Appearance value */
  5218. 0x00,
  5219. 0x0A, /* Complete Local name len */
  5220. 0x09, /* Complete name */
  5221. 0x54, 0x65, 0x73, 0x74,
  5222. 0x20, 0x6E, 0x61, 0x6D, 0x65, /* "Test name" */
  5223. 0x05, /* Short Local name len */
  5224. 0x08, /* Short name */
  5225. 0x54, 0x65, 0x73, 0x74, /* "Test" */
  5226. };
  5227. static const struct generic_data read_ext_ctrl_info5 = {
  5228. .setup_settings = settings_powered_le,
  5229. .setup_mgmt_cmd_arr = set_dev_class_cmd_arr2,
  5230. .send_opcode = MGMT_OP_READ_EXT_INFO,
  5231. .expect_status = MGMT_STATUS_SUCCESS,
  5232. .expect_param = ext_ctrl_info5,
  5233. .expect_len = sizeof(ext_ctrl_info5),
  5234. };
  5235. static const struct generic_data read_controller_cap_invalid_param_test = {
  5236. .send_opcode = MGMT_OP_READ_CONTROLLER_CAP,
  5237. .send_param = dummy_data,
  5238. .send_len = sizeof(dummy_data),
  5239. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  5240. };
  5241. static const struct generic_data read_controller_cap_success = {
  5242. .send_opcode = MGMT_OP_READ_CONTROLLER_CAP,
  5243. .expect_ignore_param = true,
  5244. .expect_status = MGMT_STATUS_SUCCESS,
  5245. };
  5246. static const char ext_adv_params_valid[] = {
  5247. 0x01, /* instance */
  5248. 0x00, 0xC0, 0x00, 0x00, /* flags, use tx power and intervals */
  5249. 0x00, 0x00, /* duration */
  5250. 0x00, 0x00, /* timeout */
  5251. 0xA0, 0x00, 0x00, 0x00, /* min_interval */
  5252. 0xA0, 0x00, 0x00, 0x00, /* max_interval */
  5253. 0x7f, /* tx_power */
  5254. };
  5255. static const char ext_adv_hci_params_valid[] = {
  5256. 0x01, /* handle */
  5257. 0x10, 0x00, /* evt_properties */
  5258. 0xA0, 0x00, 0x00, /* min_interval */
  5259. 0xA0, 0x00, 0x00, /* max_interval */
  5260. 0x07, /* channel_map */
  5261. 0x01, /* own_addr_type */
  5262. 0x00, /* peer_addr_type */
  5263. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* peer_addr */
  5264. 0x00, /* filter_policy */
  5265. 0x7f, /* tx_power */
  5266. 0x01, /* primary_phy */
  5267. 0x00, /* secondary_max_skip */
  5268. 0x01, /* secondary_phy */
  5269. 0x00, /* sid */
  5270. 0x00, /* notif_enable */
  5271. };
  5272. static const char ext_adv_params_mgmt_rsp_valid_50[] = {
  5273. 0x01, /* instance */
  5274. 0x00, /* tx_power defaults to 0 on BT5 platform*/
  5275. 0x1f, /* max_adv_data_len */
  5276. 0x1f, /* max_scan_rsp_len */
  5277. };
  5278. static const char ext_adv_params_mgmt_rsp_valid[] = {
  5279. 0x01, /* instance */
  5280. 0x7f, /* tx_power */
  5281. 0x1f, /* max_adv_data_len */
  5282. 0x1f, /* max_scan_rsp_len */
  5283. };
  5284. static const char ext_adv_data_mgmt_rsp_valid[] = {
  5285. 0x01, /* instance */
  5286. };
  5287. static const uint8_t ext_adv_data_valid[] = {
  5288. 0x01, /* instance */
  5289. 0x04, /* Ad data len */
  5290. 0x06, /* Scan response data len */
  5291. 0x03, /* Section length */
  5292. 0x19, /* GAP Appearance */
  5293. 0x01,
  5294. 0x23,
  5295. 0x05, /* Section length */
  5296. 0x08, /* ad type Short Name */
  5297. 't',
  5298. 'e',
  5299. 's',
  5300. 't',
  5301. };
  5302. static const char ext_adv_hci_ad_data_valid[] = {
  5303. 0x01, /* handle */
  5304. 0x03, /* operation */
  5305. 0x01, /* minimize fragmentation */
  5306. 0x04, /* data length */
  5307. 0x03, /* Section length */
  5308. 0x19, /* GAP Appearance */
  5309. 0x01,
  5310. 0x23,
  5311. };
  5312. static const char ext_adv_hci_scan_rsp_data_valid[] = {
  5313. 0x01, /* handle */
  5314. 0x03, /* operation */
  5315. 0x01, /* minimize fragmentation */
  5316. 0x06,
  5317. 0x05, /* Section length */
  5318. 0x08, /* ad type Short Name */
  5319. 't',
  5320. 'e',
  5321. 's',
  5322. 't',
  5323. };
  5324. static const uint8_t ext_adv_data_invalid[] = {
  5325. 0x01, /* instance */
  5326. 0x04, /* Ad data len */
  5327. 0x06, /* Scan response data len */
  5328. 0x03, /* Section length */
  5329. 0x19, /* GAP Appearance */
  5330. 0x01,
  5331. 0x23,
  5332. 0x07, /* Section length purposefully two octets too long */
  5333. 0x08, /* ad type Short Name */
  5334. 't',
  5335. 'e',
  5336. 's',
  5337. 't',
  5338. };
  5339. static const struct generic_data adv_params_fail_unpowered = {
  5340. .setup_settings = settings_le, /* Unpowered */
  5341. .send_opcode = MGMT_OP_ADD_EXT_ADV_PARAMS,
  5342. .send_param = ext_adv_params_valid,
  5343. .send_len = sizeof(ext_adv_params_valid),
  5344. .expect_status = MGMT_STATUS_REJECTED,
  5345. };
  5346. static const struct generic_data adv_params_fail_invalid_params = {
  5347. .setup_settings = settings_powered_le,
  5348. .send_opcode = MGMT_OP_ADD_EXT_ADV_PARAMS,
  5349. .send_param = dummy_data,
  5350. .send_len = sizeof(dummy_data),
  5351. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  5352. };
  5353. static const struct generic_data adv_params_success = {
  5354. .setup_settings = settings_powered_le,
  5355. .send_opcode = MGMT_OP_ADD_EXT_ADV_PARAMS,
  5356. .send_param = ext_adv_params_valid,
  5357. .send_len = sizeof(ext_adv_params_valid),
  5358. .expect_param = ext_adv_params_mgmt_rsp_valid,
  5359. .expect_len = sizeof(ext_adv_params_mgmt_rsp_valid),
  5360. .expect_status = MGMT_STATUS_SUCCESS,
  5361. };
  5362. static const struct generic_data adv_params_success_50 = {
  5363. .setup_settings = settings_powered_le,
  5364. .send_opcode = MGMT_OP_ADD_EXT_ADV_PARAMS,
  5365. .send_param = ext_adv_params_valid,
  5366. .send_len = sizeof(ext_adv_params_valid),
  5367. .expect_status = MGMT_STATUS_SUCCESS,
  5368. .expect_param = ext_adv_params_mgmt_rsp_valid_50,
  5369. .expect_len = sizeof(ext_adv_params_mgmt_rsp_valid_50),
  5370. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  5371. .expect_hci_param = ext_adv_hci_params_valid,
  5372. .expect_hci_len = sizeof(ext_adv_hci_params_valid),
  5373. };
  5374. static const struct generic_data adv_data_fail_no_params = {
  5375. .setup_settings = settings_powered_le,
  5376. .send_opcode = MGMT_OP_ADD_EXT_ADV_DATA,
  5377. .send_param = ext_adv_data_valid,
  5378. .send_len = sizeof(ext_adv_data_valid),
  5379. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  5380. };
  5381. static const struct generic_data adv_data_success = {
  5382. .setup_settings = settings_powered_le,
  5383. .send_opcode = MGMT_OP_ADD_EXT_ADV_DATA,
  5384. .send_param = ext_adv_data_valid,
  5385. .send_len = sizeof(ext_adv_data_valid),
  5386. .expect_status = MGMT_STATUS_SUCCESS,
  5387. .expect_param = ext_adv_data_mgmt_rsp_valid,
  5388. .expect_len = sizeof(ext_adv_data_mgmt_rsp_valid),
  5389. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_DATA,
  5390. .expect_hci_param = ext_adv_hci_ad_data_valid,
  5391. .expect_hci_len = sizeof(ext_adv_hci_ad_data_valid),
  5392. };
  5393. static const struct generic_data adv_scan_rsp_success = {
  5394. .setup_settings = settings_powered_le,
  5395. .send_opcode = MGMT_OP_ADD_EXT_ADV_DATA,
  5396. .send_param = ext_adv_data_valid,
  5397. .send_len = sizeof(ext_adv_data_valid),
  5398. .expect_status = MGMT_STATUS_SUCCESS,
  5399. .expect_param = ext_adv_data_mgmt_rsp_valid,
  5400. .expect_len = sizeof(ext_adv_data_mgmt_rsp_valid),
  5401. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_RSP_DATA,
  5402. .expect_hci_param = ext_adv_hci_scan_rsp_data_valid,
  5403. .expect_hci_len = sizeof(ext_adv_hci_scan_rsp_data_valid),
  5404. };
  5405. static const struct generic_data adv_data_invalid_params = {
  5406. .setup_settings = settings_powered_le,
  5407. .send_opcode = MGMT_OP_ADD_EXT_ADV_DATA,
  5408. .send_param = ext_adv_data_invalid,
  5409. .send_len = sizeof(ext_adv_data_invalid),
  5410. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  5411. };
  5412. static const uint8_t set_dev_id_param_success_1[] = {
  5413. 0x01, /* Source - 0x0001 (Bluetooth SIG) */
  5414. 0x00,
  5415. 0x02, /* Vendor */
  5416. 0x00,
  5417. 0xcd, /* Product */
  5418. 0xab,
  5419. 0x34,
  5420. 0x12, /* Version */
  5421. };
  5422. static const char write_eir_set_dev_id_success_1[241] = {
  5423. 0x00, 0x02, 0x0a, 0x00, 0x09, 0x10, 0x01, 0x00,
  5424. 0x02, 0x00, 0xcd, 0xab, 0x34, 0x12 };
  5425. static const struct generic_data set_dev_id_success_1 = {
  5426. .setup_settings = settings_powered_ssp,
  5427. .send_opcode = MGMT_OP_SET_DEVICE_ID,
  5428. .send_param = set_dev_id_param_success_1,
  5429. .send_len = sizeof(set_dev_id_param_success_1),
  5430. .expect_status = MGMT_STATUS_SUCCESS,
  5431. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  5432. .expect_hci_param = write_eir_set_dev_id_success_1,
  5433. .expect_hci_len = sizeof(write_eir_set_dev_id_success_1),
  5434. };
  5435. static const uint8_t set_dev_id_param_success_2[] = {
  5436. 0x02, /* Source - 0x0001 (Bluetooth SIG) */
  5437. 0x00,
  5438. 0x02, /* Vendor */
  5439. 0x00,
  5440. 0xcd, /* Product */
  5441. 0xab,
  5442. 0x34,
  5443. 0x12, /* Version */
  5444. };
  5445. static const char write_eir_set_dev_id_success_2[241] = {
  5446. 0x00, 0x02, 0x0a, 0x00, 0x09, 0x10, 0x02, 0x00,
  5447. 0x02, 0x00, 0xcd, 0xab, 0x34, 0x12 };
  5448. static const struct generic_data set_dev_id_success_2 = {
  5449. .setup_settings = settings_powered_ssp,
  5450. .send_opcode = MGMT_OP_SET_DEVICE_ID,
  5451. .send_param = set_dev_id_param_success_2,
  5452. .send_len = sizeof(set_dev_id_param_success_2),
  5453. .expect_status = MGMT_STATUS_SUCCESS,
  5454. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  5455. .expect_hci_param = write_eir_set_dev_id_success_2,
  5456. .expect_hci_len = sizeof(write_eir_set_dev_id_success_2),
  5457. };
  5458. static const uint8_t set_dev_id_param_disable[8] = { 0x00 };
  5459. static const struct generic_data set_dev_id_disable = {
  5460. .setup_settings = settings_powered_ssp,
  5461. .send_opcode = MGMT_OP_SET_DEVICE_ID,
  5462. .send_param = set_dev_id_param_disable,
  5463. .send_len = sizeof(set_dev_id_param_disable),
  5464. .expect_status = MGMT_STATUS_SUCCESS,
  5465. };
  5466. static const struct generic_data set_dev_id_power_off_on = {
  5467. .setup_settings = settings_ssp,
  5468. .setup_send_opcode = MGMT_OP_SET_DEVICE_ID,
  5469. .setup_send_param = set_dev_id_param_success_1,
  5470. .setup_send_len = sizeof(set_dev_id_param_success_1),
  5471. .send_opcode = MGMT_OP_SET_POWERED,
  5472. .send_param = set_powered_on_param,
  5473. .send_len = sizeof(set_powered_on_param),
  5474. .expect_status = MGMT_STATUS_SUCCESS,
  5475. .expect_param = set_ssp_settings_param_2,
  5476. .expect_len = sizeof(set_ssp_settings_param_2),
  5477. .expect_settings_set = MGMT_SETTING_POWERED,
  5478. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  5479. .expect_hci_param = write_eir_set_dev_id_success_1,
  5480. .expect_hci_len = sizeof(write_eir_set_dev_id_success_1),
  5481. };
  5482. static const struct generic_data set_dev_id_ssp_off_on = {
  5483. .setup_settings = settings_powered,
  5484. .setup_send_opcode = MGMT_OP_SET_DEVICE_ID,
  5485. .setup_send_param = set_dev_id_param_success_1,
  5486. .setup_send_len = sizeof(set_dev_id_param_success_1),
  5487. .send_opcode = MGMT_OP_SET_SSP,
  5488. .send_param = set_ssp_on_param,
  5489. .send_len = sizeof(set_ssp_on_param),
  5490. .expect_status = MGMT_STATUS_SUCCESS,
  5491. .expect_param = set_ssp_settings_param_2,
  5492. .expect_len = sizeof(set_ssp_settings_param_2),
  5493. .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE,
  5494. .expect_hci_param = write_eir_set_dev_id_success_1,
  5495. .expect_hci_len = sizeof(write_eir_set_dev_id_success_1),
  5496. };
  5497. static const uint8_t set_dev_id_invalid_1[] = {
  5498. 0x03, /* Source */
  5499. 0x00,
  5500. 0x02, /* Vendor */
  5501. 0x00,
  5502. 0xcd, /* Product */
  5503. 0xab,
  5504. 0x34,
  5505. 0x12, /* Version */
  5506. };
  5507. static const struct generic_data set_dev_id_invalid_param = {
  5508. .setup_settings = settings_powered_ssp,
  5509. .send_opcode = MGMT_OP_SET_DEVICE_ID,
  5510. .send_param = set_dev_id_invalid_1,
  5511. .send_len = sizeof(set_dev_id_invalid_1),
  5512. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  5513. };
  5514. static void client_cmd_complete(uint16_t opcode, uint8_t status,
  5515. const void *param, uint8_t len,
  5516. void *user_data)
  5517. {
  5518. struct test_data *data = tester_get_data();
  5519. const struct generic_data *test = data->test_data;
  5520. struct bthost *bthost;
  5521. bthost = hciemu_client_get_host(data->hciemu);
  5522. switch (opcode) {
  5523. case BT_HCI_CMD_WRITE_SCAN_ENABLE:
  5524. case BT_HCI_CMD_LE_SET_ADV_ENABLE:
  5525. case BT_HCI_CMD_LE_SET_EXT_ADV_ENABLE:
  5526. tester_print("Client set connectable: %s (0x%02x)",
  5527. mgmt_errstr(status), status);
  5528. if (!status && test->client_enable_ssp) {
  5529. bthost_write_ssp_mode(bthost, 0x01);
  5530. return;
  5531. }
  5532. break;
  5533. case BT_HCI_CMD_WRITE_SIMPLE_PAIRING_MODE:
  5534. tester_print("Client enable SSP: %s (0x%02x)",
  5535. mgmt_errstr(status), status);
  5536. break;
  5537. default:
  5538. return;
  5539. }
  5540. if (status)
  5541. tester_setup_failed();
  5542. else
  5543. test_setup_condition_complete(data);
  5544. }
  5545. static void setup_bthost(void)
  5546. {
  5547. struct test_data *data = tester_get_data();
  5548. const struct generic_data *test = data->test_data;
  5549. struct bthost *bthost;
  5550. bthost = hciemu_client_get_host(data->hciemu);
  5551. bthost_set_cmd_complete_cb(bthost, client_cmd_complete, data);
  5552. test_add_setup_condition(data);
  5553. if (data->hciemu_type == HCIEMU_TYPE_LE ||
  5554. test->client_enable_adv) {
  5555. if (data->hciemu_type >= HCIEMU_TYPE_BREDRLE50) {
  5556. bthost_set_ext_adv_params(bthost);
  5557. bthost_set_ext_adv_enable(bthost, 0x01);
  5558. } else
  5559. bthost_set_adv_enable(bthost, 0x01);
  5560. } else
  5561. bthost_write_scan_enable(bthost, 0x03);
  5562. }
  5563. static void setup_pairing_acceptor(const void *test_data)
  5564. {
  5565. struct test_data *data = tester_get_data();
  5566. const struct generic_data *test = data->test_data;
  5567. if (!test->io_cap)
  5568. return;
  5569. mgmt_send(data->mgmt, MGMT_OP_SET_IO_CAPABILITY, data->mgmt_index,
  5570. sizeof(test->io_cap), &test->io_cap,
  5571. NULL, NULL, NULL);
  5572. setup_bthost();
  5573. }
  5574. static void setup_powered_callback(uint8_t status, uint16_t length,
  5575. const void *param, void *user_data)
  5576. {
  5577. if (status != MGMT_STATUS_SUCCESS) {
  5578. tester_setup_failed();
  5579. return;
  5580. }
  5581. tester_print("Controller powered on");
  5582. setup_bthost();
  5583. }
  5584. static void setup_class(const void *test_data)
  5585. {
  5586. struct test_data *data = tester_get_data();
  5587. unsigned char param[] = { 0x01 };
  5588. unsigned char class_param[] = { 0x01, 0x0c };
  5589. tester_print("Setting device class and powering on");
  5590. mgmt_send(data->mgmt, MGMT_OP_SET_DEV_CLASS, data->mgmt_index,
  5591. sizeof(class_param), class_param,
  5592. NULL, NULL, NULL);
  5593. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  5594. sizeof(param), param,
  5595. setup_powered_callback, NULL, NULL);
  5596. }
  5597. static void discovering_event(uint16_t index, uint16_t length,
  5598. const void *param, void *user_data)
  5599. {
  5600. struct test_data *data = tester_get_data();
  5601. const struct mgmt_ev_discovering *ev = param;
  5602. mgmt_unregister(data->mgmt, data->mgmt_discov_ev_id);
  5603. if (length != sizeof(*ev)) {
  5604. tester_warn("Incorrect discovering event length");
  5605. tester_setup_failed();
  5606. return;
  5607. }
  5608. if (!ev->discovering) {
  5609. tester_warn("Unexpected discovery stopped event");
  5610. tester_setup_failed();
  5611. return;
  5612. }
  5613. tester_setup_complete();
  5614. }
  5615. static void setup_discovery_callback(uint8_t status, uint16_t length,
  5616. const void *param, void *user_data)
  5617. {
  5618. if (status != MGMT_STATUS_SUCCESS) {
  5619. tester_setup_failed();
  5620. return;
  5621. }
  5622. tester_print("Discovery started");
  5623. }
  5624. static void setup_start_discovery(const void *test_data)
  5625. {
  5626. struct test_data *data = tester_get_data();
  5627. const struct generic_data *test = data->test_data;
  5628. const void *send_param = test->setup_send_param;
  5629. uint16_t send_len = test->setup_send_len;
  5630. unsigned int id;
  5631. id = mgmt_register(data->mgmt, MGMT_EV_DISCOVERING, data->mgmt_index,
  5632. discovering_event, NULL, NULL);
  5633. data->mgmt_discov_ev_id = id;
  5634. mgmt_send(data->mgmt, test->setup_send_opcode, data->mgmt_index,
  5635. send_len, send_param, setup_discovery_callback,
  5636. NULL, NULL);
  5637. }
  5638. static void setup_multi_uuid32(const void *test_data)
  5639. {
  5640. struct test_data *data = tester_get_data();
  5641. unsigned char param[] = { 0x01 };
  5642. tester_print("Powering on controller (with 32-bit UUID)");
  5643. mgmt_send(data->mgmt, MGMT_OP_SET_SSP, data->mgmt_index,
  5644. sizeof(param), param, NULL, NULL, NULL);
  5645. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5646. sizeof(add_uuid32_param_1), add_uuid32_param_1,
  5647. NULL, NULL, NULL);
  5648. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5649. sizeof(add_uuid32_param_2), add_uuid32_param_2,
  5650. NULL, NULL, NULL);
  5651. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5652. sizeof(add_uuid32_param_3), add_uuid32_param_3,
  5653. NULL, NULL, NULL);
  5654. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  5655. sizeof(param), param,
  5656. setup_powered_callback, NULL, NULL);
  5657. }
  5658. static void setup_multi_uuid32_2(const void *test_data)
  5659. {
  5660. struct test_data *data = tester_get_data();
  5661. unsigned char param[] = { 0x01 };
  5662. unsigned char uuid_param[] = {
  5663. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
  5664. 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  5665. 0x00 };
  5666. int i;
  5667. tester_print("Powering on controller (with many 32-bit UUIDs)");
  5668. mgmt_send(data->mgmt, MGMT_OP_SET_SSP, data->mgmt_index,
  5669. sizeof(param), param, NULL, NULL, NULL);
  5670. for (i = 0; i < 58; i++) {
  5671. uint32_t val = htobl(0xffffffff - i);
  5672. memcpy(&uuid_param[12], &val, sizeof(val));
  5673. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5674. sizeof(uuid_param), uuid_param,
  5675. NULL, NULL, NULL);
  5676. }
  5677. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  5678. sizeof(param), param,
  5679. setup_powered_callback, NULL, NULL);
  5680. }
  5681. static void setup_multi_uuid128(const void *test_data)
  5682. {
  5683. struct test_data *data = tester_get_data();
  5684. unsigned char param[] = { 0x01 };
  5685. tester_print("Powering on controller (with 128-bit UUID)");
  5686. mgmt_send(data->mgmt, MGMT_OP_SET_SSP, data->mgmt_index,
  5687. sizeof(param), param, NULL, NULL, NULL);
  5688. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5689. sizeof(add_uuid128_param_1), add_uuid128_param_1,
  5690. NULL, NULL, NULL);
  5691. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  5692. sizeof(param), param,
  5693. setup_powered_callback, NULL, NULL);
  5694. }
  5695. static void setup_multi_uuid128_2(const void *test_data)
  5696. {
  5697. struct test_data *data = tester_get_data();
  5698. unsigned char param[] = { 0x01 };
  5699. unsigned char uuid_param[] = {
  5700. 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
  5701. 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00,
  5702. 0x00 };
  5703. int i;
  5704. tester_print("Powering on controller (with many 128-bit UUIDs)");
  5705. mgmt_send(data->mgmt, MGMT_OP_SET_SSP, data->mgmt_index,
  5706. sizeof(param), param, NULL, NULL, NULL);
  5707. for (i = 0; i < 13; i++) {
  5708. uuid_param[15] = i;
  5709. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5710. sizeof(uuid_param), uuid_param,
  5711. NULL, NULL, NULL);
  5712. }
  5713. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  5714. sizeof(param), param,
  5715. setup_powered_callback, NULL, NULL);
  5716. }
  5717. static void setup_multi_uuid16(const void *test_data)
  5718. {
  5719. struct test_data *data = tester_get_data();
  5720. unsigned char param[] = { 0x01 };
  5721. tester_print("Powering on controller (with SPP UUID)");
  5722. mgmt_send(data->mgmt, MGMT_OP_SET_SSP, data->mgmt_index,
  5723. sizeof(param), param, NULL, NULL, NULL);
  5724. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5725. sizeof(add_spp_uuid_param), add_spp_uuid_param,
  5726. NULL, NULL, NULL);
  5727. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5728. sizeof(add_dun_uuid_param), add_dun_uuid_param,
  5729. NULL, NULL, NULL);
  5730. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5731. sizeof(add_sync_uuid_param), add_sync_uuid_param,
  5732. NULL, NULL, NULL);
  5733. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  5734. sizeof(param), param,
  5735. setup_powered_callback, NULL, NULL);
  5736. }
  5737. static void setup_multi_uuid16_power_off(const void *test_data)
  5738. {
  5739. struct test_data *data = tester_get_data();
  5740. unsigned char param[] = { 0x01 };
  5741. tester_print("Adding UUIDs without powering on");
  5742. mgmt_send(data->mgmt, MGMT_OP_SET_SSP, data->mgmt_index,
  5743. sizeof(param), param, NULL, NULL, NULL);
  5744. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5745. sizeof(add_spp_uuid_param), add_spp_uuid_param,
  5746. NULL, NULL, NULL);
  5747. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5748. sizeof(add_dun_uuid_param), add_dun_uuid_param,
  5749. NULL, NULL, NULL);
  5750. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5751. sizeof(add_sync_uuid_param), add_sync_uuid_param,
  5752. NULL, NULL, NULL);
  5753. setup_bthost();
  5754. }
  5755. static void setup_multi_uuid16_power_off_remove(const void *test_data)
  5756. {
  5757. struct test_data *data = tester_get_data();
  5758. unsigned char param[] = { 0x01 };
  5759. tester_print("Adding UUIDs without powering on and remove UUID");
  5760. mgmt_send(data->mgmt, MGMT_OP_SET_SSP, data->mgmt_index,
  5761. sizeof(param), param, NULL, NULL, NULL);
  5762. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5763. sizeof(add_spp_uuid_param), add_spp_uuid_param,
  5764. NULL, NULL, NULL);
  5765. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5766. sizeof(add_dun_uuid_param), add_dun_uuid_param,
  5767. NULL, NULL, NULL);
  5768. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5769. sizeof(add_sync_uuid_param), add_sync_uuid_param,
  5770. NULL, NULL, NULL);
  5771. mgmt_send(data->mgmt, MGMT_OP_REMOVE_UUID, data->mgmt_index,
  5772. sizeof(remove_dun_uuid_param), remove_dun_uuid_param,
  5773. NULL, NULL, NULL);
  5774. setup_bthost();
  5775. }
  5776. static void setup_multi_uuid16_2(const void *test_data)
  5777. {
  5778. struct test_data *data = tester_get_data();
  5779. unsigned char param[] = { 0x01 };
  5780. unsigned char uuid_param[] = {
  5781. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
  5782. 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  5783. 0x00 };
  5784. int i;
  5785. tester_print("Powering on controller (with many 16-bit UUIDs)");
  5786. mgmt_send(data->mgmt, MGMT_OP_SET_SSP, data->mgmt_index,
  5787. sizeof(param), param, NULL, NULL, NULL);
  5788. for (i = 0; i < 117; i++) {
  5789. uint16_t val = htobs(i + 0x2000);
  5790. memcpy(&uuid_param[12], &val, sizeof(val));
  5791. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5792. sizeof(uuid_param), uuid_param,
  5793. NULL, NULL, NULL);
  5794. }
  5795. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  5796. sizeof(param), param,
  5797. setup_powered_callback, NULL, NULL);
  5798. }
  5799. static void setup_uuid_mix(const void *test_data)
  5800. {
  5801. struct test_data *data = tester_get_data();
  5802. unsigned char param[] = { 0x01 };
  5803. tester_print("Powering on controller (with mixed UUIDs)");
  5804. mgmt_send(data->mgmt, MGMT_OP_SET_SSP, data->mgmt_index,
  5805. sizeof(param), param, NULL, NULL, NULL);
  5806. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5807. sizeof(add_spp_uuid_param), add_spp_uuid_param,
  5808. NULL, NULL, NULL);
  5809. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5810. sizeof(add_uuid32_param_1), add_uuid32_param_1,
  5811. NULL, NULL, NULL);
  5812. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5813. sizeof(add_uuid128_param_1), add_uuid128_param_1,
  5814. NULL, NULL, NULL);
  5815. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5816. sizeof(add_dun_uuid_param), add_dun_uuid_param,
  5817. NULL, NULL, NULL);
  5818. mgmt_send(data->mgmt, MGMT_OP_ADD_UUID, data->mgmt_index,
  5819. sizeof(add_uuid32_param_2), add_uuid32_param_2,
  5820. NULL, NULL, NULL);
  5821. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  5822. sizeof(param), param,
  5823. setup_powered_callback, NULL, NULL);
  5824. }
  5825. static void setup_load_ltks_callback(uint8_t status, uint16_t length,
  5826. const void *param, void *user_data)
  5827. {
  5828. if (status != MGMT_STATUS_SUCCESS) {
  5829. tester_setup_failed();
  5830. return;
  5831. }
  5832. tester_print("Loaded Long Term Key");
  5833. }
  5834. static void setup_load_ltks_20_by_1(const void *test_data)
  5835. {
  5836. struct test_data *data = tester_get_data();
  5837. struct mgmt_cp_load_long_term_keys *cp;
  5838. struct mgmt_ltk_info *info;
  5839. unsigned char param[sizeof(*cp) + sizeof(*info)] = { 0x00 };
  5840. unsigned char param_on[] = { 0x01 };
  5841. int i;
  5842. cp = (struct mgmt_cp_load_long_term_keys *)param;
  5843. cp->key_count = 1;
  5844. info = (struct mgmt_ltk_info *)cp->keys;
  5845. info->addr.type = 0x01; /* LE Public */
  5846. for (i = 0; i < 20; i++) {
  5847. /* Update BDADDR */
  5848. info->addr.bdaddr.b[0] = i + 1;
  5849. mgmt_send(data->mgmt, MGMT_OP_LOAD_LONG_TERM_KEYS,
  5850. data->mgmt_index, sizeof(param), param,
  5851. setup_load_ltks_callback, NULL, NULL);
  5852. }
  5853. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  5854. sizeof(param_on), param_on,
  5855. setup_powered_callback, NULL, NULL);
  5856. }
  5857. static void setup_add_device(const void *test_data)
  5858. {
  5859. struct test_data *data = tester_get_data();
  5860. unsigned char param[] = { 0x01 };
  5861. const unsigned char *add_param;
  5862. size_t add_param_len;
  5863. tester_print("Powering on controller (with added device)");
  5864. if (data->hciemu_type == HCIEMU_TYPE_LE) {
  5865. add_param = add_device_success_param_2;
  5866. add_param_len = sizeof(add_device_success_param_2);
  5867. } else {
  5868. add_param = add_device_success_param_1;
  5869. add_param_len = sizeof(add_device_success_param_1);
  5870. }
  5871. mgmt_send(data->mgmt, MGMT_OP_ADD_DEVICE, data->mgmt_index,
  5872. add_param_len, add_param, NULL, NULL, NULL);
  5873. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  5874. sizeof(param), param,
  5875. setup_powered_callback, NULL, NULL);
  5876. }
  5877. static void setup_add_advertising_callback(uint8_t status, uint16_t length,
  5878. const void *param, void *user_data)
  5879. {
  5880. struct mgmt_rp_add_advertising *rp =
  5881. (struct mgmt_rp_add_advertising *) param;
  5882. if (status != MGMT_STATUS_SUCCESS) {
  5883. tester_setup_failed();
  5884. return;
  5885. }
  5886. tester_print("Add Advertising setup complete (instance %d)",
  5887. rp->instance);
  5888. setup_bthost();
  5889. }
  5890. #define TESTER_ADD_ADV_DATA_LEN 7
  5891. static void setup_add_adv_param(struct mgmt_cp_add_advertising *cp,
  5892. uint8_t instance)
  5893. {
  5894. memset(cp, 0, sizeof(*cp));
  5895. cp->instance = instance;
  5896. cp->adv_data_len = TESTER_ADD_ADV_DATA_LEN;
  5897. cp->data[0] = TESTER_ADD_ADV_DATA_LEN - 1; /* AD len */
  5898. cp->data[1] = 0x08; /* AD type: shortened local name */
  5899. cp->data[2] = 't'; /* adv data ... */
  5900. cp->data[3] = 'e';
  5901. cp->data[4] = 's';
  5902. cp->data[5] = 't';
  5903. cp->data[6] = '0' + instance;
  5904. }
  5905. static void setup_add_advertising_not_powered(const void *test_data)
  5906. {
  5907. struct test_data *data = tester_get_data();
  5908. struct mgmt_cp_add_advertising *cp;
  5909. unsigned char adv_param[sizeof(*cp) + TESTER_ADD_ADV_DATA_LEN];
  5910. unsigned char param[] = { 0x01 };
  5911. tester_print("Adding advertising instance while unpowered");
  5912. cp = (struct mgmt_cp_add_advertising *) adv_param;
  5913. setup_add_adv_param(cp, 1);
  5914. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  5915. sizeof(param), &param,
  5916. NULL, NULL, NULL);
  5917. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  5918. sizeof(adv_param), adv_param,
  5919. setup_add_advertising_callback,
  5920. NULL, NULL);
  5921. }
  5922. static void setup_add_advertising(const void *test_data)
  5923. {
  5924. struct test_data *data = tester_get_data();
  5925. struct mgmt_cp_add_advertising *cp;
  5926. unsigned char adv_param[sizeof(*cp) + TESTER_ADD_ADV_DATA_LEN];
  5927. unsigned char param[] = { 0x01 };
  5928. tester_print("Adding advertising instance while powered");
  5929. cp = (struct mgmt_cp_add_advertising *) adv_param;
  5930. setup_add_adv_param(cp, 1);
  5931. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  5932. sizeof(param), &param,
  5933. NULL, NULL, NULL);
  5934. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  5935. sizeof(param), &param,
  5936. NULL, NULL, NULL);
  5937. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  5938. sizeof(adv_param), adv_param,
  5939. setup_add_advertising_callback,
  5940. NULL, NULL);
  5941. }
  5942. static void setup_add_advertising_connectable(const void *test_data)
  5943. {
  5944. struct test_data *data = tester_get_data();
  5945. struct mgmt_cp_add_advertising *cp;
  5946. unsigned char adv_param[sizeof(*cp) + TESTER_ADD_ADV_DATA_LEN];
  5947. unsigned char param[] = { 0x01 };
  5948. tester_print("Adding advertising instance while connectable");
  5949. cp = (struct mgmt_cp_add_advertising *) adv_param;
  5950. setup_add_adv_param(cp, 1);
  5951. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  5952. sizeof(param), &param,
  5953. NULL, NULL, NULL);
  5954. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  5955. sizeof(param), &param,
  5956. NULL, NULL, NULL);
  5957. mgmt_send(data->mgmt, MGMT_OP_SET_CONNECTABLE, data->mgmt_index,
  5958. sizeof(param), &param,
  5959. NULL, NULL, NULL);
  5960. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  5961. sizeof(adv_param), adv_param,
  5962. setup_add_advertising_callback,
  5963. NULL, NULL);
  5964. }
  5965. static int create_le_att_sock(struct test_data *data)
  5966. {
  5967. struct sockaddr_l2 addr;
  5968. int sk, err;
  5969. sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET | SOCK_NONBLOCK,
  5970. BTPROTO_L2CAP);
  5971. if (sk < 0) {
  5972. err = -errno;
  5973. tester_warn("Can't create socket: %s (%d)", strerror(errno),
  5974. errno);
  5975. return err;
  5976. }
  5977. memset(&addr, 0, sizeof(addr));
  5978. addr.l2_family = AF_BLUETOOTH;
  5979. addr.l2_psm = 0;
  5980. addr.l2_cid = htobs(0x0004);
  5981. addr.l2_bdaddr_type = BDADDR_LE_PUBLIC;
  5982. if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
  5983. err = -errno;
  5984. tester_warn("Can't bind socket: %s (%d)", strerror(errno),
  5985. errno);
  5986. close(sk);
  5987. return err;
  5988. }
  5989. if (listen(sk, 1) < 0) {
  5990. err = -errno;
  5991. tester_warn("Can't bind socket: %s (%d)", strerror(errno),
  5992. errno);
  5993. close(sk);
  5994. return err;
  5995. }
  5996. data->sk = sk;
  5997. return sk;
  5998. }
  5999. static void setup_advertise_while_connected(const void *test_data)
  6000. {
  6001. struct test_data *data = tester_get_data();
  6002. struct mgmt_cp_add_advertising *cp;
  6003. uint8_t adv_param[sizeof(*cp) + TESTER_ADD_ADV_DATA_LEN];
  6004. tester_print("Adding advertising instances");
  6005. cp = (struct mgmt_cp_add_advertising *) adv_param;
  6006. setup_add_adv_param(cp, 1);
  6007. cp->flags |= MGMT_ADV_FLAG_CONNECTABLE;
  6008. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  6009. sizeof(adv_param), adv_param,
  6010. NULL, NULL, NULL);
  6011. cp->flags &= ~MGMT_ADV_FLAG_CONNECTABLE;
  6012. cp->instance = 2;
  6013. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  6014. sizeof(adv_param), adv_param,
  6015. setup_add_advertising_callback,
  6016. NULL, NULL);
  6017. /* Listen on the socket so Kernel does not drop connection just after
  6018. * connect. Socket is closed in test_post_teardown
  6019. */
  6020. if (create_le_att_sock(data) < 0)
  6021. tester_test_failed();
  6022. }
  6023. static void setup_add_advertising_timeout(const void *test_data)
  6024. {
  6025. struct test_data *data = tester_get_data();
  6026. struct mgmt_cp_add_advertising *cp;
  6027. unsigned char adv_param[sizeof(*cp) + TESTER_ADD_ADV_DATA_LEN];
  6028. unsigned char param[] = { 0x01 };
  6029. tester_print("Adding advertising instance with timeout");
  6030. cp = (struct mgmt_cp_add_advertising *) adv_param;
  6031. setup_add_adv_param(cp, 1);
  6032. cp->timeout = 1;
  6033. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  6034. sizeof(param), &param,
  6035. NULL, NULL, NULL);
  6036. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  6037. sizeof(param), &param,
  6038. NULL, NULL, NULL);
  6039. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  6040. sizeof(adv_param), adv_param,
  6041. setup_add_advertising_callback,
  6042. NULL, NULL);
  6043. }
  6044. static void setup_add_advertising_duration(const void *test_data)
  6045. {
  6046. struct test_data *data = tester_get_data();
  6047. struct mgmt_cp_add_advertising *cp;
  6048. unsigned char adv_param[sizeof(*cp) + TESTER_ADD_ADV_DATA_LEN];
  6049. unsigned char param[] = { 0x01 };
  6050. tester_print("Adding instance with long timeout/short duration");
  6051. cp = (struct mgmt_cp_add_advertising *) adv_param;
  6052. setup_add_adv_param(cp, 1);
  6053. cp->duration = 1;
  6054. cp->timeout = 30;
  6055. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  6056. sizeof(param), &param,
  6057. NULL, NULL, NULL);
  6058. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  6059. sizeof(param), &param,
  6060. NULL, NULL, NULL);
  6061. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  6062. sizeof(adv_param), adv_param,
  6063. setup_add_advertising_callback,
  6064. NULL, NULL);
  6065. }
  6066. static void setup_power_cycle_callback(uint8_t status, uint16_t length,
  6067. const void *param, void *user_data)
  6068. {
  6069. struct test_data *data = tester_get_data();
  6070. unsigned char param_off[] = { 0x00 };
  6071. if (status != MGMT_STATUS_SUCCESS) {
  6072. tester_setup_failed();
  6073. return;
  6074. }
  6075. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  6076. sizeof(param_off), &param_off,
  6077. NULL, NULL, NULL);
  6078. setup_bthost();
  6079. }
  6080. static void setup_add_advertising_power_cycle(const void *test_data)
  6081. {
  6082. struct test_data *data = tester_get_data();
  6083. struct mgmt_cp_add_advertising *cp;
  6084. unsigned char adv_param[sizeof(*cp) + TESTER_ADD_ADV_DATA_LEN];
  6085. unsigned char param_on[] = { 0x01 };
  6086. tester_print("Adding instance without timeout and power cycle");
  6087. cp = (struct mgmt_cp_add_advertising *) adv_param;
  6088. setup_add_adv_param(cp, 1);
  6089. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  6090. sizeof(param_on), &param_on,
  6091. NULL, NULL, NULL);
  6092. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  6093. sizeof(param_on), &param_on,
  6094. NULL, NULL, NULL);
  6095. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  6096. sizeof(adv_param), adv_param,
  6097. setup_power_cycle_callback,
  6098. NULL, NULL);
  6099. }
  6100. static void setup_set_and_add_advertising(const void *test_data)
  6101. {
  6102. struct test_data *data = tester_get_data();
  6103. struct mgmt_cp_add_advertising *cp;
  6104. unsigned char adv_param[sizeof(*cp) + TESTER_ADD_ADV_DATA_LEN];
  6105. unsigned char param[] = { 0x01 };
  6106. tester_print("Set and add advertising instance");
  6107. cp = (struct mgmt_cp_add_advertising *) adv_param;
  6108. setup_add_adv_param(cp, 1);
  6109. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  6110. sizeof(param), &param,
  6111. NULL, NULL, NULL);
  6112. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  6113. sizeof(param), &param,
  6114. NULL, NULL, NULL);
  6115. mgmt_send(data->mgmt, MGMT_OP_SET_ADVERTISING, data->mgmt_index,
  6116. sizeof(param), &param,
  6117. NULL, NULL, NULL);
  6118. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  6119. sizeof(adv_param), adv_param,
  6120. setup_add_advertising_callback,
  6121. NULL, NULL);
  6122. }
  6123. static void setup_multi_adv_second_instance(uint8_t status, uint16_t length,
  6124. const void *param, void *user_data) {
  6125. struct mgmt_rp_add_advertising *rp =
  6126. (struct mgmt_rp_add_advertising *) param;
  6127. struct test_data *data = tester_get_data();
  6128. struct mgmt_cp_add_advertising *cp;
  6129. unsigned char adv_param[sizeof(*cp) + TESTER_ADD_ADV_DATA_LEN];
  6130. if (status != MGMT_STATUS_SUCCESS) {
  6131. tester_setup_failed();
  6132. return;
  6133. }
  6134. tester_print("Add Advertising setup complete (instance %d)",
  6135. rp->instance);
  6136. cp = (struct mgmt_cp_add_advertising *) adv_param;
  6137. setup_add_adv_param(cp, 2);
  6138. cp->timeout = 1;
  6139. cp->duration = 1;
  6140. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  6141. sizeof(adv_param), adv_param,
  6142. setup_add_advertising_callback,
  6143. NULL, NULL);
  6144. }
  6145. static void setup_multi_adv(const void *test_data)
  6146. {
  6147. struct test_data *data = tester_get_data();
  6148. struct mgmt_cp_add_advertising *cp;
  6149. unsigned char adv_param[sizeof(*cp) + TESTER_ADD_ADV_DATA_LEN];
  6150. unsigned char param[] = { 0x01 };
  6151. tester_print("Adding two instances with timeout 1 and duration 1");
  6152. cp = (struct mgmt_cp_add_advertising *) adv_param;
  6153. setup_add_adv_param(cp, 1);
  6154. cp->timeout = 1;
  6155. cp->duration = 1;
  6156. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  6157. sizeof(param), &param,
  6158. NULL, NULL, NULL);
  6159. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  6160. sizeof(param), &param,
  6161. NULL, NULL, NULL);
  6162. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  6163. sizeof(adv_param), adv_param,
  6164. setup_multi_adv_second_instance,
  6165. NULL, NULL);
  6166. }
  6167. static void setup_complete(uint8_t status, uint16_t length,
  6168. const void *param, void *user_data)
  6169. {
  6170. struct test_data *data = tester_get_data();
  6171. if (status != MGMT_STATUS_SUCCESS) {
  6172. tester_setup_failed();
  6173. return;
  6174. }
  6175. tester_print("Initial settings completed");
  6176. if (data->test_setup)
  6177. data->test_setup(data);
  6178. else
  6179. setup_bthost();
  6180. }
  6181. static void setup_set_unpowered_callback(uint8_t status, uint16_t length,
  6182. const void *param, void *user_data)
  6183. {
  6184. if (status != MGMT_STATUS_SUCCESS) {
  6185. tester_setup_failed();
  6186. return;
  6187. }
  6188. setup_bthost();
  6189. }
  6190. static void setup_set_le_callback(uint8_t status, uint16_t length,
  6191. const void *param, void *user_data)
  6192. {
  6193. struct test_data *data = tester_get_data();
  6194. unsigned char power_param[] = { 0x00 };
  6195. if (status != MGMT_STATUS_SUCCESS) {
  6196. tester_setup_failed();
  6197. return;
  6198. }
  6199. tester_print("Disabling power");
  6200. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  6201. sizeof(power_param),
  6202. &power_param,
  6203. setup_set_unpowered_callback,
  6204. NULL, NULL);
  6205. }
  6206. static void setup_ext_adv_not_powered(const void *test_data)
  6207. {
  6208. struct test_data *data = tester_get_data();
  6209. unsigned char param[] = { 0x01 };
  6210. tester_print("Enabling LE");
  6211. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  6212. sizeof(param), &param,
  6213. setup_set_le_callback,
  6214. NULL, NULL);
  6215. }
  6216. static void setup_set_ext_adv_params_callback(uint8_t status, uint16_t length,
  6217. const void *param, void *user_data)
  6218. {
  6219. if (status != MGMT_STATUS_SUCCESS) {
  6220. tester_setup_failed();
  6221. return;
  6222. }
  6223. setup_bthost();
  6224. }
  6225. static void setup_ext_adv_params(const void *test_data)
  6226. {
  6227. struct test_data *data = tester_get_data();
  6228. tester_print("Setting Extended Adv Params");
  6229. mgmt_send(data->mgmt, MGMT_OP_ADD_EXT_ADV_PARAMS, data->mgmt_index,
  6230. sizeof(ext_adv_params_valid),
  6231. &ext_adv_params_valid,
  6232. setup_set_ext_adv_params_callback,
  6233. NULL, NULL);
  6234. }
  6235. static void pin_code_request_callback(uint16_t index, uint16_t length,
  6236. const void *param, void *user_data)
  6237. {
  6238. const struct mgmt_ev_pin_code_request *ev = param;
  6239. struct test_data *data = user_data;
  6240. const struct generic_data *test = data->test_data;
  6241. struct mgmt_cp_pin_code_reply cp;
  6242. test_condition_complete(data);
  6243. memset(&cp, 0, sizeof(cp));
  6244. memcpy(&cp.addr, &ev->addr, sizeof(cp.addr));
  6245. if (!test->pin) {
  6246. mgmt_reply(data->mgmt, MGMT_OP_PIN_CODE_NEG_REPLY,
  6247. data->mgmt_index, sizeof(cp.addr), &cp.addr,
  6248. NULL, NULL, NULL);
  6249. return;
  6250. }
  6251. cp.pin_len = test->pin_len;
  6252. memcpy(cp.pin_code, test->pin, test->pin_len);
  6253. mgmt_reply(data->mgmt, MGMT_OP_PIN_CODE_REPLY, data->mgmt_index,
  6254. sizeof(cp), &cp, NULL, NULL, NULL);
  6255. }
  6256. static void user_confirm_request_callback(uint16_t index, uint16_t length,
  6257. const void *param,
  6258. void *user_data)
  6259. {
  6260. const struct mgmt_ev_user_confirm_request *ev = param;
  6261. struct test_data *data = user_data;
  6262. const struct generic_data *test = data->test_data;
  6263. struct mgmt_cp_user_confirm_reply cp;
  6264. uint16_t opcode;
  6265. memset(&cp, 0, sizeof(cp));
  6266. memcpy(&cp.addr, &ev->addr, sizeof(cp.addr));
  6267. if (test->reject_confirm)
  6268. opcode = MGMT_OP_USER_CONFIRM_NEG_REPLY;
  6269. else
  6270. opcode = MGMT_OP_USER_CONFIRM_REPLY;
  6271. mgmt_reply(data->mgmt, opcode, data->mgmt_index, sizeof(cp), &cp,
  6272. NULL, NULL, NULL);
  6273. }
  6274. static void user_passkey_request_callback(uint16_t index, uint16_t length,
  6275. const void *param,
  6276. void *user_data)
  6277. {
  6278. const struct mgmt_ev_user_passkey_request *ev = param;
  6279. struct test_data *data = user_data;
  6280. const struct generic_data *test = data->test_data;
  6281. struct mgmt_cp_user_passkey_reply cp;
  6282. if (test->just_works) {
  6283. tester_warn("User Passkey Request for just-works case");
  6284. tester_test_failed();
  6285. return;
  6286. }
  6287. memset(&cp, 0, sizeof(cp));
  6288. memcpy(&cp.addr, &ev->addr, sizeof(cp.addr));
  6289. if (test->reject_confirm) {
  6290. mgmt_reply(data->mgmt, MGMT_OP_USER_PASSKEY_NEG_REPLY,
  6291. data->mgmt_index, sizeof(cp.addr), &cp.addr,
  6292. NULL, NULL, NULL);
  6293. return;
  6294. }
  6295. mgmt_reply(data->mgmt, MGMT_OP_USER_PASSKEY_REPLY, data->mgmt_index,
  6296. sizeof(cp), &cp, NULL, NULL, NULL);
  6297. }
  6298. static void test_setup(const void *test_data)
  6299. {
  6300. struct test_data *data = tester_get_data();
  6301. const struct generic_data *test = data->test_data;
  6302. struct bthost *bthost = hciemu_client_get_host(data->hciemu);
  6303. const uint16_t *cmd;
  6304. if (!test)
  6305. goto proceed;
  6306. if (test->pin || test->expect_pin) {
  6307. mgmt_register(data->mgmt, MGMT_EV_PIN_CODE_REQUEST,
  6308. data->mgmt_index, pin_code_request_callback,
  6309. data, NULL);
  6310. test_add_condition(data);
  6311. }
  6312. mgmt_register(data->mgmt, MGMT_EV_USER_CONFIRM_REQUEST,
  6313. data->mgmt_index, user_confirm_request_callback,
  6314. data, NULL);
  6315. mgmt_register(data->mgmt, MGMT_EV_USER_PASSKEY_REQUEST,
  6316. data->mgmt_index, user_passkey_request_callback,
  6317. data, NULL);
  6318. if (test->client_pin)
  6319. bthost_set_pin_code(bthost, test->client_pin,
  6320. test->client_pin_len);
  6321. if (test->client_io_cap)
  6322. bthost_set_io_capability(bthost, test->client_io_cap);
  6323. if (test->client_auth_req)
  6324. bthost_set_auth_req(bthost, test->client_auth_req);
  6325. else if (!test->just_works)
  6326. bthost_set_auth_req(bthost, 0x01);
  6327. if (test->client_reject_confirm)
  6328. bthost_set_reject_user_confirm(bthost, true);
  6329. if (test->client_enable_le)
  6330. bthost_write_le_host_supported(bthost, 0x01);
  6331. if (test->client_enable_sc)
  6332. bthost_set_sc_support(bthost, 0x01);
  6333. proceed:
  6334. if (!test || !test->setup_settings) {
  6335. if (data->test_setup)
  6336. data->test_setup(data);
  6337. else
  6338. tester_setup_complete();
  6339. return;
  6340. }
  6341. for (cmd = test->setup_settings; *cmd; cmd++) {
  6342. unsigned char simple_param[] = { 0x01 };
  6343. unsigned char discov_param[] = { 0x01, 0x00, 0x00 };
  6344. unsigned char privacy_param[] = { 0x01,
  6345. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  6346. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
  6347. unsigned char *param = simple_param;
  6348. size_t param_size = sizeof(simple_param);
  6349. mgmt_request_func_t func = NULL;
  6350. /* If this is the last command (next one is 0) request
  6351. * for a callback. */
  6352. if (!cmd[1])
  6353. func = setup_complete;
  6354. if (*cmd == MGMT_OP_SET_DISCOVERABLE) {
  6355. if (test->setup_limited_discov) {
  6356. discov_param[0] = 0x02;
  6357. discov_param[1] = 0x01;
  6358. }
  6359. param_size = sizeof(discov_param);
  6360. param = discov_param;
  6361. }
  6362. if (*cmd == MGMT_OP_SET_PRIVACY) {
  6363. param_size = sizeof(privacy_param);
  6364. param = privacy_param;
  6365. }
  6366. if (*cmd == MGMT_OP_START_DISCOVERY) {
  6367. if (test->setup_discovery_param)
  6368. memcpy(param, test->setup_discovery_param, 1);
  6369. }
  6370. if (*cmd == MGMT_OP_SET_LE && test->setup_nobredr) {
  6371. unsigned char off[] = { 0x00 };
  6372. mgmt_send(data->mgmt, *cmd, data->mgmt_index,
  6373. param_size, param, NULL, NULL, NULL);
  6374. mgmt_send(data->mgmt, MGMT_OP_SET_BREDR,
  6375. data->mgmt_index, sizeof(off), off,
  6376. func, data, NULL);
  6377. } else {
  6378. mgmt_send(data->mgmt, *cmd, data->mgmt_index,
  6379. param_size, param, func, data, NULL);
  6380. }
  6381. }
  6382. }
  6383. static void command_generic_new_settings(uint16_t index, uint16_t length,
  6384. const void *param, void *user_data)
  6385. {
  6386. struct test_data *data = tester_get_data();
  6387. tester_print("New settings event received");
  6388. mgmt_unregister(data->mgmt, data->mgmt_settings_id);
  6389. tester_test_failed();
  6390. }
  6391. static void command_generic_new_settings_alt(uint16_t index, uint16_t length,
  6392. const void *param, void *user_data)
  6393. {
  6394. struct test_data *data = tester_get_data();
  6395. const struct generic_data *test = data->test_data;
  6396. uint32_t settings;
  6397. if (length != 4) {
  6398. tester_warn("Invalid parameter size for new settings event");
  6399. tester_test_failed();
  6400. return;
  6401. }
  6402. settings = get_le32(param);
  6403. tester_print("New settings 0x%08x received", settings);
  6404. if (test->expect_settings_unset) {
  6405. if ((settings & test->expect_settings_unset) != 0)
  6406. return;
  6407. goto done;
  6408. }
  6409. if (!test->expect_settings_set)
  6410. return;
  6411. if ((settings & test->expect_settings_set) != test->expect_settings_set)
  6412. return;
  6413. done:
  6414. tester_print("Unregistering new settings notification");
  6415. mgmt_unregister(data->mgmt_alt, data->mgmt_alt_settings_id);
  6416. test_condition_complete(data);
  6417. }
  6418. static bool verify_alt_ev(const void *param, uint16_t length)
  6419. {
  6420. struct test_data *data = tester_get_data();
  6421. const struct generic_data *test = data->test_data;
  6422. if (length != test->expect_alt_ev_len) {
  6423. tester_warn("Invalid length %u != %u", length,
  6424. test->expect_alt_ev_len);
  6425. return false;
  6426. }
  6427. if (test->expect_alt_ev_param &&
  6428. memcmp(test->expect_alt_ev_param, param, length)) {
  6429. tester_warn("Event parameters do not match");
  6430. util_hexdump('>', param, length, print_debug, "");
  6431. util_hexdump('!', test->expect_alt_ev_param, length,
  6432. print_debug, "");
  6433. return false;
  6434. }
  6435. return true;
  6436. }
  6437. static void command_generic_event_alt(uint16_t index, uint16_t length,
  6438. const void *param,
  6439. void *user_data)
  6440. {
  6441. struct test_data *data = tester_get_data();
  6442. const struct generic_data *test = data->test_data;
  6443. bool (*verify)(const void *param, uint16_t length);
  6444. tester_print("New %s event received", mgmt_evstr(test->expect_alt_ev));
  6445. mgmt_unregister(data->mgmt_alt, data->mgmt_alt_ev_id);
  6446. if (test->verify_alt_ev_func)
  6447. verify = test->verify_alt_ev_func;
  6448. else
  6449. verify = verify_alt_ev;
  6450. if (!verify(param, length)) {
  6451. tester_warn("Incorrect %s event parameters",
  6452. mgmt_evstr(test->expect_alt_ev));
  6453. tester_test_failed();
  6454. return;
  6455. }
  6456. test_condition_complete(data);
  6457. }
  6458. static void command_generic_callback(uint8_t status, uint16_t length,
  6459. const void *param, void *user_data)
  6460. {
  6461. struct test_data *data = tester_get_data();
  6462. const struct generic_data *test = data->test_data;
  6463. const void *expect_param = test->expect_param;
  6464. uint16_t expect_len = test->expect_len;
  6465. tester_print("%s (0x%04x): %s (0x%02x)", mgmt_opstr(test->send_opcode),
  6466. test->send_opcode, mgmt_errstr(status), status);
  6467. if (status != test->expect_status) {
  6468. if (!test->fail_tolerant || !!status != !!test->expect_status) {
  6469. tester_test_abort();
  6470. return;
  6471. }
  6472. tester_warn("Unexpected status got %d expected %d",
  6473. status, test->expect_status);
  6474. }
  6475. if (!test->expect_ignore_param) {
  6476. if (test->expect_func)
  6477. expect_param = test->expect_func(&expect_len);
  6478. if (length != expect_len) {
  6479. tester_warn("Invalid cmd response parameter size");
  6480. tester_test_failed();
  6481. return;
  6482. }
  6483. if (expect_param && expect_len > 0 &&
  6484. memcmp(param, expect_param, length)) {
  6485. tester_warn("Unexpected cmd response parameter value");
  6486. util_hexdump('>', param, length, print_debug, "");
  6487. util_hexdump('!', expect_param, length, print_debug,
  6488. "");
  6489. tester_test_failed();
  6490. return;
  6491. }
  6492. }
  6493. test_condition_complete(data);
  6494. }
  6495. static void command_setup_hci_callback(uint16_t opcode, const void *param,
  6496. uint8_t length, void *user_data)
  6497. {
  6498. struct test_data *data = user_data;
  6499. const struct generic_data *test = data->test_data;
  6500. const void *setup_expect_hci_param = test->setup_expect_hci_param;
  6501. uint8_t setup_expect_hci_len = test->setup_expect_hci_len;
  6502. tester_print("HCI Command 0x%04x length %u", opcode, length);
  6503. if (opcode != test->setup_expect_hci_command)
  6504. return;
  6505. if (length != setup_expect_hci_len) {
  6506. tester_warn("Invalid parameter size for HCI command");
  6507. tester_test_failed();
  6508. return;
  6509. }
  6510. if (memcmp(param, setup_expect_hci_param, length) != 0) {
  6511. tester_warn("Unexpected HCI command parameter value");
  6512. tester_test_failed();
  6513. return;
  6514. }
  6515. hciemu_clear_central_post_command_hooks(data->hciemu);
  6516. test_setup_condition_complete(data);
  6517. }
  6518. static void command_hci_callback(uint16_t opcode, const void *param,
  6519. uint8_t length, void *user_data)
  6520. {
  6521. struct test_data *data = user_data;
  6522. const struct generic_data *test = data->test_data;
  6523. const void *expect_hci_param = test->expect_hci_param;
  6524. uint8_t expect_hci_len = test->expect_hci_len;
  6525. int ret;
  6526. tester_print("HCI Command 0x%04x length %u", opcode, length);
  6527. if (opcode != test->expect_hci_command || data->expect_hci_command_done)
  6528. return;
  6529. data->expect_hci_command_done = true;
  6530. if (test->expect_hci_func)
  6531. expect_hci_param = test->expect_hci_func(&expect_hci_len);
  6532. if (length != expect_hci_len) {
  6533. tester_warn("Invalid parameter size for HCI command");
  6534. tester_test_failed();
  6535. return;
  6536. }
  6537. if (test->expect_hci_param_check_func)
  6538. ret = test->expect_hci_param_check_func(param, length);
  6539. else
  6540. ret = memcmp(param, expect_hci_param, length);
  6541. if (ret != 0) {
  6542. tester_warn("Unexpected HCI command parameter value:");
  6543. util_hexdump('>', param, length, print_debug, "");
  6544. util_hexdump('!', expect_hci_param, length, print_debug, "");
  6545. tester_test_failed();
  6546. return;
  6547. }
  6548. test_condition_complete(data);
  6549. }
  6550. static void setup_mgmt_cmd_callback(uint8_t status, uint16_t length,
  6551. const void *param, void *user_data)
  6552. {
  6553. if (status != MGMT_STATUS_SUCCESS) {
  6554. tester_setup_failed();
  6555. return;
  6556. }
  6557. test_setup_condition_complete(user_data);
  6558. }
  6559. static void setup_command_generic(const void *test_data)
  6560. {
  6561. struct test_data *data = tester_get_data();
  6562. const struct generic_data *test = data->test_data;
  6563. const void *send_param = test->setup_send_param;
  6564. uint16_t send_len = test->setup_send_len;
  6565. size_t i = 0;
  6566. if (test->setup_expect_hci_command) {
  6567. tester_print("Registering setup expected HCI command callback");
  6568. tester_print("Setup expected HCI command 0x%04x",
  6569. test->setup_expect_hci_command);
  6570. hciemu_add_central_post_command_hook(data->hciemu,
  6571. command_setup_hci_callback, data);
  6572. test_add_setup_condition(data);
  6573. }
  6574. if (test->setup_send_opcode) {
  6575. tester_print("Setup sending %s (0x%04x)",
  6576. mgmt_opstr(test->setup_send_opcode),
  6577. test->setup_send_opcode);
  6578. mgmt_send(data->mgmt, test->setup_send_opcode, data->mgmt_index,
  6579. send_len, send_param,
  6580. setup_mgmt_cmd_callback,
  6581. data, NULL);
  6582. test_add_setup_condition(data);
  6583. return;
  6584. }
  6585. tester_print("Sending setup opcode array");
  6586. for (; test->setup_mgmt_cmd_arr + i; ++i) {
  6587. const struct setup_mgmt_cmd *cmd = test->setup_mgmt_cmd_arr + i;
  6588. if (cmd->send_opcode == 0x00)
  6589. break;
  6590. tester_print("Setup sending %s (0x%04x)",
  6591. mgmt_opstr(cmd->send_opcode),
  6592. cmd->send_opcode);
  6593. mgmt_send(data->mgmt, cmd->send_opcode, data->mgmt_index,
  6594. cmd->send_len, cmd->send_param,
  6595. setup_mgmt_cmd_callback,
  6596. data, NULL);
  6597. test_add_setup_condition(data);
  6598. }
  6599. }
  6600. static const uint8_t add_advertising_param_empty[] = {
  6601. 0x01, /* adv instance */
  6602. 0x00, 0x00, 0x00, 0x00, /* flags: none */
  6603. 0x00, 0x00, /* duration: default */
  6604. 0x00, 0x00, /* timeout: none */
  6605. 0x00, /* adv data len */
  6606. 0x00, /* scan rsp len */
  6607. };
  6608. static const struct generic_data add_advertising_empty_scrsp = {
  6609. .setup_settings = settings_powered_le,
  6610. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  6611. .setup_send_param = set_local_name_param,
  6612. .setup_send_len = sizeof(set_local_name_param),
  6613. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  6614. .send_param = add_advertising_param_empty,
  6615. .send_len = sizeof(add_advertising_param_empty),
  6616. .expect_status = MGMT_STATUS_SUCCESS,
  6617. .expect_param = advertising_instance1_param,
  6618. .expect_len = sizeof(advertising_instance1_param),
  6619. };
  6620. static const uint8_t add_advertising_param_scrsp_data_only_ok[] = {
  6621. 0x01, /* adv instance */
  6622. 0x00, 0x00, 0x00, 0x00, /* flags: none */
  6623. 0x00, 0x00, /* duration: default */
  6624. 0x00, 0x00, /* timeout: none */
  6625. 0x00, /* adv data len */
  6626. 0x1f, /* scan rsp len */
  6627. /* adv data: */
  6628. /* scan rsp data: */
  6629. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6630. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6631. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6632. 0x00,
  6633. };
  6634. static const struct generic_data add_advertising_scrsp_data_only_ok = {
  6635. .setup_settings = settings_powered_le,
  6636. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  6637. .send_param = add_advertising_param_scrsp_data_only_ok,
  6638. .send_len = sizeof(add_advertising_param_scrsp_data_only_ok),
  6639. .expect_status = MGMT_STATUS_SUCCESS,
  6640. .expect_param = advertising_instance1_param,
  6641. .expect_len = sizeof(advertising_instance1_param),
  6642. };
  6643. static const uint8_t add_advertising_param_scrsp_data_only_too_long[] = {
  6644. 0x01, /* adv instance */
  6645. 0x00, 0x00, 0x00, 0x00, /* flags: none */
  6646. 0x00, 0x00, /* duration: default */
  6647. 0x00, 0x00, /* timeout: none */
  6648. 0x00, /* adv data len */
  6649. 0x20, /* scan rsp len */
  6650. /* adv data: */
  6651. /* scan rsp data: */
  6652. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6653. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6654. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6655. 0x00, 0x00,
  6656. };
  6657. static const struct generic_data add_advertising_scrsp_data_only_too_long = {
  6658. .setup_settings = settings_powered_le,
  6659. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  6660. .send_param = add_advertising_param_scrsp_data_only_too_long,
  6661. .send_len = sizeof(add_advertising_param_scrsp_data_only_too_long),
  6662. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  6663. .expect_param = NULL,
  6664. .expect_len = 0,
  6665. };
  6666. static const uint8_t set_appearance_param[2] = { 0x54, 0x65 };
  6667. static const uint8_t add_advertising_param_scrsp_appear_data_ok[] = {
  6668. 0x01, /* adv instance */
  6669. 0x20, 0x00, 0x00, 0x00, /* flags: appearance */
  6670. 0x00, 0x00, /* duration: default */
  6671. 0x00, 0x00, /* timeout: none */
  6672. 0x00, /* adv data len */
  6673. 0x1b, /* scan rsp len */
  6674. /* adv data: */
  6675. /* scan rsp data: */
  6676. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6677. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6678. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6679. };
  6680. static const struct generic_data add_advertising_scrsp_appear_data_ok = {
  6681. .setup_settings = settings_powered_le,
  6682. .setup_send_opcode = MGMT_OP_SET_APPEARANCE,
  6683. .setup_send_param = set_appearance_param,
  6684. .setup_send_len = sizeof(set_appearance_param),
  6685. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  6686. .send_param = add_advertising_param_scrsp_appear_data_ok,
  6687. .send_len = sizeof(add_advertising_param_scrsp_appear_data_ok),
  6688. .expect_status = MGMT_STATUS_SUCCESS,
  6689. .expect_param = advertising_instance1_param,
  6690. .expect_len = sizeof(advertising_instance1_param),
  6691. };
  6692. static const uint8_t add_advertising_param_scrsp_appear_data_too_long[] = {
  6693. 0x01, /* adv instance */
  6694. 0x20, 0x00, 0x00, 0x00, /* flags: appearance */
  6695. 0x00, 0x00, /* duration: default */
  6696. 0x00, 0x00, /* timeout: none */
  6697. 0x00, /* adv data len */
  6698. 0x1c, /* scan rsp len */
  6699. /* adv data: */
  6700. /* scan rsp data: */
  6701. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6702. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6703. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6704. };
  6705. static const struct generic_data add_advertising_scrsp_appear_data_too_long = {
  6706. .setup_settings = settings_powered_le,
  6707. .setup_send_opcode = MGMT_OP_SET_APPEARANCE,
  6708. .setup_send_param = set_appearance_param,
  6709. .setup_send_len = sizeof(set_appearance_param),
  6710. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  6711. .send_param = add_advertising_param_scrsp_appear_data_too_long,
  6712. .send_len = sizeof(add_advertising_param_scrsp_appear_data_too_long),
  6713. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  6714. .expect_param = NULL,
  6715. .expect_len = 0,
  6716. };
  6717. static const uint8_t add_advertising_param_scrsp_appear_null[] = {
  6718. 0x01, /* adv instance */
  6719. 0x20, 0x00, 0x00, 0x00, /* flags: appearance */
  6720. 0x00, 0x00, /* duration: default */
  6721. 0x00, 0x00, /* timeout: none */
  6722. 0x00, /* adv data len */
  6723. 0x01, /* scan rsp len */
  6724. /* adv data: */
  6725. /* scan rsp data: */
  6726. 0x00,
  6727. };
  6728. static const struct generic_data add_advertising_scrsp_appear_null = {
  6729. .setup_settings = settings_powered_le,
  6730. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  6731. .send_param = add_advertising_param_scrsp_appear_null,
  6732. .send_len = sizeof(add_advertising_param_scrsp_appear_null),
  6733. .expect_status = MGMT_STATUS_SUCCESS,
  6734. .expect_param = advertising_instance1_param,
  6735. .expect_len = sizeof(advertising_instance1_param),
  6736. };
  6737. static const uint8_t add_advertising_empty_param[] = {
  6738. 0x01, /* adv instance */
  6739. 0x40, 0x00, 0x00, 0x00, /* flags: local name*/
  6740. 0x00, 0x00, /* duration: default */
  6741. 0x00, 0x00, /* timeout: none */
  6742. 0x00, /* adv data len */
  6743. 0x01, /* scan rsp len */
  6744. /* scan rsp data: */
  6745. 0x00,
  6746. };
  6747. static const uint8_t scan_rsp_data_empty[] = {
  6748. 0x01, /* scan rsp data len */
  6749. 0x00, /* scan rsp data */
  6750. /* placeholder data */
  6751. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6752. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6753. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6754. };
  6755. static const struct generic_data add_advertising_no_name_set = {
  6756. .setup_settings = settings_powered_le,
  6757. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  6758. .send_param = add_advertising_empty_param,
  6759. .send_len = sizeof(add_advertising_empty_param),
  6760. .expect_status = MGMT_STATUS_SUCCESS,
  6761. .expect_param = advertising_instance1_param,
  6762. .expect_len = sizeof(advertising_instance1_param),
  6763. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_RSP_DATA,
  6764. .expect_hci_param = scan_rsp_data_empty,
  6765. .expect_hci_len = sizeof(scan_rsp_data_empty),
  6766. };
  6767. static const uint8_t add_advertising_param_name[] = {
  6768. 0x01, /* adv instance */
  6769. 0x40, 0x00, 0x00, 0x00, /* flags: Add local name to scan_rsp */
  6770. 0x00, 0x00, /* duration: default */
  6771. 0x00, 0x00, /* timeout: none */
  6772. 0x00, /* adv data len */
  6773. 0x00, /* scan rsp len */
  6774. };
  6775. static const uint8_t set_scan_rsp_data_name_fits_in_scrsp[] = {
  6776. 0x0c, /* Scan rsp data len */
  6777. 0x0b, /* Local name data len */
  6778. 0x09, /* Complete name */
  6779. 0x54, 0x65, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, /* "Test name" */
  6780. /* padding */
  6781. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6782. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6783. };
  6784. static const struct generic_data add_advertising_name_fits_in_scrsp = {
  6785. .setup_settings = settings_powered_le,
  6786. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  6787. .setup_send_param = &set_local_name_cp,
  6788. .setup_send_len = sizeof(set_local_name_cp),
  6789. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  6790. .send_param = add_advertising_param_name,
  6791. .send_len = sizeof(add_advertising_param_name),
  6792. .expect_status = MGMT_STATUS_SUCCESS,
  6793. .expect_param = advertising_instance1_param,
  6794. .expect_len = sizeof(advertising_instance1_param),
  6795. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_RSP_DATA,
  6796. .expect_hci_param = set_scan_rsp_data_name_fits_in_scrsp,
  6797. .expect_hci_len = sizeof(set_scan_rsp_data_name_fits_in_scrsp),
  6798. };
  6799. static const uint8_t set_scan_rsp_data_shortened_name_fits[] = {
  6800. 0x0d, /* Scan rsp data len */
  6801. 0x0c, /* Local name data len */
  6802. 0x08, /* Short name */
  6803. 0x54, 0x65, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x31,
  6804. /* "Test name1" */
  6805. /* padding */
  6806. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6807. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6808. };
  6809. static const struct generic_data add_advertising_shortened_name_in_scrsp = {
  6810. .setup_settings = settings_powered_le,
  6811. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  6812. .setup_send_param = &set_local_name_longer_cp,
  6813. .setup_send_len = sizeof(set_local_name_longer_cp),
  6814. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  6815. .send_param = add_advertising_param_name,
  6816. .send_len = sizeof(add_advertising_param_name),
  6817. .expect_status = MGMT_STATUS_SUCCESS,
  6818. .expect_param = advertising_instance1_param,
  6819. .expect_len = sizeof(advertising_instance1_param),
  6820. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_RSP_DATA,
  6821. .expect_hci_param = set_scan_rsp_data_shortened_name_fits,
  6822. .expect_hci_len = sizeof(set_scan_rsp_data_shortened_name_fits),
  6823. };
  6824. static const uint8_t set_scan_rsp_data_short_name_fits[] = {
  6825. 0x07, /* Scan rsp data len */
  6826. 0x06, /* Local name data len */
  6827. 0x08, /* Short name */
  6828. 0x54, 0x65, 0x73, 0x74,
  6829. /* "Test*/
  6830. /* padding */
  6831. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6832. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6833. 0x00, 0x00, 0x00, 0x00, 0x00,
  6834. };
  6835. static const struct generic_data add_advertising_short_name_in_scrsp = {
  6836. .setup_settings = settings_powered_le,
  6837. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  6838. .setup_send_param = &set_local_name_long_short_cp,
  6839. .setup_send_len = sizeof(set_local_name_long_short_cp),
  6840. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  6841. .send_param = add_advertising_param_name,
  6842. .send_len = sizeof(add_advertising_param_name),
  6843. .expect_status = MGMT_STATUS_SUCCESS,
  6844. .expect_param = advertising_instance1_param,
  6845. .expect_len = sizeof(advertising_instance1_param),
  6846. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_RSP_DATA,
  6847. .expect_hci_param = set_scan_rsp_data_short_name_fits,
  6848. .expect_hci_len = sizeof(set_scan_rsp_data_short_name_fits),
  6849. };
  6850. static const uint8_t add_advertising_param_name_data_ok[] = {
  6851. 0x01, /* adv instance */
  6852. 0x40, 0x00, 0x00, 0x00, /* flags: local name */
  6853. 0x00, 0x00, /* duration: default */
  6854. 0x00, 0x00, /* timeout: none */
  6855. 0x00, /* adv data len */
  6856. 0x12, /* scan rsp len */
  6857. /* adv data: */
  6858. /* scan rsp data: */
  6859. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6860. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6861. };
  6862. static const uint8_t set_scan_rsp_data_param_name_data_ok[] = {
  6863. 0x1e, /* Scan rsp data len */
  6864. /* scan rsp data */
  6865. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6866. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6867. 0x0b, /* Local name data len */
  6868. 0x09, /* Complete name */
  6869. 0x54, 0x65, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x00,
  6870. /* "Test name" */
  6871. /* padding */
  6872. 0x00,
  6873. };
  6874. static const struct generic_data add_advertising_name_data_ok = {
  6875. .setup_settings = settings_powered_le,
  6876. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  6877. .setup_send_param = &set_local_name_cp,
  6878. .setup_send_len = sizeof(set_local_name_cp),
  6879. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  6880. .send_param = add_advertising_param_name_data_ok,
  6881. .send_len = sizeof(add_advertising_param_name_data_ok),
  6882. .expect_status = MGMT_STATUS_SUCCESS,
  6883. .expect_param = advertising_instance1_param,
  6884. .expect_len = sizeof(advertising_instance1_param),
  6885. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_RSP_DATA,
  6886. .expect_hci_param = set_scan_rsp_data_param_name_data_ok,
  6887. .expect_hci_len = sizeof(set_scan_rsp_data_param_name_data_ok),
  6888. };
  6889. static const uint8_t add_advertising_param_name_data_inv[] = {
  6890. 0x01, /* adv instance */
  6891. 0x40, 0x00, 0x00, 0x00, /* flags: local name */
  6892. 0x00, 0x00, /* duration: default */
  6893. 0x00, 0x00, /* timeout: none */
  6894. 0x00, /* adv data len */
  6895. 0x14, /* scan rsp len */
  6896. /* adv data: */
  6897. /* scan rsp data: */
  6898. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6899. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  6900. };
  6901. static const struct generic_data add_advertising_name_data_inv = {
  6902. .setup_settings = settings_powered_le,
  6903. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  6904. .setup_send_param = &set_local_name_cp,
  6905. .setup_send_len = sizeof(set_local_name_cp),
  6906. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  6907. .send_param = add_advertising_param_name_data_inv,
  6908. .send_len = sizeof(add_advertising_param_name_data_inv),
  6909. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  6910. .expect_param = NULL,
  6911. .expect_len = 0,
  6912. };
  6913. static const uint8_t add_advertising_param_name_data_appear[] = {
  6914. 0x01, /* adv instance */
  6915. 0x60, 0x00, 0x00, 0x00, /* flags: local name + appearance */
  6916. 0x00, 0x00, /* duration: default */
  6917. 0x00, 0x00, /* timeout: none */
  6918. 0x00, /* adv data len */
  6919. 0x0e, /* scan rsp len */
  6920. /* adv data: */
  6921. /* scan rsp data: */
  6922. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6923. 0x00, 0x00, 0x00, 0x00,
  6924. };
  6925. static const struct setup_mgmt_cmd add_advertising_mgmt_cmd_arr[] = {
  6926. {
  6927. .send_opcode = MGMT_OP_SET_APPEARANCE,
  6928. .send_param = set_appearance_param,
  6929. .send_len = sizeof(set_appearance_param),
  6930. },
  6931. {
  6932. .send_opcode = MGMT_OP_SET_LOCAL_NAME,
  6933. .send_param = &set_local_name_cp,
  6934. .send_len = sizeof(set_local_name_cp),
  6935. },
  6936. { /* last element should always have opcode 0x00 */
  6937. .send_opcode = 0x00,
  6938. .send_param = NULL,
  6939. .send_len = 0,
  6940. }
  6941. };
  6942. static const uint8_t set_scan_rsp_data_name_data_appear[] = {
  6943. 0x1e, /* Scan rsp data len */
  6944. 0x03, /* appearance len */
  6945. 0x19, /* EIR_APPEARANCE */
  6946. 0x54, 0x65, /* appearance value */
  6947. /* scan rsp data */
  6948. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  6949. 0x00, 0x00, 0x00, 0x00,
  6950. 0x0b, /* Local name data len */
  6951. 0x09, /* Complete name */
  6952. 0x54, 0x65, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x00,
  6953. /* "Test name" */
  6954. /* padding */
  6955. 0x00,
  6956. };
  6957. static const struct generic_data add_advertising_name_data_appear = {
  6958. .setup_settings = settings_powered_le,
  6959. .setup_mgmt_cmd_arr = add_advertising_mgmt_cmd_arr,
  6960. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  6961. .send_param = add_advertising_param_name_data_appear,
  6962. .send_len = sizeof(add_advertising_param_name_data_appear),
  6963. .expect_status = MGMT_STATUS_SUCCESS,
  6964. .expect_param = advertising_instance1_param,
  6965. .expect_len = sizeof(advertising_instance1_param),
  6966. .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_RSP_DATA,
  6967. .expect_hci_param = set_scan_rsp_data_name_data_appear,
  6968. .expect_hci_len = sizeof(set_scan_rsp_data_name_data_appear),
  6969. };
  6970. static const struct generic_data set_appearance_not_supported = {
  6971. .send_opcode = MGMT_OP_SET_APPEARANCE,
  6972. .send_param = set_appearance_param,
  6973. .send_len = sizeof(set_appearance_param),
  6974. .expect_status = MGMT_STATUS_NOT_SUPPORTED,
  6975. .expect_param = NULL,
  6976. .expect_len = 0,
  6977. };
  6978. static const struct generic_data set_appearance_success = {
  6979. .send_opcode = MGMT_OP_SET_APPEARANCE,
  6980. .send_param = set_appearance_param,
  6981. .send_len = sizeof(set_appearance_param),
  6982. .expect_status = MGMT_STATUS_SUCCESS,
  6983. .expect_param = NULL,
  6984. .expect_len = 0,
  6985. };
  6986. static const uint8_t read_adv_features_rsp_3[] = {
  6987. 0xff, 0xff, 0x01, 0x00, /* supported flags */
  6988. 0x1f, /* max_adv_data_len */
  6989. 0x1f, /* max_scan_rsp_len */
  6990. 0x03, /* max_instances */
  6991. 0x00, /* num_instances */
  6992. };
  6993. static const struct generic_data read_adv_features_success_3 = {
  6994. .send_opcode = MGMT_OP_READ_ADV_FEATURES,
  6995. .expect_param = read_adv_features_rsp_3,
  6996. .expect_len = sizeof(read_adv_features_rsp_3),
  6997. .expect_status = MGMT_STATUS_SUCCESS,
  6998. };
  6999. /* add advertising with multiple phy flags */
  7000. static const uint8_t add_ext_advertising_invalid_param_1[] = {
  7001. 0x01, /* adv instance */
  7002. 0x80, 0x01, 0x00, 0x00, /* flags: 1m and 2m*/
  7003. 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
  7004. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  7005. };
  7006. static const struct generic_data add_ext_advertising_fail_1 = {
  7007. .setup_settings = settings_powered_le,
  7008. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7009. .send_param = add_ext_advertising_invalid_param_1,
  7010. .send_len = sizeof(add_ext_advertising_invalid_param_1),
  7011. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  7012. };
  7013. /* add advertising with multiple phy flags */
  7014. static const uint8_t add_ext_advertising_invalid_param_2[] = {
  7015. 0x01, /* adv instance */
  7016. 0x00, 0x03, 0x00, 0x00, /* flags: 2m and coded*/
  7017. 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
  7018. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  7019. };
  7020. static const struct generic_data add_ext_advertising_fail_2 = {
  7021. .setup_settings = settings_powered_le,
  7022. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7023. .send_param = add_ext_advertising_invalid_param_2,
  7024. .send_len = sizeof(add_ext_advertising_invalid_param_2),
  7025. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  7026. };
  7027. /* add advertising with multiple phy flags */
  7028. static const uint8_t add_ext_advertising_invalid_param_3[] = {
  7029. 0x01, /* adv instance */
  7030. 0x80, 0x02, 0x00, 0x00, /* flags: 1m and coded*/
  7031. 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
  7032. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  7033. };
  7034. static const struct generic_data add_ext_advertising_fail_3 = {
  7035. .setup_settings = settings_powered_le,
  7036. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7037. .send_param = add_ext_advertising_invalid_param_3,
  7038. .send_len = sizeof(add_ext_advertising_invalid_param_3),
  7039. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  7040. };
  7041. /* add advertising with multiple phy flags */
  7042. static const uint8_t add_ext_advertising_invalid_param_4[] = {
  7043. 0x01, /* adv instance */
  7044. 0x80, 0x03, 0x00, 0x00, /* flags: 1m, 2m and coded*/
  7045. 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
  7046. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  7047. };
  7048. static const struct generic_data add_ext_advertising_fail_4 = {
  7049. .setup_settings = settings_powered_le,
  7050. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7051. .send_param = add_ext_advertising_invalid_param_4,
  7052. .send_len = sizeof(add_ext_advertising_invalid_param_4),
  7053. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  7054. };
  7055. static const uint8_t set_ext_adv_data_uuid[] = {
  7056. /* handle */
  7057. 0x01,
  7058. /* complete data */
  7059. 0x03,
  7060. /* controller should not fragment */
  7061. 0x01,
  7062. /* adv data len */
  7063. 0x09,
  7064. /* advertise heart rate monitor and manufacturer specific data */
  7065. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  7066. };
  7067. static const struct generic_data add_ext_advertising_success_1 = {
  7068. .setup_settings = settings_powered_le,
  7069. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7070. .send_param = add_advertising_param_uuid,
  7071. .send_len = sizeof(add_advertising_param_uuid),
  7072. .expect_param = advertising_instance1_param,
  7073. .expect_len = sizeof(advertising_instance1_param),
  7074. .expect_status = MGMT_STATUS_SUCCESS,
  7075. .expect_alt_ev = MGMT_EV_ADVERTISING_ADDED,
  7076. .expect_alt_ev_param = advertising_instance1_param,
  7077. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  7078. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_DATA,
  7079. .expect_hci_param = set_ext_adv_data_uuid,
  7080. .expect_hci_len = sizeof(set_ext_adv_data_uuid),
  7081. };
  7082. static const uint8_t set_ext_adv_data_test1[] = {
  7083. 0x01, /* handle */
  7084. 0x03, /* complete data */
  7085. 0x01, /* controller should not fragment */
  7086. 0x07, /* adv data len */
  7087. 0x06, /* AD len */
  7088. 0x08, /* AD type: shortened local name */
  7089. 0x74, 0x65, 0x73, 0x74, 0x31, /* "test1" */
  7090. };
  7091. static const struct generic_data add_ext_advertising_success_pwron_data = {
  7092. .send_opcode = MGMT_OP_SET_POWERED,
  7093. .send_param = set_powered_on_param,
  7094. .send_len = sizeof(set_powered_on_param),
  7095. .expect_status = MGMT_STATUS_SUCCESS,
  7096. .expect_param = set_powered_adv_instance_settings_param,
  7097. .expect_len = sizeof(set_powered_adv_instance_settings_param),
  7098. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_DATA,
  7099. .expect_hci_param = set_ext_adv_data_test1,
  7100. .expect_hci_len = sizeof(set_ext_adv_data_test1),
  7101. };
  7102. static const char set_ext_adv_on_set_adv_enable_param[] = {
  7103. 0x01, /* Enable */
  7104. 0x01, /* No of sets */
  7105. 0x01, /* Handle */
  7106. 0x00, 0x00, /* Duration */
  7107. 0x00, /* Max events */
  7108. };
  7109. static const struct generic_data add_ext_advertising_success_pwron_enabled = {
  7110. .send_opcode = MGMT_OP_SET_POWERED,
  7111. .send_param = set_powered_on_param,
  7112. .send_len = sizeof(set_powered_on_param),
  7113. .expect_status = MGMT_STATUS_SUCCESS,
  7114. .expect_param = set_powered_adv_instance_settings_param,
  7115. .expect_len = sizeof(set_powered_adv_instance_settings_param),
  7116. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_ENABLE,
  7117. .expect_hci_param = set_ext_adv_on_set_adv_enable_param,
  7118. .expect_hci_len = sizeof(set_ext_adv_on_set_adv_enable_param),
  7119. };
  7120. static const uint8_t set_ext_adv_data_txpwr[] = {
  7121. 0x00, /* handle */
  7122. 0x03, /* complete data */
  7123. 0x01, /* controller should not fragment */
  7124. 0x03, /* adv data len */
  7125. 0x02, /* AD len */
  7126. 0x0a, /* AD type: tx power */
  7127. 0x00, /* tx power */
  7128. };
  7129. static const struct generic_data add_ext_advertising_success_4 = {
  7130. .send_opcode = MGMT_OP_SET_ADVERTISING,
  7131. .send_param = set_adv_on_param,
  7132. .send_len = sizeof(set_adv_on_param),
  7133. .expect_status = MGMT_STATUS_SUCCESS,
  7134. .expect_param = set_adv_settings_param_2,
  7135. .expect_len = sizeof(set_adv_settings_param_2),
  7136. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_DATA,
  7137. .expect_hci_param = set_ext_adv_data_txpwr,
  7138. .expect_hci_len = sizeof(set_ext_adv_data_txpwr),
  7139. };
  7140. static const struct generic_data add_ext_advertising_success_5 = {
  7141. .send_opcode = MGMT_OP_SET_ADVERTISING,
  7142. .send_param = set_adv_off_param,
  7143. .send_len = sizeof(set_adv_off_param),
  7144. .expect_status = MGMT_STATUS_SUCCESS,
  7145. .expect_param = set_powered_adv_instance_settings_param,
  7146. .expect_len = sizeof(set_powered_adv_instance_settings_param),
  7147. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_DATA,
  7148. .expect_hci_param = set_ext_adv_data_test1,
  7149. .expect_hci_len = sizeof(set_ext_adv_data_test1),
  7150. };
  7151. static const struct generic_data add_ext_advertising_success_6 = {
  7152. .setup_settings = settings_powered_le,
  7153. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7154. .send_param = add_advertising_param_scanrsp,
  7155. .send_len = sizeof(add_advertising_param_scanrsp),
  7156. .expect_param = advertising_instance1_param,
  7157. .expect_len = sizeof(advertising_instance1_param),
  7158. .expect_status = MGMT_STATUS_SUCCESS,
  7159. .expect_alt_ev = MGMT_EV_ADVERTISING_ADDED,
  7160. .expect_alt_ev_param = advertising_instance1_param,
  7161. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  7162. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_DATA,
  7163. .expect_hci_param = set_ext_adv_data_uuid,
  7164. .expect_hci_len = sizeof(set_ext_adv_data_uuid),
  7165. };
  7166. static const uint8_t set_ext_scan_rsp_uuid[] = {
  7167. 0x01, /* handle */
  7168. 0x03, /* complete data */
  7169. 0x01, /* controller should not fragment */
  7170. 0x0a, /* scan rsp data len */
  7171. 0x03, /* AD len */
  7172. 0x19, /* AD type: external appearance */
  7173. 0x40, 0x03, /* some custom appearance */
  7174. 0x05, /* AD len */
  7175. 0x03, /* AD type: all 16 bit service class UUIDs */
  7176. 0x0d, 0x18, 0x0f, 0x18, /* heart rate monitor, battery service */
  7177. };
  7178. static const struct generic_data add_ext_advertising_success_7 = {
  7179. .setup_settings = settings_powered_le,
  7180. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7181. .send_param = add_advertising_param_scanrsp,
  7182. .send_len = sizeof(add_advertising_param_scanrsp),
  7183. .expect_param = advertising_instance1_param,
  7184. .expect_len = sizeof(advertising_instance1_param),
  7185. .expect_status = MGMT_STATUS_SUCCESS,
  7186. .expect_alt_ev = MGMT_EV_ADVERTISING_ADDED,
  7187. .expect_alt_ev_param = advertising_instance1_param,
  7188. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  7189. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_RSP_DATA,
  7190. .expect_hci_param = set_ext_scan_rsp_uuid,
  7191. .expect_hci_len = sizeof(set_ext_scan_rsp_uuid),
  7192. };
  7193. static uint8_t set_connectable_on_ext_adv_param[] = {
  7194. 0x01, /* Handle */
  7195. 0x13, 0x00, /* Event type */
  7196. 0x00, 0x08, 0x00, /* min_interval */
  7197. 0x00, 0x08, 0x00, /* max_interval */
  7198. 0x07, /* channel_map */
  7199. 0x00, /* own_addr_type */
  7200. 0x00, /* peer_addr_type */
  7201. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* peer_addr */
  7202. 0x00, /* filter_policy */
  7203. 127, /* Tx power */
  7204. 0x01, /* Primary PHY */
  7205. 0x00, /* primary adv max skip */
  7206. 0x01, /* Secondary PHY */
  7207. 0x00, /* adv sid*/
  7208. 0x00, /* Scan req notification */
  7209. };
  7210. static const struct generic_data add_ext_advertising_success_8 = {
  7211. .setup_settings = settings_powered_le,
  7212. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7213. .send_param = add_advertising_param_connectable,
  7214. .send_len = sizeof(add_advertising_param_connectable),
  7215. .expect_param = advertising_instance1_param,
  7216. .expect_len = sizeof(advertising_instance1_param),
  7217. .expect_status = MGMT_STATUS_SUCCESS,
  7218. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  7219. .expect_hci_param = set_connectable_on_ext_adv_param,
  7220. .expect_hci_len = sizeof(set_connectable_on_ext_adv_param),
  7221. };
  7222. static const uint8_t set_ext_adv_data_general_discov[] = {
  7223. 0x01, /* handle */
  7224. 0x03, /* complete data */
  7225. 0x01, /* controller should not fragment */
  7226. 0x0c, /* adv data len */
  7227. 0x02, /* AD len */
  7228. 0x01, /* AD type: flags */
  7229. 0x02, /* general discoverable */
  7230. 0x03, /* AD len */
  7231. 0x02, /* AD type: some 16bit service class UUIDs */
  7232. 0x0d, 0x18, /* heart rate monitor */
  7233. 0x04, /* AD len */
  7234. 0xff, /* AD type: manufacturer specific data */
  7235. 0x01, 0x02, 0x03, /* custom advertising data */
  7236. };
  7237. static const uint8_t set_ext_adv_data_limited_discov[] = {
  7238. 0x01, /* handle */
  7239. 0x03, /* complete data */
  7240. 0x01, /* controller should not fragment */
  7241. 0x0c, /* adv data len */
  7242. 0x02, /* AD len */
  7243. 0x01, /* AD type: flags */
  7244. 0x01, /* limited discoverable */
  7245. /* rest: same as before */
  7246. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  7247. };
  7248. static const uint8_t set_ext_adv_data_uuid_txpwr[] = {
  7249. 0x01, /* handle */
  7250. 0x03, /* complete data */
  7251. 0x01, /* controller should not fragment */
  7252. 0x0c, /* adv data len */
  7253. 0x03, /* AD len */
  7254. 0x02, /* AD type: some 16bit service class UUIDs */
  7255. 0x0d, 0x18, /* heart rate monitor */
  7256. 0x04, /* AD len */
  7257. 0xff, /* AD type: manufacturer specific data */
  7258. 0x01, 0x02, 0x03, /* custom advertising data */
  7259. 0x02, /* AD len */
  7260. 0x0a, /* AD type: tx power */
  7261. 0x00, /* tx power */
  7262. };
  7263. static const struct generic_data add_ext_advertising_success_9 = {
  7264. .setup_settings = settings_powered_le,
  7265. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7266. .send_param = add_advertising_param_general_discov,
  7267. .send_len = sizeof(add_advertising_param_general_discov),
  7268. .expect_param = advertising_instance1_param,
  7269. .expect_len = sizeof(advertising_instance1_param),
  7270. .expect_status = MGMT_STATUS_SUCCESS,
  7271. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_DATA,
  7272. .expect_hci_param = set_ext_adv_data_general_discov,
  7273. .expect_hci_len = sizeof(set_ext_adv_data_general_discov),
  7274. };
  7275. static const struct generic_data add_ext_advertising_success_10 = {
  7276. .setup_settings = settings_powered_le,
  7277. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7278. .send_param = add_advertising_param_limited_discov,
  7279. .send_len = sizeof(add_advertising_param_limited_discov),
  7280. .expect_param = advertising_instance1_param,
  7281. .expect_len = sizeof(advertising_instance1_param),
  7282. .expect_status = MGMT_STATUS_SUCCESS,
  7283. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_DATA,
  7284. .expect_hci_param = set_ext_adv_data_limited_discov,
  7285. .expect_hci_len = sizeof(set_ext_adv_data_limited_discov),
  7286. };
  7287. static const struct generic_data add_ext_advertising_success_11 = {
  7288. .setup_settings = settings_powered_le_discoverable,
  7289. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7290. .send_param = add_advertising_param_managed,
  7291. .send_len = sizeof(add_advertising_param_managed),
  7292. .expect_param = advertising_instance1_param,
  7293. .expect_len = sizeof(advertising_instance1_param),
  7294. .expect_status = MGMT_STATUS_SUCCESS,
  7295. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_DATA,
  7296. .expect_hci_param = set_ext_adv_data_general_discov,
  7297. .expect_hci_len = sizeof(set_ext_adv_data_general_discov),
  7298. };
  7299. static const struct generic_data add_ext_advertising_success_12 = {
  7300. .setup_settings = settings_powered_le_discoverable,
  7301. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7302. .send_param = add_advertising_param_txpwr,
  7303. .send_len = sizeof(add_advertising_param_txpwr),
  7304. .expect_param = advertising_instance1_param,
  7305. .expect_len = sizeof(advertising_instance1_param),
  7306. .expect_status = MGMT_STATUS_SUCCESS,
  7307. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_DATA,
  7308. .expect_hci_param = set_ext_adv_data_uuid_txpwr,
  7309. .expect_hci_len = sizeof(set_ext_adv_data_uuid_txpwr),
  7310. };
  7311. static uint8_t set_connectable_off_scan_ext_adv_param[] = {
  7312. 0x01, /* Handle */
  7313. 0x12, 0x00, /* Event type */
  7314. 0x00, 0x08, 0x00, /* min_interval */
  7315. 0x00, 0x08, 0x00, /* max_interval */
  7316. 0x07, /* channel_map */
  7317. 0x01, /* own_addr_type */
  7318. 0x00, /* peer_addr_type */
  7319. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* peer_addr */
  7320. 0x00, /* filter_policy */
  7321. 127, /* Tx power */
  7322. 0x01, /* Primary PHY */
  7323. 0x00, /* primary adv max skip */
  7324. 0x01, /* Secondary PHY */
  7325. 0x00, /* adv sid*/
  7326. 0x00, /* Scan req notification */
  7327. };
  7328. static const struct generic_data add_ext_advertising_success_13 = {
  7329. .setup_settings = settings_powered_le,
  7330. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7331. .send_param = add_advertising_param_scanrsp,
  7332. .send_len = sizeof(add_advertising_param_scanrsp),
  7333. .expect_param = advertising_instance1_param,
  7334. .expect_len = sizeof(advertising_instance1_param),
  7335. .expect_status = MGMT_STATUS_SUCCESS,
  7336. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  7337. .expect_hci_param = set_connectable_off_scan_ext_adv_param,
  7338. .expect_hci_len = sizeof(set_connectable_off_scan_ext_adv_param),
  7339. };
  7340. static uint8_t set_connectable_off_ext_adv_param[] = {
  7341. 0x01, /* Handle */
  7342. 0x10, 0x00, /* Event type */
  7343. 0x00, 0x08, 0x00, /* min_interval */
  7344. 0x00, 0x08, 0x00, /* max_interval */
  7345. 0x07, /* channel_map */
  7346. 0x01, /* own_addr_type */
  7347. 0x00, /* peer_addr_type */
  7348. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* peer_addr */
  7349. 0x00, /* filter_policy */
  7350. 127, /* Tx power */
  7351. 0x01, /* Primary PHY */
  7352. 0x00, /* primary adv max skip */
  7353. 0x01, /* Secondary PHY */
  7354. 0x00, /* adv sid*/
  7355. 0x00, /* Scan req notification */
  7356. };
  7357. static const struct generic_data add_ext_advertising_success_14 = {
  7358. .setup_settings = settings_powered_le,
  7359. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7360. .send_param = add_advertising_param_uuid,
  7361. .send_len = sizeof(add_advertising_param_uuid),
  7362. .expect_param = advertising_instance1_param,
  7363. .expect_len = sizeof(advertising_instance1_param),
  7364. .expect_status = MGMT_STATUS_SUCCESS,
  7365. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  7366. .expect_hci_param = set_connectable_off_ext_adv_param,
  7367. .expect_hci_len = sizeof(set_connectable_off_ext_adv_param),
  7368. };
  7369. static const struct generic_data add_ext_advertising_success_15 = {
  7370. .setup_settings = settings_powered_le_connectable,
  7371. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7372. .send_param = add_advertising_param_uuid,
  7373. .send_len = sizeof(add_advertising_param_uuid),
  7374. .expect_param = advertising_instance1_param,
  7375. .expect_len = sizeof(advertising_instance1_param),
  7376. .expect_status = MGMT_STATUS_SUCCESS,
  7377. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  7378. .expect_hci_param = set_connectable_on_ext_adv_param,
  7379. .expect_hci_len = sizeof(set_connectable_on_ext_adv_param),
  7380. };
  7381. static uint8_t preset_connectable_on_ext_adv_param[] = {
  7382. 0x01, /* Handle */
  7383. 0x13, 0x00, /* Event type */
  7384. 0x00, 0x08, 0x00, /* min_interval */
  7385. 0x00, 0x08, 0x00, /* max_interval */
  7386. 0x07, /* channel_map */
  7387. 0x00, /* own_addr_type */
  7388. 0x00, /* peer_addr_type */
  7389. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* peer_addr */
  7390. 0x00, /* filter_policy */
  7391. 0x00, /* Tx power */
  7392. 0x01, /* Primary PHY */
  7393. 0x00, /* primary adv max skip */
  7394. 0x01, /* Secondary PHY */
  7395. 0x00, /* adv sid*/
  7396. 0x00, /* Scan req notification */
  7397. };
  7398. static const struct generic_data add_ext_advertising_success_16 = {
  7399. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  7400. .send_param = set_connectable_on_param,
  7401. .send_len = sizeof(set_connectable_on_param),
  7402. .expect_status = MGMT_STATUS_SUCCESS,
  7403. .expect_param = set_connectable_settings_param_3,
  7404. .expect_len = sizeof(set_connectable_settings_param_3),
  7405. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  7406. .expect_hci_param = preset_connectable_on_ext_adv_param,
  7407. .expect_hci_len = sizeof(preset_connectable_on_ext_adv_param),
  7408. };
  7409. static uint8_t preset_connectable_off_ext_adv_param[] = {
  7410. 0x01, /* Handle */
  7411. 0x10, 0x00, /* Event type */
  7412. 0x00, 0x08, 0x00, /* min_interval */
  7413. 0x00, 0x08, 0x00, /* max_interval */
  7414. 0x07, /* channel_map */
  7415. 0x01, /* own_addr_type */
  7416. 0x00, /* peer_addr_type */
  7417. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* peer_addr */
  7418. 0x00, /* filter_policy */
  7419. 0x00, /* Tx power */
  7420. 0x01, /* Primary PHY */
  7421. 0x00, /* primary adv max skip */
  7422. 0x01, /* Secondary PHY */
  7423. 0x00, /* adv sid*/
  7424. 0x00, /* Scan req notification */
  7425. };
  7426. static const struct generic_data add_ext_advertising_success_17 = {
  7427. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  7428. .send_param = set_connectable_off_param,
  7429. .send_len = sizeof(set_connectable_off_param),
  7430. .expect_status = MGMT_STATUS_SUCCESS,
  7431. .expect_param = set_le_settings_param_2,
  7432. .expect_len = sizeof(set_le_settings_param_2),
  7433. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  7434. .expect_hci_param = preset_connectable_off_ext_adv_param,
  7435. .expect_hci_len = sizeof(preset_connectable_off_ext_adv_param),
  7436. };
  7437. static const struct generic_data add_ext_advertising_le_off = {
  7438. .send_opcode = MGMT_OP_SET_LE,
  7439. .send_param = set_le_off_param,
  7440. .send_len = sizeof(set_le_off_param),
  7441. .expect_status = MGMT_STATUS_SUCCESS,
  7442. .expect_param = set_le_settings_param_off,
  7443. .expect_len = sizeof(set_le_settings_param_off),
  7444. .expect_alt_ev = MGMT_EV_ADVERTISING_REMOVED,
  7445. .expect_alt_ev_param = advertising_instance1_param,
  7446. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  7447. };
  7448. static const struct generic_data add_ext_advertising_success_18 = {
  7449. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7450. .send_param = add_advertising_param_uuid,
  7451. .send_len = sizeof(add_advertising_param_uuid),
  7452. .expect_param = advertising_instance1_param,
  7453. .expect_len = sizeof(advertising_instance1_param),
  7454. .expect_status = MGMT_STATUS_SUCCESS,
  7455. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_DATA,
  7456. .expect_hci_param = set_ext_adv_data_uuid,
  7457. .expect_hci_len = sizeof(set_ext_adv_data_uuid),
  7458. };
  7459. static const char set_ext_adv_disable_param[] = {
  7460. 0x00, 0x00,
  7461. };
  7462. static const char set_ext_adv_disable_param_1[] = {
  7463. 0x00, 0x01, 0x01, 0x00, 0x00, 0x00
  7464. };
  7465. static const struct generic_data add_ext_advertising_timeout_expired = {
  7466. .expect_alt_ev = MGMT_EV_ADVERTISING_REMOVED,
  7467. .expect_alt_ev_param = advertising_instance1_param,
  7468. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  7469. };
  7470. static const struct generic_data remove_ext_advertising_fail_1 = {
  7471. .send_opcode = MGMT_OP_REMOVE_ADVERTISING,
  7472. .send_param = remove_advertising_param_1,
  7473. .send_len = sizeof(remove_advertising_param_1),
  7474. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  7475. };
  7476. static const struct generic_data remove_ext_advertising_success_1 = {
  7477. .send_opcode = MGMT_OP_REMOVE_ADVERTISING,
  7478. .send_param = remove_advertising_param_1,
  7479. .send_len = sizeof(remove_advertising_param_1),
  7480. .expect_status = MGMT_STATUS_SUCCESS,
  7481. .expect_param = remove_advertising_param_1,
  7482. .expect_len = sizeof(remove_advertising_param_1),
  7483. .expect_alt_ev = MGMT_EV_ADVERTISING_REMOVED,
  7484. .expect_alt_ev_param = advertising_instance1_param,
  7485. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  7486. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_ENABLE,
  7487. .expect_hci_param = set_ext_adv_disable_param_1,
  7488. .expect_hci_len = sizeof(set_ext_adv_disable_param_1),
  7489. };
  7490. static const struct generic_data remove_ext_advertising_success_2 = {
  7491. .send_opcode = MGMT_OP_REMOVE_ADVERTISING,
  7492. .send_param = remove_advertising_param_2,
  7493. .send_len = sizeof(remove_advertising_param_2),
  7494. .expect_status = MGMT_STATUS_SUCCESS,
  7495. .expect_param = remove_advertising_param_2,
  7496. .expect_len = sizeof(remove_advertising_param_2),
  7497. .expect_alt_ev = MGMT_EV_ADVERTISING_REMOVED,
  7498. .expect_alt_ev_param = advertising_instance1_param,
  7499. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  7500. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_ENABLE,
  7501. .expect_hci_param = set_ext_adv_disable_param,
  7502. .expect_hci_len = sizeof(set_ext_adv_disable_param),
  7503. };
  7504. static const uint8_t set_ext_adv_data_test2[] = {
  7505. 0x02, /* handle */
  7506. 0x03, /* complete data */
  7507. 0x01, /* controller should not fragment */
  7508. 0x07, /* adv data len */
  7509. 0x06, /* AD len */
  7510. 0x08, /* AD type: shortened local name */
  7511. 0x74, 0x65, 0x73, 0x74, 0x32, /* "test2" */
  7512. };
  7513. static const struct generic_data multi_ext_advertising = {
  7514. .expect_alt_ev = MGMT_EV_ADVERTISING_REMOVED,
  7515. .expect_alt_ev_param = advertising_instance1_param,
  7516. .expect_alt_ev_len = sizeof(advertising_instance1_param),
  7517. };
  7518. static const struct generic_data multi_ext_advertising_add_second = {
  7519. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7520. .send_param = add_advertising_param_test2,
  7521. .send_len = sizeof(add_advertising_param_test2),
  7522. .expect_param = advertising_instance2_param,
  7523. .expect_len = sizeof(advertising_instance2_param),
  7524. .expect_status = MGMT_STATUS_SUCCESS,
  7525. .expect_alt_ev = MGMT_EV_ADVERTISING_ADDED,
  7526. .expect_alt_ev_param = advertising_instance2_param,
  7527. .expect_alt_ev_len = sizeof(advertising_instance2_param),
  7528. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_DATA,
  7529. .expect_hci_param = set_ext_adv_data_test2,
  7530. .expect_hci_len = sizeof(set_ext_adv_data_test2),
  7531. };
  7532. static const struct generic_data add_ext_advertising_empty_scrsp = {
  7533. .setup_settings = settings_powered_le,
  7534. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  7535. .setup_send_param = set_local_name_param,
  7536. .setup_send_len = sizeof(set_local_name_param),
  7537. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7538. .send_param = add_advertising_param_empty,
  7539. .send_len = sizeof(add_advertising_param_empty),
  7540. .expect_status = MGMT_STATUS_SUCCESS,
  7541. .expect_param = advertising_instance1_param,
  7542. .expect_len = sizeof(advertising_instance1_param),
  7543. };
  7544. static const struct generic_data add_ext_advertising_scrsp_data_only_ok = {
  7545. .setup_settings = settings_powered_le,
  7546. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7547. .send_param = add_advertising_param_scrsp_data_only_ok,
  7548. .send_len = sizeof(add_advertising_param_scrsp_data_only_ok),
  7549. .expect_status = MGMT_STATUS_SUCCESS,
  7550. .expect_param = advertising_instance1_param,
  7551. .expect_len = sizeof(advertising_instance1_param),
  7552. };
  7553. static const struct generic_data add_ext_advertising_scrsp_data_only_too_long = {
  7554. .setup_settings = settings_powered_le,
  7555. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7556. .send_param = add_advertising_param_scrsp_data_only_too_long,
  7557. .send_len = sizeof(add_advertising_param_scrsp_data_only_too_long),
  7558. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  7559. .expect_param = NULL,
  7560. .expect_len = 0,
  7561. };
  7562. static const struct generic_data add_ext_advertising_scrsp_appear_data_ok = {
  7563. .setup_settings = settings_powered_le,
  7564. .setup_send_opcode = MGMT_OP_SET_APPEARANCE,
  7565. .setup_send_param = set_appearance_param,
  7566. .setup_send_len = sizeof(set_appearance_param),
  7567. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7568. .send_param = add_advertising_param_scrsp_appear_data_ok,
  7569. .send_len = sizeof(add_advertising_param_scrsp_appear_data_ok),
  7570. .expect_status = MGMT_STATUS_SUCCESS,
  7571. .expect_param = advertising_instance1_param,
  7572. .expect_len = sizeof(advertising_instance1_param),
  7573. };
  7574. static const struct generic_data add_ext_advertising_scrsp_appear_data_too_long = {
  7575. .setup_settings = settings_powered_le,
  7576. .setup_send_opcode = MGMT_OP_SET_APPEARANCE,
  7577. .setup_send_param = set_appearance_param,
  7578. .setup_send_len = sizeof(set_appearance_param),
  7579. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7580. .send_param = add_advertising_param_scrsp_appear_data_too_long,
  7581. .send_len = sizeof(add_advertising_param_scrsp_appear_data_too_long),
  7582. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  7583. .expect_param = NULL,
  7584. .expect_len = 0,
  7585. };
  7586. static const struct generic_data add_ext_advertising_scrsp_appear_null = {
  7587. .setup_settings = settings_powered_le,
  7588. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7589. .send_param = add_advertising_param_scrsp_appear_null,
  7590. .send_len = sizeof(add_advertising_param_scrsp_appear_null),
  7591. .expect_status = MGMT_STATUS_SUCCESS,
  7592. .expect_param = advertising_instance1_param,
  7593. .expect_len = sizeof(advertising_instance1_param),
  7594. };
  7595. static const uint8_t ext_scan_rsp_data_empty[] = {
  7596. 0x01, /* handle */
  7597. 0x03, /* complete data */
  7598. 0x01, /* controller should not fragment */
  7599. 0x01, /* scan rsp data len */
  7600. 0x00, /* scan rsp data */
  7601. };
  7602. static const struct generic_data add_ext_advertising_no_name_set = {
  7603. .setup_settings = settings_powered_le,
  7604. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7605. .send_param = add_advertising_empty_param,
  7606. .send_len = sizeof(add_advertising_empty_param),
  7607. .expect_status = MGMT_STATUS_SUCCESS,
  7608. .expect_param = advertising_instance1_param,
  7609. .expect_len = sizeof(advertising_instance1_param),
  7610. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_RSP_DATA,
  7611. .expect_hci_param = ext_scan_rsp_data_empty,
  7612. .expect_hci_len = sizeof(ext_scan_rsp_data_empty),
  7613. };
  7614. static const uint8_t set_ext_scan_rsp_data_name_fits_in_scrsp[] = {
  7615. 0x01, /* handle */
  7616. 0x03, /* complete data */
  7617. 0x01, /* controller should not fragment */
  7618. 0x0c, /* Scan rsp data len */
  7619. 0x0b, /* Local name data len */
  7620. 0x09, /* Complete name */
  7621. /* "Test name" */
  7622. 0x54, 0x65, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x00,
  7623. };
  7624. static const struct generic_data add_ext_advertising_name_fits_in_scrsp = {
  7625. .setup_settings = settings_powered_le,
  7626. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  7627. .setup_send_param = &set_local_name_cp,
  7628. .setup_send_len = sizeof(set_local_name_cp),
  7629. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7630. .send_param = add_advertising_param_name,
  7631. .send_len = sizeof(add_advertising_param_name),
  7632. .expect_status = MGMT_STATUS_SUCCESS,
  7633. .expect_param = advertising_instance1_param,
  7634. .expect_len = sizeof(advertising_instance1_param),
  7635. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_RSP_DATA,
  7636. .expect_hci_param = set_ext_scan_rsp_data_name_fits_in_scrsp,
  7637. .expect_hci_len = sizeof(set_ext_scan_rsp_data_name_fits_in_scrsp),
  7638. };
  7639. static const uint8_t set_ext_scan_rsp_data_shortened_name_fits[] = {
  7640. 0x01, /* handle */
  7641. 0x03, /* complete data */
  7642. 0x01, /* controller should not fragment */
  7643. 0x0d, /* Scan rsp data len */
  7644. 0x0c, /* Local name data len */
  7645. 0x08, /* Short name */
  7646. /* "Test name1" */
  7647. 0x54, 0x65, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x31, 0x00,
  7648. };
  7649. static const struct generic_data add_ext_advertising_shortened_name_in_scrsp = {
  7650. .setup_settings = settings_powered_le,
  7651. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  7652. .setup_send_param = &set_local_name_longer_cp,
  7653. .setup_send_len = sizeof(set_local_name_longer_cp),
  7654. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7655. .send_param = add_advertising_param_name,
  7656. .send_len = sizeof(add_advertising_param_name),
  7657. .expect_status = MGMT_STATUS_SUCCESS,
  7658. .expect_param = advertising_instance1_param,
  7659. .expect_len = sizeof(advertising_instance1_param),
  7660. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_RSP_DATA,
  7661. .expect_hci_param = set_ext_scan_rsp_data_shortened_name_fits,
  7662. .expect_hci_len = sizeof(set_ext_scan_rsp_data_shortened_name_fits),
  7663. };
  7664. static const uint8_t set_ext_scan_rsp_data_param_name_data_ok[] = {
  7665. 0x01, /* handle */
  7666. 0x03, /* complete data */
  7667. 0x01, /* controller should not fragment */
  7668. 0x1e, /* Scan rsp data len */
  7669. /* scan rsp data */
  7670. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  7671. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  7672. 0x0b, /* Local name data len */
  7673. 0x09, /* Complete name */
  7674. 0x54, 0x65, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x00,
  7675. /* "Test name" */
  7676. };
  7677. static const struct generic_data add_ext_advertising_name_data_ok = {
  7678. .setup_settings = settings_powered_le,
  7679. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  7680. .setup_send_param = &set_local_name_cp,
  7681. .setup_send_len = sizeof(set_local_name_cp),
  7682. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7683. .send_param = add_advertising_param_name_data_ok,
  7684. .send_len = sizeof(add_advertising_param_name_data_ok),
  7685. .expect_status = MGMT_STATUS_SUCCESS,
  7686. .expect_param = advertising_instance1_param,
  7687. .expect_len = sizeof(advertising_instance1_param),
  7688. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_RSP_DATA,
  7689. .expect_hci_param = set_ext_scan_rsp_data_param_name_data_ok,
  7690. .expect_hci_len = sizeof(set_ext_scan_rsp_data_param_name_data_ok),
  7691. };
  7692. static const struct generic_data add_ext_advertising_name_data_inv = {
  7693. .setup_settings = settings_powered_le,
  7694. .setup_send_opcode = MGMT_OP_SET_LOCAL_NAME,
  7695. .setup_send_param = &set_local_name_cp,
  7696. .setup_send_len = sizeof(set_local_name_cp),
  7697. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7698. .send_param = add_advertising_param_name_data_inv,
  7699. .send_len = sizeof(add_advertising_param_name_data_inv),
  7700. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  7701. .expect_param = NULL,
  7702. .expect_len = 0,
  7703. };
  7704. static const uint8_t set_ext_scan_rsp_data_name_data_appear[] = {
  7705. 0x01, /* handle */
  7706. 0x03, /* complete data */
  7707. 0x01, /* controller should not fragment */
  7708. 0x1e, /* Scan rsp data len */
  7709. 0x03, /* appearance len */
  7710. 0x19, /* EIR_APPEARANCE */
  7711. 0x54, 0x65, /* appearance value */
  7712. /* scan rsp data */
  7713. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  7714. 0x00, 0x00, 0x00, 0x00,
  7715. 0x0b, /* Local name data len */
  7716. 0x09, /* Complete name */
  7717. 0x54, 0x65, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x00,
  7718. /* "Test name" */
  7719. };
  7720. static const struct generic_data add_ext_advertising_name_data_appear = {
  7721. .setup_settings = settings_powered_le,
  7722. .setup_mgmt_cmd_arr = add_advertising_mgmt_cmd_arr,
  7723. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7724. .send_param = add_advertising_param_name_data_appear,
  7725. .send_len = sizeof(add_advertising_param_name_data_appear),
  7726. .expect_status = MGMT_STATUS_SUCCESS,
  7727. .expect_param = advertising_instance1_param,
  7728. .expect_len = sizeof(advertising_instance1_param),
  7729. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_RSP_DATA,
  7730. .expect_hci_param = set_ext_scan_rsp_data_name_data_appear,
  7731. .expect_hci_len = sizeof(set_ext_scan_rsp_data_name_data_appear),
  7732. };
  7733. /* simple add advertising command */
  7734. static const uint8_t add_advertising_1m_param_uuid[] = {
  7735. 0x01, /* adv instance */
  7736. 0x80, 0x00, 0x00, 0x00, /* flags: 1m */
  7737. 0x00, 0x00, /* duration: default */
  7738. 0x00, 0x00, /* timeout: none */
  7739. 0x09, /* adv data len */
  7740. 0x00, /* scan rsp len */
  7741. /* adv data: */
  7742. 0x03, /* AD len */
  7743. 0x02, /* AD type: some 16 bit service class UUIDs */
  7744. 0x0d, 0x18, /* heart rate monitor */
  7745. 0x04, /* AD len */
  7746. 0xff, /* AD type: manufacturer specific data */
  7747. 0x01, 0x02, 0x03, /* custom advertising data */
  7748. };
  7749. static uint8_t set_connectable_off_ext_1m_adv_param[] = {
  7750. 0x01, /* Handle */
  7751. 0x00, 0x00, /* Event type */
  7752. 0x00, 0x08, 0x00, /* min_interval */
  7753. 0x00, 0x08, 0x00, /* max_interval */
  7754. 0x07, /* channel_map */
  7755. 0x01, /* own_addr_type */
  7756. 0x00, /* peer_addr_type */
  7757. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* peer_addr */
  7758. 0x00, /* filter_policy */
  7759. 127, /* Tx power */
  7760. 0x01, /* Primary PHY */
  7761. 0x00, /* primary adv max skip */
  7762. 0x01, /* Secondary PHY */
  7763. 0x00, /* adv sid*/
  7764. 0x00, /* Scan req notification */
  7765. };
  7766. static const struct generic_data add_ext_advertising_success_1m = {
  7767. .setup_settings = settings_powered_le,
  7768. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7769. .send_param = add_advertising_1m_param_uuid,
  7770. .send_len = sizeof(add_advertising_1m_param_uuid),
  7771. .expect_param = advertising_instance1_param,
  7772. .expect_len = sizeof(advertising_instance1_param),
  7773. .expect_status = MGMT_STATUS_SUCCESS,
  7774. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  7775. .expect_hci_param = set_connectable_off_ext_1m_adv_param,
  7776. .expect_hci_len = sizeof(set_connectable_off_ext_1m_adv_param),
  7777. };
  7778. /* simple add advertising command */
  7779. static const uint8_t add_advertising_2m_param_uuid[] = {
  7780. 0x01, /* adv instance */
  7781. 0x00, 0x01, 0x00, 0x00, /* flags: 2m */
  7782. 0x00, 0x00, /* duration: default */
  7783. 0x00, 0x00, /* timeout: none */
  7784. 0x09, /* adv data len */
  7785. 0x00, /* scan rsp len */
  7786. /* adv data: */
  7787. 0x03, /* AD len */
  7788. 0x02, /* AD type: some 16 bit service class UUIDs */
  7789. 0x0d, 0x18, /* heart rate monitor */
  7790. 0x04, /* AD len */
  7791. 0xff, /* AD type: manufacturer specific data */
  7792. 0x01, 0x02, 0x03, /* custom advertising data */
  7793. };
  7794. static uint8_t set_connectable_off_ext_2m_adv_param[] = {
  7795. 0x01, /* Handle */
  7796. 0x00, 0x00, /* Event type */
  7797. 0x00, 0x08, 0x00, /* min_interval */
  7798. 0x00, 0x08, 0x00, /* max_interval */
  7799. 0x07, /* channel_map */
  7800. 0x01, /* own_addr_type */
  7801. 0x00, /* peer_addr_type */
  7802. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* peer_addr */
  7803. 0x00, /* filter_policy */
  7804. 127, /* Tx power */
  7805. 0x01, /* Primary PHY */
  7806. 0x00, /* primary adv max skip */
  7807. 0x02, /* Secondary PHY */
  7808. 0x00, /* adv sid*/
  7809. 0x00, /* Scan req notification */
  7810. };
  7811. static const struct generic_data add_ext_advertising_success_2m = {
  7812. .setup_settings = settings_powered_le,
  7813. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7814. .send_param = add_advertising_2m_param_uuid,
  7815. .send_len = sizeof(add_advertising_2m_param_uuid),
  7816. .expect_param = advertising_instance1_param,
  7817. .expect_len = sizeof(advertising_instance1_param),
  7818. .expect_status = MGMT_STATUS_SUCCESS,
  7819. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  7820. .expect_hci_param = set_connectable_off_ext_2m_adv_param,
  7821. .expect_hci_len = sizeof(set_connectable_off_ext_2m_adv_param),
  7822. };
  7823. /* simple add advertising command */
  7824. static const uint8_t add_advertising_coded_param_uuid[] = {
  7825. 0x01, /* adv instance */
  7826. 0x00, 0x02, 0x00, 0x00, /* flags: coded */
  7827. 0x00, 0x00, /* duration: default */
  7828. 0x00, 0x00, /* timeout: none */
  7829. 0x09, /* adv data len */
  7830. 0x00, /* scan rsp len */
  7831. /* adv data: */
  7832. 0x03, /* AD len */
  7833. 0x02, /* AD type: some 16 bit service class UUIDs */
  7834. 0x0d, 0x18, /* heart rate monitor */
  7835. 0x04, /* AD len */
  7836. 0xff, /* AD type: manufacturer specific data */
  7837. 0x01, 0x02, 0x03, /* custom advertising data */
  7838. };
  7839. static uint8_t set_connectable_off_ext_coded_adv_param[] = {
  7840. 0x01, /* Handle */
  7841. 0x00, 0x00, /* Event type */
  7842. 0x00, 0x08, 0x00, /* min_interval */
  7843. 0x00, 0x08, 0x00, /* max_interval */
  7844. 0x07, /* channel_map */
  7845. 0x01, /* own_addr_type */
  7846. 0x00, /* peer_addr_type */
  7847. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* peer_addr */
  7848. 0x00, /* filter_policy */
  7849. 127, /* Tx power */
  7850. 0x03, /* Primary PHY */
  7851. 0x00, /* primary adv max skip */
  7852. 0x03, /* Secondary PHY */
  7853. 0x00, /* adv sid*/
  7854. 0x00, /* Scan req notification */
  7855. };
  7856. static const struct generic_data add_ext_advertising_success_coded = {
  7857. .setup_settings = settings_powered_le,
  7858. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7859. .send_param = add_advertising_coded_param_uuid,
  7860. .send_len = sizeof(add_advertising_coded_param_uuid),
  7861. .expect_param = advertising_instance1_param,
  7862. .expect_len = sizeof(advertising_instance1_param),
  7863. .expect_status = MGMT_STATUS_SUCCESS,
  7864. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  7865. .expect_hci_param = set_connectable_off_ext_coded_adv_param,
  7866. .expect_hci_len = sizeof(set_connectable_off_ext_coded_adv_param),
  7867. };
  7868. /* add advertising with scan response data */
  7869. static const uint8_t add_advertising_param_scanrsp_1m[] = {
  7870. 0x01, /* Instance */
  7871. 0x80, 0x00, 0x00, 0x00, /* Flags: 1m*/
  7872. 0x00, 0x00, /* Duration */
  7873. 0x00, 0x00, /* Timeout */
  7874. 0x09, /* Adv data len */
  7875. 0x0a, /* scan rsp len */
  7876. /* adv data: same as before */
  7877. 0x03, 0x02, 0x0d, 0x18, 0x04, 0xff, 0x01, 0x02, 0x03,
  7878. /* scan rsp data: */
  7879. 0x03, /* AD len */
  7880. 0x19, /* AD type: external appearance */
  7881. 0x40, 0x03, /* some custom appearance */
  7882. 0x05, /* AD len */
  7883. 0x03, /* AD type: all 16 bit service class UUIDs */
  7884. 0x0d, 0x18, /* heart rate monitor */
  7885. 0x0f, 0x18, /* battery service */
  7886. };
  7887. static uint8_t set_connectable_off_scan_ext_pdu_adv_param[] = {
  7888. 0x01, /* Handle */
  7889. 0x02, 0x00, /* Event type */
  7890. 0x00, 0x08, 0x00, /* min_interval */
  7891. 0x00, 0x08, 0x00, /* max_interval */
  7892. 0x07, /* channel_map */
  7893. 0x01, /* own_addr_type */
  7894. 0x00, /* peer_addr_type */
  7895. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* peer_addr */
  7896. 0x00, /* filter_policy */
  7897. 127, /* Tx power */
  7898. 0x01, /* Primary PHY */
  7899. 0x00, /* primary adv max skip */
  7900. 0x01, /* Secondary PHY */
  7901. 0x00, /* adv sid*/
  7902. 0x00, /* Scan req notification */
  7903. };
  7904. static const struct generic_data add_ext_advertising_success_scannable = {
  7905. .setup_settings = settings_powered_le,
  7906. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7907. .send_param = add_advertising_param_scanrsp_1m,
  7908. .send_len = sizeof(add_advertising_param_scanrsp_1m),
  7909. .expect_param = advertising_instance1_param,
  7910. .expect_len = sizeof(advertising_instance1_param),
  7911. .expect_status = MGMT_STATUS_SUCCESS,
  7912. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  7913. .expect_hci_param = set_connectable_off_scan_ext_pdu_adv_param,
  7914. .expect_hci_len = sizeof(set_connectable_off_scan_ext_pdu_adv_param),
  7915. };
  7916. static uint8_t set_connectable_on_ext_pdu_adv_param[] = {
  7917. 0x01, /* Handle */
  7918. 0x01, 0x00, /* Event type */
  7919. 0x00, 0x08, 0x00, /* min_interval */
  7920. 0x00, 0x08, 0x00, /* max_interval */
  7921. 0x07, /* channel_map */
  7922. 0x00, /* own_addr_type */
  7923. 0x00, /* peer_addr_type */
  7924. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* peer_addr */
  7925. 0x00, /* filter_policy */
  7926. 127, /* Tx power */
  7927. 0x01, /* Primary PHY */
  7928. 0x00, /* primary adv max skip */
  7929. 0x01, /* Secondary PHY */
  7930. 0x00, /* adv sid*/
  7931. 0x00, /* Scan req notification */
  7932. };
  7933. static const struct generic_data add_ext_advertising_success_connectable = {
  7934. .setup_settings = settings_powered_le_connectable,
  7935. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7936. .send_param = add_advertising_1m_param_uuid,
  7937. .send_len = sizeof(add_advertising_1m_param_uuid),
  7938. .expect_param = advertising_instance1_param,
  7939. .expect_len = sizeof(advertising_instance1_param),
  7940. .expect_status = MGMT_STATUS_SUCCESS,
  7941. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  7942. .expect_hci_param = set_connectable_on_ext_pdu_adv_param,
  7943. .expect_hci_len = sizeof(set_connectable_on_ext_pdu_adv_param),
  7944. };
  7945. static const struct generic_data add_ext_advertising_success_conn_scan = {
  7946. .setup_settings = settings_powered_le_connectable,
  7947. .send_opcode = MGMT_OP_ADD_ADVERTISING,
  7948. .send_param = add_advertising_param_scanrsp_1m,
  7949. .send_len = sizeof(add_advertising_param_scanrsp_1m),
  7950. .expect_param = advertising_instance1_param,
  7951. .expect_len = sizeof(advertising_instance1_param),
  7952. .expect_status = MGMT_STATUS_SUCCESS,
  7953. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  7954. .expect_hci_param = set_connectable_on_ext_pdu_adv_param,
  7955. .expect_hci_len = sizeof(set_connectable_on_ext_pdu_adv_param),
  7956. };
  7957. static void setup_add_adv_param_1m(struct mgmt_cp_add_advertising *cp,
  7958. uint8_t instance)
  7959. {
  7960. memset(cp, 0, sizeof(*cp));
  7961. cp->instance = instance;
  7962. cp->flags = cpu_to_le32(MGMT_ADV_FLAG_SEC_1M);
  7963. cp->adv_data_len = TESTER_ADD_ADV_DATA_LEN;
  7964. cp->data[0] = TESTER_ADD_ADV_DATA_LEN - 1; /* AD len */
  7965. cp->data[1] = 0x08; /* AD type: shortened local name */
  7966. cp->data[2] = 't'; /* adv data ... */
  7967. cp->data[3] = 'e';
  7968. cp->data[4] = 's';
  7969. cp->data[5] = 't';
  7970. cp->data[6] = '0' + instance;
  7971. }
  7972. static void setup_add_advertising_1m(const void *test_data)
  7973. {
  7974. struct test_data *data = tester_get_data();
  7975. struct mgmt_cp_add_advertising *cp;
  7976. unsigned char adv_param[sizeof(*cp) + TESTER_ADD_ADV_DATA_LEN];
  7977. unsigned char param[] = { 0x01 };
  7978. tester_print("Adding advertising instance while powered");
  7979. cp = (struct mgmt_cp_add_advertising *) adv_param;
  7980. setup_add_adv_param_1m(cp, 1);
  7981. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  7982. sizeof(param), &param,
  7983. NULL, NULL, NULL);
  7984. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  7985. sizeof(param), &param,
  7986. NULL, NULL, NULL);
  7987. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  7988. sizeof(adv_param), adv_param,
  7989. setup_add_advertising_callback,
  7990. NULL, NULL);
  7991. }
  7992. static uint8_t preset_connectable_on_ext_pdu_adv_param[] = {
  7993. 0x01, /* Handle */
  7994. 0x01, 0x00, /* Event type */
  7995. 0x00, 0x08, 0x00, /* min_interval */
  7996. 0x00, 0x08, 0x00, /* max_interval */
  7997. 0x07, /* channel_map */
  7998. 0x00, /* own_addr_type */
  7999. 0x00, /* peer_addr_type */
  8000. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* peer_addr */
  8001. 0x00, /* filter_policy */
  8002. 0x00, /* Tx power */
  8003. 0x01, /* Primary PHY */
  8004. 0x00, /* primary adv max skip */
  8005. 0x01, /* Secondary PHY */
  8006. 0x00, /* adv sid*/
  8007. 0x00, /* Scan req notification */
  8008. };
  8009. static const struct generic_data add_ext_advertising_conn_on_1m = {
  8010. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  8011. .send_param = set_connectable_on_param,
  8012. .send_len = sizeof(set_connectable_on_param),
  8013. .expect_status = MGMT_STATUS_SUCCESS,
  8014. .expect_param = set_connectable_settings_param_3,
  8015. .expect_len = sizeof(set_connectable_settings_param_3),
  8016. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  8017. .expect_hci_param = preset_connectable_on_ext_pdu_adv_param,
  8018. .expect_hci_len = sizeof(preset_connectable_on_ext_pdu_adv_param),
  8019. };
  8020. static void setup_add_advertising_connectable_1m(const void *test_data)
  8021. {
  8022. struct test_data *data = tester_get_data();
  8023. struct mgmt_cp_add_advertising *cp;
  8024. unsigned char adv_param[sizeof(*cp) + TESTER_ADD_ADV_DATA_LEN];
  8025. unsigned char param[] = { 0x01 };
  8026. tester_print("Adding advertising instance while connectable");
  8027. cp = (struct mgmt_cp_add_advertising *) adv_param;
  8028. setup_add_adv_param_1m(cp, 1);
  8029. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  8030. sizeof(param), &param,
  8031. NULL, NULL, NULL);
  8032. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  8033. sizeof(param), &param,
  8034. NULL, NULL, NULL);
  8035. mgmt_send(data->mgmt, MGMT_OP_SET_CONNECTABLE, data->mgmt_index,
  8036. sizeof(param), &param,
  8037. NULL, NULL, NULL);
  8038. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  8039. sizeof(adv_param), adv_param,
  8040. setup_add_advertising_callback,
  8041. NULL, NULL);
  8042. }
  8043. static uint8_t preset_connectable_off_ext_1m_adv_param[] = {
  8044. 0x01, /* Handle */
  8045. 0x00, 0x00, /* Event type */
  8046. 0x00, 0x08, 0x00, /* min_interval */
  8047. 0x00, 0x08, 0x00, /* max_interval */
  8048. 0x07, /* channel_map */
  8049. 0x01, /* own_addr_type */
  8050. 0x00, /* peer_addr_type */
  8051. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* peer_addr */
  8052. 0x00, /* filter_policy */
  8053. 0x00, /* Tx power */
  8054. 0x01, /* Primary PHY */
  8055. 0x00, /* primary adv max skip */
  8056. 0x01, /* Secondary PHY */
  8057. 0x00, /* adv sid*/
  8058. 0x00, /* Scan req notification */
  8059. };
  8060. static const struct generic_data add_ext_advertising_conn_off_1m = {
  8061. .send_opcode = MGMT_OP_SET_CONNECTABLE,
  8062. .send_param = set_connectable_off_param,
  8063. .send_len = sizeof(set_connectable_off_param),
  8064. .expect_status = MGMT_STATUS_SUCCESS,
  8065. .expect_param = set_le_settings_param_2,
  8066. .expect_len = sizeof(set_le_settings_param_2),
  8067. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
  8068. .expect_hci_param = preset_connectable_off_ext_1m_adv_param,
  8069. .expect_hci_len = sizeof(preset_connectable_off_ext_1m_adv_param),
  8070. };
  8071. static const uint8_t get_phy_param[] = {
  8072. 0xff, 0x7f, 0x00, 0x00, /* All PHYs */
  8073. 0xfe, 0x79, 0x00, 0x00, /* All PHYs except BR 1M 1SLOT, LE 1M TX & LE 1M RX */
  8074. 0xff, 0x07, 0x00, 0x00, /* All BREDR PHYs and LE 1M TX & LE 1M RX */
  8075. };
  8076. static const struct generic_data get_phy_success = {
  8077. .setup_settings = settings_powered_le,
  8078. .send_opcode = MGMT_OP_GET_PHY_CONFIGURATION,
  8079. .expect_status = MGMT_STATUS_SUCCESS,
  8080. .expect_param = get_phy_param,
  8081. .expect_len = sizeof(get_phy_param),
  8082. };
  8083. static const uint8_t set_phy_2m_param[] = {
  8084. 0xff, 0x1f, 0x00, 0x00 /* 1mtxrx 2mtxrx */
  8085. };
  8086. static const uint8_t set_default_phy_2m_param[] = {
  8087. 0x00, /* preference is there for tx and rx */
  8088. 0x03, /* 1mtx, 2mtx */
  8089. 0x03, /* 1mrx, 2mrx */
  8090. };
  8091. static const struct generic_data set_phy_2m_success = {
  8092. .setup_settings = settings_powered_le,
  8093. .send_opcode = MGMT_OP_SET_PHY_CONFIGURATION,
  8094. .send_param = set_phy_2m_param,
  8095. .send_len = sizeof(set_phy_2m_param),
  8096. .expect_status = MGMT_STATUS_SUCCESS,
  8097. .expect_hci_command = BT_HCI_CMD_LE_SET_DEFAULT_PHY,
  8098. .expect_hci_param = set_default_phy_2m_param,
  8099. .expect_hci_len = sizeof(set_default_phy_2m_param),
  8100. .expect_alt_ev = MGMT_EV_PHY_CONFIGURATION_CHANGED,
  8101. .expect_alt_ev_param = set_phy_2m_param,
  8102. .expect_alt_ev_len = sizeof(set_phy_2m_param),
  8103. };
  8104. static const uint8_t set_phy_coded_param[] = {
  8105. 0xff, 0x67, 0x00, 0x00 /* 1mtx, 1m rx, codedtx codedrx */
  8106. };
  8107. static const uint8_t set_default_phy_coded_param[] = {
  8108. 0x00, /* preference is there for tx and rx */
  8109. 0x05, /* 1mtx, codedtx */
  8110. 0x05, /* 1mrx, codedrx */
  8111. };
  8112. static const struct generic_data set_phy_coded_success = {
  8113. .setup_settings = settings_powered_le,
  8114. .send_opcode = MGMT_OP_SET_PHY_CONFIGURATION,
  8115. .send_param = set_phy_coded_param,
  8116. .send_len = sizeof(set_phy_coded_param),
  8117. .expect_status = MGMT_STATUS_SUCCESS,
  8118. .expect_hci_command = BT_HCI_CMD_LE_SET_DEFAULT_PHY,
  8119. .expect_hci_param = set_default_phy_coded_param,
  8120. .expect_hci_len = sizeof(set_default_phy_coded_param),
  8121. .expect_alt_ev = MGMT_EV_PHY_CONFIGURATION_CHANGED,
  8122. .expect_alt_ev_param = set_phy_coded_param,
  8123. .expect_alt_ev_len = sizeof(set_phy_coded_param),
  8124. };
  8125. static const uint8_t set_phy_all_param[] = {
  8126. 0xff, 0x7f, 0x00, 0x00 /* All PHYs */
  8127. };
  8128. static const uint8_t set_default_phy_all_param[] = {
  8129. 0x00, /* preference is there for tx and rx */
  8130. 0x07, /* 1m 2m coded tx */
  8131. 0x07, /* 1m 2m coded rx */
  8132. };
  8133. static const struct generic_data set_phy_all_success = {
  8134. .setup_settings = settings_powered_le,
  8135. .send_opcode = MGMT_OP_SET_PHY_CONFIGURATION,
  8136. .send_param = set_phy_all_param,
  8137. .send_len = sizeof(set_phy_all_param),
  8138. .expect_status = MGMT_STATUS_SUCCESS,
  8139. .expect_hci_command = BT_HCI_CMD_LE_SET_DEFAULT_PHY,
  8140. .expect_hci_param = set_default_phy_all_param,
  8141. .expect_hci_len = sizeof(set_default_phy_all_param),
  8142. .expect_alt_ev = MGMT_EV_PHY_CONFIGURATION_CHANGED,
  8143. .expect_alt_ev_param = set_phy_all_param,
  8144. .expect_alt_ev_len = sizeof(set_phy_all_param),
  8145. };
  8146. static const uint8_t set_phy_2m_tx_param[] = {
  8147. 0xff, 0x0f, 0x00, 0x00 /* 1mtxrx, 2m tx */
  8148. };
  8149. static const uint8_t set_default_phy_2m_tx_param[] = {
  8150. 0x00,
  8151. 0x03, /* 1m, 2m tx */
  8152. 0x01, /* 1m rx */
  8153. };
  8154. static const uint8_t set_phy_2m_tx_evt_param[] = {
  8155. 0xff, 0x0f, 0x00, 0x00 /* 2m tx 1m rx */
  8156. };
  8157. static const struct generic_data set_phy_2m_tx_success = {
  8158. .setup_settings = settings_powered_le,
  8159. .send_opcode = MGMT_OP_SET_PHY_CONFIGURATION,
  8160. .send_param = set_phy_2m_tx_param,
  8161. .send_len = sizeof(set_phy_2m_tx_param),
  8162. .expect_status = MGMT_STATUS_SUCCESS,
  8163. .expect_hci_command = BT_HCI_CMD_LE_SET_DEFAULT_PHY,
  8164. .expect_hci_param = set_default_phy_2m_tx_param,
  8165. .expect_hci_len = sizeof(set_default_phy_2m_tx_param),
  8166. .expect_alt_ev = MGMT_EV_PHY_CONFIGURATION_CHANGED,
  8167. .expect_alt_ev_param = set_phy_2m_tx_evt_param,
  8168. .expect_alt_ev_len = sizeof(set_phy_2m_tx_evt_param),
  8169. };
  8170. static const uint8_t set_phy_2m_rx_param[] = {
  8171. 0xff, 0x17, 0x00, 0x00 /* 1mtxrx, 2m rx */
  8172. };
  8173. static const uint8_t set_default_phy_2m_rx_param[] = {
  8174. 0x00,
  8175. 0x01,
  8176. 0x03, /* 2m rx */
  8177. };
  8178. static const uint8_t set_phy_2m_rx_evt_param[] = {
  8179. 0xff, 0x17, 0x00, 0x00 /* 2m rx 1m tx */
  8180. };
  8181. static const struct generic_data set_phy_2m_rx_success = {
  8182. .setup_settings = settings_powered_le,
  8183. .send_opcode = MGMT_OP_SET_PHY_CONFIGURATION,
  8184. .send_param = set_phy_2m_rx_param,
  8185. .send_len = sizeof(set_phy_2m_rx_param),
  8186. .expect_status = MGMT_STATUS_SUCCESS,
  8187. .expect_hci_command = BT_HCI_CMD_LE_SET_DEFAULT_PHY,
  8188. .expect_hci_param = set_default_phy_2m_rx_param,
  8189. .expect_hci_len = sizeof(set_default_phy_2m_rx_param),
  8190. .expect_alt_ev = MGMT_EV_PHY_CONFIGURATION_CHANGED,
  8191. .expect_alt_ev_param = set_phy_2m_rx_evt_param,
  8192. .expect_alt_ev_len = sizeof(set_phy_2m_rx_evt_param),
  8193. };
  8194. static const uint8_t set_phy_param_invalid[] = {
  8195. 0x79, 0xfe, 0x00, 0x00 /* Set unconfigurable phy*/
  8196. };
  8197. static const struct generic_data set_phy_invalid_param = {
  8198. .setup_settings = settings_powered_le,
  8199. .send_opcode = MGMT_OP_SET_PHY_CONFIGURATION,
  8200. .send_param = set_phy_param_invalid,
  8201. .send_len = sizeof(set_phy_param_invalid),
  8202. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  8203. };
  8204. static const char start_discovery_valid_ext_scan_enable[] = {
  8205. 0x01,
  8206. 0x01,
  8207. 0x00, 0x00,
  8208. 0x00, 0x00
  8209. };
  8210. static const struct generic_data start_discovery_bredrle_ext_scan_enable = {
  8211. .setup_settings = settings_powered_le,
  8212. .send_opcode = MGMT_OP_START_DISCOVERY,
  8213. .send_param = start_discovery_bredrle_param,
  8214. .send_len = sizeof(start_discovery_bredrle_param),
  8215. .expect_status = MGMT_STATUS_SUCCESS,
  8216. .expect_param = start_discovery_bredrle_param,
  8217. .expect_len = sizeof(start_discovery_bredrle_param),
  8218. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_ENABLE,
  8219. .expect_hci_param = start_discovery_valid_ext_scan_enable,
  8220. .expect_hci_len = sizeof(start_discovery_valid_ext_scan_enable),
  8221. .expect_alt_ev = MGMT_EV_DISCOVERING,
  8222. .expect_alt_ev_param = start_discovery_evt,
  8223. .expect_alt_ev_len = sizeof(start_discovery_evt),
  8224. };
  8225. static const struct generic_data start_discovery_le_ext_scan_enable = {
  8226. .setup_settings = settings_powered_le,
  8227. .send_opcode = MGMT_OP_START_DISCOVERY,
  8228. .send_param = start_discovery_le_param,
  8229. .send_len = sizeof(start_discovery_le_param),
  8230. .expect_status = MGMT_STATUS_SUCCESS,
  8231. .expect_param = start_discovery_le_param,
  8232. .expect_len = sizeof(start_discovery_le_param),
  8233. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_ENABLE,
  8234. .expect_hci_param = start_discovery_valid_ext_scan_enable,
  8235. .expect_hci_len = sizeof(start_discovery_valid_ext_scan_enable),
  8236. .expect_alt_ev = MGMT_EV_DISCOVERING,
  8237. .expect_alt_ev_param = start_discovery_le_evt,
  8238. .expect_alt_ev_len = sizeof(start_discovery_le_evt),
  8239. };
  8240. static const char start_discovery_valid_ext_scan_param[] = {
  8241. 0x01, /* Own Addr type*/
  8242. 0x00, /* Scan filter policy*/
  8243. 0x01, /*Phys - 1m */
  8244. 0x01, /* Type */
  8245. 0x12, 0x00, /* Interval */
  8246. 0x12, 0x00, /* Window */
  8247. };
  8248. static const struct generic_data start_discovery_le_ext_scan_param = {
  8249. .setup_settings = settings_powered_le,
  8250. .send_opcode = MGMT_OP_START_DISCOVERY,
  8251. .send_param = start_discovery_le_param,
  8252. .send_len = sizeof(start_discovery_le_param),
  8253. .expect_status = MGMT_STATUS_SUCCESS,
  8254. .expect_param = start_discovery_le_param,
  8255. .expect_len = sizeof(start_discovery_le_param),
  8256. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_PARAMS,
  8257. .expect_hci_param = start_discovery_valid_ext_scan_param,
  8258. .expect_hci_len = sizeof(start_discovery_valid_ext_scan_param),
  8259. .expect_alt_ev = MGMT_EV_DISCOVERING,
  8260. .expect_alt_ev_param = start_discovery_le_evt,
  8261. .expect_alt_ev_len = sizeof(start_discovery_le_evt),
  8262. };
  8263. static const char stop_discovery_valid_ext_scan_disable[] = {
  8264. 0x00,
  8265. 0x00,
  8266. 0x00, 0x00,
  8267. 0x00, 0x00
  8268. };
  8269. static const struct generic_data stop_discovery_le_ext_scan_disable = {
  8270. .setup_settings = settings_powered_le,
  8271. .setup_send_opcode = MGMT_OP_START_DISCOVERY,
  8272. .setup_send_param = start_discovery_bredrle_param,
  8273. .setup_send_len = sizeof(start_discovery_bredrle_param),
  8274. .send_opcode = MGMT_OP_STOP_DISCOVERY,
  8275. .send_param = stop_discovery_bredrle_param,
  8276. .send_len = sizeof(stop_discovery_bredrle_param),
  8277. .expect_status = MGMT_STATUS_SUCCESS,
  8278. .expect_param = stop_discovery_bredrle_param,
  8279. .expect_len = sizeof(stop_discovery_bredrle_param),
  8280. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_ENABLE,
  8281. .expect_hci_param = stop_discovery_valid_ext_scan_disable,
  8282. .expect_hci_len = sizeof(stop_discovery_valid_ext_scan_disable),
  8283. .expect_alt_ev = MGMT_EV_DISCOVERING,
  8284. .expect_alt_ev_param = stop_discovery_evt,
  8285. .expect_alt_ev_len = sizeof(stop_discovery_evt),
  8286. };
  8287. static const struct generic_data start_discovery_le_2m_scan_param = {
  8288. .setup_settings = settings_powered_le,
  8289. .setup_send_opcode = MGMT_OP_SET_PHY_CONFIGURATION,
  8290. .setup_send_param = set_phy_2m_param,
  8291. .setup_send_len = sizeof(set_phy_2m_param),
  8292. .send_opcode = MGMT_OP_START_DISCOVERY,
  8293. .send_param = start_discovery_bredrle_param,
  8294. .send_len = sizeof(start_discovery_bredrle_param),
  8295. .expect_status = MGMT_STATUS_SUCCESS,
  8296. .expect_param = start_discovery_bredrle_param,
  8297. .expect_len = sizeof(start_discovery_bredrle_param),
  8298. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_PARAMS,
  8299. .expect_hci_param = start_discovery_valid_ext_scan_param,
  8300. .expect_hci_len = sizeof(start_discovery_valid_ext_scan_param),
  8301. .expect_alt_ev = MGMT_EV_DISCOVERING,
  8302. .expect_alt_ev_param = start_discovery_evt,
  8303. .expect_alt_ev_len = sizeof(start_discovery_evt),
  8304. };
  8305. static const char start_discovery_valid_coded_scan_param[] = {
  8306. 0x01, /* Own Addr type*/
  8307. 0x00, /* Scan filter policy*/
  8308. 0x05, /*Phys - 1m & coded */
  8309. 0x01, /* Type */
  8310. 0x12, 0x00, /* Interval */
  8311. 0x12, 0x00, /* Window */
  8312. 0x01, /* Type */
  8313. 0x12, 0x00, /* Interval */
  8314. 0x12, 0x00, /* Window */
  8315. };
  8316. static const struct generic_data start_discovery_le_coded_scan_param = {
  8317. .setup_settings = settings_powered_le,
  8318. .setup_send_opcode = MGMT_OP_SET_PHY_CONFIGURATION,
  8319. .setup_send_param = set_phy_coded_param,
  8320. .setup_send_len = sizeof(set_phy_coded_param),
  8321. .send_opcode = MGMT_OP_START_DISCOVERY,
  8322. .send_param = start_discovery_bredrle_param,
  8323. .send_len = sizeof(start_discovery_bredrle_param),
  8324. .expect_status = MGMT_STATUS_SUCCESS,
  8325. .expect_param = start_discovery_bredrle_param,
  8326. .expect_len = sizeof(start_discovery_bredrle_param),
  8327. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_PARAMS,
  8328. .expect_hci_param = start_discovery_valid_coded_scan_param,
  8329. .expect_hci_len = sizeof(start_discovery_valid_coded_scan_param),
  8330. .expect_alt_ev = MGMT_EV_DISCOVERING,
  8331. .expect_alt_ev_param = start_discovery_evt,
  8332. .expect_alt_ev_len = sizeof(start_discovery_evt),
  8333. };
  8334. static const char start_discovery_valid_1m_2m_coded_scan_param[] = {
  8335. 0x01, /* Own Addr type*/
  8336. 0x00, /* Scan filter policy*/
  8337. 0x05, /*Phys - 1m, coded */
  8338. 0x01, /* Type */
  8339. 0x12, 0x00, /* Interval */
  8340. 0x12, 0x00, /* Window */
  8341. 0x01, /* Type */
  8342. 0x12, 0x00, /* Interval */
  8343. 0x12, 0x00, /* Window */
  8344. };
  8345. static const struct generic_data start_discovery_le_1m_coded_scan_param = {
  8346. .setup_settings = settings_powered_le,
  8347. .setup_send_opcode = MGMT_OP_SET_PHY_CONFIGURATION,
  8348. .setup_send_param = set_phy_all_param,
  8349. .setup_send_len = sizeof(set_phy_all_param),
  8350. .send_opcode = MGMT_OP_START_DISCOVERY,
  8351. .send_param = start_discovery_bredrle_param,
  8352. .send_len = sizeof(start_discovery_bredrle_param),
  8353. .expect_status = MGMT_STATUS_SUCCESS,
  8354. .expect_param = start_discovery_bredrle_param,
  8355. .expect_len = sizeof(start_discovery_bredrle_param),
  8356. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_PARAMS,
  8357. .expect_hci_param = start_discovery_valid_1m_2m_coded_scan_param,
  8358. .expect_hci_len = sizeof(start_discovery_valid_1m_2m_coded_scan_param),
  8359. .expect_alt_ev = MGMT_EV_DISCOVERING,
  8360. .expect_alt_ev_param = start_discovery_evt,
  8361. .expect_alt_ev_len = sizeof(start_discovery_evt),
  8362. };
  8363. static void set_phy_callback(uint8_t status, uint16_t length,
  8364. const void *param, void *user_data)
  8365. {
  8366. if (status != MGMT_STATUS_SUCCESS) {
  8367. tester_setup_failed();
  8368. return;
  8369. }
  8370. tester_print("Set PHY Success");
  8371. tester_setup_complete();
  8372. }
  8373. static void setup_phy_configuration(const void *test_data)
  8374. {
  8375. struct test_data *data = tester_get_data();
  8376. const struct generic_data *test = data->test_data;
  8377. const void *send_param = test->setup_send_param;
  8378. uint16_t send_len = test->setup_send_len;
  8379. unsigned int id;
  8380. id = mgmt_register(data->mgmt, MGMT_EV_DISCOVERING, data->mgmt_index,
  8381. discovering_event, NULL, NULL);
  8382. data->mgmt_discov_ev_id = id;
  8383. mgmt_send(data->mgmt, test->setup_send_opcode, data->mgmt_index,
  8384. send_len, send_param, set_phy_callback,
  8385. NULL, NULL);
  8386. }
  8387. static const uint8_t get_dev_flags_param[] = {
  8388. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, /* Address */
  8389. 0x00, /* Type */
  8390. };
  8391. static const uint8_t get_dev_flags_rsp_param[] = {
  8392. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, /* Address */
  8393. 0x00, /* Type */
  8394. 0x01, 0x00, 0x00, 0x00, /* Supported Flages */
  8395. 0x00, 0x00, 0x00, 0x00, /* Current Flages */
  8396. };
  8397. static const struct generic_data get_dev_flags_success = {
  8398. .send_opcode = MGMT_OP_GET_DEVICE_FLAGS,
  8399. .send_param = get_dev_flags_param,
  8400. .send_len = sizeof(get_dev_flags_param),
  8401. .expect_status = MGMT_STATUS_SUCCESS,
  8402. .expect_param = get_dev_flags_rsp_param,
  8403. .expect_len = sizeof(get_dev_flags_rsp_param),
  8404. };
  8405. static const uint8_t get_dev_flags_param_fail_1[] = {
  8406. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, /* Address */
  8407. };
  8408. static const struct generic_data get_dev_flags_fail_1 = {
  8409. .send_opcode = MGMT_OP_GET_DEVICE_FLAGS,
  8410. .send_param = get_dev_flags_param_fail_1,
  8411. .send_len = sizeof(get_dev_flags_param_fail_1),
  8412. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  8413. };
  8414. static void setup_get_dev_flags(const void *test_data)
  8415. {
  8416. struct test_data *data = tester_get_data();
  8417. unsigned char param[] = { 0x01 };
  8418. const unsigned char *add_param;
  8419. size_t add_param_len;
  8420. tester_print("Powering on controller (with added device)");
  8421. if (data->hciemu_type == HCIEMU_TYPE_LE) {
  8422. add_param = add_device_success_param_2;
  8423. add_param_len = sizeof(add_device_success_param_2);
  8424. } else {
  8425. add_param = add_device_success_param_1;
  8426. add_param_len = sizeof(add_device_success_param_1);
  8427. }
  8428. mgmt_send(data->mgmt, MGMT_OP_ADD_DEVICE, data->mgmt_index,
  8429. add_param_len, add_param, NULL, NULL, NULL);
  8430. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  8431. sizeof(param), param,
  8432. setup_powered_callback, NULL, NULL);
  8433. }
  8434. static const uint8_t set_dev_flags_param[] = {
  8435. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, /* Address */
  8436. 0x00, /* Type */
  8437. 0x01, 0x00, 0x00, 0x00, /* Current Flages */
  8438. };
  8439. static const uint8_t set_dev_flags_rsp_param[] = {
  8440. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, /* Address */
  8441. 0x00, /* Type */
  8442. };
  8443. static const uint8_t dev_flags_changed_param[] = {
  8444. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, /* Address */
  8445. 0x00, /* Type */
  8446. 0x01, 0x00, 0x00, 0x00, /* Supported Flages */
  8447. 0x01, 0x00, 0x00, 0x00, /* Current Flages */
  8448. };
  8449. static const struct generic_data set_dev_flags_success = {
  8450. .send_opcode = MGMT_OP_SET_DEVICE_FLAGS,
  8451. .send_param = set_dev_flags_param,
  8452. .send_len = sizeof(set_dev_flags_param),
  8453. .expect_status = MGMT_STATUS_SUCCESS,
  8454. .expect_param = set_dev_flags_rsp_param,
  8455. .expect_len = sizeof(set_dev_flags_rsp_param),
  8456. .expect_alt_ev = MGMT_EV_DEVICE_FLAGS_CHANGED,
  8457. .expect_alt_ev_param = dev_flags_changed_param,
  8458. .expect_alt_ev_len = sizeof(dev_flags_changed_param),
  8459. };
  8460. static const uint8_t set_dev_flags_param_fail_1[] = {
  8461. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, /* Address */
  8462. 0x00, /* Type */
  8463. };
  8464. static const struct generic_data set_dev_flags_fail_1 = {
  8465. .send_opcode = MGMT_OP_SET_DEVICE_FLAGS,
  8466. .send_param = set_dev_flags_param_fail_1,
  8467. .send_len = sizeof(set_dev_flags_param_fail_1),
  8468. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  8469. };
  8470. static const uint8_t set_dev_flags_param_fail_2[] = {
  8471. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, /* Address */
  8472. 0x00, /* Type */
  8473. 0x03, 0x00, 0x00, 0x00, /* Current Flages */
  8474. };
  8475. static const struct generic_data set_dev_flags_fail_2 = {
  8476. .send_opcode = MGMT_OP_SET_DEVICE_FLAGS,
  8477. .send_param = set_dev_flags_param_fail_2,
  8478. .send_len = sizeof(set_dev_flags_param_fail_2),
  8479. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  8480. .expect_param = set_dev_flags_rsp_param,
  8481. .expect_len = sizeof(set_dev_flags_rsp_param),
  8482. };
  8483. static const uint8_t set_dev_flags_param_fail_3[] = {
  8484. 0x11, 0x34, 0x56, 0x78, 0x9a, 0xbc, /* Address */
  8485. 0x00, /* Type */
  8486. 0x01, 0x00, 0x00, 0x00, /* Current Flages */
  8487. };
  8488. static const uint8_t set_dev_flags_rsp_param_fail_3[] = {
  8489. 0x11, 0x34, 0x56, 0x78, 0x9a, 0xbc, /* Address */
  8490. 0x00, /* Type */
  8491. };
  8492. static const struct generic_data set_dev_flags_fail_3 = {
  8493. .send_opcode = MGMT_OP_SET_DEVICE_FLAGS,
  8494. .send_param = set_dev_flags_param_fail_3,
  8495. .send_len = sizeof(set_dev_flags_param_fail_3),
  8496. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  8497. .expect_param = set_dev_flags_rsp_param_fail_3,
  8498. .expect_len = sizeof(set_dev_flags_rsp_param_fail_3),
  8499. };
  8500. static const uint8_t read_exp_feat_param_success[] = {
  8501. 0x03, 0x00, /* Feature Count */
  8502. 0xd6, 0x49, 0xb0, 0xd1, 0x28, 0xeb, /* UUID - Simultaneous */
  8503. 0x27, 0x92, 0x96, 0x46, 0xc0, 0x42, /* Central Peripheral */
  8504. 0xb5, 0x10, 0x1b, 0x67,
  8505. 0x00, 0x00, 0x00, 0x00, /* Flags */
  8506. 0x04, 0x00, 0x13, 0xac, 0x42, 0x02, /* UUID - LL Privacy */
  8507. 0xde, 0xb3, 0xea, 0x11, 0x73, 0xc2,
  8508. 0x48, 0xa1, 0xc0, 0x15,
  8509. 0x02, 0x00, 0x00, 0x00, /* Flags */
  8510. 0xaf, 0x29, 0xc6, 0x66, 0xac, 0x5f, /* UUID - Codec Offload */
  8511. 0x1a, 0x88, 0xb9, 0x4f, 0x7f, 0xee,
  8512. 0xce, 0x5a, 0x69, 0xa6,
  8513. 0x00, 0x00, 0x00, 0x00 /* Flags */
  8514. };
  8515. static const struct generic_data read_exp_feat_success = {
  8516. .send_opcode = MGMT_OP_READ_EXP_FEATURES_INFO,
  8517. .expect_status = MGMT_STATUS_SUCCESS,
  8518. .expect_param = read_exp_feat_param_success,
  8519. .expect_len = sizeof(read_exp_feat_param_success),
  8520. };
  8521. static const uint8_t read_exp_feat_param_success_index_none[] = {
  8522. 0x01, 0x00, /* Feature Count */
  8523. 0x1c, 0xda, 0x47, 0x1c, 0x48, 0x6c, /* UUID - Debug */
  8524. 0x01, 0xab, 0x9f, 0x46, 0xec, 0xb9,
  8525. 0x30, 0x25, 0x99, 0xd4,
  8526. 0x00, 0x00, 0x00, 0x00, /* Flags */
  8527. };
  8528. static const struct generic_data read_exp_feat_success_index_none = {
  8529. .send_index_none = true,
  8530. .send_opcode = MGMT_OP_READ_EXP_FEATURES_INFO,
  8531. .expect_status = MGMT_STATUS_SUCCESS,
  8532. .expect_param = read_exp_feat_param_success_index_none,
  8533. .expect_len = sizeof(read_exp_feat_param_success_index_none),
  8534. };
  8535. static uint16_t settings_powered_le_privacy[] = { MGMT_OP_SET_LE,
  8536. MGMT_OP_SET_PRIVACY,
  8537. MGMT_OP_SET_POWERED, 0 };
  8538. static const uint8_t set_exp_feat_param_ll_privacy[] = {
  8539. 0x04, 0x00, 0x13, 0xac, 0x42, 0x02, /* UUID - LL Privacy */
  8540. 0xde, 0xb3, 0xea, 0x11, 0x73, 0xc2,
  8541. 0x48, 0xa1, 0xc0, 0x15,
  8542. 0x01, /* Action - enable */
  8543. };
  8544. static const uint8_t set_exp_feat_rsp_param_ll_privacy[] = {
  8545. 0x04, 0x00, 0x13, 0xac, 0x42, 0x02, /* UUID - LL Privacy */
  8546. 0xde, 0xb3, 0xea, 0x11, 0x73, 0xc2,
  8547. 0x48, 0xa1, 0xc0, 0x15,
  8548. 0x03, 0x00, 0x00, 0x00, /* Action - enable */
  8549. };
  8550. static const uint8_t set_exp_feat_param_offload_codec[] = {
  8551. 0xaf, 0x29, 0xc6, 0x66, 0xac, 0x5f, /* UUID - Codec Offload */
  8552. 0x1a, 0x88, 0xb9, 0x4f, 0x7f, 0xee,
  8553. 0xce, 0x5a, 0x69, 0xa6,
  8554. 0x01, /* Action - enable */
  8555. };
  8556. static const uint8_t set_exp_feat_rsp_param_offload_codec[] = {
  8557. 0xaf, 0x29, 0xc6, 0x66, 0xac, 0x5f, /* UUID - Codec Offload */
  8558. 0x1a, 0x88, 0xb9, 0x4f, 0x7f, 0xee,
  8559. 0xce, 0x5a, 0x69, 0xa6,
  8560. 0x01, 0x00, 0x00, 0x00, /* Action - enable */
  8561. };
  8562. static const struct generic_data set_exp_feat_enable_ll_privacy = {
  8563. .send_opcode = MGMT_OP_SET_EXP_FEATURE,
  8564. .send_param = set_exp_feat_param_ll_privacy,
  8565. .send_len = sizeof(set_exp_feat_param_ll_privacy),
  8566. .expect_status = MGMT_STATUS_SUCCESS,
  8567. .expect_param = set_exp_feat_rsp_param_ll_privacy,
  8568. .expect_len = sizeof(set_exp_feat_rsp_param_ll_privacy),
  8569. .expect_alt_ev = MGMT_EV_EXP_FEATURE_CHANGE,
  8570. .expect_alt_ev_len = sizeof(struct mgmt_ev_exp_feature_changed),
  8571. };
  8572. static void read_exp_feature_callback(uint8_t status, uint16_t length,
  8573. const void *param, void *user_data)
  8574. {
  8575. if (status != MGMT_STATUS_SUCCESS) {
  8576. tester_setup_failed();
  8577. return;
  8578. }
  8579. tester_print("Received Read Experimental Features Info");
  8580. tester_setup_complete();
  8581. }
  8582. static void setup_set_exp_feature_alt(const void *test_data)
  8583. {
  8584. struct test_data *data = tester_get_data();
  8585. /* Send the Read Experiemental Features Information command to receive
  8586. * the Experiemental Feature Changed event
  8587. */
  8588. mgmt_send(data->mgmt_alt, MGMT_OP_READ_EXP_FEATURES_INFO,
  8589. data->mgmt_index, 0, NULL,
  8590. read_exp_feature_callback, NULL, NULL);
  8591. }
  8592. static const struct generic_data set_exp_feat_offload_codec = {
  8593. .send_opcode = MGMT_OP_SET_EXP_FEATURE,
  8594. .send_param = set_exp_feat_param_offload_codec,
  8595. .send_len = sizeof(set_exp_feat_param_offload_codec),
  8596. .expect_status = MGMT_STATUS_SUCCESS,
  8597. .expect_param = set_exp_feat_rsp_param_offload_codec,
  8598. .expect_len = sizeof(set_exp_feat_rsp_param_offload_codec),
  8599. .expect_alt_ev = MGMT_EV_EXP_FEATURE_CHANGE,
  8600. .expect_alt_ev_len = sizeof(struct mgmt_ev_exp_feature_changed),
  8601. };
  8602. static const uint8_t set_exp_feat_param_disable[17] = { 0x00 };
  8603. static const uint8_t set_exp_feat_rsp_param_disable[20] = { 0x00 };
  8604. static const struct generic_data set_exp_feat_disable = {
  8605. .send_opcode = MGMT_OP_SET_EXP_FEATURE,
  8606. .send_param = set_exp_feat_param_disable,
  8607. .send_len = sizeof(set_exp_feat_param_disable),
  8608. .expect_status = MGMT_STATUS_SUCCESS,
  8609. .expect_param = set_exp_feat_rsp_param_disable,
  8610. .expect_len = sizeof(set_exp_feat_rsp_param_disable),
  8611. };
  8612. static const struct generic_data set_exp_feat_rejected = {
  8613. .setup_settings = settings_powered_le_privacy,
  8614. .send_opcode = MGMT_OP_SET_EXP_FEATURE,
  8615. .send_param = set_exp_feat_param_ll_privacy,
  8616. .send_len = sizeof(set_exp_feat_param_ll_privacy),
  8617. .expect_status = MGMT_STATUS_REJECTED,
  8618. };
  8619. static const uint8_t set_exp_feat_param_invalid[] = {
  8620. 0x04, 0x00, 0x13, 0xac, 0x42, 0x02, /* UUID - LL Privacy */
  8621. 0xde, 0xb3, 0xea, 0x11, 0x73, 0xc2,
  8622. 0x48, 0xa1, 0xc0, 0x15,
  8623. 0xff, /* Action - invalid */
  8624. };
  8625. static const struct generic_data set_exp_feat_invalid = {
  8626. .send_opcode = MGMT_OP_SET_EXP_FEATURE,
  8627. .send_param = set_exp_feat_param_invalid,
  8628. .send_len = sizeof(set_exp_feat_param_invalid),
  8629. .expect_status = MGMT_STATUS_INVALID_PARAMS,
  8630. };
  8631. static const uint8_t set_exp_feat_param_unknown[] = {
  8632. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* UUID - Unknown */
  8633. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  8634. 0xff, 0xff, 0xff, 0xff,
  8635. 0x01, /* Action - enable */
  8636. };
  8637. static const struct generic_data set_exp_feat_unknown = {
  8638. .send_opcode = MGMT_OP_SET_EXP_FEATURE,
  8639. .send_param = set_exp_feat_param_unknown,
  8640. .send_len = sizeof(set_exp_feat_param_unknown),
  8641. .expect_status = MGMT_STATUS_NOT_SUPPORTED,
  8642. };
  8643. static const char load_irks_params[] = { 0x01, 0x00,
  8644. 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0x01,
  8645. 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
  8646. 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 };
  8647. static void setup_load_irks_callback(uint8_t status, uint16_t length,
  8648. const void *param, void *user_data)
  8649. {
  8650. if (status != MGMT_STATUS_SUCCESS) {
  8651. tester_setup_failed();
  8652. return;
  8653. }
  8654. tester_print("Load IRK completed");
  8655. }
  8656. static void setup_exp_feat_callback(uint8_t status, uint16_t length,
  8657. const void *param, void *user_data)
  8658. {
  8659. if (status != MGMT_STATUS_SUCCESS) {
  8660. tester_setup_failed();
  8661. return;
  8662. }
  8663. tester_print("LL Privacy Exp feature is enabled");
  8664. }
  8665. static void setup_ll_privacy(const void *test_data)
  8666. {
  8667. struct test_data *data = tester_get_data();
  8668. unsigned char param[] = { 0x01 };
  8669. const uint8_t *ext_feat_param;
  8670. size_t ext_feat_len;
  8671. const char *irk_param;
  8672. size_t irk_len;
  8673. unsigned char privacy_param[] = { 0x01,
  8674. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  8675. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
  8676. tester_print("Enabling LL Privacy feature");
  8677. ext_feat_param = set_exp_feat_param_ll_privacy;
  8678. ext_feat_len = sizeof(set_exp_feat_param_ll_privacy);
  8679. irk_param = load_irks_params;
  8680. irk_len = sizeof(load_irks_params);
  8681. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  8682. sizeof(param), &param,
  8683. NULL, NULL, NULL);
  8684. mgmt_send(data->mgmt, MGMT_OP_SET_PRIVACY, data->mgmt_index,
  8685. sizeof(privacy_param), privacy_param,
  8686. NULL, NULL, NULL);
  8687. mgmt_send(data->mgmt, MGMT_OP_LOAD_IRKS, data->mgmt_index,
  8688. irk_len, irk_param,
  8689. setup_load_irks_callback, NULL, NULL);
  8690. mgmt_send(data->mgmt, MGMT_OP_SET_EXP_FEATURE, data->mgmt_index,
  8691. ext_feat_len, ext_feat_param,
  8692. setup_exp_feat_callback, NULL, NULL);
  8693. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  8694. sizeof(param), param,
  8695. setup_powered_callback, NULL, NULL);
  8696. }
  8697. static void setup_add_device_callback(uint8_t status, uint16_t length,
  8698. const void *param, void *user_data)
  8699. {
  8700. if (status != MGMT_STATUS_SUCCESS) {
  8701. tester_setup_failed();
  8702. return;
  8703. }
  8704. tester_print("New Device is Added");
  8705. }
  8706. static void setup_ll_privacy_device(const void *test_data)
  8707. {
  8708. struct test_data *data = tester_get_data();
  8709. const struct generic_data *test = data->test_data;
  8710. unsigned char param[] = { 0x01 };
  8711. const uint8_t *ext_feat_param;
  8712. size_t ext_feat_len;
  8713. const char *irk_param;
  8714. size_t irk_len;
  8715. const uint8_t *dev_param;
  8716. size_t dev_len;
  8717. unsigned char privacy_param[] = { 0x01,
  8718. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  8719. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
  8720. tester_print("Setup expected HCI command 0x%04x",
  8721. test->setup_expect_hci_command);
  8722. hciemu_add_central_post_command_hook(data->hciemu,
  8723. command_setup_hci_callback, data);
  8724. test_add_setup_condition(data);
  8725. tester_print("Enabling LL Privacy feature");
  8726. ext_feat_param = set_exp_feat_param_ll_privacy;
  8727. ext_feat_len = sizeof(set_exp_feat_param_ll_privacy);
  8728. irk_param = load_irks_params;
  8729. irk_len = sizeof(load_irks_params);
  8730. dev_param = add_device_success_param_6;
  8731. dev_len = sizeof(add_device_success_param_6);
  8732. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  8733. sizeof(param), &param,
  8734. NULL, NULL, NULL);
  8735. mgmt_send(data->mgmt, MGMT_OP_SET_PRIVACY, data->mgmt_index,
  8736. sizeof(privacy_param), privacy_param,
  8737. NULL, NULL, NULL);
  8738. mgmt_send(data->mgmt, MGMT_OP_LOAD_IRKS, data->mgmt_index,
  8739. irk_len, irk_param,
  8740. setup_load_irks_callback, NULL, NULL);
  8741. mgmt_send(data->mgmt, MGMT_OP_SET_EXP_FEATURE, data->mgmt_index,
  8742. ext_feat_len, ext_feat_param,
  8743. setup_exp_feat_callback, NULL, NULL);
  8744. mgmt_send(data->mgmt, MGMT_OP_ADD_DEVICE, data->mgmt_index,
  8745. dev_len, dev_param,
  8746. setup_add_device_callback, NULL, NULL);
  8747. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  8748. sizeof(param), param,
  8749. setup_powered_callback, NULL, NULL);
  8750. }
  8751. static const uint8_t add_device_success_param_4[] = {
  8752. 0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
  8753. 0x01,
  8754. 0x02,
  8755. };
  8756. /* Enable LL Privacy and Add 2 devices */
  8757. static void setup_ll_privacy_device2(const void *test_data)
  8758. {
  8759. struct test_data *data = tester_get_data();
  8760. unsigned char param[] = { 0x01 };
  8761. const uint8_t *ext_feat_param;
  8762. size_t ext_feat_len;
  8763. const char *irk_param;
  8764. size_t irk_len;
  8765. const uint8_t *dev_param, *dev2_param;
  8766. size_t dev_len, dev2_len;
  8767. unsigned char privacy_param[] = { 0x01,
  8768. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
  8769. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
  8770. tester_print("Enabling LL Privacy feature");
  8771. ext_feat_param = set_exp_feat_param_ll_privacy;
  8772. ext_feat_len = sizeof(set_exp_feat_param_ll_privacy);
  8773. irk_param = load_irks_params;
  8774. irk_len = sizeof(load_irks_params);
  8775. dev_param = add_device_success_param_6;
  8776. dev_len = sizeof(add_device_success_param_6);
  8777. dev2_param = add_device_success_param_4;
  8778. dev2_len = sizeof(add_device_success_param_4);
  8779. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  8780. sizeof(param), &param,
  8781. NULL, NULL, NULL);
  8782. mgmt_send(data->mgmt, MGMT_OP_SET_PRIVACY, data->mgmt_index,
  8783. sizeof(privacy_param), privacy_param,
  8784. NULL, NULL, NULL);
  8785. mgmt_send(data->mgmt, MGMT_OP_LOAD_IRKS, data->mgmt_index,
  8786. irk_len, irk_param,
  8787. setup_load_irks_callback, NULL, NULL);
  8788. mgmt_send(data->mgmt, MGMT_OP_SET_EXP_FEATURE, data->mgmt_index,
  8789. ext_feat_len, ext_feat_param,
  8790. setup_exp_feat_callback, NULL, NULL);
  8791. mgmt_send(data->mgmt, MGMT_OP_ADD_DEVICE, data->mgmt_index,
  8792. dev_len, dev_param,
  8793. setup_add_device_callback, NULL, NULL);
  8794. mgmt_send(data->mgmt, MGMT_OP_ADD_DEVICE, data->mgmt_index,
  8795. dev2_len, dev2_param,
  8796. setup_add_device_callback, NULL, NULL);
  8797. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  8798. sizeof(param), param,
  8799. setup_powered_callback, NULL, NULL);
  8800. }
  8801. static bool power_off(uint16_t index)
  8802. {
  8803. int sk, err;
  8804. sk = hci_open_dev(index);
  8805. if (sk < 0)
  8806. return false;
  8807. err = ioctl(sk, HCIDEVDOWN, index);
  8808. hci_close_dev(sk);
  8809. if (err < 0)
  8810. return false;
  8811. return true;
  8812. }
  8813. static void test_command_generic(const void *test_data)
  8814. {
  8815. struct test_data *data = tester_get_data();
  8816. const struct generic_data *test = data->test_data;
  8817. const void *send_param = test->send_param;
  8818. uint16_t send_len = test->send_len;
  8819. unsigned int id;
  8820. uint16_t index;
  8821. index = test->send_index_none ? MGMT_INDEX_NONE : data->mgmt_index;
  8822. if (test->expect_settings_set || test->expect_settings_unset) {
  8823. tester_print("Registering new settings notification");
  8824. id = mgmt_register(data->mgmt, MGMT_EV_NEW_SETTINGS, index,
  8825. command_generic_new_settings, NULL, NULL);
  8826. data->mgmt_settings_id = id;
  8827. id = mgmt_register(data->mgmt_alt, MGMT_EV_NEW_SETTINGS, index,
  8828. command_generic_new_settings_alt, NULL, NULL);
  8829. data->mgmt_alt_settings_id = id;
  8830. test_add_condition(data);
  8831. }
  8832. if (test->expect_alt_ev) {
  8833. tester_print("Registering %s notification",
  8834. mgmt_evstr(test->expect_alt_ev));
  8835. id = mgmt_register(data->mgmt_alt, test->expect_alt_ev, index,
  8836. command_generic_event_alt, NULL, NULL);
  8837. data->mgmt_alt_ev_id = id;
  8838. test_add_condition(data);
  8839. }
  8840. if (test->expect_hci_command) {
  8841. tester_print("Registering HCI command callback");
  8842. hciemu_add_central_post_command_hook(data->hciemu,
  8843. command_hci_callback, data);
  8844. test_add_condition(data);
  8845. }
  8846. if (test->send_opcode == 0x0000) {
  8847. tester_print("Executing no-op test");
  8848. return;
  8849. }
  8850. tester_print("Sending %s (0x%04x)", mgmt_opstr(test->send_opcode),
  8851. test->send_opcode);
  8852. if (test->send_func)
  8853. send_param = test->send_func(&send_len);
  8854. if (test->force_power_off) {
  8855. mgmt_send_nowait(data->mgmt, test->send_opcode, index,
  8856. send_len, send_param,
  8857. command_generic_callback, NULL, NULL);
  8858. power_off(data->mgmt_index);
  8859. } else {
  8860. mgmt_send(data->mgmt, test->send_opcode, index, send_len,
  8861. send_param, command_generic_callback,
  8862. NULL, NULL);
  8863. }
  8864. test_add_condition(data);
  8865. }
  8866. static void check_scan(void *user_data)
  8867. {
  8868. struct test_data *data = tester_get_data();
  8869. if (hciemu_get_central_le_scan_enable(data->hciemu)) {
  8870. tester_warn("LE scan still enabled");
  8871. tester_test_failed();
  8872. return;
  8873. }
  8874. if (hciemu_get_central_scan_enable(data->hciemu)) {
  8875. tester_warn("BR/EDR scan still enabled");
  8876. tester_test_failed();
  8877. return;
  8878. }
  8879. test_condition_complete(data);
  8880. }
  8881. static void test_remove_device(const void *test_data)
  8882. {
  8883. struct test_data *data = tester_get_data();
  8884. test_command_generic(test_data);
  8885. tester_wait(1, check_scan, NULL);
  8886. test_add_condition(data);
  8887. }
  8888. static void trigger_device_found(void *user_data)
  8889. {
  8890. struct test_data *data = tester_get_data();
  8891. const struct generic_data *test = data->test_data;
  8892. struct bthost *bthost;
  8893. bthost = hciemu_client_get_host(data->hciemu);
  8894. if ((data->hciemu_type == HCIEMU_TYPE_LE) ||
  8895. (data->hciemu_type == HCIEMU_TYPE_BREDRLE)) {
  8896. if (test->set_adv)
  8897. bthost_set_adv_data(bthost, test->adv_data,
  8898. test->adv_data_len);
  8899. bthost_set_adv_enable(bthost, 0x01);
  8900. } else if (data->hciemu_type >= HCIEMU_TYPE_BREDRLE50) {
  8901. bthost_set_ext_adv_params(bthost);
  8902. if (test->set_adv)
  8903. bthost_set_ext_adv_data(bthost, test->adv_data,
  8904. test->adv_data_len);
  8905. bthost_set_ext_adv_enable(bthost, 0x01);
  8906. }
  8907. if (data->hciemu_type != HCIEMU_TYPE_LE)
  8908. bthost_write_scan_enable(bthost, 0x03);
  8909. test_condition_complete(data);
  8910. }
  8911. static void test_device_found(const void *test_data)
  8912. {
  8913. struct test_data *data = tester_get_data();
  8914. test_command_generic(test_data);
  8915. /* Make sure discovery is enabled before enabling advertising. */
  8916. tester_wait(1, trigger_device_found, NULL);
  8917. test_add_condition(data);
  8918. }
  8919. static void pairing_new_conn(uint16_t handle, void *user_data)
  8920. {
  8921. struct test_data *data = tester_get_data();
  8922. struct bthost *bthost;
  8923. tester_print("New connection with handle 0x%04x", handle);
  8924. bthost = hciemu_client_get_host(data->hciemu);
  8925. bthost_request_auth(bthost, handle);
  8926. }
  8927. static void test_pairing_acceptor(const void *test_data)
  8928. {
  8929. struct test_data *data = tester_get_data();
  8930. const struct generic_data *test = data->test_data;
  8931. const uint8_t *central_bdaddr;
  8932. struct bthost *bthost;
  8933. uint8_t addr_type;
  8934. if (test->expect_alt_ev) {
  8935. unsigned int id;
  8936. tester_print("Registering %s notification",
  8937. mgmt_evstr(test->expect_alt_ev));
  8938. id = mgmt_register(data->mgmt_alt, test->expect_alt_ev,
  8939. data->mgmt_index,
  8940. command_generic_event_alt, NULL, NULL);
  8941. data->mgmt_alt_ev_id = id;
  8942. test_add_condition(data);
  8943. }
  8944. central_bdaddr = hciemu_get_central_bdaddr(data->hciemu);
  8945. if (!central_bdaddr) {
  8946. tester_warn("No central bdaddr");
  8947. tester_test_failed();
  8948. return;
  8949. }
  8950. bthost = hciemu_client_get_host(data->hciemu);
  8951. bthost_set_connect_cb(bthost, pairing_new_conn, data);
  8952. if (data->hciemu_type == HCIEMU_TYPE_BREDRLE)
  8953. addr_type = BDADDR_BREDR;
  8954. else
  8955. addr_type = BDADDR_LE_PUBLIC;
  8956. bthost_hci_connect(bthost, central_bdaddr, addr_type);
  8957. }
  8958. static void connected_event(uint16_t index, uint16_t length, const void *param,
  8959. void *user_data)
  8960. {
  8961. struct test_data *data = tester_get_data();
  8962. const struct generic_data *test = data->test_data;
  8963. const void *send_param = test->send_param;
  8964. uint16_t send_len = test->send_len;
  8965. tester_print("Sending %s 0x%04x", mgmt_opstr(test->send_opcode),
  8966. test->send_opcode);
  8967. if (test->send_func)
  8968. send_param = test->send_func(&send_len);
  8969. if (test->force_power_off) {
  8970. mgmt_send_nowait(data->mgmt, test->send_opcode, index,
  8971. send_len, send_param,
  8972. command_generic_callback, NULL, NULL);
  8973. power_off(data->mgmt_index);
  8974. } else {
  8975. mgmt_send(data->mgmt, test->send_opcode, index, send_len,
  8976. send_param, command_generic_callback,
  8977. NULL, NULL);
  8978. }
  8979. test_add_condition(data);
  8980. /* Complete MGMT_EV_DEVICE_CONNECTED *after* adding new one */
  8981. test_condition_complete(data);
  8982. }
  8983. static void test_command_generic_connect(const void *test_data)
  8984. {
  8985. struct test_data *data = tester_get_data();
  8986. unsigned int id;
  8987. const uint8_t *central_bdaddr;
  8988. uint8_t addr_type;
  8989. struct bthost *bthost;
  8990. tester_print("Registering %s notification",
  8991. mgmt_evstr(MGMT_EV_DEVICE_CONNECTED));
  8992. id = mgmt_register(data->mgmt_alt, MGMT_EV_DEVICE_CONNECTED,
  8993. data->mgmt_index, connected_event,
  8994. NULL, NULL);
  8995. data->mgmt_alt_ev_id = id;
  8996. test_add_condition(data);
  8997. central_bdaddr = hciemu_get_central_bdaddr(data->hciemu);
  8998. if (!central_bdaddr) {
  8999. tester_warn("No central bdaddr");
  9000. tester_test_failed();
  9001. return;
  9002. }
  9003. addr_type = data->hciemu_type == HCIEMU_TYPE_BREDRLE ? BDADDR_BREDR :
  9004. BDADDR_LE_PUBLIC;
  9005. tester_print("ADDR TYPE: %d", addr_type);
  9006. bthost = hciemu_client_get_host(data->hciemu);
  9007. bthost_hci_connect(bthost, central_bdaddr, addr_type);
  9008. }
  9009. static bool test_adv_enable_hook(const void *data, uint16_t len,
  9010. void *user_data)
  9011. {
  9012. struct test_data *test_data = user_data;
  9013. const uint8_t *status = data;
  9014. if (*status == 0) {
  9015. tester_print("Advertising enabled");
  9016. test_condition_complete(test_data);
  9017. } else {
  9018. tester_print("Advertising enabled error 0x%02x", *status);
  9019. }
  9020. return true;
  9021. }
  9022. static void disconnected_event(uint16_t index, uint16_t length,
  9023. const void *param, void *user_data)
  9024. {
  9025. tester_test_failed();
  9026. }
  9027. static void le_connected_event(uint16_t index, uint16_t length,
  9028. const void *param, void *user_data)
  9029. {
  9030. struct test_data *data = tester_get_data();
  9031. tester_print("Device connected");
  9032. if (data->hciemu_type < HCIEMU_TYPE_BREDRLE50) {
  9033. test_add_condition(data);
  9034. hciemu_add_hook(data->hciemu, HCIEMU_HOOK_POST_CMD,
  9035. BT_HCI_CMD_LE_SET_ADV_ENABLE,
  9036. test_adv_enable_hook, data);
  9037. }
  9038. /* Make sure we get not disconnected during the testaces */
  9039. mgmt_register(data->mgmt_alt, MGMT_EV_DEVICE_DISCONNECTED,
  9040. data->mgmt_index, disconnected_event,
  9041. NULL, NULL);
  9042. test_condition_complete(data);
  9043. }
  9044. static void add_device_callback(uint8_t status, uint16_t len, const void *param,
  9045. void *user_data)
  9046. {
  9047. struct test_data *data = user_data;
  9048. const struct generic_data *test = data->test_data;
  9049. struct bthost *bthost;
  9050. const uint8_t *central_bdaddr;
  9051. if (status != 0) {
  9052. tester_test_failed();
  9053. return;
  9054. }
  9055. tester_print("Device added");
  9056. /* If advertising is enabled on client that means we can stop here and
  9057. * just wait for connection
  9058. */
  9059. if (test->client_enable_adv)
  9060. return;
  9061. central_bdaddr = hciemu_get_central_bdaddr(data->hciemu);
  9062. if (!central_bdaddr) {
  9063. tester_warn("No central bdaddr");
  9064. tester_test_failed();
  9065. return;
  9066. }
  9067. bthost = hciemu_client_get_host(data->hciemu);
  9068. if (data->hciemu_type >= HCIEMU_TYPE_BREDRLE50)
  9069. bthost_hci_ext_connect(bthost, central_bdaddr,
  9070. BDADDR_LE_PUBLIC);
  9071. else
  9072. bthost_hci_connect(bthost, central_bdaddr, BDADDR_LE_PUBLIC);
  9073. }
  9074. static void test_connected_and_advertising(const void *test_data)
  9075. {
  9076. struct test_data *data = tester_get_data();
  9077. const struct generic_data *test = data->test_data;
  9078. const uint8_t *client_bdaddr;
  9079. struct mgmt_cp_add_device cp;
  9080. tester_print("Registering %s notification",
  9081. mgmt_evstr(MGMT_EV_DEVICE_CONNECTED));
  9082. test_add_condition(data);
  9083. mgmt_register(data->mgmt_alt, MGMT_EV_DEVICE_CONNECTED,
  9084. data->mgmt_index, le_connected_event,
  9085. NULL, NULL);
  9086. client_bdaddr = hciemu_get_client_bdaddr(data->hciemu);
  9087. if (!client_bdaddr) {
  9088. tester_warn("No client bdaddr");
  9089. tester_test_failed();
  9090. return;
  9091. }
  9092. memset(&cp, 0, sizeof(cp));
  9093. memcpy(&cp.addr.bdaddr, client_bdaddr, 6);
  9094. cp.addr.type = BDADDR_LE_PUBLIC;
  9095. if (test->client_enable_adv)
  9096. cp.action = 0x02; /* Auto connect */
  9097. else
  9098. cp.action = 0x01; /* Allow incoming connection */
  9099. mgmt_send(data->mgmt_alt, MGMT_OP_ADD_DEVICE, data->mgmt_index,
  9100. sizeof(cp), &cp,
  9101. add_device_callback,
  9102. data, NULL);
  9103. }
  9104. static void read_50_controller_cap_complete(uint8_t status, uint16_t length,
  9105. const void *param, void *user_data)
  9106. {
  9107. struct test_data *data = user_data;
  9108. const struct mgmt_rp_read_controller_cap *rp = param;
  9109. const uint8_t *ptr = rp->cap;
  9110. size_t offset = 0;
  9111. uint8_t tag_len;
  9112. uint8_t tag_type;
  9113. if (status || !param) {
  9114. tester_warn("Failed to read advertising features: %s (0x%02x)",
  9115. mgmt_errstr(status), status);
  9116. tester_test_failed();
  9117. }
  9118. if (sizeof(rp->cap_len) + rp->cap_len != length) {
  9119. tester_warn("Controller capabilities malformed, size %zu != %u",
  9120. sizeof(rp->cap_len) + rp->cap_len, length);
  9121. tester_test_failed();
  9122. }
  9123. while (offset < rp->cap_len) {
  9124. tag_len = ptr[offset++];
  9125. tag_type = ptr[offset++];
  9126. switch (tag_type) {
  9127. case MGMT_CAP_LE_TX_PWR:
  9128. if ((tag_len - sizeof(tag_type)) != 2) {
  9129. tester_warn("TX power had unexpected length %d",
  9130. tag_len);
  9131. break;
  9132. }
  9133. tester_print("Expected Tx Power discovered: %d-%d",
  9134. ptr[offset], ptr[offset+1]);
  9135. test_condition_complete(data);
  9136. }
  9137. /* Step to the next entry */
  9138. offset += (tag_len - sizeof(tag_type));
  9139. }
  9140. }
  9141. static void test_50_controller_cap_response(const void *test_data)
  9142. {
  9143. struct test_data *data = tester_get_data();
  9144. test_add_condition(data);
  9145. mgmt_send(data->mgmt_alt, MGMT_OP_READ_CONTROLLER_CAP, data->mgmt_index,
  9146. 0, NULL,
  9147. read_50_controller_cap_complete,
  9148. data, NULL);
  9149. }
  9150. static const uint8_t suspend_state_param_disconnect[] = {
  9151. 0x01,
  9152. };
  9153. static const uint8_t suspend_state_param_page_scan[] = {
  9154. 0x02,
  9155. };
  9156. static const uint8_t resume_state_param_non_bt_wake[] = {
  9157. 0x00,
  9158. 0x00, 0x00, 0x0, 0x00, 0x00, 0x00,
  9159. 0x00
  9160. };
  9161. static const struct generic_data suspend_resume_success_1 = {
  9162. .setup_settings = settings_powered,
  9163. .expect_alt_ev = MGMT_EV_CONTROLLER_SUSPEND,
  9164. .expect_alt_ev_param = suspend_state_param_disconnect,
  9165. .expect_alt_ev_len = sizeof(suspend_state_param_disconnect),
  9166. };
  9167. static void test_suspend_resume_success_1(const void *test_data)
  9168. {
  9169. bool suspend;
  9170. int err;
  9171. /* Triggers the suspend */
  9172. suspend = true;
  9173. err = set_debugfs_force_suspend(0, suspend);
  9174. if (err) {
  9175. tester_warn("Unable to enable the force_suspend");
  9176. tester_test_failed();
  9177. return;
  9178. }
  9179. test_command_generic(test_data);
  9180. }
  9181. static const struct generic_data suspend_resume_success_2 = {
  9182. .setup_settings = settings_powered,
  9183. .expect_alt_ev = MGMT_EV_CONTROLLER_RESUME,
  9184. .expect_alt_ev_param = resume_state_param_non_bt_wake,
  9185. .expect_alt_ev_len = sizeof(resume_state_param_non_bt_wake),
  9186. };
  9187. static void test_suspend_resume_success_2(const void *test_data)
  9188. {
  9189. bool suspend;
  9190. int err;
  9191. /* Triggers the suspend */
  9192. suspend = true;
  9193. err = set_debugfs_force_suspend(0, suspend);
  9194. if (err) {
  9195. tester_warn("Unable to enable the force_suspend");
  9196. tester_test_failed();
  9197. return;
  9198. }
  9199. /* Triggers the resume */
  9200. suspend = false;
  9201. err = set_debugfs_force_suspend(0, suspend);
  9202. if (err) {
  9203. tester_warn("Unable to enable the force_suspend");
  9204. tester_test_failed();
  9205. return;
  9206. }
  9207. test_command_generic(test_data);
  9208. }
  9209. static const struct generic_data suspend_resume_success_3 = {
  9210. .setup_expect_hci_command = BT_HCI_CMD_LE_ADD_TO_ACCEPT_LIST,
  9211. .setup_expect_hci_param = le_add_to_accept_list_param,
  9212. .setup_expect_hci_len = sizeof(le_add_to_accept_list_param),
  9213. .expect_alt_ev = MGMT_EV_CONTROLLER_SUSPEND,
  9214. .expect_alt_ev_param = suspend_state_param_disconnect,
  9215. .expect_alt_ev_len = sizeof(suspend_state_param_disconnect),
  9216. };
  9217. static void setup_suspend_resume_success_3(const void *test_data)
  9218. {
  9219. struct test_data *data = tester_get_data();
  9220. unsigned char param[] = { 0x01 };
  9221. /* Add Device 1 */
  9222. mgmt_send(data->mgmt, MGMT_OP_ADD_DEVICE, data->mgmt_index,
  9223. sizeof(add_device_success_param_3),
  9224. add_device_success_param_3,
  9225. setup_add_device_callback,
  9226. NULL, NULL);
  9227. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  9228. sizeof(param), param,
  9229. setup_powered_callback, NULL, NULL);
  9230. }
  9231. static void test_suspend_resume_success_3(const void *test_data)
  9232. {
  9233. bool suspend;
  9234. int err;
  9235. /* Triggers the suspend */
  9236. suspend = true;
  9237. err = set_debugfs_force_suspend(0, suspend);
  9238. if (err) {
  9239. tester_warn("Unable to enable the force_suspend");
  9240. tester_test_failed();
  9241. return;
  9242. }
  9243. test_command_generic(test_data);
  9244. }
  9245. static const struct generic_data suspend_resume_success_4 = {
  9246. .setup_expect_hci_command = BT_HCI_CMD_LE_SET_EXT_ADV_ENABLE,
  9247. .setup_expect_hci_param = set_ext_adv_on_set_adv_enable_param,
  9248. .setup_expect_hci_len = sizeof(set_ext_adv_on_set_adv_enable_param),
  9249. .expect_alt_ev = MGMT_EV_CONTROLLER_SUSPEND,
  9250. .expect_alt_ev_param = suspend_state_param_disconnect,
  9251. .expect_alt_ev_len = sizeof(suspend_state_param_disconnect),
  9252. };
  9253. static void setup_suspend_resume_success_4(const void *test_data)
  9254. {
  9255. struct test_data *data = tester_get_data();
  9256. struct mgmt_cp_add_advertising *cp;
  9257. unsigned char adv_param[sizeof(*cp) + TESTER_ADD_ADV_DATA_LEN];
  9258. unsigned char param[] = { 0x01 };
  9259. cp = (struct mgmt_cp_add_advertising *) adv_param;
  9260. setup_add_adv_param(cp, 1);
  9261. mgmt_send(data->mgmt, MGMT_OP_SET_LE, data->mgmt_index,
  9262. sizeof(param), &param,
  9263. NULL, NULL, NULL);
  9264. mgmt_send(data->mgmt, MGMT_OP_SET_POWERED, data->mgmt_index,
  9265. sizeof(param), param,
  9266. NULL, NULL, NULL);
  9267. mgmt_send(data->mgmt, MGMT_OP_ADD_ADVERTISING, data->mgmt_index,
  9268. sizeof(adv_param), adv_param,
  9269. setup_add_advertising_callback,
  9270. NULL, NULL);
  9271. }
  9272. static void test_suspend_resume_success_4(const void *test_data)
  9273. {
  9274. bool suspend;
  9275. int err;
  9276. test_command_generic(test_data);
  9277. /* Triggers the suspend */
  9278. suspend = true;
  9279. tester_print("Set the system into Suspend via force_suspend");
  9280. err = set_debugfs_force_suspend(0, suspend);
  9281. if (err) {
  9282. tester_warn("Unable to enable the force_suspend");
  9283. tester_test_failed();
  9284. return;
  9285. }
  9286. }
  9287. static const struct generic_data suspend_resume_success_5 = {
  9288. .setup_settings = settings_powered_connectable_bondable,
  9289. .pin = pair_device_pin,
  9290. .pin_len = sizeof(pair_device_pin),
  9291. .client_pin = pair_device_pin,
  9292. .client_pin_len = sizeof(pair_device_pin),
  9293. .expect_alt_ev = MGMT_EV_CONTROLLER_SUSPEND,
  9294. .expect_alt_ev_param = suspend_state_param_disconnect,
  9295. .expect_alt_ev_len = sizeof(suspend_state_param_disconnect),
  9296. };
  9297. static void trigger_force_suspend(void *user_data)
  9298. {
  9299. bool suspend;
  9300. int err;
  9301. /* Triggers the suspend */
  9302. suspend = true;
  9303. tester_print("Set the system into Suspend via force_suspend");
  9304. err = set_debugfs_force_suspend(0, suspend);
  9305. if (err) {
  9306. tester_warn("Unable to enable the force_suspend");
  9307. return;
  9308. }
  9309. }
  9310. static void trigger_force_resume(void *user_data)
  9311. {
  9312. bool suspend;
  9313. int err;
  9314. /* Triggers the suspend */
  9315. suspend = false;
  9316. tester_print("Set the system into Resume via force_suspend");
  9317. err = set_debugfs_force_suspend(0, suspend);
  9318. if (err) {
  9319. tester_warn("Unable to disable the force_suspend");
  9320. return;
  9321. }
  9322. }
  9323. static void test_suspend_resume_success_5(const void *test_data)
  9324. {
  9325. test_pairing_acceptor(test_data);
  9326. tester_wait(1, trigger_force_suspend, NULL);
  9327. }
  9328. static const struct generic_data suspend_resume_success_6 = {
  9329. .setup_settings = settings_powered_connectable_bondable_ssp,
  9330. .client_enable_ssp = true,
  9331. .expect_alt_ev = MGMT_EV_CONTROLLER_SUSPEND,
  9332. .expect_alt_ev_param = suspend_state_param_disconnect,
  9333. .expect_alt_ev_len = sizeof(suspend_state_param_disconnect),
  9334. .expect_hci_command = BT_HCI_CMD_USER_CONFIRM_REQUEST_REPLY,
  9335. .expect_hci_func = client_bdaddr_param_func,
  9336. .io_cap = 0x03, /* NoInputNoOutput */
  9337. .client_io_cap = 0x03, /* NoInputNoOutput */
  9338. .just_works = true,
  9339. };
  9340. static const struct generic_data suspend_resume_success_7 = {
  9341. .setup_settings = settings_powered,
  9342. .expect_alt_ev = MGMT_EV_CONTROLLER_SUSPEND,
  9343. .expect_alt_ev_param = suspend_state_param_page_scan,
  9344. .expect_alt_ev_len = sizeof(suspend_state_param_page_scan),
  9345. };
  9346. static void test_suspend_resume_success_7(const void *test_data)
  9347. {
  9348. bool suspend;
  9349. int err;
  9350. /* Set Force Wakeup */
  9351. suspend = true;
  9352. err = set_debugfs_force_wakeup(0, suspend);
  9353. if (err) {
  9354. tester_warn("Unable to enable the force_wakeup");
  9355. tester_test_failed();
  9356. return;
  9357. }
  9358. /* Triggers the suspend */
  9359. suspend = true;
  9360. err = set_debugfs_force_suspend(0, suspend);
  9361. if (err) {
  9362. tester_warn("Unable to enable the force_suspend");
  9363. tester_test_failed();
  9364. return;
  9365. }
  9366. test_command_generic(test_data);
  9367. }
  9368. static const struct generic_data suspend_resume_success_8 = {
  9369. .setup_settings = settings_powered_le,
  9370. .send_opcode = MGMT_OP_START_DISCOVERY,
  9371. .send_param = start_discovery_le_param,
  9372. .send_len = sizeof(start_discovery_le_param),
  9373. .expect_status = MGMT_STATUS_SUCCESS,
  9374. .expect_param = start_discovery_le_param,
  9375. .expect_len = sizeof(start_discovery_le_param),
  9376. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_ENABLE,
  9377. .expect_hci_param = start_discovery_valid_ext_scan_enable,
  9378. .expect_hci_len = sizeof(start_discovery_valid_ext_scan_enable),
  9379. .expect_alt_ev = MGMT_EV_CONTROLLER_SUSPEND,
  9380. .expect_alt_ev_param = suspend_state_param_disconnect,
  9381. .expect_alt_ev_len = sizeof(suspend_state_param_disconnect),
  9382. };
  9383. static void test_suspend_resume_success_8(const void *test_data)
  9384. {
  9385. test_command_generic(test_data);
  9386. tester_wait(1, trigger_force_suspend, NULL);
  9387. }
  9388. static uint16_t settings_powered_le_discovery[] = { MGMT_OP_SET_LE,
  9389. MGMT_OP_SET_POWERED,
  9390. MGMT_OP_START_DISCOVERY,
  9391. 0 };
  9392. static const struct generic_data suspend_resume_success_9 = {
  9393. .setup_settings = settings_powered_le_discovery,
  9394. .setup_discovery_param = start_discovery_bredrle_param,
  9395. .setup_expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_ENABLE,
  9396. .setup_expect_hci_param = stop_discovery_valid_ext_scan_disable,
  9397. .setup_expect_hci_len = sizeof(stop_discovery_valid_ext_scan_disable),
  9398. .expect_hci_command = BT_HCI_CMD_LE_SET_EXT_SCAN_ENABLE,
  9399. .expect_hci_param = start_discovery_valid_ext_scan_enable,
  9400. .expect_hci_len = sizeof(start_discovery_valid_ext_scan_enable),
  9401. .expect_alt_ev = MGMT_EV_CONTROLLER_RESUME,
  9402. .expect_alt_ev_param = resume_state_param_non_bt_wake,
  9403. .expect_alt_ev_len = sizeof(resume_state_param_non_bt_wake),
  9404. };
  9405. static void trigger_force_suspend_9(void *user_data)
  9406. {
  9407. trigger_force_suspend(user_data);
  9408. }
  9409. static void setup_suspend_resume_success_9(const void *test_data)
  9410. {
  9411. setup_command_generic(test_data);
  9412. tester_wait(1, trigger_force_suspend_9, NULL);
  9413. }
  9414. static void test_suspend_resume_success_9(const void *test_data)
  9415. {
  9416. test_command_generic(test_data);
  9417. tester_wait(2, trigger_force_resume, NULL);
  9418. }
  9419. static const struct generic_data suspend_resume_success_10 = {
  9420. .setup_settings = settings_powered_le,
  9421. .expect_alt_ev = MGMT_EV_CONTROLLER_RESUME,
  9422. .expect_alt_ev_param = resume_state_param_non_bt_wake,
  9423. .expect_alt_ev_len = sizeof(resume_state_param_non_bt_wake),
  9424. };
  9425. static void resume_event(uint16_t index, uint16_t length,
  9426. const void *param, void *user_data)
  9427. {
  9428. struct test_data *data = tester_get_data();
  9429. const struct mgmt_ev_controller_resume *ev = param;
  9430. mgmt_unregister(data->mgmt, data->mgmt_discov_ev_id);
  9431. if (length != sizeof(*ev)) {
  9432. tester_warn("Incorrect resume event length");
  9433. tester_setup_failed();
  9434. return;
  9435. }
  9436. tester_print("New Controller Resume event received");
  9437. test_condition_complete(data);
  9438. tester_setup_complete();
  9439. }
  9440. static void setup_suspend_resume_success_10(const void *test_data)
  9441. {
  9442. struct test_data *data = tester_get_data();
  9443. unsigned int id;
  9444. tester_print("Registering Controller Resume notification");
  9445. id = mgmt_register(data->mgmt, MGMT_EV_CONTROLLER_RESUME,
  9446. data->mgmt_index, resume_event, NULL, NULL);
  9447. /* Reuse the variable */
  9448. data->mgmt_discov_ev_id = id;
  9449. test_add_condition(data);
  9450. tester_wait(1, trigger_force_suspend, NULL);
  9451. tester_wait(2, trigger_force_resume, NULL);
  9452. }
  9453. static void test_suspend_resume_success_10(const void *test_data)
  9454. {
  9455. test_command_generic(test_data);
  9456. tester_wait(1, trigger_force_suspend, NULL);
  9457. tester_wait(2, trigger_force_resume, NULL);
  9458. }
  9459. int main(int argc, char *argv[])
  9460. {
  9461. tester_init(&argc, &argv);
  9462. test_bredrle("Controller setup",
  9463. NULL, NULL, controller_setup);
  9464. test_bredr("Controller setup (BR/EDR-only)",
  9465. NULL, NULL, controller_setup);
  9466. test_le("Controller setup (LE)",
  9467. NULL, NULL, controller_setup);
  9468. test_bredrle("Invalid command",
  9469. &invalid_command_test,
  9470. NULL, test_command_generic);
  9471. test_bredrle("Read version - Success",
  9472. &read_version_success_test,
  9473. NULL, test_command_generic);
  9474. test_bredrle("Read version - Invalid parameters",
  9475. &read_version_invalid_param_test,
  9476. NULL, test_command_generic);
  9477. test_bredrle("Read version - Invalid index",
  9478. &read_version_invalid_index_test,
  9479. NULL, test_command_generic);
  9480. test_bredrle("Read commands - Invalid parameters",
  9481. &read_commands_invalid_param_test,
  9482. NULL, test_command_generic);
  9483. test_bredrle("Read commands - Invalid index",
  9484. &read_commands_invalid_index_test,
  9485. NULL, test_command_generic);
  9486. test_bredrle("Read index list - Invalid parameters",
  9487. &read_index_list_invalid_param_test,
  9488. NULL, test_command_generic);
  9489. test_bredrle("Read index list - Invalid index",
  9490. &read_index_list_invalid_index_test,
  9491. NULL, test_command_generic);
  9492. test_bredrle("Read info - Invalid parameters",
  9493. &read_info_invalid_param_test,
  9494. NULL, test_command_generic);
  9495. test_bredrle("Read info - Invalid index",
  9496. &read_info_invalid_index_test,
  9497. NULL, test_command_generic);
  9498. test_bredrle("Read unconfigured index list - Invalid parameters",
  9499. &read_unconf_index_list_invalid_param_test,
  9500. NULL, test_command_generic);
  9501. test_bredrle("Read unconfigured index list - Invalid index",
  9502. &read_unconf_index_list_invalid_index_test,
  9503. NULL, test_command_generic);
  9504. test_bredrle("Read configuration info - Invalid parameters",
  9505. &read_config_info_invalid_param_test,
  9506. NULL, test_command_generic);
  9507. test_bredrle("Read configuration info - Invalid index",
  9508. &read_config_info_invalid_index_test,
  9509. NULL, test_command_generic);
  9510. test_bredrle("Read extended index list - Invalid parameters",
  9511. &read_ext_index_list_invalid_param_test,
  9512. NULL, test_command_generic);
  9513. test_bredrle("Read extended index list - Invalid index",
  9514. &read_ext_index_list_invalid_index_test,
  9515. NULL, test_command_generic);
  9516. test_bredrle("Set powered on - Success",
  9517. &set_powered_on_success_test,
  9518. NULL, test_command_generic);
  9519. test_bredrle("Set powered on - Invalid parameters 1",
  9520. &set_powered_on_invalid_param_test_1,
  9521. NULL, test_command_generic);
  9522. test_bredrle("Set powered on - Invalid parameters 2",
  9523. &set_powered_on_invalid_param_test_2,
  9524. NULL, test_command_generic);
  9525. test_bredrle("Set powered on - Invalid parameters 3",
  9526. &set_powered_on_invalid_param_test_3,
  9527. NULL, test_command_generic);
  9528. test_bredrle("Set powered on - Invalid index",
  9529. &set_powered_on_invalid_index_test,
  9530. NULL, test_command_generic);
  9531. test_le("Set powered on - Privacy and Advertising",
  9532. &set_powered_on_privacy_adv_test,
  9533. NULL, test_command_generic);
  9534. test_bredrle("Set powered off - Success",
  9535. &set_powered_off_success_test,
  9536. NULL, test_command_generic);
  9537. test_bredrle("Set powered off - Class of Device",
  9538. &set_powered_off_class_test,
  9539. setup_class, test_command_generic);
  9540. test_bredrle("Set powered off - Invalid parameters 1",
  9541. &set_powered_off_invalid_param_test_1,
  9542. NULL, test_command_generic);
  9543. test_bredrle("Set powered off - Invalid parameters 2",
  9544. &set_powered_off_invalid_param_test_2,
  9545. NULL, test_command_generic);
  9546. test_bredrle("Set powered off - Invalid parameters 3",
  9547. &set_powered_off_invalid_param_test_3,
  9548. NULL, test_command_generic);
  9549. test_bredrle("Set connectable on - Success 1",
  9550. &set_connectable_on_success_test_1,
  9551. NULL, test_command_generic);
  9552. test_bredrle("Set connectable on - Success 2",
  9553. &set_connectable_on_success_test_2,
  9554. NULL, test_command_generic);
  9555. test_bredrle("Set connectable on - Invalid parameters 1",
  9556. &set_connectable_on_invalid_param_test_1,
  9557. NULL, test_command_generic);
  9558. test_bredrle("Set connectable on - Invalid parameters 2",
  9559. &set_connectable_on_invalid_param_test_2,
  9560. NULL, test_command_generic);
  9561. test_bredrle("Set connectable on - Invalid parameters 3",
  9562. &set_connectable_on_invalid_param_test_3,
  9563. NULL, test_command_generic);
  9564. test_bredrle("Set connectable on - Invalid index",
  9565. &set_connectable_on_invalid_index_test,
  9566. NULL, test_command_generic);
  9567. test_le("Set connectable on (LE) - Success 1",
  9568. &set_connectable_on_le_test_1,
  9569. NULL, test_command_generic);
  9570. test_le("Set connectable on (LE) - Success 2",
  9571. &set_connectable_on_le_test_2,
  9572. NULL, test_command_generic);
  9573. test_le("Set connectable on (LE) - Success 3",
  9574. &set_connectable_on_le_test_3,
  9575. NULL, test_command_generic);
  9576. test_bredrle("Set connectable off - Success 1",
  9577. &set_connectable_off_success_test_1,
  9578. NULL, test_command_generic);
  9579. test_bredrle("Set connectable off - Success 2",
  9580. &set_connectable_off_success_test_2,
  9581. NULL, test_command_generic);
  9582. test_bredrle("Set connectable off - Success 3",
  9583. &set_connectable_off_success_test_3,
  9584. NULL, test_command_generic);
  9585. test_bredrle("Set connectable off - Success 4",
  9586. &set_connectable_off_success_test_4,
  9587. setup_add_device, test_command_generic);
  9588. test_le("Set connectable off (LE) - Success 1",
  9589. &set_connectable_off_le_test_1,
  9590. NULL, test_command_generic);
  9591. test_le("Set connectable off (LE) - Success 2",
  9592. &set_connectable_off_le_test_2,
  9593. NULL, test_command_generic);
  9594. test_le("Set connectable off (LE) - Success 3",
  9595. &set_connectable_off_le_test_3,
  9596. NULL, test_command_generic);
  9597. test_le("Set connectable off (LE) - Success 4",
  9598. &set_connectable_off_le_test_4,
  9599. NULL, test_command_generic);
  9600. test_bredrle("Set fast connectable on - Success 1",
  9601. &set_fast_conn_on_success_test_1,
  9602. NULL, test_command_generic);
  9603. test_bredrle("Set fast connectable on - Success 2",
  9604. &set_fast_conn_on_success_test_2,
  9605. NULL, test_command_generic);
  9606. test_bredrle("Set fast connectable on - Success 3",
  9607. &set_fast_conn_on_success_test_3,
  9608. NULL, test_command_generic);
  9609. test_bredrle("Set fast connectable on - Invalid Params 1",
  9610. &set_fast_conn_nval_param_test_1,
  9611. NULL, test_command_generic);
  9612. test_le("Set fast connectable on - Not Supported 1",
  9613. &set_fast_conn_on_not_supported_test_1,
  9614. NULL, test_command_generic);
  9615. test_bredrle("Set bondable on - Success",
  9616. &set_bondable_on_success_test,
  9617. NULL, test_command_generic);
  9618. test_bredrle("Set bondable on - Invalid parameters 1",
  9619. &set_bondable_on_invalid_param_test_1,
  9620. NULL, test_command_generic);
  9621. test_bredrle("Set bondable on - Invalid parameters 2",
  9622. &set_bondable_on_invalid_param_test_2,
  9623. NULL, test_command_generic);
  9624. test_bredrle("Set bondable on - Invalid parameters 3",
  9625. &set_bondable_on_invalid_param_test_3,
  9626. NULL, test_command_generic);
  9627. test_bredrle("Set bondable on - Invalid index",
  9628. &set_bondable_on_invalid_index_test,
  9629. NULL, test_command_generic);
  9630. test_bredrle("Set discoverable on - Invalid parameters 1",
  9631. &set_discoverable_on_invalid_param_test_1,
  9632. NULL, test_command_generic);
  9633. test_bredrle("Set discoverable on - Invalid parameters 2",
  9634. &set_discoverable_on_invalid_param_test_2,
  9635. NULL, test_command_generic);
  9636. test_bredrle("Set discoverable on - Invalid parameters 3",
  9637. &set_discoverable_on_invalid_param_test_3,
  9638. NULL, test_command_generic);
  9639. test_bredrle("Set discoverable on - Invalid parameters 4",
  9640. &set_discoverable_on_invalid_param_test_4,
  9641. NULL, test_command_generic);
  9642. test_bredrle("Set discoverable on - Not powered 1",
  9643. &set_discoverable_on_not_powered_test_1,
  9644. NULL, test_command_generic);
  9645. test_bredrle("Set discoverable on - Not powered 2",
  9646. &set_discoverable_on_not_powered_test_2,
  9647. NULL, test_command_generic);
  9648. test_bredrle("Set discoverable on - Rejected 1",
  9649. &set_discoverable_on_rejected_test_1,
  9650. NULL, test_command_generic);
  9651. test_bredrle("Set discoverable on - Rejected 2",
  9652. &set_discoverable_on_rejected_test_2,
  9653. NULL, test_command_generic);
  9654. test_bredrle("Set discoverable on - Rejected 3",
  9655. &set_discoverable_on_rejected_test_3,
  9656. NULL, test_command_generic);
  9657. test_bredrle("Set discoverable on - Success 1",
  9658. &set_discoverable_on_success_test_1,
  9659. NULL, test_command_generic);
  9660. test_bredrle("Set discoverable on - Success 2",
  9661. &set_discoverable_on_success_test_2,
  9662. NULL, test_command_generic);
  9663. test_le("Set discoverable on (LE) - Success 1",
  9664. &set_discov_on_le_success_1,
  9665. NULL, test_command_generic);
  9666. test_bredrle("Set discoverable off - Success 1",
  9667. &set_discoverable_off_success_test_1,
  9668. NULL, test_command_generic);
  9669. test_bredrle("Set discoverable off - Success 2",
  9670. &set_discoverable_off_success_test_2,
  9671. NULL, test_command_generic);
  9672. test_bredrle("Set limited discoverable on - Success 1",
  9673. &set_limited_discov_on_success_1,
  9674. NULL, test_command_generic);
  9675. test_bredrle("Set limited discoverable on - Success 2",
  9676. &set_limited_discov_on_success_2,
  9677. NULL, test_command_generic);
  9678. test_bredrle("Set limited discoverable on - Success 3",
  9679. &set_limited_discov_on_success_3,
  9680. NULL, test_command_generic);
  9681. test_le("Set limited discoverable on (LE) - Success 1",
  9682. &set_limited_discov_on_le_success_1,
  9683. NULL, test_command_generic);
  9684. test_bredrle("Set link security on - Success 1",
  9685. &set_link_sec_on_success_test_1,
  9686. NULL, test_command_generic);
  9687. test_bredrle("Set link security on - Success 2",
  9688. &set_link_sec_on_success_test_2,
  9689. NULL, test_command_generic);
  9690. test_bredrle("Set link security on - Success 3",
  9691. &set_link_sec_on_success_test_3,
  9692. NULL, test_command_generic);
  9693. test_bredrle("Set link security on - Invalid parameters 1",
  9694. &set_link_sec_on_invalid_param_test_1,
  9695. NULL, test_command_generic);
  9696. test_bredrle("Set link security on - Invalid parameters 2",
  9697. &set_link_sec_on_invalid_param_test_2,
  9698. NULL, test_command_generic);
  9699. test_bredrle("Set link security on - Invalid parameters 3",
  9700. &set_link_sec_on_invalid_param_test_3,
  9701. NULL, test_command_generic);
  9702. test_bredrle("Set link security on - Invalid index",
  9703. &set_link_sec_on_invalid_index_test,
  9704. NULL, test_command_generic);
  9705. test_bredrle("Set link security off - Success 1",
  9706. &set_link_sec_off_success_test_1,
  9707. NULL, test_command_generic);
  9708. test_bredrle("Set link security off - Success 2",
  9709. &set_link_sec_off_success_test_2,
  9710. NULL, test_command_generic);
  9711. test_bredrle("Set SSP on - Success 1",
  9712. &set_ssp_on_success_test_1,
  9713. NULL, test_command_generic);
  9714. test_bredrle("Set SSP on - Success 2",
  9715. &set_ssp_on_success_test_2,
  9716. NULL, test_command_generic);
  9717. test_bredrle("Set SSP on - Success 3",
  9718. &set_ssp_on_success_test_3,
  9719. NULL, test_command_generic);
  9720. test_bredrle("Set SSP on - Invalid parameters 1",
  9721. &set_ssp_on_invalid_param_test_1,
  9722. NULL, test_command_generic);
  9723. test_bredrle("Set SSP on - Invalid parameters 2",
  9724. &set_ssp_on_invalid_param_test_2,
  9725. NULL, test_command_generic);
  9726. test_bredrle("Set SSP on - Invalid parameters 3",
  9727. &set_ssp_on_invalid_param_test_3,
  9728. NULL, test_command_generic);
  9729. test_bredrle("Set SSP on - Invalid index",
  9730. &set_ssp_on_invalid_index_test,
  9731. NULL, test_command_generic);
  9732. test_bredrle("Set Secure Connections on - Success 1",
  9733. &set_sc_on_success_test_1,
  9734. NULL, test_command_generic);
  9735. test_bredrle("Set Secure Connections on - Success 2",
  9736. &set_sc_on_success_test_2,
  9737. NULL, test_command_generic);
  9738. test_bredrle("Set Secure Connections on - Invalid params 1",
  9739. &set_sc_on_invalid_param_test_1,
  9740. NULL, test_command_generic);
  9741. test_bredrle("Set Secure Connections on - Invalid params 2",
  9742. &set_sc_on_invalid_param_test_2,
  9743. NULL, test_command_generic);
  9744. test_bredrle("Set Secure Connections on - Invalid params 3",
  9745. &set_sc_on_invalid_param_test_3,
  9746. NULL, test_command_generic);
  9747. test_bredrle("Set Secure Connections on - Invalid index",
  9748. &set_sc_on_invalid_index_test,
  9749. NULL, test_command_generic);
  9750. test_bredr("Set Secure Connections on - Not supported 1",
  9751. &set_sc_on_not_supported_test_1,
  9752. NULL, test_command_generic);
  9753. test_bredr("Set Secure Connections on - Not supported 2",
  9754. &set_sc_on_not_supported_test_2,
  9755. NULL, test_command_generic);
  9756. test_bredrle("Set Secure Connections Only on - Success 1",
  9757. &set_sc_only_on_success_test_1,
  9758. NULL, test_command_generic);
  9759. test_bredrle("Set Secure Connections Only on - Success 2",
  9760. &set_sc_only_on_success_test_2,
  9761. NULL, test_command_generic);
  9762. test_hs("Set High Speed on - Success",
  9763. &set_hs_on_success_test,
  9764. NULL, test_command_generic);
  9765. test_hs("Set High Speed on - Invalid parameters 1",
  9766. &set_hs_on_invalid_param_test_1,
  9767. NULL, test_command_generic);
  9768. test_hs("Set High Speed on - Invalid parameters 2",
  9769. &set_hs_on_invalid_param_test_2,
  9770. NULL, test_command_generic);
  9771. test_hs("Set High Speed on - Invalid parameters 3",
  9772. &set_hs_on_invalid_param_test_3,
  9773. NULL, test_command_generic);
  9774. test_hs("Set High Speed on - Invalid index",
  9775. &set_hs_on_invalid_index_test,
  9776. NULL, test_command_generic);
  9777. test_bredrle("Set Low Energy on - Success 1",
  9778. &set_le_on_success_test_1,
  9779. NULL, test_command_generic);
  9780. test_bredrle("Set Low Energy on - Success 2",
  9781. &set_le_on_success_test_2,
  9782. NULL, test_command_generic);
  9783. test_bredrle("Set Low Energy on - Success 3",
  9784. &set_le_on_success_test_3,
  9785. NULL, test_command_generic);
  9786. test_bredrle("Set Low Energy on - Invalid parameters 1",
  9787. &set_le_on_invalid_param_test_1,
  9788. NULL, test_command_generic);
  9789. test_bredrle("Set Low Energy on - Invalid parameters 2",
  9790. &set_le_on_invalid_param_test_2,
  9791. NULL, test_command_generic);
  9792. test_bredrle("Set Low Energy on - Invalid parameters 3",
  9793. &set_le_on_invalid_param_test_3,
  9794. NULL, test_command_generic);
  9795. test_bredrle("Set Low Energy on - Invalid index",
  9796. &set_le_on_invalid_index_test,
  9797. NULL, test_command_generic);
  9798. test_bredrle("Set Advertising on - Success 1",
  9799. &set_adv_on_success_test_1,
  9800. NULL, test_command_generic);
  9801. test_bredrle("Set Advertising on - Success 2",
  9802. &set_adv_on_success_test_2,
  9803. NULL, test_command_generic);
  9804. test_bredrle("Set Advertising on - Rejected 1",
  9805. &set_adv_on_rejected_test_1,
  9806. NULL, test_command_generic);
  9807. test_bredrle("Set Advertising on - Appearance 1",
  9808. &set_adv_on_appearance_test_1,
  9809. setup_command_generic, test_command_generic);
  9810. test_bredrle("Set Advertising on - Local name 1",
  9811. &set_adv_on_local_name_test_1,
  9812. setup_command_generic, test_command_generic);
  9813. test_bredrle("Set Advertising on - Name + Appear 1",
  9814. &set_adv_on_local_name_appear_test_1,
  9815. setup_command_generic, test_command_generic);
  9816. test_bredrle("Set BR/EDR off - Success 1",
  9817. &set_bredr_off_success_test_1,
  9818. NULL, test_command_generic);
  9819. test_bredrle("Set BR/EDR on - Success 1",
  9820. &set_bredr_on_success_test_1,
  9821. NULL, test_command_generic);
  9822. test_bredrle("Set BR/EDR on - Success 2",
  9823. &set_bredr_on_success_test_2,
  9824. NULL, test_command_generic);
  9825. test_bredr("Set BR/EDR off - Not Supported 1",
  9826. &set_bredr_off_notsupp_test,
  9827. NULL, test_command_generic);
  9828. test_le("Set BR/EDR off - Not Supported 2",
  9829. &set_bredr_off_notsupp_test,
  9830. NULL, test_command_generic);
  9831. test_bredrle("Set BR/EDR off - Rejected 1",
  9832. &set_bredr_off_failure_test_1,
  9833. NULL, test_command_generic);
  9834. test_bredrle("Set BR/EDR off - Rejected 2",
  9835. &set_bredr_off_failure_test_2,
  9836. NULL, test_command_generic);
  9837. test_bredrle("Set BR/EDR off - Invalid Parameters 1",
  9838. &set_bredr_off_failure_test_3,
  9839. NULL, test_command_generic);
  9840. test_bredr("Set Local Name - Success 1",
  9841. &set_local_name_test_1,
  9842. NULL, test_command_generic);
  9843. test_bredr("Set Local Name - Success 2",
  9844. &set_local_name_test_2,
  9845. NULL, test_command_generic);
  9846. test_bredr("Set Local Name - Success 3",
  9847. &set_local_name_test_3,
  9848. NULL, test_command_generic);
  9849. test_bredrle("Start Discovery - Not powered 1",
  9850. &start_discovery_not_powered_test_1,
  9851. NULL, test_command_generic);
  9852. test_bredrle("Start Discovery - Invalid parameters 1",
  9853. &start_discovery_invalid_param_test_1,
  9854. NULL, test_command_generic);
  9855. test_bredrle("Start Discovery - Not supported 1",
  9856. &start_discovery_not_supported_test_1,
  9857. NULL, test_command_generic);
  9858. test_bredrle("Start Discovery - Success 1",
  9859. &start_discovery_valid_param_test_1,
  9860. NULL, test_command_generic);
  9861. test_le("Start Discovery - Success 2",
  9862. &start_discovery_valid_param_test_2,
  9863. NULL, test_command_generic);
  9864. test_bredrle("Start Discovery - Power Off 1",
  9865. &start_discovery_valid_param_power_off_1,
  9866. NULL, test_command_generic);
  9867. /* MGMT_OP_START_DISCOVERY
  9868. * Check if the resolving list is disabled before the scan parameter is
  9869. * changed.
  9870. */
  9871. test_bredrle50("Start Discovery - Disable Resolve List",
  9872. &start_discovery_ll_privacy_disable_resolv,
  9873. setup_ll_privacy_device, test_command_generic);
  9874. test_bredrle("Stop Discovery - Success 1",
  9875. &stop_discovery_success_test_1,
  9876. setup_start_discovery, test_command_generic);
  9877. test_bredr("Stop Discovery - BR/EDR (Inquiry) Success 1",
  9878. &stop_discovery_bredr_success_test_1,
  9879. setup_start_discovery, test_command_generic);
  9880. test_bredrle("Stop Discovery - Rejected 1",
  9881. &stop_discovery_rejected_test_1,
  9882. NULL, test_command_generic);
  9883. test_bredrle("Stop Discovery - Invalid parameters 1",
  9884. &stop_discovery_invalid_param_test_1,
  9885. setup_start_discovery, test_command_generic);
  9886. test_bredrle("Start Service Discovery - Not powered 1",
  9887. &start_service_discovery_not_powered_test_1,
  9888. NULL, test_command_generic);
  9889. test_bredrle("Start Service Discovery - Invalid parameters 1",
  9890. &start_service_discovery_invalid_param_test_1,
  9891. NULL, test_command_generic);
  9892. test_bredrle("Start Service Discovery - Not supported 1",
  9893. &start_service_discovery_not_supported_test_1,
  9894. NULL, test_command_generic);
  9895. test_bredrle("Start Service Discovery - Success 1",
  9896. &start_service_discovery_valid_param_test_1,
  9897. NULL, test_command_generic);
  9898. test_le("Start Service Discovery - Success 2",
  9899. &start_service_discovery_valid_param_test_2,
  9900. NULL, test_command_generic);
  9901. test_bredrle("Set Device Class - Success 1",
  9902. &set_dev_class_valid_param_test_1,
  9903. NULL, test_command_generic);
  9904. test_bredrle("Set Device Class - Success 2",
  9905. &set_dev_class_valid_param_test_2,
  9906. NULL, test_command_generic);
  9907. test_bredrle("Set Device Class - Invalid parameters 1",
  9908. &set_dev_class_invalid_param_test_1,
  9909. NULL, test_command_generic);
  9910. test_bredrle("Add UUID - UUID-16 1",
  9911. &add_uuid16_test_1,
  9912. NULL, test_command_generic);
  9913. test_bredrle("Add UUID - UUID-16 multiple 1",
  9914. &add_multi_uuid16_test_1,
  9915. setup_multi_uuid16, test_command_generic);
  9916. test_bredrle("Add UUID - UUID-16 partial 1",
  9917. &add_multi_uuid16_test_2,
  9918. setup_multi_uuid16_2, test_command_generic);
  9919. test_bredrle("Add UUID - UUID-32 1",
  9920. &add_uuid32_test_1,
  9921. NULL, test_command_generic);
  9922. test_bredrle("Add UUID - UUID-32 multiple 1",
  9923. &add_uuid32_multi_test_1,
  9924. setup_multi_uuid32, test_command_generic);
  9925. test_bredrle("Add UUID - UUID-32 partial 1",
  9926. &add_uuid32_multi_test_2,
  9927. setup_multi_uuid32_2, test_command_generic);
  9928. test_bredrle("Add UUID - UUID-128 1",
  9929. &add_uuid128_test_1,
  9930. NULL, test_command_generic);
  9931. test_bredrle("Add UUID - UUID-128 multiple 1",
  9932. &add_uuid128_multi_test_1,
  9933. setup_multi_uuid128, test_command_generic);
  9934. test_bredrle("Add UUID - UUID-128 partial 1",
  9935. &add_uuid128_multi_test_2,
  9936. setup_multi_uuid128_2, test_command_generic);
  9937. test_bredrle("Add UUID - UUID mix",
  9938. &add_uuid_mix_test_1,
  9939. setup_uuid_mix, test_command_generic);
  9940. /* MGMT_OP_REMOVE_UUID
  9941. * Remove existing UUID.
  9942. */
  9943. test_bredrle("Remove UUID - Success 1",
  9944. &remove_uuid_success_1,
  9945. setup_multi_uuid16, test_command_generic);
  9946. /* MGMT_OP_REMOVE_UUID
  9947. * Remove all UUID by sending zero filled UUID
  9948. */
  9949. test_bredrle("Remove UUID - All UUID - Success 2",
  9950. &remove_uuid_all_success_2,
  9951. setup_multi_uuid16, test_command_generic);
  9952. /* MGMT_OP_REMOVE_UUID
  9953. * Remove UUID while powering off
  9954. * Expect the 0x000000 for the class of device
  9955. */
  9956. test_bredrle("Remove UUID - Power Off - Success 3",
  9957. &remove_uuid_power_off_success_3,
  9958. setup_multi_uuid16_power_off,
  9959. test_command_generic);
  9960. /* MGMT_OP_REMOVE_UUID
  9961. * Remove UUID while powering off and then powering on
  9962. */
  9963. test_bredrle("Remove UUID - Power Off and On - Success 4",
  9964. &remove_uuid_power_off_on_success_4,
  9965. setup_multi_uuid16_power_off_remove,
  9966. test_command_generic);
  9967. /* MGMT_OP_REMOVE_UUID
  9968. * Remove UUID doesn't exist - Invalid parameter
  9969. */
  9970. test_bredrle("Remove UUID - Not Exist - Invalid Params 1",
  9971. &remove_uuid_invalid_params_1,
  9972. setup_multi_uuid16, test_command_generic);
  9973. test_bredrle("Load Link Keys - Empty List Success 1",
  9974. &load_link_keys_success_test_1,
  9975. NULL, test_command_generic);
  9976. test_bredrle("Load Link Keys - Empty List Success 2",
  9977. &load_link_keys_success_test_2,
  9978. NULL, test_command_generic);
  9979. test_bredrle("Load Link Keys - Invalid Parameters 1",
  9980. &load_link_keys_invalid_params_test_1,
  9981. NULL, test_command_generic);
  9982. test_bredrle("Load Link Keys - Invalid Parameters 2",
  9983. &load_link_keys_invalid_params_test_2,
  9984. NULL, test_command_generic);
  9985. test_bredrle("Load Link Keys - Invalid Parameters 3",
  9986. &load_link_keys_invalid_params_test_3,
  9987. NULL, test_command_generic);
  9988. test_bredrle("Load Long Term Keys - Success 1",
  9989. &load_ltks_success_test_1,
  9990. NULL, test_command_generic);
  9991. test_bredrle("Load Long Term Keys - Success 2",
  9992. &load_ltks_success_test_2,
  9993. NULL, test_command_generic);
  9994. test_bredrle("Load Long Term Keys - Success 3 (20 with count 1)",
  9995. &load_ltks_success_test_3,
  9996. setup_load_ltks_20_by_1, test_command_generic);
  9997. test_bredrle("Load Long Term Keys - Success 4 (20 with count 20)",
  9998. &load_ltks_success_test_4,
  9999. NULL, test_command_generic);
  10000. test_bredrle("Load Long Term Keys - Success 5 (Power On and 20 keys)",
  10001. &load_ltks_success_test_5,
  10002. NULL, test_command_generic);
  10003. test_bredrle("Load Long Term Keys - Invalid Parameters 1",
  10004. &load_ltks_invalid_params_test_1,
  10005. NULL, test_command_generic);
  10006. test_bredrle("Load Long Term Keys - Invalid Parameters 2",
  10007. &load_ltks_invalid_params_test_2,
  10008. NULL, test_command_generic);
  10009. test_bredrle("Load Long Term Keys - Invalid Parameters 3",
  10010. &load_ltks_invalid_params_test_3,
  10011. NULL, test_command_generic);
  10012. test_bredrle("Load Long Term Keys - Invalid Parameters 4",
  10013. &load_ltks_invalid_params_test_4,
  10014. NULL, test_command_generic);
  10015. test_bredrle("Set IO Capability - Invalid Params 1",
  10016. &set_io_cap_invalid_param_test_1,
  10017. NULL, test_command_generic);
  10018. test_bredrle("Pair Device - Not Powered 1",
  10019. &pair_device_not_powered_test_1,
  10020. NULL, test_command_generic);
  10021. test_bredrle("Pair Device - Power off 1",
  10022. &pair_device_power_off_test_1,
  10023. NULL, test_command_generic);
  10024. test_le("Pair Device - Incorrect transport reject 1",
  10025. &pair_device_not_supported_test_1,
  10026. NULL, test_command_generic);
  10027. test_bredr("Pair Device - Incorrect transport reject 2",
  10028. &pair_device_not_supported_test_2,
  10029. NULL, test_command_generic);
  10030. test_bredrle("Pair Device - Reject on not enabled transport 1",
  10031. &pair_device_reject_transport_not_enabled_1,
  10032. NULL, test_command_generic);
  10033. test_bredrle("Pair Device - Reject on not enabled transport 2",
  10034. &pair_device_reject_transport_not_enabled_2,
  10035. NULL, test_command_generic);
  10036. test_bredrle("Pair Device - Invalid Parameters 1",
  10037. &pair_device_invalid_param_test_1,
  10038. NULL, test_command_generic);
  10039. test_bredrle("Pair Device - Invalid Parameters 2",
  10040. &pair_device_invalid_param_test_2,
  10041. NULL, test_command_generic);
  10042. test_bredrle("Pair Device - Legacy Success 1",
  10043. &pair_device_success_test_1,
  10044. NULL, test_command_generic);
  10045. test_bredrle("Pair Device - Legacy Non-bondable 1",
  10046. &pair_device_legacy_nonbondable_1,
  10047. NULL, test_command_generic);
  10048. test_bredrle("Pair Device - Sec Mode 3 Success 1",
  10049. &pair_device_success_test_2,
  10050. NULL, test_command_generic);
  10051. test_bredrle("Pair Device - Legacy Reject 1",
  10052. &pair_device_reject_test_1,
  10053. NULL, test_command_generic);
  10054. test_bredrle("Pair Device - Legacy Reject 2",
  10055. &pair_device_reject_test_2,
  10056. NULL, test_command_generic);
  10057. test_bredrle("Pair Device - Sec Mode 3 Reject 1",
  10058. &pair_device_reject_test_3,
  10059. NULL, test_command_generic);
  10060. test_bredrle("Pair Device - Sec Mode 3 Reject 2",
  10061. &pair_device_reject_test_4,
  10062. NULL, test_command_generic);
  10063. test_bredrle("Pair Device - SSP Just-Works Success 1",
  10064. &pair_device_ssp_test_1,
  10065. NULL, test_command_generic);
  10066. test_bredrle("Pair Device - SSP Just-Works Success 2",
  10067. &pair_device_ssp_test_2,
  10068. NULL, test_command_generic);
  10069. test_bredrle("Pair Device - SSP Just-Works Success 3",
  10070. &pair_device_ssp_test_3,
  10071. NULL, test_command_generic);
  10072. test_bredrle("Pair Device - SSP Confirm Success 1",
  10073. &pair_device_ssp_test_4,
  10074. NULL, test_command_generic);
  10075. test_bredrle("Pair Device - SSP Confirm Success 2",
  10076. &pair_device_ssp_test_5,
  10077. NULL, test_command_generic);
  10078. test_bredrle("Pair Device - SSP Confirm Success 3",
  10079. &pair_device_ssp_test_6,
  10080. NULL, test_command_generic);
  10081. test_bredrle("Pair Device - SSP Confirm Reject 1",
  10082. &pair_device_ssp_reject_1,
  10083. NULL, test_command_generic);
  10084. test_bredrle("Pair Device - SSP Confirm Reject 2",
  10085. &pair_device_ssp_reject_2,
  10086. NULL, test_command_generic);
  10087. test_bredrle("Pair Device - SSP Non-bondable 1",
  10088. &pair_device_ssp_nonbondable_1,
  10089. NULL, test_command_generic);
  10090. test_bredrle("Pair Device - SMP over BR/EDR Success 1",
  10091. &pair_device_smp_bredr_test_1,
  10092. NULL, test_command_generic);
  10093. test_bredrle("Pair Device - SMP over BR/EDR Success 2",
  10094. &pair_device_smp_bredr_test_2,
  10095. NULL, test_command_generic);
  10096. test_le("Pair Device - LE Success 1",
  10097. &pair_device_le_success_test_1,
  10098. NULL, test_command_generic);
  10099. test_le("Pair Device - LE Success 2",
  10100. &pair_device_le_success_test_2,
  10101. NULL, test_command_generic);
  10102. test_le("Pair Device - LE Reject 1",
  10103. &pair_device_le_reject_test_1,
  10104. NULL, test_command_generic);
  10105. test_le("Pair Device - LE SC Legacy 1",
  10106. &pair_device_le_sc_legacy_test_1,
  10107. NULL, test_command_generic);
  10108. test_le("Pair Device - LE SC Success 1",
  10109. &pair_device_le_sc_success_test_1,
  10110. NULL, test_command_generic);
  10111. test_le("Pair Device - LE SC Success 2",
  10112. &pair_device_le_sc_success_test_2,
  10113. NULL, test_command_generic);
  10114. test_bredrle("Pair Device - LE SC Success 3",
  10115. &pair_device_le_sc_success_test_3,
  10116. NULL, test_command_generic);
  10117. test_bredrle("Pairing Acceptor - Legacy 1",
  10118. &pairing_acceptor_legacy_1, NULL,
  10119. test_pairing_acceptor);
  10120. test_bredrle("Pairing Acceptor - Legacy 2",
  10121. &pairing_acceptor_legacy_2, NULL,
  10122. test_pairing_acceptor);
  10123. test_bredrle("Pairing Acceptor - Legacy 3",
  10124. &pairing_acceptor_legacy_3, NULL,
  10125. test_pairing_acceptor);
  10126. test_bredrle("Pairing Acceptor - Link Sec 1",
  10127. &pairing_acceptor_linksec_1, NULL,
  10128. test_pairing_acceptor);
  10129. test_bredrle("Pairing Acceptor - Link Sec 2",
  10130. &pairing_acceptor_linksec_2, NULL,
  10131. test_pairing_acceptor);
  10132. test_bredrle("Pairing Acceptor - SSP 1",
  10133. &pairing_acceptor_ssp_1, setup_pairing_acceptor,
  10134. test_pairing_acceptor);
  10135. test_bredrle("Pairing Acceptor - SSP 2",
  10136. &pairing_acceptor_ssp_2, setup_pairing_acceptor,
  10137. test_pairing_acceptor);
  10138. test_bredrle("Pairing Acceptor - SSP 3",
  10139. &pairing_acceptor_ssp_3, setup_pairing_acceptor,
  10140. test_pairing_acceptor);
  10141. test_bredrle("Pairing Acceptor - SSP 4",
  10142. &pairing_acceptor_ssp_4, setup_pairing_acceptor,
  10143. test_pairing_acceptor);
  10144. test_bredrle("Pairing Acceptor - SMP over BR/EDR 1",
  10145. &pairing_acceptor_smp_bredr_1,
  10146. setup_pairing_acceptor, test_pairing_acceptor);
  10147. test_bredrle("Pairing Acceptor - SMP over BR/EDR 2",
  10148. &pairing_acceptor_smp_bredr_2,
  10149. setup_pairing_acceptor, test_pairing_acceptor);
  10150. test_le("Pairing Acceptor - LE 1",
  10151. &pairing_acceptor_le_1, setup_pairing_acceptor,
  10152. test_pairing_acceptor);
  10153. test_le("Pairing Acceptor - LE 2",
  10154. &pairing_acceptor_le_2, setup_pairing_acceptor,
  10155. test_pairing_acceptor);
  10156. test_le("Pairing Acceptor - LE 3",
  10157. &pairing_acceptor_le_3, setup_pairing_acceptor,
  10158. test_pairing_acceptor);
  10159. test_le("Pairing Acceptor - LE 4",
  10160. &pairing_acceptor_le_4, setup_pairing_acceptor,
  10161. test_pairing_acceptor);
  10162. test_le("Pairing Acceptor - LE 5",
  10163. &pairing_acceptor_le_5, setup_pairing_acceptor,
  10164. test_pairing_acceptor);
  10165. test_bredrle("Unpair Device - Not Powered 1",
  10166. &unpair_device_not_powered_test_1,
  10167. NULL, test_command_generic);
  10168. test_bredrle("Unpair Device - Invalid Parameters 1",
  10169. &unpair_device_invalid_param_test_1,
  10170. NULL, test_command_generic);
  10171. test_bredrle("Unpair Device - Invalid Parameters 2",
  10172. &unpair_device_invalid_param_test_2,
  10173. NULL, test_command_generic);
  10174. test_bredrle("Disconnect - Invalid Parameters 1",
  10175. &disconnect_invalid_param_test_1,
  10176. NULL, test_command_generic);
  10177. test_bredrle("Block Device - Invalid Parameters 1",
  10178. &block_device_invalid_param_test_1,
  10179. NULL, test_command_generic);
  10180. test_bredrle("Unblock Device - Invalid Parameters 1",
  10181. &unblock_device_invalid_param_test_1,
  10182. NULL, test_command_generic);
  10183. test_le("Set Static Address - Success 1",
  10184. &set_static_addr_success_test,
  10185. NULL, test_command_generic);
  10186. test_bredrle("Set Static Address - Success 2",
  10187. &set_static_addr_success_test_2,
  10188. NULL, test_command_generic);
  10189. test_bredrle("Set Static Address - Failure 1",
  10190. &set_static_addr_failure_test,
  10191. NULL, test_command_generic);
  10192. test_bredr("Set Static Address - Failure 2",
  10193. &set_static_addr_failure_test_2,
  10194. NULL, test_command_generic);
  10195. test_bredrle("Set Scan Parameters - Success",
  10196. &set_scan_params_success_test,
  10197. NULL, test_command_generic);
  10198. test_bredrle("Load IRKs - Success 1",
  10199. &load_irks_success1_test,
  10200. NULL, test_command_generic);
  10201. test_bredrle("Load IRKs - Success 2",
  10202. &load_irks_success2_test,
  10203. NULL, test_command_generic);
  10204. test_bredrle("Load IRKs - Invalid Parameters 1",
  10205. &load_irks_nval_param1_test,
  10206. NULL, test_command_generic);
  10207. test_bredrle("Load IRKs - Invalid Parameters 2",
  10208. &load_irks_nval_param2_test,
  10209. NULL, test_command_generic);
  10210. test_bredrle("Load IRKs - Invalid Parameters 3",
  10211. &load_irks_nval_param3_test,
  10212. NULL, test_command_generic);
  10213. test_bredr("Load IRKs - Not Supported",
  10214. &load_irks_not_supported_test,
  10215. NULL, test_command_generic);
  10216. test_bredrle("Set Privacy - Success",
  10217. &set_privacy_success_test,
  10218. NULL, test_command_generic);
  10219. test_bredrle("Set Privacy - Rejected",
  10220. &set_privacy_powered_test,
  10221. NULL, test_command_generic);
  10222. test_bredrle("Set Privacy - Invalid Parameters",
  10223. &set_privacy_nval_param_test,
  10224. NULL, test_command_generic);
  10225. test_bredrle("Get Clock Info - Success",
  10226. &get_clock_info_succes1_test, NULL,
  10227. test_command_generic_connect);
  10228. test_bredrle("Get Clock Info - Fail (Power Off)",
  10229. &get_clock_info_fail1_test, NULL,
  10230. test_command_generic);
  10231. test_bredrle("Get Conn Info - Success",
  10232. &get_conn_info_succes1_test, NULL,
  10233. test_command_generic_connect);
  10234. test_bredrle("Get Conn Info - Not Connected",
  10235. &get_conn_info_ncon_test, NULL,
  10236. test_command_generic);
  10237. test_bredrle("Get Conn Info - Power off",
  10238. &get_conn_info_power_off_test, NULL,
  10239. test_command_generic_connect);
  10240. test_bredrle("Load Connection Parameters - Invalid Params 1",
  10241. &load_conn_params_fail_1,
  10242. NULL, test_command_generic);
  10243. test_bredrle("Add Device - Invalid Params 1",
  10244. &add_device_fail_1,
  10245. NULL, test_command_generic);
  10246. test_bredrle("Add Device - Invalid Params 2",
  10247. &add_device_fail_2,
  10248. NULL, test_command_generic);
  10249. test_bredrle("Add Device - Invalid Params 3",
  10250. &add_device_fail_3,
  10251. NULL, test_command_generic);
  10252. test_bredrle("Add Device - Invalid Params 4",
  10253. &add_device_fail_4,
  10254. NULL, test_command_generic);
  10255. test_bredrle("Add Device - Success 1",
  10256. &add_device_success_1,
  10257. NULL, test_command_generic);
  10258. test_bredrle("Add Device - Success 2",
  10259. &add_device_success_2,
  10260. NULL, test_command_generic);
  10261. test_bredrle("Add Device - Success 3",
  10262. &add_device_success_3,
  10263. NULL, test_command_generic);
  10264. test_bredrle("Add Device - Success 4",
  10265. &add_device_success_4,
  10266. NULL, test_command_generic);
  10267. test_bredrle("Add Device - Success 5",
  10268. &add_device_success_5,
  10269. NULL, test_command_generic);
  10270. /* MGMT_OP_ADD_DEVICE
  10271. * Add device and check the device is added to the accept list
  10272. */
  10273. test_bredrle50("Add Device - Success 6 - Add to accept list",
  10274. &add_device_success_6,
  10275. NULL, test_command_generic);
  10276. /* MGMT_OP_ADD_DEVICE
  10277. * Add device and check the device is added to the resolve list
  10278. * when the LL Privacy is enabled
  10279. */
  10280. test_bredrle50("Add Device - Success 7 - Add to resolv list",
  10281. &add_device_success_7,
  10282. setup_ll_privacy, test_command_generic);
  10283. /* MGMT_OP_ADD_DEVICE
  10284. * Add device and check the Resolving List is enabled for the device
  10285. * when the LL Privacy is enabled
  10286. */
  10287. test_bredrle50("Add Device - Success 8 - Enable resolv list",
  10288. &add_device_success_8,
  10289. setup_ll_privacy, test_command_generic);
  10290. test_bredrle("Remove Device - Invalid Params 1",
  10291. &remove_device_fail_1,
  10292. NULL, test_command_generic);
  10293. test_bredrle("Remove Device - Invalid Params 2",
  10294. &remove_device_fail_2,
  10295. NULL, test_command_generic);
  10296. test_bredrle("Remove Device - Invalid Params 3",
  10297. &remove_device_fail_3,
  10298. NULL, test_command_generic);
  10299. test_bredrle("Remove Device - Success 1",
  10300. &remove_device_success_1,
  10301. setup_add_device, test_command_generic);
  10302. test_bredrle("Remove Device - Success 2",
  10303. &remove_device_success_2,
  10304. setup_add_device, test_command_generic);
  10305. test_bredrle("Remove Device - Success 3",
  10306. &remove_device_success_3,
  10307. setup_add_device, test_remove_device);
  10308. test_le("Remove Device - Success 4",
  10309. &remove_device_success_4,
  10310. setup_add_device, test_remove_device);
  10311. test_le("Remove Device - Success 5",
  10312. &remove_device_success_5,
  10313. setup_add_device, test_remove_device);
  10314. /* MGMT_OP_REMOVE_DEVICE
  10315. * Remove all devices
  10316. */
  10317. test_bredrle50("Remove Device - Success 6 - All Devices",
  10318. &remove_device_success_6,
  10319. setup_add_device, test_remove_device);
  10320. /* MGMT_OP_REMOVE_DEVICE
  10321. * Remove the device and check the device is removed from the whilte
  10322. * list as well.
  10323. */
  10324. test_bredrle50("Remove Device - Success 7 - Remove from accept list",
  10325. &remove_device_success_7,
  10326. setup_ll_privacy_device2, test_command_generic);
  10327. /* MGMT_OP_REMOVE_DEVICE
  10328. * Remove the device and check the device is removed from the resolving
  10329. * list as well when the LL Privacy is enabled.
  10330. */
  10331. test_bredrle50("Remove Device - Success 8 - Remove from resolv list",
  10332. &remove_device_success_8,
  10333. setup_ll_privacy_device2, test_command_generic);
  10334. test_bredrle("Read Advertising Features - Invalid parameters",
  10335. &read_adv_features_invalid_param_test,
  10336. NULL, test_command_generic);
  10337. test_bredrle("Read Advertising Features - Invalid index",
  10338. &read_adv_features_invalid_index_test,
  10339. NULL, test_command_generic);
  10340. test_bredrle("Read Advertising Features - Success 1 (No instance)",
  10341. &read_adv_features_success_1,
  10342. NULL, test_command_generic);
  10343. test_bredrle("Read Advertising Features - Success 2 (One instance)",
  10344. &read_adv_features_success_2,
  10345. setup_add_advertising,
  10346. test_command_generic);
  10347. test_bredrle("Add Advertising - Failure: LE off",
  10348. &add_advertising_fail_1,
  10349. NULL, test_command_generic);
  10350. test_bredrle("Add Advertising - Invalid Params 1 (AD too long)",
  10351. &add_advertising_fail_2,
  10352. NULL, test_command_generic);
  10353. test_bredrle("Add Advertising - Invalid Params 2 (Malformed len)",
  10354. &add_advertising_fail_3,
  10355. NULL, test_command_generic);
  10356. test_bredrle("Add Advertising - Invalid Params 3 (Malformed len)",
  10357. &add_advertising_fail_4,
  10358. NULL, test_command_generic);
  10359. test_bredrle("Add Advertising - Invalid Params 4 (Malformed len)",
  10360. &add_advertising_fail_5,
  10361. NULL, test_command_generic);
  10362. test_le("Add Advertising - Invalid Params 5 (AD too long)",
  10363. &add_advertising_fail_6,
  10364. NULL, test_command_generic);
  10365. test_bredrle("Add Advertising - Invalid Params 6 (ScRsp too long)",
  10366. &add_advertising_fail_7,
  10367. NULL, test_command_generic);
  10368. test_bredrle("Add Advertising - Invalid Params 7 (Malformed len)",
  10369. &add_advertising_fail_8,
  10370. NULL, test_command_generic);
  10371. test_bredrle("Add Advertising - Invalid Params 8 (Malformed len)",
  10372. &add_advertising_fail_9,
  10373. NULL, test_command_generic);
  10374. test_bredrle("Add Advertising - Invalid Params 9 (Malformed len)",
  10375. &add_advertising_fail_10,
  10376. NULL, test_command_generic);
  10377. test_le("Add Advertising - Invalid Params 10 (ScRsp too long)",
  10378. &add_advertising_fail_11,
  10379. NULL, test_command_generic);
  10380. test_bredrle("Add Advertising - Rejected (Timeout, !Powered)",
  10381. &add_advertising_fail_12,
  10382. NULL, test_command_generic);
  10383. test_bredrle("Add Advertising - Success 1 (Powered, Add Adv Inst)",
  10384. &add_advertising_success_1,
  10385. NULL, test_command_generic);
  10386. test_bredrle("Add Advertising - Success 2 (!Powered, Add Adv Inst)",
  10387. &add_advertising_success_pwron_data,
  10388. setup_add_advertising_not_powered,
  10389. test_command_generic);
  10390. test_bredrle("Add Advertising - Success 3 (!Powered, Adv Enable)",
  10391. &add_advertising_success_pwron_enabled,
  10392. setup_add_advertising_not_powered,
  10393. test_command_generic);
  10394. test_bredrle("Add Advertising - Success 4 (Set Adv on override)",
  10395. &add_advertising_success_4,
  10396. setup_add_advertising,
  10397. test_command_generic);
  10398. test_bredrle("Add Advertising - Success 5 (Set Adv off override)",
  10399. &add_advertising_success_5,
  10400. setup_set_and_add_advertising,
  10401. test_command_generic);
  10402. test_bredrle("Add Advertising - Success 6 (Scan Rsp Dta, Adv ok)",
  10403. &add_advertising_success_6,
  10404. NULL, test_command_generic);
  10405. test_bredrle("Add Advertising - Success 7 (Scan Rsp Dta, Scan ok) ",
  10406. &add_advertising_success_7,
  10407. NULL, test_command_generic);
  10408. test_bredrle("Add Advertising - Success 8 (Connectable Flag)",
  10409. &add_advertising_success_8,
  10410. NULL, test_command_generic);
  10411. test_bredrle("Add Advertising - Success 9 (General Discov Flag)",
  10412. &add_advertising_success_9,
  10413. NULL, test_command_generic);
  10414. test_bredrle("Add Advertising - Success 10 (Limited Discov Flag)",
  10415. &add_advertising_success_10,
  10416. NULL, test_command_generic);
  10417. test_bredrle("Add Advertising - Success 11 (Managed Flags)",
  10418. &add_advertising_success_11,
  10419. NULL, test_command_generic);
  10420. test_bredrle("Add Advertising - Success 12 (TX Power Flag)",
  10421. &add_advertising_success_12,
  10422. NULL, test_command_generic);
  10423. test_bredrle("Add Advertising - Success 13 (ADV_SCAN_IND)",
  10424. &add_advertising_success_13,
  10425. NULL, test_command_generic);
  10426. test_bredrle("Add Advertising - Success 14 (ADV_NONCONN_IND)",
  10427. &add_advertising_success_14,
  10428. NULL, test_command_generic);
  10429. test_bredrle("Add Advertising - Success 15 (ADV_IND)",
  10430. &add_advertising_success_15,
  10431. NULL, test_command_generic);
  10432. test_bredrle("Add Advertising - Success 16 (Connectable -> on)",
  10433. &add_advertising_success_16,
  10434. setup_add_advertising,
  10435. test_command_generic);
  10436. test_bredrle("Add Advertising - Success 17 (Connectable -> off)",
  10437. &add_advertising_success_17,
  10438. setup_add_advertising_connectable,
  10439. test_command_generic);
  10440. /* Adv instances with a timeout do NOT survive a power cycle. */
  10441. test_bredrle("Add Advertising - Success 18 (Power -> off, Remove)",
  10442. &add_advertising_power_off,
  10443. setup_add_advertising_timeout,
  10444. test_command_generic);
  10445. /* Adv instances without timeout survive a power cycle. */
  10446. test_bredrle("Add Advertising - Success 19 (Power -> off, Keep)",
  10447. &add_advertising_success_pwron_data,
  10448. setup_add_advertising_power_cycle,
  10449. test_command_generic);
  10450. /* Changing an advertising instance while it is still being
  10451. * advertised will immediately update the advertised data if
  10452. * there is no other instance to switch to.
  10453. */
  10454. test_bredrle("Add Advertising - Success 20 (Add Adv override)",
  10455. &add_advertising_success_18,
  10456. setup_add_advertising,
  10457. test_command_generic);
  10458. /* An instance should be removed when its timeout has been reached.
  10459. * Advertising will also be disabled if this was the last instance.
  10460. */
  10461. test_bredrle_full("Add Advertising - Success 21 (Timeout expires)",
  10462. &add_advertising_timeout_expired,
  10463. setup_add_advertising_timeout,
  10464. test_command_generic, 3);
  10465. /* LE off will clear (remove) all instances. */
  10466. test_bredrle("Add Advertising - Success 22 (LE -> off, Remove)",
  10467. &add_advertising_le_off,
  10468. setup_add_advertising,
  10469. test_command_generic);
  10470. test_bredrle("Add Advertising - Success (Empty ScRsp)",
  10471. &add_advertising_empty_scrsp,
  10472. setup_command_generic,
  10473. test_command_generic);
  10474. test_bredrle("Add Advertising - Success (ScRsp only)",
  10475. &add_advertising_scrsp_data_only_ok,
  10476. NULL, test_command_generic);
  10477. test_bredrle("Add Advertising - Invalid Params (ScRsp too long)",
  10478. &add_advertising_scrsp_data_only_too_long,
  10479. NULL, test_command_generic);
  10480. test_bredrle("Add Advertising - Success (ScRsp appear)",
  10481. &add_advertising_scrsp_appear_data_ok,
  10482. setup_command_generic, test_command_generic);
  10483. test_bredrle("Add Advertising - Invalid Params (ScRsp appear long)",
  10484. &add_advertising_scrsp_appear_data_too_long,
  10485. setup_command_generic, test_command_generic);
  10486. test_bredrle("Add Advertising - Success (Appear is null)",
  10487. &add_advertising_scrsp_appear_null,
  10488. NULL, test_command_generic);
  10489. test_bredrle("Add Advertising - Success (Name is null)",
  10490. &add_advertising_no_name_set,
  10491. NULL, test_command_generic);
  10492. test_bredrle("Add Advertising - Success (Complete name)",
  10493. &add_advertising_name_fits_in_scrsp,
  10494. setup_command_generic,
  10495. test_command_generic);
  10496. test_bredrle("Add Advertising - Success (Shortened name)",
  10497. &add_advertising_shortened_name_in_scrsp,
  10498. setup_command_generic,
  10499. test_command_generic);
  10500. test_bredrle("Add Advertising - Success (Short name)",
  10501. &add_advertising_short_name_in_scrsp,
  10502. setup_command_generic,
  10503. test_command_generic);
  10504. test_bredrle("Add Advertising - Success (Name + data)",
  10505. &add_advertising_name_data_ok,
  10506. setup_command_generic,
  10507. test_command_generic);
  10508. test_bredrle("Add Advertising - Invalid Params (Name + data)",
  10509. &add_advertising_name_data_inv,
  10510. setup_command_generic,
  10511. test_command_generic);
  10512. test_bredrle("Add Advertising - Success (Name+data+appear)",
  10513. &add_advertising_name_data_appear,
  10514. setup_command_generic,
  10515. test_command_generic);
  10516. test_le_full("Adv. connectable & connected (peripheral) - Success",
  10517. &conn_peripheral_adv_connectable_test,
  10518. setup_advertise_while_connected,
  10519. test_connected_and_advertising, 10);
  10520. test_le_full("Adv. non-connectable & connected (peripheral) - Success",
  10521. &conn_peripheral_adv_non_connectable_test,
  10522. setup_advertise_while_connected,
  10523. test_connected_and_advertising, 10);
  10524. test_le_full("Adv. connectable & connected (central) - Success",
  10525. &conn_central_adv_connectable_test,
  10526. setup_advertise_while_connected,
  10527. test_connected_and_advertising, 10);
  10528. test_le_full("Adv. non-connectable & connected (central) - Success",
  10529. &conn_central_adv_non_connectable_test,
  10530. setup_advertise_while_connected,
  10531. test_connected_and_advertising, 10);
  10532. test_bredrle("Remove Advertising - Invalid Params 1",
  10533. &remove_advertising_fail_1,
  10534. NULL, test_command_generic);
  10535. test_bredrle("Remove Advertising - Success 1",
  10536. &remove_advertising_success_1,
  10537. setup_add_advertising,
  10538. test_command_generic);
  10539. test_bredrle("Remove Advertising - Success 2",
  10540. &remove_advertising_success_2,
  10541. setup_add_advertising,
  10542. test_command_generic);
  10543. /* When advertising two instances, the instances should be
  10544. * advertised in a round-robin fashion.
  10545. */
  10546. test_bredrle("Multi Advertising - Success 1 (Instance Switch)",
  10547. &multi_advertising_switch,
  10548. setup_multi_adv,
  10549. test_command_generic);
  10550. /* Adding a new instance when one is already being advertised
  10551. * will switch to the new instance after the first has reached
  10552. * its duration. A long timeout has been set to
  10553. */
  10554. test_bredrle_full("Multi Advertising - Success 2 (Add Second Inst)",
  10555. &multi_advertising_add_second,
  10556. setup_add_advertising_duration,
  10557. test_command_generic, 3);
  10558. test_bredr("Set appearance - BR/EDR only",
  10559. &set_appearance_not_supported,
  10560. NULL,
  10561. test_command_generic);
  10562. test_bredrle("Set appearance - BR/EDR LE",
  10563. &set_appearance_success,
  10564. NULL,
  10565. test_command_generic);
  10566. test_le("Set appearance - LE only",
  10567. &set_appearance_success,
  10568. NULL,
  10569. test_command_generic);
  10570. test_bredrle("Read Ext Controller Info 1",
  10571. &read_ext_ctrl_info1,
  10572. NULL, test_command_generic);
  10573. test_bredrle("Read Ext Controller Info 2",
  10574. &read_ext_ctrl_info2,
  10575. setup_command_generic, test_command_generic);
  10576. test_bredrle("Read Ext Controller Info 3",
  10577. &read_ext_ctrl_info3,
  10578. setup_command_generic, test_command_generic);
  10579. test_bredrle("Read Ext Controller Info 4",
  10580. &read_ext_ctrl_info4,
  10581. setup_command_generic, test_command_generic);
  10582. test_bredrle("Read Ext Controller Info 5",
  10583. &read_ext_ctrl_info5,
  10584. setup_command_generic, test_command_generic);
  10585. test_bredrle("Read Local OOB Data - Not powered",
  10586. &read_local_oob_not_powered_test,
  10587. NULL, test_command_generic);
  10588. test_bredrle("Read Local OOB Data - Invalid parameters",
  10589. &read_local_oob_invalid_param_test,
  10590. NULL, test_command_generic);
  10591. test_bredrle("Read Local OOB Data - Invalid index",
  10592. &read_local_oob_invalid_index_test,
  10593. NULL, test_command_generic);
  10594. test_bredr20("Read Local OOB Data - Legacy pairing",
  10595. &read_local_oob_legacy_pairing_test,
  10596. NULL, test_command_generic);
  10597. test_bredrle("Read Local OOB Data - Success SSP",
  10598. &read_local_oob_success_ssp_test,
  10599. NULL, test_command_generic);
  10600. test_bredrle("Read Local OOB Data - Success SC",
  10601. &read_local_oob_success_sc_test,
  10602. NULL, test_command_generic);
  10603. test_bredrle("Read Local OOB Ext Data - Invalid index",
  10604. &read_local_oob_ext_invalid_index_test,
  10605. NULL, test_command_generic);
  10606. test_bredr20("Read Local OOB Ext Data - Legacy pairing",
  10607. &read_local_oob_ext_legacy_pairing_test,
  10608. NULL, test_command_generic);
  10609. test_bredrle("Read Local OOB Ext Data - Success SSP",
  10610. &read_local_oob_ext_success_ssp_test,
  10611. NULL, test_command_generic);
  10612. test_bredrle("Read Local OOB Ext Data - Success SC",
  10613. &read_local_oob_ext_success_sc_test,
  10614. NULL, test_command_generic);
  10615. test_bredrle("Device Found - Advertising data - Zero padded",
  10616. &device_found_gtag,
  10617. NULL, test_device_found);
  10618. test_bredrle("Device Found - Advertising data - Invalid field",
  10619. &device_found_invalid_field,
  10620. NULL, test_device_found);
  10621. test_bredrle50("Read Ext Advertising Features - Success 3 (PHY flags)",
  10622. &read_adv_features_success_3,
  10623. NULL, test_command_generic);
  10624. test_bredrle50("Add Ext Advertising - Invalid Params 1 (Multiple Phys)",
  10625. &add_ext_advertising_fail_1,
  10626. NULL, test_command_generic);
  10627. test_bredrle50("Add Ext Advertising - Invalid Params 2 (Multiple PHYs)",
  10628. &add_ext_advertising_fail_2,
  10629. NULL, test_command_generic);
  10630. test_bredrle50("Add Ext Advertising - Invalid Params 3 (Multiple PHYs)",
  10631. &add_ext_advertising_fail_3,
  10632. NULL, test_command_generic);
  10633. test_bredrle50("Add Ext Advertising - Invalid Params 4 (Multiple PHYs)",
  10634. &add_ext_advertising_fail_4,
  10635. NULL, test_command_generic);
  10636. test_bredrle50("Add Ext Advertising - Success 1 (Powered, Add Adv Inst)",
  10637. &add_ext_advertising_success_1,
  10638. NULL, test_command_generic);
  10639. test_bredrle50("Add Ext Advertising - Success 2 (!Powered, Add Adv Inst)",
  10640. &add_ext_advertising_success_pwron_data,
  10641. setup_add_advertising_not_powered,
  10642. test_command_generic);
  10643. test_bredrle50("Add Ext Advertising - Success 3 (!Powered, Adv Enable)",
  10644. &add_ext_advertising_success_pwron_enabled,
  10645. setup_add_advertising_not_powered,
  10646. test_command_generic);
  10647. test_bredrle50("Add Ext Advertising - Success 4 (Set Adv on override)",
  10648. &add_ext_advertising_success_4,
  10649. setup_add_advertising,
  10650. test_command_generic);
  10651. test_bredrle50("Add Ext Advertising - Success 5 (Set Adv off override)",
  10652. &add_ext_advertising_success_5,
  10653. setup_set_and_add_advertising,
  10654. test_command_generic);
  10655. test_bredrle50("Add Ext Advertising - Success 6 (Scan Rsp Dta, Adv ok)",
  10656. &add_ext_advertising_success_6,
  10657. NULL, test_command_generic);
  10658. test_bredrle50("Add Ext Advertising - Success 7 (Scan Rsp Dta, Scan ok) ",
  10659. &add_ext_advertising_success_7,
  10660. NULL, test_command_generic);
  10661. test_bredrle50("Add Ext Advertising - Success 8 (Connectable Flag)",
  10662. &add_ext_advertising_success_8,
  10663. NULL, test_command_generic);
  10664. test_bredrle50("Add Ext Advertising - Success 9 (General Discov Flag)",
  10665. &add_ext_advertising_success_9,
  10666. NULL, test_command_generic);
  10667. test_bredrle50("Add Ext Advertising - Success 10 (Limited Discov Flag)",
  10668. &add_ext_advertising_success_10,
  10669. NULL, test_command_generic);
  10670. test_bredrle50("Add Ext Advertising - Success 11 (Managed Flags)",
  10671. &add_ext_advertising_success_11,
  10672. NULL, test_command_generic);
  10673. test_bredrle50("Add Ext Advertising - Success 12 (TX Power Flag)",
  10674. &add_ext_advertising_success_12,
  10675. NULL, test_command_generic);
  10676. test_bredrle50("Add Ext Advertising - Success 13 (ADV_SCAN_IND)",
  10677. &add_ext_advertising_success_13,
  10678. NULL, test_command_generic);
  10679. test_bredrle50("Add Ext Advertising - Success 14 (ADV_NONCONN_IND)",
  10680. &add_ext_advertising_success_14,
  10681. NULL, test_command_generic);
  10682. test_bredrle50("Add Ext Advertising - Success 15 (ADV_IND)",
  10683. &add_ext_advertising_success_15,
  10684. NULL, test_command_generic);
  10685. test_bredrle50("Add Ext Advertising - Success 16 (Connectable -> on)",
  10686. &add_ext_advertising_success_16,
  10687. setup_add_advertising,
  10688. test_command_generic);
  10689. test_bredrle50("Add Ext Advertising - Success 17 (Connectable -> off)",
  10690. &add_ext_advertising_success_17,
  10691. setup_add_advertising_connectable,
  10692. test_command_generic);
  10693. /* Changing an advertising instance while it is still being
  10694. * advertised will immediately update the advertised data if
  10695. * there is no other instance to switch to.
  10696. */
  10697. test_bredrle50("Add Ext Advertising - Success 20 (Add Adv override)",
  10698. &add_ext_advertising_success_18,
  10699. setup_add_advertising,
  10700. test_command_generic);
  10701. /* An instance should be removed when its timeout has been reached.
  10702. * Advertising will also be disabled if this was the last instance.
  10703. */
  10704. test_bredrle50_full("Add Ext Advertising - Success 21 (Timeout expires)",
  10705. &add_ext_advertising_timeout_expired,
  10706. setup_add_advertising_timeout,
  10707. test_command_generic, 3);
  10708. /* LE off will clear (remove) all instances. */
  10709. test_bredrle50("Add Ext Advertising - Success 22 (LE -> off, Remove)",
  10710. &add_ext_advertising_le_off,
  10711. setup_add_advertising,
  10712. test_command_generic);
  10713. test_bredrle50("Add Ext Advertising - Success (Empty ScRsp)",
  10714. &add_ext_advertising_empty_scrsp,
  10715. setup_command_generic,
  10716. test_command_generic);
  10717. test_bredrle50("Add Ext Advertising - Success (ScRsp only)",
  10718. &add_ext_advertising_scrsp_data_only_ok,
  10719. NULL, test_command_generic);
  10720. test_bredrle50("Add Ext Advertising - Invalid Params (ScRsp too long)",
  10721. &add_ext_advertising_scrsp_data_only_too_long,
  10722. NULL, test_command_generic);
  10723. test_bredrle50("Add Ext Advertising - Success (ScRsp appear)",
  10724. &add_ext_advertising_scrsp_appear_data_ok,
  10725. setup_command_generic, test_command_generic);
  10726. test_bredrle50("Add Ext Advertising - Invalid Params (ScRsp appear long)",
  10727. &add_ext_advertising_scrsp_appear_data_too_long,
  10728. setup_command_generic, test_command_generic);
  10729. test_bredrle50("Add Ext Advertising - Success (Appear is null)",
  10730. &add_ext_advertising_scrsp_appear_null,
  10731. NULL, test_command_generic);
  10732. test_bredrle50("Add Ext Advertising - Success (Name is null)",
  10733. &add_ext_advertising_no_name_set,
  10734. NULL, test_command_generic);
  10735. test_bredrle50("Add Ext Advertising - Success (Complete name)",
  10736. &add_ext_advertising_name_fits_in_scrsp,
  10737. setup_command_generic,
  10738. test_command_generic);
  10739. test_bredrle50("Add Ext Advertising - Success (Shortened name)",
  10740. &add_ext_advertising_shortened_name_in_scrsp,
  10741. setup_command_generic,
  10742. test_command_generic);
  10743. test_bredrle50("Add Ext Advertising - Success (Short name)",
  10744. &add_ext_advertising_shortened_name_in_scrsp,
  10745. setup_command_generic,
  10746. test_command_generic);
  10747. test_bredrle50("Add Ext Advertising - Success (Name + data)",
  10748. &add_ext_advertising_name_data_ok,
  10749. setup_command_generic,
  10750. test_command_generic);
  10751. test_bredrle50("Add Ext Advertising - Invalid Params (Name + data)",
  10752. &add_ext_advertising_name_data_inv,
  10753. setup_command_generic,
  10754. test_command_generic);
  10755. test_bredrle50("Add Ext Advertising - Success (Name+data+appear)",
  10756. &add_ext_advertising_name_data_appear,
  10757. setup_command_generic,
  10758. test_command_generic);
  10759. test_bredrle50("Add Ext Advertising - Success (PHY -> 1M)",
  10760. &add_ext_advertising_success_1m,
  10761. NULL, test_command_generic);
  10762. test_bredrle50("Add Ext Advertising - Success (PHY -> 2M)",
  10763. &add_ext_advertising_success_2m,
  10764. NULL, test_command_generic);
  10765. test_bredrle50("Add Ext Advertising - Success (PHY -> Coded)",
  10766. &add_ext_advertising_success_coded,
  10767. NULL, test_command_generic);
  10768. test_bredrle50("Add Ext Advertising - Success (Ext Pdu Scannable)",
  10769. &add_ext_advertising_success_scannable,
  10770. NULL, test_command_generic);
  10771. test_bredrle50("Add Ext Advertising - Success (Ext Pdu Connectable)",
  10772. &add_ext_advertising_success_connectable,
  10773. NULL, test_command_generic);
  10774. /* In Ext pdu it shall not be both scannable and connectable */
  10775. test_bredrle50("Add Ext Advertising - Success (Ext Pdu Conn Scan)",
  10776. &add_ext_advertising_success_conn_scan,
  10777. NULL, test_command_generic);
  10778. test_bredrle50("Add Ext Advertising - Success (1m Connectable -> on)",
  10779. &add_ext_advertising_conn_on_1m,
  10780. setup_add_advertising_1m,
  10781. test_command_generic);
  10782. test_bredrle50("Add Ext Advertising - Success (1m Connectable -> off)",
  10783. &add_ext_advertising_conn_off_1m,
  10784. setup_add_advertising_connectable_1m,
  10785. test_command_generic);
  10786. test_bredrle50("Remove Ext Advertising - Invalid Params 1",
  10787. &remove_ext_advertising_fail_1,
  10788. NULL, test_command_generic);
  10789. test_bredrle50("Remove Ext Advertising - Success 1",
  10790. &remove_ext_advertising_success_1,
  10791. setup_add_advertising,
  10792. test_command_generic);
  10793. test_bredrle50("Remove Ext Advertising - Success 2",
  10794. &remove_ext_advertising_success_2,
  10795. setup_add_advertising,
  10796. test_command_generic);
  10797. /* When advertising two instances, the instances should be
  10798. * advertised in a round-robin fashion.
  10799. */
  10800. test_bredrle50("Multi Ext Advertising - Success 1",
  10801. &multi_ext_advertising,
  10802. setup_multi_adv,
  10803. test_command_generic);
  10804. /* Adding a new instance when one is already being advertised
  10805. * will switch to the new instance after the first has reached
  10806. * its duration. A long timeout has been set to
  10807. */
  10808. test_bredrle50_full("Multi Ext Advertising - Success 2 (Add Second Inst)",
  10809. &multi_ext_advertising_add_second,
  10810. setup_add_advertising_duration,
  10811. test_command_generic, 3);
  10812. test_bredrle50("Get PHY Success", &get_phy_success,
  10813. NULL, test_command_generic);
  10814. test_bredrle50("Set PHY 2m Success", &set_phy_2m_success,
  10815. NULL, test_command_generic);
  10816. test_bredrle50("Set PHY coded Succcess", &set_phy_coded_success,
  10817. NULL, test_command_generic);
  10818. test_bredrle50("Set PHY 1m 2m coded Succcess", &set_phy_all_success,
  10819. NULL, test_command_generic);
  10820. test_bredrle50("Set PHY 2m tx success", &set_phy_2m_tx_success,
  10821. NULL, test_command_generic);
  10822. test_bredrle50("Set PHY 2m rx success", &set_phy_2m_rx_success,
  10823. NULL, test_command_generic);
  10824. test_bredrle50("Set PHY Invalid Param", &set_phy_invalid_param,
  10825. NULL, test_command_generic);
  10826. test_bredrle50("Start Discovery BREDR LE - (Ext Scan Enable)",
  10827. &start_discovery_bredrle_ext_scan_enable,
  10828. NULL,
  10829. test_command_generic);
  10830. test_bredrle50("Start Discovery LE - (Ext Scan Enable)",
  10831. &start_discovery_le_ext_scan_enable,
  10832. NULL,
  10833. test_command_generic);
  10834. test_bredrle50("Start Discovery LE - (Ext Scan Param)",
  10835. &start_discovery_le_ext_scan_param,
  10836. NULL,
  10837. test_command_generic);
  10838. test_bredrle50("Stop Discovery - (Ext Scan Disable)",
  10839. &stop_discovery_le_ext_scan_disable,
  10840. setup_start_discovery, test_command_generic);
  10841. test_bredrle50("Start Discovery - (2m, Scan Param)",
  10842. &start_discovery_le_2m_scan_param,
  10843. setup_phy_configuration, test_command_generic);
  10844. test_bredrle50("Start Discovery - (coded, Scan Param)",
  10845. &start_discovery_le_coded_scan_param,
  10846. setup_phy_configuration, test_command_generic);
  10847. test_bredrle50("Start Discovery - (1m, 2m, coded, Scan Param)",
  10848. &start_discovery_le_1m_coded_scan_param,
  10849. setup_phy_configuration, test_command_generic);
  10850. test_bredrle50("Ext Device Found - Advertising data - Zero padded",
  10851. &device_found_gtag,
  10852. NULL, test_device_found);
  10853. test_bredrle50("Ext Device Found - Advertising data - Invalid field",
  10854. &device_found_invalid_field,
  10855. NULL, test_device_found);
  10856. test_bredrle50_full("Ext Adv. connectable & connected (peripheral)",
  10857. &conn_peripheral_adv_connectable_test,
  10858. setup_advertise_while_connected,
  10859. test_connected_and_advertising, 10);
  10860. test_bredrle50_full("Ext Adv. non-connectable & connected (peripheral)",
  10861. &conn_peripheral_adv_non_connectable_test,
  10862. setup_advertise_while_connected,
  10863. test_connected_and_advertising, 10);
  10864. test_bredrle50_full("Ext Adv. connectable & connected (central)",
  10865. &conn_central_adv_connectable_test,
  10866. setup_advertise_while_connected,
  10867. test_connected_and_advertising, 10);
  10868. test_bredrle50_full("Ext Adv. non-connectable & connected (central)",
  10869. &conn_central_adv_non_connectable_test,
  10870. setup_advertise_while_connected,
  10871. test_connected_and_advertising, 10);
  10872. test_bredrle("Read Controller Capabilities - Invalid parameters",
  10873. &read_controller_cap_invalid_param_test,
  10874. NULL, test_command_generic);
  10875. test_bredrle50("Read Controller Capabilities - (5.0) Success",
  10876. &read_controller_cap_success,
  10877. NULL, test_50_controller_cap_response);
  10878. test_bredrle("Ext Adv MGMT Params - Unpowered",
  10879. &adv_params_fail_unpowered,
  10880. setup_ext_adv_not_powered,
  10881. test_command_generic);
  10882. test_bredrle("Ext Adv MGMT Params - Invalid parameters",
  10883. &adv_params_fail_invalid_params,
  10884. NULL, test_command_generic);
  10885. test_bredrle("Ext Adv MGMT Params - Success",
  10886. &adv_params_success,
  10887. NULL, test_command_generic);
  10888. test_bredrle50("Ext Adv MGMT Params - (5.0) Success",
  10889. &adv_params_success_50,
  10890. NULL, test_command_generic);
  10891. test_bredrle("Ext Adv MGMT - Data set without Params",
  10892. &adv_data_fail_no_params,
  10893. NULL, test_command_generic);
  10894. test_bredrle50("Ext Adv MGMT - AD Data (5.0) Invalid parameters",
  10895. &adv_data_invalid_params,
  10896. setup_ext_adv_params,
  10897. test_command_generic);
  10898. test_bredrle50("Ext Adv MGMT - AD Data (5.0) Success",
  10899. &adv_data_success,
  10900. setup_ext_adv_params,
  10901. test_command_generic);
  10902. test_bredrle50("Ext Adv MGMT - AD Scan Response (5.0) Success",
  10903. &adv_scan_rsp_success,
  10904. setup_ext_adv_params,
  10905. test_command_generic);
  10906. /* MGMT_OP_SET_DEVICE_ID
  10907. * Using Bluetooth SIG for source.
  10908. */
  10909. test_bredrle50("Set Device ID - Success 1",
  10910. &set_dev_id_success_1,
  10911. NULL,
  10912. test_command_generic);
  10913. /* MGMT_OP_SET_DEVICE_ID
  10914. * Using SB Implementer's Forum for source.
  10915. */
  10916. test_bredrle50("Set Device ID - Success 2",
  10917. &set_dev_id_success_2,
  10918. NULL,
  10919. test_command_generic);
  10920. /* MGMT_OP_SET_DEVICE_ID
  10921. * Disable DID with disable flag for source.
  10922. */
  10923. test_bredrle50("Set Device ID - Disable",
  10924. &set_dev_id_disable,
  10925. NULL,
  10926. test_command_generic);
  10927. /* MGMT_OP_SET_DEVICE_ID
  10928. * Power off, set device id, and power on.
  10929. * Expect Write_Extended_Inquiry with device id when power on.
  10930. */
  10931. test_bredrle50("Set Device ID - Power off and Power on",
  10932. &set_dev_id_power_off_on,
  10933. setup_command_generic,
  10934. test_command_generic);
  10935. /* MGMT_OP_SET_DEVICE_ID
  10936. * SSP off, set device id, and SSP on.
  10937. * Expect Write_Extended_Inquiry with device id when SSP on.
  10938. */
  10939. test_bredrle50("Set Device ID - SSP off and Power on",
  10940. &set_dev_id_ssp_off_on,
  10941. setup_command_generic,
  10942. test_command_generic);
  10943. /* MGMT_OP_SET_DEVICE_ID
  10944. * Invalid parameter
  10945. */
  10946. test_bredrle50("Set Device ID - Invalid Parameter",
  10947. &set_dev_id_invalid_param,
  10948. NULL,
  10949. test_command_generic);
  10950. /* MGMT_OP_GET_DEVICE_FLAGS
  10951. * Success
  10952. */
  10953. test_bredrle50("Get Device Flags - Success",
  10954. &get_dev_flags_success,
  10955. setup_get_dev_flags,
  10956. test_command_generic);
  10957. /* MGMT_OP_GET_DEVICE_FLAGS
  10958. * Fail - Invalid parameter
  10959. */
  10960. test_bredrle50("Get Device Flags - Invalid Parameter",
  10961. &get_dev_flags_fail_1,
  10962. setup_get_dev_flags,
  10963. test_command_generic);
  10964. /* MGMT_OP_SET_DEVICE_FLAGS
  10965. * Success
  10966. */
  10967. test_bredrle50("Set Device Flags - Success",
  10968. &set_dev_flags_success,
  10969. setup_get_dev_flags,
  10970. test_command_generic);
  10971. /* MGMT_OP_SET_DEVICE_FLAGS
  10972. * Invalid Parameter - Missing parameter
  10973. */
  10974. test_bredrle50("Set Device Flags - Invalid Parameter 1",
  10975. &set_dev_flags_fail_1,
  10976. setup_get_dev_flags,
  10977. test_command_generic);
  10978. /* MGMT_OP_SET_DEVICE_FLAGS
  10979. * Invalid Parameter - Not supported value
  10980. */
  10981. test_bredrle50("Set Device Flags - Invalid Parameter 2",
  10982. &set_dev_flags_fail_2,
  10983. setup_get_dev_flags,
  10984. test_command_generic);
  10985. /* MGMT_OP_SET_DEVICE_FLAGS
  10986. * Device not exist
  10987. */
  10988. test_bredrle50("Set Device Flags - Device not found",
  10989. &set_dev_flags_fail_3,
  10990. setup_get_dev_flags,
  10991. test_command_generic);
  10992. /* Suspend/Resume
  10993. * Setup : Power on and register Suspend Event
  10994. * Run: Enable suspend via force_suspend
  10995. * Expect: Receive the Suspend Event
  10996. */
  10997. test_bredrle50("Suspend - Success 1",
  10998. &suspend_resume_success_1,
  10999. NULL, test_suspend_resume_success_1);
  11000. /* Suspend/Resume
  11001. * Setup : Power on and register Suspend Event
  11002. * Run: Enable suspend, and then resume via force_suspend
  11003. * Expect: Receive the Resume Event
  11004. */
  11005. test_bredrle50("Resume - Success 2",
  11006. &suspend_resume_success_2,
  11007. NULL, test_suspend_resume_success_2);
  11008. /* Suspend/Resume
  11009. * Setup: Enable LL Privacy and power on
  11010. * Run: Add new device, and enable suspend.
  11011. * Expect: Receive the Suspend Event
  11012. */
  11013. test_bredrle50("Suspend - Success 3 (Device in WL)",
  11014. &suspend_resume_success_3,
  11015. setup_suspend_resume_success_3,
  11016. test_suspend_resume_success_3);
  11017. /* Suspend/Resume
  11018. * Setup: Start advertising and power on.
  11019. * Run: Enable suspend
  11020. * Expect: Receive the Suspend Event
  11021. */
  11022. test_bredrle50("Suspend - Success 4 (Advertising)",
  11023. &suspend_resume_success_4,
  11024. setup_suspend_resume_success_4,
  11025. test_suspend_resume_success_4);
  11026. /* Suspend/Resume
  11027. * Setup: Pair.
  11028. * Run: Enable suspend
  11029. * Expect: Receive the Suspend Event
  11030. */
  11031. test_bredrle("Suspend - Success 5 (Pairing - Legacy)",
  11032. &suspend_resume_success_5, NULL,
  11033. test_suspend_resume_success_5);
  11034. /* Suspend/Resume
  11035. * Setup: Pair.
  11036. * Run: Enable suspend
  11037. * Expect: Receive the Suspend Event
  11038. */
  11039. test_bredrle("Suspend - Success 6 (Pairing - SSP)",
  11040. &suspend_resume_success_6,
  11041. setup_pairing_acceptor,
  11042. test_suspend_resume_success_5);
  11043. /* Suspend/Resume
  11044. * Setup : Power on and register Suspend Event
  11045. * Run: Enable suspend via force_suspend
  11046. * Expect: Receive the Suspend Event
  11047. */
  11048. test_bredrle50("Suspend - Success 7 (Suspend/Force Wakeup)",
  11049. &suspend_resume_success_7,
  11050. NULL, test_suspend_resume_success_7);
  11051. /* Suspend/Resume
  11052. * Setup : Power on
  11053. * Run: Start discover and enable suspend
  11054. * Expect: Receive the Suspend Event
  11055. */
  11056. test_bredrle50_full("Suspend - Success 8 (Discovery/Suspend)",
  11057. &suspend_resume_success_8,
  11058. NULL, test_suspend_resume_success_8, 4);
  11059. /* Suspend/Resume
  11060. * Setup : Power on, start discovery
  11061. * Run: Start discover, enable suspend and resume.
  11062. * Expect: Receive the Resume Event
  11063. */
  11064. test_bredrle50_full("Resume - Success 9 (Discovery/Suspend/Resume)",
  11065. &suspend_resume_success_9,
  11066. setup_suspend_resume_success_9,
  11067. test_suspend_resume_success_9, 4);
  11068. /* Suspend/Resume
  11069. * Setup : Power on
  11070. * Run: Suspend, Resume, Suspend, and Resume
  11071. * Expect:
  11072. */
  11073. test_bredrle50_full("Resume - Success 10 (Multiple Suspend/Resume)",
  11074. &suspend_resume_success_10,
  11075. setup_suspend_resume_success_10,
  11076. test_suspend_resume_success_10, 6);
  11077. /* MGMT_OP_READ_EXP_FEATURE
  11078. * Read Experimental features - success
  11079. */
  11080. test_bredrle50("Read Exp Feature - Success",
  11081. &read_exp_feat_success,
  11082. NULL, test_command_generic);
  11083. /* MGMT_OP_READ_EXP_FEATURE
  11084. * Read Experimental features - success (Index None)
  11085. */
  11086. test_bredrle50("Read Exp Feature - Success (Index None)",
  11087. &read_exp_feat_success_index_none,
  11088. NULL, test_command_generic);
  11089. /* MGMT_OP_SET_EXP_FEATURE
  11090. * Enable LL Privacy
  11091. */
  11092. test_bredrle50("Set Exp Feature - Enable LL Privacy",
  11093. &set_exp_feat_enable_ll_privacy,
  11094. setup_set_exp_feature_alt,
  11095. test_command_generic);
  11096. /* MGMT_OP_SET_EXP_FEATURE
  11097. * Offload Codec
  11098. */
  11099. test_bredrle50("Set Exp Feature - Offload Codec",
  11100. &set_exp_feat_offload_codec,
  11101. setup_set_exp_feature_alt,
  11102. test_command_generic);
  11103. /* MGMT_OP_SET_EXP_FEATURE
  11104. * Disable all features by sending zero UUID
  11105. */
  11106. test_bredrle50("Set Exp Feature - Disable all",
  11107. &set_exp_feat_disable,
  11108. NULL, test_command_generic);
  11109. /* MGMT_OP_SET_EXP_FEATURE
  11110. * Rejected - If the power is on, the command should be rejected
  11111. */
  11112. test_bredrle50("Set Exp Feature - Rejected",
  11113. &set_exp_feat_rejected,
  11114. NULL, test_command_generic);
  11115. /* MGMT_OP_SET_EXP_FEATURE
  11116. * Invalid parameter
  11117. */
  11118. test_bredrle50("Set Exp Feature - Invalid params",
  11119. &set_exp_feat_invalid,
  11120. NULL, test_command_generic);
  11121. /* MGMT_OP_SET_EXP_FEATURE
  11122. * Not Supported UUID
  11123. */
  11124. test_bredrle50("Set Exp Feature - Unknown feature",
  11125. &set_exp_feat_unknown,
  11126. NULL, test_command_generic);
  11127. return tester_run();
  11128. }