packet.c 371 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677
  1. // SPDX-License-Identifier: LGPL-2.1-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2011-2014 Intel Corporation
  7. * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
  8. *
  9. *
  10. */
  11. #ifdef HAVE_CONFIG_H
  12. #include <config.h>
  13. #endif
  14. #define _GNU_SOURCE
  15. #include <stdio.h>
  16. #include <errno.h>
  17. #include <ctype.h>
  18. #include <unistd.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <stdbool.h>
  22. #include <inttypes.h>
  23. #include <time.h>
  24. #include <sys/time.h>
  25. #include <sys/socket.h>
  26. #include "lib/bluetooth.h"
  27. #include "lib/uuid.h"
  28. #include "lib/hci.h"
  29. #include "lib/hci_lib.h"
  30. #include "src/shared/util.h"
  31. #include "src/shared/btsnoop.h"
  32. #include "display.h"
  33. #include "bt.h"
  34. #include "ll.h"
  35. #include "hwdb.h"
  36. #include "keys.h"
  37. #include "l2cap.h"
  38. #include "control.h"
  39. #include "vendor.h"
  40. #include "msft.h"
  41. #include "intel.h"
  42. #include "broadcom.h"
  43. #include "packet.h"
  44. #define COLOR_CHANNEL_LABEL COLOR_WHITE
  45. #define COLOR_FRAME_LABEL COLOR_WHITE
  46. #define COLOR_INDEX_LABEL COLOR_WHITE
  47. #define COLOR_TIMESTAMP COLOR_YELLOW
  48. #define COLOR_NEW_INDEX COLOR_GREEN
  49. #define COLOR_DEL_INDEX COLOR_RED
  50. #define COLOR_OPEN_INDEX COLOR_GREEN
  51. #define COLOR_CLOSE_INDEX COLOR_RED
  52. #define COLOR_INDEX_INFO COLOR_GREEN
  53. #define COLOR_VENDOR_DIAG COLOR_YELLOW
  54. #define COLOR_SYSTEM_NOTE COLOR_OFF
  55. #define COLOR_HCI_COMMAND COLOR_BLUE
  56. #define COLOR_HCI_COMMAND_UNKNOWN COLOR_WHITE_BG
  57. #define COLOR_HCI_EVENT COLOR_MAGENTA
  58. #define COLOR_HCI_EVENT_UNKNOWN COLOR_WHITE_BG
  59. #define COLOR_HCI_ACLDATA COLOR_CYAN
  60. #define COLOR_HCI_SCODATA COLOR_YELLOW
  61. #define COLOR_UNKNOWN_ERROR COLOR_WHITE_BG
  62. #define COLOR_UNKNOWN_FEATURE_BIT COLOR_WHITE_BG
  63. #define COLOR_UNKNOWN_COMMAND_BIT COLOR_WHITE_BG
  64. #define COLOR_UNKNOWN_EVENT_MASK COLOR_WHITE_BG
  65. #define COLOR_UNKNOWN_LE_STATES COLOR_WHITE_BG
  66. #define COLOR_UNKNOWN_SERVICE_CLASS COLOR_WHITE_BG
  67. #define COLOR_UNKNOWN_PKT_TYPE_BIT COLOR_WHITE_BG
  68. #define COLOR_CTRL_OPEN COLOR_GREEN_BOLD
  69. #define COLOR_CTRL_CLOSE COLOR_RED_BOLD
  70. #define COLOR_CTRL_COMMAND COLOR_BLUE_BOLD
  71. #define COLOR_CTRL_COMMAND_UNKNOWN COLOR_WHITE_BG
  72. #define COLOR_CTRL_EVENT COLOR_MAGENTA_BOLD
  73. #define COLOR_CTRL_EVENT_UNKNOWN COLOR_WHITE_BG
  74. #define COLOR_UNKNOWN_OPTIONS_BIT COLOR_WHITE_BG
  75. #define COLOR_UNKNOWN_SETTINGS_BIT COLOR_WHITE_BG
  76. #define COLOR_UNKNOWN_ADDRESS_TYPE COLOR_WHITE_BG
  77. #define COLOR_UNKNOWN_DEVICE_FLAG COLOR_WHITE_BG
  78. #define COLOR_UNKNOWN_EXP_FEATURE_FLAG COLOR_WHITE_BG
  79. #define COLOR_UNKNOWN_ADV_FLAG COLOR_WHITE_BG
  80. #define COLOR_UNKNOWN_PHY COLOR_WHITE_BG
  81. #define COLOR_UNKNOWN_ADDED_DEVICE_FLAG COLOR_WHITE_BG
  82. #define COLOR_UNKNOWN_ADVMON_FEATURES COLOR_WHITE_BG
  83. #define COLOR_PHY_PACKET COLOR_BLUE
  84. #define UNKNOWN_MANUFACTURER 0xffff
  85. static time_t time_offset = ((time_t) -1);
  86. static int priority_level = BTSNOOP_PRIORITY_INFO;
  87. static unsigned long filter_mask = 0;
  88. static bool index_filter = false;
  89. static uint16_t index_current = 0;
  90. static uint16_t fallback_manufacturer = UNKNOWN_MANUFACTURER;
  91. #define CTRL_RAW 0x0000
  92. #define CTRL_USER 0x0001
  93. #define CTRL_MGMT 0x0002
  94. #define MAX_CTRL 64
  95. struct ctrl_data {
  96. bool used;
  97. uint32_t cookie;
  98. uint16_t format;
  99. char name[20];
  100. };
  101. static struct ctrl_data ctrl_list[MAX_CTRL];
  102. static void assign_ctrl(uint32_t cookie, uint16_t format, const char *name)
  103. {
  104. int i;
  105. for (i = 0; i < MAX_CTRL; i++) {
  106. if (!ctrl_list[i].used) {
  107. ctrl_list[i].used = true;
  108. ctrl_list[i].cookie = cookie;
  109. ctrl_list[i].format = format;
  110. if (name) {
  111. strncpy(ctrl_list[i].name, name, 19);
  112. ctrl_list[i].name[19] = '\0';
  113. } else
  114. strcpy(ctrl_list[i].name, "null");
  115. break;
  116. }
  117. }
  118. }
  119. static void release_ctrl(uint32_t cookie, uint16_t *format, char *name)
  120. {
  121. int i;
  122. if (format)
  123. *format = 0xffff;
  124. for (i = 0; i < MAX_CTRL; i++) {
  125. if (ctrl_list[i].used && ctrl_list[i].cookie == cookie) {
  126. ctrl_list[i].used = false;
  127. if (format)
  128. *format = ctrl_list[i].format;
  129. if (name)
  130. strncpy(name, ctrl_list[i].name, 20);
  131. break;
  132. }
  133. }
  134. }
  135. static uint16_t get_format(uint32_t cookie)
  136. {
  137. int i;
  138. for (i = 0; i < MAX_CTRL; i++) {
  139. if (ctrl_list[i].used && ctrl_list[i].cookie == cookie)
  140. return ctrl_list[i].format;
  141. }
  142. return 0xffff;
  143. }
  144. #define MAX_CONN 16
  145. struct conn_data {
  146. uint16_t handle;
  147. uint8_t type;
  148. };
  149. static struct conn_data conn_list[MAX_CONN];
  150. static void assign_handle(uint16_t handle, uint8_t type)
  151. {
  152. int i;
  153. for (i = 0; i < MAX_CONN; i++) {
  154. if (conn_list[i].handle == 0x0000) {
  155. conn_list[i].handle = handle;
  156. conn_list[i].type = type;
  157. break;
  158. }
  159. }
  160. }
  161. static void release_handle(uint16_t handle)
  162. {
  163. int i;
  164. for (i = 0; i < MAX_CONN; i++) {
  165. if (conn_list[i].handle == handle) {
  166. conn_list[i].handle = 0x0000;
  167. conn_list[i].type = 0x00;
  168. break;
  169. }
  170. }
  171. }
  172. static uint8_t get_type(uint16_t handle)
  173. {
  174. int i;
  175. for (i = 0; i < MAX_CONN; i++) {
  176. if (conn_list[i].handle == handle)
  177. return conn_list[i].type;
  178. }
  179. return 0xff;
  180. }
  181. bool packet_has_filter(unsigned long filter)
  182. {
  183. return filter_mask & filter;
  184. }
  185. void packet_set_filter(unsigned long filter)
  186. {
  187. filter_mask = filter;
  188. }
  189. void packet_add_filter(unsigned long filter)
  190. {
  191. if (index_filter)
  192. filter &= ~PACKET_FILTER_SHOW_INDEX;
  193. filter_mask |= filter;
  194. }
  195. void packet_del_filter(unsigned long filter)
  196. {
  197. filter_mask &= ~filter;
  198. }
  199. void packet_set_priority(const char *priority)
  200. {
  201. if (!priority)
  202. return;
  203. if (!strcasecmp(priority, "debug"))
  204. priority_level = BTSNOOP_PRIORITY_DEBUG;
  205. else
  206. priority_level = atoi(priority);
  207. }
  208. void packet_select_index(uint16_t index)
  209. {
  210. filter_mask &= ~PACKET_FILTER_SHOW_INDEX;
  211. control_filter_index(index);
  212. index_filter = true;
  213. }
  214. #define print_space(x) printf("%*c", (x), ' ');
  215. #define MAX_INDEX 16
  216. struct index_data {
  217. uint8_t type;
  218. uint8_t bdaddr[6];
  219. uint16_t manufacturer;
  220. uint16_t msft_opcode;
  221. uint8_t msft_evt_prefix[8];
  222. uint8_t msft_evt_len;
  223. size_t frame;
  224. };
  225. static struct index_data index_list[MAX_INDEX];
  226. void packet_set_fallback_manufacturer(uint16_t manufacturer)
  227. {
  228. int i;
  229. for (i = 0; i < MAX_INDEX; i++)
  230. index_list[i].manufacturer = manufacturer;
  231. fallback_manufacturer = manufacturer;
  232. }
  233. void packet_set_msft_evt_prefix(const uint8_t *prefix, uint8_t len)
  234. {
  235. if (index_current < MAX_INDEX && len < 8)
  236. memcpy(index_list[index_current].msft_evt_prefix, prefix, len);
  237. }
  238. static void print_packet(struct timeval *tv, struct ucred *cred, char ident,
  239. uint16_t index, const char *channel,
  240. const char *color, const char *label,
  241. const char *text, const char *extra)
  242. {
  243. int col = num_columns();
  244. char line[256], ts_str[96];
  245. int n, ts_len = 0, ts_pos = 0, len = 0, pos = 0;
  246. static size_t last_frame;
  247. if (channel) {
  248. if (use_color()) {
  249. n = sprintf(ts_str + ts_pos, "%s", COLOR_CHANNEL_LABEL);
  250. if (n > 0)
  251. ts_pos += n;
  252. }
  253. n = sprintf(ts_str + ts_pos, " {%s}", channel);
  254. if (n > 0) {
  255. ts_pos += n;
  256. ts_len += n;
  257. }
  258. } else if (index != HCI_DEV_NONE && index < MAX_INDEX &&
  259. index_list[index].frame != last_frame) {
  260. if (use_color()) {
  261. n = sprintf(ts_str + ts_pos, "%s", COLOR_FRAME_LABEL);
  262. if (n > 0)
  263. ts_pos += n;
  264. }
  265. n = sprintf(ts_str + ts_pos, " #%zu", index_list[index].frame);
  266. if (n > 0) {
  267. ts_pos += n;
  268. ts_len += n;
  269. }
  270. last_frame = index_list[index].frame;
  271. }
  272. if ((filter_mask & PACKET_FILTER_SHOW_INDEX) &&
  273. index != HCI_DEV_NONE) {
  274. if (use_color()) {
  275. n = sprintf(ts_str + ts_pos, "%s", COLOR_INDEX_LABEL);
  276. if (n > 0)
  277. ts_pos += n;
  278. }
  279. n = sprintf(ts_str + ts_pos, " [hci%d]", index);
  280. if (n > 0) {
  281. ts_pos += n;
  282. ts_len += n;
  283. }
  284. }
  285. if (tv) {
  286. time_t t = tv->tv_sec;
  287. struct tm tm;
  288. localtime_r(&t, &tm);
  289. if (use_color()) {
  290. n = sprintf(ts_str + ts_pos, "%s", COLOR_TIMESTAMP);
  291. if (n > 0)
  292. ts_pos += n;
  293. }
  294. if (filter_mask & PACKET_FILTER_SHOW_DATE) {
  295. n = sprintf(ts_str + ts_pos, " %04d-%02d-%02d",
  296. tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
  297. if (n > 0) {
  298. ts_pos += n;
  299. ts_len += n;
  300. }
  301. }
  302. if (filter_mask & PACKET_FILTER_SHOW_TIME) {
  303. n = sprintf(ts_str + ts_pos, " %02d:%02d:%02d.%06lu",
  304. tm.tm_hour, tm.tm_min, tm.tm_sec, tv->tv_usec);
  305. if (n > 0) {
  306. ts_pos += n;
  307. ts_len += n;
  308. }
  309. }
  310. if (filter_mask & PACKET_FILTER_SHOW_TIME_OFFSET) {
  311. n = sprintf(ts_str + ts_pos, " %lu.%06lu",
  312. tv->tv_sec - time_offset, tv->tv_usec);
  313. if (n > 0) {
  314. ts_pos += n;
  315. ts_len += n;
  316. }
  317. }
  318. }
  319. if (use_color()) {
  320. n = sprintf(ts_str + ts_pos, "%s", COLOR_OFF);
  321. if (n > 0)
  322. ts_pos += n;
  323. }
  324. if (use_color()) {
  325. n = sprintf(line + pos, "%s", color);
  326. if (n > 0)
  327. pos += n;
  328. }
  329. n = sprintf(line + pos, "%c %s", ident, label ? label : "");
  330. if (n > 0) {
  331. pos += n;
  332. len += n;
  333. }
  334. if (text) {
  335. int extra_len = extra ? strlen(extra) : 0;
  336. int max_len = col - len - extra_len - ts_len - 3;
  337. n = snprintf(line + pos, max_len + 1, "%s%s",
  338. label ? ": " : "", text);
  339. if (n > max_len) {
  340. line[pos + max_len - 1] = '.';
  341. line[pos + max_len - 2] = '.';
  342. if (line[pos + max_len - 3] == ' ')
  343. line[pos + max_len - 3] = '.';
  344. n = max_len;
  345. }
  346. if (n > 0) {
  347. pos += n;
  348. len += n;
  349. }
  350. }
  351. if (use_color()) {
  352. n = sprintf(line + pos, "%s", COLOR_OFF);
  353. if (n > 0)
  354. pos += n;
  355. }
  356. if (extra) {
  357. n = sprintf(line + pos, " %s", extra);
  358. if (n > 0) {
  359. pos += n;
  360. len += n;
  361. }
  362. }
  363. if (ts_len > 0) {
  364. printf("%s", line);
  365. if (len < col)
  366. print_space(col - len - ts_len - 1);
  367. printf("%s%s\n", use_color() ? COLOR_TIMESTAMP : "", ts_str);
  368. } else
  369. printf("%s\n", line);
  370. }
  371. static const struct {
  372. uint8_t error;
  373. const char *str;
  374. } error2str_table[] = {
  375. { 0x00, "Success" },
  376. { 0x01, "Unknown HCI Command" },
  377. { 0x02, "Unknown Connection Identifier" },
  378. { 0x03, "Hardware Failure" },
  379. { 0x04, "Page Timeout" },
  380. { 0x05, "Authentication Failure" },
  381. { 0x06, "PIN or Key Missing" },
  382. { 0x07, "Memory Capacity Exceeded" },
  383. { 0x08, "Connection Timeout" },
  384. { 0x09, "Connection Limit Exceeded" },
  385. { 0x0a, "Synchronous Connection Limit to a Device Exceeded" },
  386. { 0x0b, "ACL Connection Already Exists" },
  387. { 0x0c, "Command Disallowed" },
  388. { 0x0d, "Connection Rejected due to Limited Resources" },
  389. { 0x0e, "Connection Rejected due to Security Reasons" },
  390. { 0x0f, "Connection Rejected due to Unacceptable BD_ADDR" },
  391. { 0x10, "Connection Accept Timeout Exceeded" },
  392. { 0x11, "Unsupported Feature or Parameter Value" },
  393. { 0x12, "Invalid HCI Command Parameters" },
  394. { 0x13, "Remote User Terminated Connection" },
  395. { 0x14, "Remote Device Terminated due to Low Resources" },
  396. { 0x15, "Remote Device Terminated due to Power Off" },
  397. { 0x16, "Connection Terminated By Local Host" },
  398. { 0x17, "Repeated Attempts" },
  399. { 0x18, "Pairing Not Allowed" },
  400. { 0x19, "Unknown LMP PDU" },
  401. { 0x1a, "Unsupported Remote Feature / Unsupported LMP Feature" },
  402. { 0x1b, "SCO Offset Rejected" },
  403. { 0x1c, "SCO Interval Rejected" },
  404. { 0x1d, "SCO Air Mode Rejected" },
  405. { 0x1e, "Invalid LMP Parameters / Invalid LL Parameters" },
  406. { 0x1f, "Unspecified Error" },
  407. { 0x20, "Unsupported LMP Parameter Value / "
  408. "Unsupported LL Parameter Value" },
  409. { 0x21, "Role Change Not Allowed" },
  410. { 0x22, "LMP Response Timeout / LL Response Timeout" },
  411. { 0x23, "LMP Error Transaction Collision" },
  412. { 0x24, "LMP PDU Not Allowed" },
  413. { 0x25, "Encryption Mode Not Acceptable" },
  414. { 0x26, "Link Key cannot be Changed" },
  415. { 0x27, "Requested QoS Not Supported" },
  416. { 0x28, "Instant Passed" },
  417. { 0x29, "Pairing With Unit Key Not Supported" },
  418. { 0x2a, "Different Transaction Collision" },
  419. { 0x2b, "Reserved" },
  420. { 0x2c, "QoS Unacceptable Parameter" },
  421. { 0x2d, "QoS Rejected" },
  422. { 0x2e, "Channel Classification Not Supported" },
  423. { 0x2f, "Insufficient Security" },
  424. { 0x30, "Parameter Out Of Manadatory Range" },
  425. { 0x31, "Reserved" },
  426. { 0x32, "Role Switch Pending" },
  427. { 0x33, "Reserved" },
  428. { 0x34, "Reserved Slot Violation" },
  429. { 0x35, "Role Switch Failed" },
  430. { 0x36, "Extended Inquiry Response Too Large" },
  431. { 0x37, "Secure Simple Pairing Not Supported By Host" },
  432. { 0x38, "Host Busy - Pairing" },
  433. { 0x39, "Connection Rejected due to No Suitable Channel Found" },
  434. { 0x3a, "Controller Busy" },
  435. { 0x3b, "Unacceptable Connection Parameters" },
  436. { 0x3c, "Advertising Timeout" },
  437. { 0x3d, "Connection Terminated due to MIC Failure" },
  438. { 0x3e, "Connection Failed to be Established" },
  439. { 0x3f, "MAC Connection Failed" },
  440. { 0x40, "Coarse Clock Adjustment Rejected "
  441. "but Will Try to Adjust Using Clock Dragging" },
  442. { 0x41, "Type0 Submap Not Defined" },
  443. { 0x42, "Unknown Advertising Identifier" },
  444. { 0x43, "Limit Reached" },
  445. { 0x44, "Operation Cancelled by Host" },
  446. { 0x45, "Packet Too Long" },
  447. { }
  448. };
  449. static void print_error(const char *label, uint8_t error)
  450. {
  451. const char *str = "Unknown";
  452. const char *color_on, *color_off;
  453. bool unknown = true;
  454. int i;
  455. for (i = 0; error2str_table[i].str; i++) {
  456. if (error2str_table[i].error == error) {
  457. str = error2str_table[i].str;
  458. unknown = false;
  459. break;
  460. }
  461. }
  462. if (use_color()) {
  463. if (error) {
  464. if (unknown)
  465. color_on = COLOR_UNKNOWN_ERROR;
  466. else
  467. color_on = COLOR_RED;
  468. } else
  469. color_on = COLOR_GREEN;
  470. color_off = COLOR_OFF;
  471. } else {
  472. color_on = "";
  473. color_off = "";
  474. }
  475. print_field("%s: %s%s%s (0x%2.2x)", label,
  476. color_on, str, color_off, error);
  477. }
  478. static void print_status(uint8_t status)
  479. {
  480. print_error("Status", status);
  481. }
  482. static void print_reason(uint8_t reason)
  483. {
  484. print_error("Reason", reason);
  485. }
  486. void packet_print_error(const char *label, uint8_t error)
  487. {
  488. print_error(label, error);
  489. }
  490. static void print_enable(const char *label, uint8_t enable)
  491. {
  492. const char *str;
  493. switch (enable) {
  494. case 0x00:
  495. str = "Disabled";
  496. break;
  497. case 0x01:
  498. str = "Enabled";
  499. break;
  500. default:
  501. str = "Reserved";
  502. break;
  503. }
  504. print_field("%s: %s (0x%2.2x)", label, str, enable);
  505. }
  506. static void print_addr_type(const char *label, uint8_t addr_type)
  507. {
  508. const char *str;
  509. switch (addr_type) {
  510. case 0x00:
  511. str = "Public";
  512. break;
  513. case 0x01:
  514. str = "Random";
  515. break;
  516. default:
  517. str = "Reserved";
  518. break;
  519. }
  520. print_field("%s: %s (0x%2.2x)", label, str, addr_type);
  521. }
  522. static void print_own_addr_type(uint8_t addr_type)
  523. {
  524. const char *str;
  525. switch (addr_type) {
  526. case 0x00:
  527. case 0x02:
  528. str = "Public";
  529. break;
  530. case 0x01:
  531. case 0x03:
  532. str = "Random";
  533. break;
  534. default:
  535. str = "Reserved";
  536. break;
  537. }
  538. print_field("Own address type: %s (0x%2.2x)", str, addr_type);
  539. }
  540. static void print_peer_addr_type(const char *label, uint8_t addr_type)
  541. {
  542. const char *str;
  543. switch (addr_type) {
  544. case 0x00:
  545. str = "Public";
  546. break;
  547. case 0x01:
  548. str = "Random";
  549. break;
  550. case 0x02:
  551. str = "Resolved Public";
  552. break;
  553. case 0x03:
  554. str = "Resolved Random";
  555. break;
  556. default:
  557. str = "Reserved";
  558. break;
  559. }
  560. print_field("%s: %s (0x%2.2x)", label, str, addr_type);
  561. }
  562. static void print_addr_resolve(const char *label, const uint8_t *addr,
  563. uint8_t addr_type, bool resolve)
  564. {
  565. const char *str;
  566. char *company;
  567. switch (addr_type) {
  568. case 0x00:
  569. case 0x02:
  570. if (!hwdb_get_company(addr, &company))
  571. company = NULL;
  572. if (company) {
  573. print_field("%s: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X"
  574. " (%s)", label, addr[5], addr[4],
  575. addr[3], addr[2],
  576. addr[1], addr[0],
  577. company);
  578. free(company);
  579. } else {
  580. print_field("%s: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X"
  581. " (OUI %2.2X-%2.2X-%2.2X)", label,
  582. addr[5], addr[4], addr[3],
  583. addr[2], addr[1], addr[0],
  584. addr[5], addr[4], addr[3]);
  585. }
  586. break;
  587. case 0x01:
  588. case 0x03:
  589. switch ((addr[5] & 0xc0) >> 6) {
  590. case 0x00:
  591. str = "Non-Resolvable";
  592. break;
  593. case 0x01:
  594. str = "Resolvable";
  595. break;
  596. case 0x03:
  597. str = "Static";
  598. break;
  599. default:
  600. str = "Reserved";
  601. break;
  602. }
  603. print_field("%s: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X (%s)",
  604. label, addr[5], addr[4], addr[3],
  605. addr[2], addr[1], addr[0], str);
  606. if (resolve && (addr[5] & 0xc0) == 0x40) {
  607. uint8_t ident[6], ident_type;
  608. if (keys_resolve_identity(addr, ident, &ident_type)) {
  609. print_addr_type(" Identity type", ident_type);
  610. print_addr_resolve(" Identity", ident,
  611. ident_type, false);
  612. }
  613. }
  614. break;
  615. default:
  616. print_field("%s: %2.2X-%2.2X-%2.2X-%2.2X-%2.2X-%2.2X",
  617. label, addr[5], addr[4], addr[3],
  618. addr[2], addr[1], addr[0]);
  619. break;
  620. }
  621. }
  622. static void print_addr(const char *label, const uint8_t *addr, uint8_t type)
  623. {
  624. print_addr_resolve(label, addr, type, true);
  625. }
  626. static void print_bdaddr(const uint8_t *bdaddr)
  627. {
  628. print_addr("Address", bdaddr, 0x00);
  629. }
  630. static void print_lt_addr(uint8_t lt_addr)
  631. {
  632. print_field("LT address: %d", lt_addr);
  633. }
  634. static void print_handle_native(uint16_t handle)
  635. {
  636. print_field("Handle: %d", handle);
  637. }
  638. static void print_handle(uint16_t handle)
  639. {
  640. print_handle_native(le16_to_cpu(handle));
  641. }
  642. static void print_phy_handle(uint8_t phy_handle)
  643. {
  644. print_field("Physical handle: %d", phy_handle);
  645. }
  646. static const struct bitfield_data pkt_type_table[] = {
  647. { 1, "2-DH1 may not be used" },
  648. { 2, "3-DH1 may not be used" },
  649. { 3, "DM1 may be used" },
  650. { 4, "DH1 may be used" },
  651. { 8, "2-DH3 may not be used" },
  652. { 9, "3-DH3 may not be used" },
  653. { 10, "DM3 may be used" },
  654. { 11, "DH3 may be used" },
  655. { 12, "2-DH5 may not be used" },
  656. { 13, "3-DH5 may not be used" },
  657. { 14, "DM5 may be used" },
  658. { 15, "DH5 may be used" },
  659. { }
  660. };
  661. static void print_pkt_type(uint16_t pkt_type)
  662. {
  663. uint16_t mask = le16_to_cpu(pkt_type);
  664. print_field("Packet type: 0x%4.4x", mask);
  665. mask = print_bitfield(2, mask, pkt_type_table);
  666. if (mask)
  667. print_text(COLOR_UNKNOWN_PKT_TYPE_BIT,
  668. " Unknown packet types (0x%4.4x)", mask);
  669. }
  670. static const struct bitfield_data pkt_type_sco_table[] = {
  671. { 0, "HV1 may be used" },
  672. { 1, "HV2 may be used" },
  673. { 2, "HV3 may be used" },
  674. { 3, "EV3 may be used" },
  675. { 4, "EV4 may be used" },
  676. { 5, "EV5 may be used" },
  677. { 6, "2-EV3 may not be used" },
  678. { 7, "3-EV3 may not be used" },
  679. { 8, "2-EV5 may not be used" },
  680. { 9, "3-EV5 may not be used" },
  681. { }
  682. };
  683. static void print_pkt_type_sco(uint16_t pkt_type)
  684. {
  685. uint16_t mask = le16_to_cpu(pkt_type);
  686. print_field("Packet type: 0x%4.4x", mask);
  687. mask = print_bitfield(2, mask, pkt_type_sco_table);
  688. if (mask)
  689. print_text(COLOR_UNKNOWN_PKT_TYPE_BIT,
  690. " Unknown packet types (0x%4.4x)", mask);
  691. }
  692. static void print_iac(const uint8_t *lap)
  693. {
  694. const char *str = "";
  695. if (lap[2] == 0x9e && lap[1] == 0x8b) {
  696. switch (lap[0]) {
  697. case 0x33:
  698. str = " (General Inquiry)";
  699. break;
  700. case 0x00:
  701. str = " (Limited Inquiry)";
  702. break;
  703. }
  704. }
  705. print_field("Access code: 0x%2.2x%2.2x%2.2x%s",
  706. lap[2], lap[1], lap[0], str);
  707. }
  708. static void print_auth_enable(uint8_t enable)
  709. {
  710. const char *str;
  711. switch (enable) {
  712. case 0x00:
  713. str = "Authentication not required";
  714. break;
  715. case 0x01:
  716. str = "Authentication required for all connections";
  717. break;
  718. default:
  719. str = "Reserved";
  720. break;
  721. }
  722. print_field("Enable: %s (0x%2.2x)", str, enable);
  723. }
  724. static void print_encrypt_mode(uint8_t mode)
  725. {
  726. const char *str;
  727. switch (mode) {
  728. case 0x00:
  729. str = "Encryption not required";
  730. break;
  731. case 0x01:
  732. str = "Encryption required for all connections";
  733. break;
  734. default:
  735. str = "Reserved";
  736. break;
  737. }
  738. print_field("Mode: %s (0x%2.2x)", str, mode);
  739. }
  740. static const struct bitfield_data svc_class_table[] = {
  741. { 0, "Positioning (Location identification)" },
  742. { 1, "Networking (LAN, Ad hoc)" },
  743. { 2, "Rendering (Printing, Speaker)" },
  744. { 3, "Capturing (Scanner, Microphone)" },
  745. { 4, "Object Transfer (v-Inbox, v-Folder)" },
  746. { 5, "Audio (Speaker, Microphone, Headset)" },
  747. { 6, "Telephony (Cordless telephony, Modem, Headset)" },
  748. { 7, "Information (WEB-server, WAP-server)" },
  749. { }
  750. };
  751. static const struct {
  752. uint8_t val;
  753. const char *str;
  754. } major_class_computer_table[] = {
  755. { 0x00, "Uncategorized, code for device not assigned" },
  756. { 0x01, "Desktop workstation" },
  757. { 0x02, "Server-class computer" },
  758. { 0x03, "Laptop" },
  759. { 0x04, "Handheld PC/PDA (clam shell)" },
  760. { 0x05, "Palm sized PC/PDA" },
  761. { 0x06, "Wearable computer (Watch sized)" },
  762. { 0x07, "Tablet" },
  763. { }
  764. };
  765. static const char *major_class_computer(uint8_t minor)
  766. {
  767. int i;
  768. for (i = 0; major_class_computer_table[i].str; i++) {
  769. if (major_class_computer_table[i].val == minor)
  770. return major_class_computer_table[i].str;
  771. }
  772. return NULL;
  773. }
  774. static const struct {
  775. uint8_t val;
  776. const char *str;
  777. } major_class_phone_table[] = {
  778. { 0x00, "Uncategorized, code for device not assigned" },
  779. { 0x01, "Cellular" },
  780. { 0x02, "Cordless" },
  781. { 0x03, "Smart phone" },
  782. { 0x04, "Wired modem or voice gateway" },
  783. { 0x05, "Common ISDN Access" },
  784. { }
  785. };
  786. static const char *major_class_phone(uint8_t minor)
  787. {
  788. int i;
  789. for (i = 0; major_class_phone_table[i].str; i++) {
  790. if (major_class_phone_table[i].val == minor)
  791. return major_class_phone_table[i].str;
  792. }
  793. return NULL;
  794. }
  795. static const struct {
  796. uint8_t val;
  797. const char *str;
  798. } major_class_av_table[] = {
  799. { 0x00, "Uncategorized, code for device not assigned" },
  800. { 0x01, "Wearable Headset Device" },
  801. { 0x02, "Hands-free Device" },
  802. { 0x04, "Microphone" },
  803. { 0x05, "Loudspeaker" },
  804. { 0x06, "Headphones" },
  805. { 0x07, "Portable Audio" },
  806. { 0x08, "Car audio" },
  807. { 0x09, "Set-top box" },
  808. { 0x0a, "HiFi Audio Device" },
  809. { 0x0b, "VCR" },
  810. { 0x0c, "Video Camera" },
  811. { 0x0d, "Camcorder" },
  812. { 0x0e, "Video Monitor" },
  813. { 0x0f, "Video Display and Loudspeaker" },
  814. { 0x10, "Video Conferencing" },
  815. { 0x12, "Gaming/Toy" },
  816. { }
  817. };
  818. static const char *major_class_av(uint8_t minor)
  819. {
  820. int i;
  821. for (i = 0; major_class_av_table[i].str; i++) {
  822. if (major_class_av_table[i].val == minor)
  823. return major_class_av_table[i].str;
  824. }
  825. return NULL;
  826. }
  827. static const struct {
  828. uint8_t val;
  829. const char *str;
  830. } major_class_wearable_table[] = {
  831. { 0x01, "Wrist Watch" },
  832. { 0x02, "Pager" },
  833. { 0x03, "Jacket" },
  834. { 0x04, "Helmet" },
  835. { 0x05, "Glasses" },
  836. { }
  837. };
  838. static const char *major_class_wearable(uint8_t minor)
  839. {
  840. int i;
  841. for (i = 0; major_class_wearable_table[i].str; i++) {
  842. if (major_class_wearable_table[i].val == minor)
  843. return major_class_wearable_table[i].str;
  844. }
  845. return NULL;
  846. }
  847. static const struct {
  848. uint8_t val;
  849. const char *str;
  850. const char *(*func)(uint8_t minor);
  851. } major_class_table[] = {
  852. { 0x00, "Miscellaneous" },
  853. { 0x01, "Computer (desktop, notebook, PDA, organizers)",
  854. major_class_computer },
  855. { 0x02, "Phone (cellular, cordless, payphone, modem)",
  856. major_class_phone },
  857. { 0x03, "LAN /Network Access point" },
  858. { 0x04, "Audio/Video (headset, speaker, stereo, video, vcr)",
  859. major_class_av },
  860. { 0x05, "Peripheral (mouse, joystick, keyboards)" },
  861. { 0x06, "Imaging (printing, scanner, camera, display)" },
  862. { 0x07, "Wearable", major_class_wearable },
  863. { 0x08, "Toy" },
  864. { 0x09, "Health" },
  865. { 0x1f, "Uncategorized, specific device code not specified" },
  866. { }
  867. };
  868. static void print_dev_class(const uint8_t *dev_class)
  869. {
  870. uint8_t mask, major_cls, minor_cls;
  871. const char *major_str = NULL;
  872. const char *minor_str = NULL;
  873. int i;
  874. print_field("Class: 0x%2.2x%2.2x%2.2x",
  875. dev_class[2], dev_class[1], dev_class[0]);
  876. if ((dev_class[0] & 0x03) != 0x00) {
  877. print_field(" Format type: 0x%2.2x", dev_class[0] & 0x03);
  878. print_text(COLOR_ERROR, " invalid format type");
  879. return;
  880. }
  881. major_cls = dev_class[1] & 0x1f;
  882. minor_cls = (dev_class[0] & 0xfc) >> 2;
  883. for (i = 0; major_class_table[i].str; i++) {
  884. if (major_class_table[i].val == major_cls) {
  885. major_str = major_class_table[i].str;
  886. if (!major_class_table[i].func)
  887. break;
  888. minor_str = major_class_table[i].func(minor_cls);
  889. break;
  890. }
  891. }
  892. if (major_str) {
  893. print_field(" Major class: %s", major_str);
  894. if (minor_str)
  895. print_field(" Minor class: %s", minor_str);
  896. else
  897. print_field(" Minor class: 0x%2.2x", minor_cls);
  898. } else {
  899. print_field(" Major class: 0x%2.2x", major_cls);
  900. print_field(" Minor class: 0x%2.2x", minor_cls);
  901. }
  902. if (dev_class[1] & 0x20)
  903. print_field(" Limited Discoverable Mode");
  904. if ((dev_class[1] & 0xc0) != 0x00) {
  905. print_text(COLOR_ERROR, " invalid service class");
  906. return;
  907. }
  908. mask = print_bitfield(2, dev_class[2], svc_class_table);
  909. if (mask)
  910. print_text(COLOR_UNKNOWN_SERVICE_CLASS,
  911. " Unknown service class (0x%2.2x)", mask);
  912. }
  913. static void print_appearance(uint16_t appearance)
  914. {
  915. print_field("Appearance: %s (0x%4.4x)", bt_appear_to_str(appearance),
  916. appearance);
  917. }
  918. static void print_num_broadcast_retrans(uint8_t num_retrans)
  919. {
  920. print_field("Number of broadcast retransmissions: %u", num_retrans);
  921. }
  922. static void print_hold_mode_activity(uint8_t activity)
  923. {
  924. print_field("Activity: 0x%2.2x", activity);
  925. if (activity == 0x00) {
  926. print_field(" Maintain current Power State");
  927. return;
  928. }
  929. if (activity & 0x01)
  930. print_field(" Suspend Page Scan");
  931. if (activity & 0x02)
  932. print_field(" Suspend Inquiry Scan");
  933. if (activity & 0x04)
  934. print_field(" Suspend Periodic Inquiries");
  935. }
  936. static void print_power_type(uint8_t type)
  937. {
  938. const char *str;
  939. switch (type) {
  940. case 0x00:
  941. str = "Current Transmit Power Level";
  942. break;
  943. case 0x01:
  944. str = "Maximum Transmit Power Level";
  945. break;
  946. default:
  947. str = "Reserved";
  948. break;
  949. }
  950. print_field("Type: %s (0x%2.2x)", str, type);
  951. }
  952. static void print_power_level(int8_t level, const char *type)
  953. {
  954. print_field("TX power%s%s%s: %d dbm (0x%2.2x)",
  955. type ? " (" : "", type ? type : "", type ? ")" : "",
  956. level, (uint8_t) level);
  957. }
  958. static void print_host_flow_control(uint8_t enable)
  959. {
  960. const char *str;
  961. switch (enable) {
  962. case 0x00:
  963. str = "Off";
  964. break;
  965. case 0x01:
  966. str = "ACL Data Packets";
  967. break;
  968. case 0x02:
  969. str = "Synchronous Data Packets";
  970. break;
  971. case 0x03:
  972. str = "ACL and Synchronous Data Packets";
  973. break;
  974. default:
  975. str = "Reserved";
  976. break;
  977. }
  978. print_field("Flow control: %s (0x%2.2x)", str, enable);
  979. }
  980. static void print_voice_setting(uint16_t setting)
  981. {
  982. uint8_t input_coding = (le16_to_cpu(setting) & 0x0300) >> 8;
  983. uint8_t input_data_format = (le16_to_cpu(setting) & 0xc0) >> 6;
  984. uint8_t air_coding_format = le16_to_cpu(setting) & 0x0003;
  985. const char *str;
  986. print_field("Setting: 0x%4.4x", le16_to_cpu(setting));
  987. switch (input_coding) {
  988. case 0x00:
  989. str = "Linear";
  990. break;
  991. case 0x01:
  992. str = "u-law";
  993. break;
  994. case 0x02:
  995. str = "A-law";
  996. break;
  997. default:
  998. str = "Reserved";
  999. break;
  1000. }
  1001. print_field(" Input Coding: %s", str);
  1002. switch (input_data_format) {
  1003. case 0x00:
  1004. str = "1's complement";
  1005. break;
  1006. case 0x01:
  1007. str = "2's complement";
  1008. break;
  1009. case 0x02:
  1010. str = "Sign-Magnitude";
  1011. break;
  1012. case 0x03:
  1013. str = "Unsigned";
  1014. break;
  1015. default:
  1016. str = "Reserved";
  1017. break;
  1018. }
  1019. print_field(" Input Data Format: %s", str);
  1020. if (input_coding == 0x00) {
  1021. print_field(" Input Sample Size: %s",
  1022. le16_to_cpu(setting) & 0x20 ? "16-bit" : "8-bit");
  1023. print_field(" # of bits padding at MSB: %d",
  1024. (le16_to_cpu(setting) & 0x1c) >> 2);
  1025. }
  1026. switch (air_coding_format) {
  1027. case 0x00:
  1028. str = "CVSD";
  1029. break;
  1030. case 0x01:
  1031. str = "u-law";
  1032. break;
  1033. case 0x02:
  1034. str = "A-law";
  1035. break;
  1036. case 0x03:
  1037. str = "Transparent Data";
  1038. break;
  1039. default:
  1040. str = "Reserved";
  1041. break;
  1042. }
  1043. print_field(" Air Coding Format: %s", str);
  1044. }
  1045. static void print_retransmission_effort(uint8_t effort)
  1046. {
  1047. const char *str;
  1048. switch (effort) {
  1049. case 0x00:
  1050. str = "No retransmissions";
  1051. break;
  1052. case 0x01:
  1053. str = "Optimize for power consumption";
  1054. break;
  1055. case 0x02:
  1056. str = "Optimize for link quality";
  1057. break;
  1058. case 0xff:
  1059. str = "Don't care";
  1060. break;
  1061. default:
  1062. str = "Reserved";
  1063. break;
  1064. }
  1065. print_field("Retransmission effort: %s (0x%2.2x)", str, effort);
  1066. }
  1067. static void print_scan_enable(uint8_t scan_enable)
  1068. {
  1069. const char *str;
  1070. switch (scan_enable) {
  1071. case 0x00:
  1072. str = "No Scans";
  1073. break;
  1074. case 0x01:
  1075. str = "Inquiry Scan";
  1076. break;
  1077. case 0x02:
  1078. str = "Page Scan";
  1079. break;
  1080. case 0x03:
  1081. str = "Inquiry Scan + Page Scan";
  1082. break;
  1083. default:
  1084. str = "Reserved";
  1085. break;
  1086. }
  1087. print_field("Scan enable: %s (0x%2.2x)", str, scan_enable);
  1088. }
  1089. static void print_link_policy(uint16_t link_policy)
  1090. {
  1091. uint16_t policy = le16_to_cpu(link_policy);
  1092. print_field("Link policy: 0x%4.4x", policy);
  1093. if (policy == 0x0000) {
  1094. print_field(" Disable All Modes");
  1095. return;
  1096. }
  1097. if (policy & 0x0001)
  1098. print_field(" Enable Role Switch");
  1099. if (policy & 0x0002)
  1100. print_field(" Enable Hold Mode");
  1101. if (policy & 0x0004)
  1102. print_field(" Enable Sniff Mode");
  1103. if (policy & 0x0008)
  1104. print_field(" Enable Park State");
  1105. }
  1106. static void print_air_mode(uint8_t mode)
  1107. {
  1108. const char *str;
  1109. switch (mode) {
  1110. case 0x00:
  1111. str = "u-law log";
  1112. break;
  1113. case 0x01:
  1114. str = "A-law log";
  1115. break;
  1116. case 0x02:
  1117. str = "CVSD";
  1118. break;
  1119. case 0x03:
  1120. str = "Transparent";
  1121. break;
  1122. default:
  1123. str = "Reserved";
  1124. break;
  1125. }
  1126. print_field("Air mode: %s (0x%2.2x)", str, mode);
  1127. }
  1128. static void print_codec_id(const char *label, uint8_t codec)
  1129. {
  1130. const char *str;
  1131. switch (codec) {
  1132. case 0x00:
  1133. str = "u-law log";
  1134. break;
  1135. case 0x01:
  1136. str = "A-law log";
  1137. break;
  1138. case 0x02:
  1139. str = "CVSD";
  1140. break;
  1141. case 0x03:
  1142. str = "Transparent";
  1143. break;
  1144. case 0x04:
  1145. str = "Linear PCM";
  1146. break;
  1147. case 0x05:
  1148. str = "mSBC";
  1149. break;
  1150. case 0xff:
  1151. str = "Vendor specific";
  1152. break;
  1153. default:
  1154. str = "Reserved";
  1155. break;
  1156. }
  1157. print_field("%s: %s (0x%2.2x)", label, str, codec);
  1158. }
  1159. static const struct bitfield_data codec_transport_table[] = {
  1160. { 0, "Codec supported over BR/EDR ACL" },
  1161. { 1, "Codec supported over BR/EDR SCO and eSCO"},
  1162. { 2, "Codec supported over LE CIS" },
  1163. { 3, "Codec supported over LE BIS" },
  1164. { }
  1165. };
  1166. static void print_codec(const char *label, const struct bt_hci_codec *codec)
  1167. {
  1168. uint8_t mask;
  1169. print_codec_id(label, codec->id);
  1170. print_field(" Logical Transport Type: 0x%02x", codec->transport);
  1171. mask = print_bitfield(4, codec->transport, codec_transport_table);
  1172. if (mask)
  1173. print_text(COLOR_UNKNOWN_SERVICE_CLASS,
  1174. " Unknown transport (0x%2.2x)", mask);
  1175. }
  1176. static void print_inquiry_mode(uint8_t mode)
  1177. {
  1178. const char *str;
  1179. switch (mode) {
  1180. case 0x00:
  1181. str = "Standard Inquiry Result";
  1182. break;
  1183. case 0x01:
  1184. str = "Inquiry Result with RSSI";
  1185. break;
  1186. case 0x02:
  1187. str = "Inquiry Result with RSSI or Extended Inquiry Result";
  1188. break;
  1189. default:
  1190. str = "Reserved";
  1191. break;
  1192. }
  1193. print_field("Mode: %s (0x%2.2x)", str, mode);
  1194. }
  1195. static void print_inquiry_scan_type(uint8_t type)
  1196. {
  1197. const char *str;
  1198. switch (type) {
  1199. case 0x00:
  1200. str = "Standard Scan";
  1201. break;
  1202. case 0x01:
  1203. str = "Interlaced Scan";
  1204. break;
  1205. default:
  1206. str = "Reserved";
  1207. break;
  1208. }
  1209. print_field("Type: %s (0x%2.2x)", str, type);
  1210. }
  1211. static void print_pscan_type(uint8_t type)
  1212. {
  1213. const char *str;
  1214. switch (type) {
  1215. case 0x00:
  1216. str = "Standard Scan";
  1217. break;
  1218. case 0x01:
  1219. str = "Interlaced Scan";
  1220. break;
  1221. default:
  1222. str = "Reserved";
  1223. break;
  1224. }
  1225. print_field("Type: %s (0x%2.2x)", str, type);
  1226. }
  1227. static void print_loopback_mode(uint8_t mode)
  1228. {
  1229. const char *str;
  1230. switch (mode) {
  1231. case 0x00:
  1232. str = "No Loopback";
  1233. break;
  1234. case 0x01:
  1235. str = "Local Loopback";
  1236. break;
  1237. case 0x02:
  1238. str = "Remote Loopback";
  1239. break;
  1240. default:
  1241. str = "Reserved";
  1242. break;
  1243. }
  1244. print_field("Mode: %s (0x%2.2x)", str, mode);
  1245. }
  1246. static void print_auth_payload_timeout(uint16_t timeout)
  1247. {
  1248. print_field("Timeout: %d msec (0x%4.4x)",
  1249. le16_to_cpu(timeout) * 10, le16_to_cpu(timeout));
  1250. }
  1251. static void print_pscan_rep_mode(uint8_t pscan_rep_mode)
  1252. {
  1253. const char *str;
  1254. switch (pscan_rep_mode) {
  1255. case 0x00:
  1256. str = "R0";
  1257. break;
  1258. case 0x01:
  1259. str = "R1";
  1260. break;
  1261. case 0x02:
  1262. str = "R2";
  1263. break;
  1264. default:
  1265. str = "Reserved";
  1266. break;
  1267. }
  1268. print_field("Page scan repetition mode: %s (0x%2.2x)",
  1269. str, pscan_rep_mode);
  1270. }
  1271. static void print_pscan_period_mode(uint8_t pscan_period_mode)
  1272. {
  1273. const char *str;
  1274. switch (pscan_period_mode) {
  1275. case 0x00:
  1276. str = "P0";
  1277. break;
  1278. case 0x01:
  1279. str = "P1";
  1280. break;
  1281. case 0x02:
  1282. str = "P2";
  1283. break;
  1284. default:
  1285. str = "Reserved";
  1286. break;
  1287. }
  1288. print_field("Page period mode: %s (0x%2.2x)", str, pscan_period_mode);
  1289. }
  1290. static void print_pscan_mode(uint8_t pscan_mode)
  1291. {
  1292. const char *str;
  1293. switch (pscan_mode) {
  1294. case 0x00:
  1295. str = "Mandatory";
  1296. break;
  1297. case 0x01:
  1298. str = "Optional I";
  1299. break;
  1300. case 0x02:
  1301. str = "Optional II";
  1302. break;
  1303. case 0x03:
  1304. str = "Optional III";
  1305. break;
  1306. default:
  1307. str = "Reserved";
  1308. break;
  1309. }
  1310. print_field("Page scan mode: %s (0x%2.2x)", str, pscan_mode);
  1311. }
  1312. static void print_clock_offset(uint16_t clock_offset)
  1313. {
  1314. print_field("Clock offset: 0x%4.4x", le16_to_cpu(clock_offset));
  1315. }
  1316. static void print_clock(uint32_t clock)
  1317. {
  1318. print_field("Clock: 0x%8.8x", le32_to_cpu(clock));
  1319. }
  1320. static void print_clock_type(uint8_t type)
  1321. {
  1322. const char *str;
  1323. switch (type) {
  1324. case 0x00:
  1325. str = "Local clock";
  1326. break;
  1327. case 0x01:
  1328. str = "Piconet clock";
  1329. break;
  1330. default:
  1331. str = "Reserved";
  1332. break;
  1333. }
  1334. print_field("Type: %s (0x%2.2x)", str, type);
  1335. }
  1336. static void print_clock_accuracy(uint16_t accuracy)
  1337. {
  1338. if (le16_to_cpu(accuracy) == 0xffff)
  1339. print_field("Accuracy: Unknown (0x%4.4x)",
  1340. le16_to_cpu(accuracy));
  1341. else
  1342. print_field("Accuracy: %.4f msec (0x%4.4x)",
  1343. le16_to_cpu(accuracy) * 0.3125,
  1344. le16_to_cpu(accuracy));
  1345. }
  1346. static void print_lpo_allowed(uint8_t lpo_allowed)
  1347. {
  1348. print_field("LPO allowed: 0x%2.2x", lpo_allowed);
  1349. }
  1350. static void print_broadcast_fragment(uint8_t fragment)
  1351. {
  1352. const char *str;
  1353. switch (fragment) {
  1354. case 0x00:
  1355. str = "Continuation fragment";
  1356. break;
  1357. case 0x01:
  1358. str = "Starting fragment";
  1359. break;
  1360. case 0x02:
  1361. str = "Ending fragment";
  1362. break;
  1363. case 0x03:
  1364. str = "No fragmentation";
  1365. break;
  1366. default:
  1367. str = "Reserved";
  1368. break;
  1369. }
  1370. print_field("Fragment: %s (0x%2.2x)", str, fragment);
  1371. }
  1372. static void print_link_type(uint8_t link_type)
  1373. {
  1374. const char *str;
  1375. switch (link_type) {
  1376. case 0x00:
  1377. str = "SCO";
  1378. break;
  1379. case 0x01:
  1380. str = "ACL";
  1381. break;
  1382. case 0x02:
  1383. str = "eSCO";
  1384. break;
  1385. default:
  1386. str = "Reserved";
  1387. break;
  1388. }
  1389. print_field("Link type: %s (0x%2.2x)", str, link_type);
  1390. }
  1391. static void print_encr_mode_change(uint8_t encr_mode, uint16_t handle)
  1392. {
  1393. const char *str;
  1394. uint8_t conn_type;
  1395. conn_type = get_type(le16_to_cpu(handle));
  1396. switch (encr_mode) {
  1397. case 0x00:
  1398. str = "Disabled";
  1399. break;
  1400. case 0x01:
  1401. switch (conn_type) {
  1402. case 0x00:
  1403. str = "Enabled with E0";
  1404. break;
  1405. case 0x01:
  1406. str = "Enabled with AES-CCM";
  1407. break;
  1408. default:
  1409. str = "Enabled";
  1410. break;
  1411. }
  1412. break;
  1413. case 0x02:
  1414. str = "Enabled with AES-CCM";
  1415. break;
  1416. default:
  1417. str = "Reserved";
  1418. break;
  1419. }
  1420. print_field("Encryption: %s (0x%2.2x)", str, encr_mode);
  1421. }
  1422. static void print_pin_type(uint8_t pin_type)
  1423. {
  1424. const char *str;
  1425. switch (pin_type) {
  1426. case 0x00:
  1427. str = "Variable";
  1428. break;
  1429. case 0x01:
  1430. str = "Fixed";
  1431. break;
  1432. default:
  1433. str = "Reserved";
  1434. break;
  1435. }
  1436. print_field("PIN type: %s (0x%2.2x)", str, pin_type);
  1437. }
  1438. static void print_key_flag(uint8_t key_flag)
  1439. {
  1440. const char *str;
  1441. switch (key_flag) {
  1442. case 0x00:
  1443. str = "Semi-permanent";
  1444. break;
  1445. case 0x01:
  1446. str = "Temporary";
  1447. break;
  1448. default:
  1449. str = "Reserved";
  1450. break;
  1451. }
  1452. print_field("Key flag: %s (0x%2.2x)", str, key_flag);
  1453. }
  1454. static void print_key_len(uint8_t key_len)
  1455. {
  1456. const char *str;
  1457. switch (key_len) {
  1458. case 32:
  1459. str = "802.11 PAL";
  1460. break;
  1461. default:
  1462. str = "Reserved";
  1463. break;
  1464. }
  1465. print_field("Key length: %s (%d)", str, key_len);
  1466. }
  1467. static void print_key_type(uint8_t key_type)
  1468. {
  1469. const char *str;
  1470. switch (key_type) {
  1471. case 0x00:
  1472. str = "Combination key";
  1473. break;
  1474. case 0x01:
  1475. str = "Local Unit key";
  1476. break;
  1477. case 0x02:
  1478. str = "Remote Unit key";
  1479. break;
  1480. case 0x03:
  1481. str = "Debug Combination key";
  1482. break;
  1483. case 0x04:
  1484. str = "Unauthenticated Combination key from P-192";
  1485. break;
  1486. case 0x05:
  1487. str = "Authenticated Combination key from P-192";
  1488. break;
  1489. case 0x06:
  1490. str = "Changed Combination key";
  1491. break;
  1492. case 0x07:
  1493. str = "Unauthenticated Combination key from P-256";
  1494. break;
  1495. case 0x08:
  1496. str = "Authenticated Combination key from P-256";
  1497. break;
  1498. default:
  1499. str = "Reserved";
  1500. break;
  1501. }
  1502. print_field("Key type: %s (0x%2.2x)", str, key_type);
  1503. }
  1504. static void print_key_size(uint8_t key_size)
  1505. {
  1506. print_field("Key size: %d", key_size);
  1507. }
  1508. static void print_hex_field(const char *label, const uint8_t *data,
  1509. uint8_t len)
  1510. {
  1511. char str[len * 2 + 1];
  1512. uint8_t i;
  1513. str[0] = '\0';
  1514. for (i = 0; i < len; i++)
  1515. sprintf(str + (i * 2), "%2.2x", data[i]);
  1516. print_field("%s: %s", label, str);
  1517. }
  1518. static void print_key(const char *label, const uint8_t *link_key)
  1519. {
  1520. print_hex_field(label, link_key, 16);
  1521. }
  1522. static void print_link_key(const uint8_t *link_key)
  1523. {
  1524. print_key("Link key", link_key);
  1525. }
  1526. static void print_pin_code(const uint8_t *pin_code, uint8_t pin_len)
  1527. {
  1528. char str[pin_len + 1];
  1529. uint8_t i;
  1530. for (i = 0; i < pin_len; i++)
  1531. sprintf(str + i, "%c", (const char) pin_code[i]);
  1532. print_field("PIN code: %s", str);
  1533. }
  1534. static void print_hash_p192(const uint8_t *hash)
  1535. {
  1536. print_key("Hash C from P-192", hash);
  1537. }
  1538. static void print_hash_p256(const uint8_t *hash)
  1539. {
  1540. print_key("Hash C from P-256", hash);
  1541. }
  1542. static void print_randomizer_p192(const uint8_t *randomizer)
  1543. {
  1544. print_key("Randomizer R with P-192", randomizer);
  1545. }
  1546. static void print_randomizer_p256(const uint8_t *randomizer)
  1547. {
  1548. print_key("Randomizer R with P-256", randomizer);
  1549. }
  1550. static void print_pk256(const char *label, const uint8_t *key)
  1551. {
  1552. print_field("%s:", label);
  1553. print_hex_field(" X", &key[0], 32);
  1554. print_hex_field(" Y", &key[32], 32);
  1555. }
  1556. static void print_dhkey(const uint8_t *dhkey)
  1557. {
  1558. print_hex_field("Diffie-Hellman key", dhkey, 32);
  1559. }
  1560. static void print_passkey(uint32_t passkey)
  1561. {
  1562. print_field("Passkey: %06d", le32_to_cpu(passkey));
  1563. }
  1564. static void print_io_capability(uint8_t capability)
  1565. {
  1566. const char *str;
  1567. switch (capability) {
  1568. case 0x00:
  1569. str = "DisplayOnly";
  1570. break;
  1571. case 0x01:
  1572. str = "DisplayYesNo";
  1573. break;
  1574. case 0x02:
  1575. str = "KeyboardOnly";
  1576. break;
  1577. case 0x03:
  1578. str = "NoInputNoOutput";
  1579. break;
  1580. default:
  1581. str = "Reserved";
  1582. break;
  1583. }
  1584. print_field("IO capability: %s (0x%2.2x)", str, capability);
  1585. }
  1586. static void print_oob_data(uint8_t oob_data)
  1587. {
  1588. const char *str;
  1589. switch (oob_data) {
  1590. case 0x00:
  1591. str = "Authentication data not present";
  1592. break;
  1593. case 0x01:
  1594. str = "P-192 authentication data present";
  1595. break;
  1596. case 0x02:
  1597. str = "P-256 authentication data present";
  1598. break;
  1599. case 0x03:
  1600. str = "P-192 and P-256 authentication data present";
  1601. break;
  1602. default:
  1603. str = "Reserved";
  1604. break;
  1605. }
  1606. print_field("OOB data: %s (0x%2.2x)", str, oob_data);
  1607. }
  1608. static void print_oob_data_response(uint8_t oob_data)
  1609. {
  1610. const char *str;
  1611. switch (oob_data) {
  1612. case 0x00:
  1613. str = "Authentication data not present";
  1614. break;
  1615. case 0x01:
  1616. str = "Authentication data present";
  1617. break;
  1618. default:
  1619. str = "Reserved";
  1620. break;
  1621. }
  1622. print_field("OOB data: %s (0x%2.2x)", str, oob_data);
  1623. }
  1624. static void print_authentication(uint8_t authentication)
  1625. {
  1626. const char *str;
  1627. switch (authentication) {
  1628. case 0x00:
  1629. str = "No Bonding - MITM not required";
  1630. break;
  1631. case 0x01:
  1632. str = "No Bonding - MITM required";
  1633. break;
  1634. case 0x02:
  1635. str = "Dedicated Bonding - MITM not required";
  1636. break;
  1637. case 0x03:
  1638. str = "Dedicated Bonding - MITM required";
  1639. break;
  1640. case 0x04:
  1641. str = "General Bonding - MITM not required";
  1642. break;
  1643. case 0x05:
  1644. str = "General Bonding - MITM required";
  1645. break;
  1646. default:
  1647. str = "Reserved";
  1648. break;
  1649. }
  1650. print_field("Authentication: %s (0x%2.2x)", str, authentication);
  1651. }
  1652. void packet_print_io_capability(uint8_t capability)
  1653. {
  1654. print_io_capability(capability);
  1655. }
  1656. void packet_print_io_authentication(uint8_t authentication)
  1657. {
  1658. print_authentication(authentication);
  1659. }
  1660. static void print_location_domain_aware(uint8_t aware)
  1661. {
  1662. const char *str;
  1663. switch (aware) {
  1664. case 0x00:
  1665. str = "Regulatory domain unknown";
  1666. break;
  1667. case 0x01:
  1668. str = "Regulatory domain known";
  1669. break;
  1670. default:
  1671. str = "Reserved";
  1672. break;
  1673. }
  1674. print_field("Domain aware: %s (0x%2.2x)", str, aware);
  1675. }
  1676. static void print_location_domain(const uint8_t *domain)
  1677. {
  1678. print_field("Domain: %c%c (0x%2.2x%2.2x)",
  1679. (char) domain[0], (char) domain[1], domain[0], domain[1]);
  1680. }
  1681. static void print_location_domain_options(uint8_t options)
  1682. {
  1683. print_field("Domain options: %c (0x%2.2x)", (char) options, options);
  1684. }
  1685. static void print_location_options(uint8_t options)
  1686. {
  1687. print_field("Options: 0x%2.2x", options);
  1688. }
  1689. static void print_flow_control_mode(uint8_t mode)
  1690. {
  1691. const char *str;
  1692. switch (mode) {
  1693. case 0x00:
  1694. str = "Packet based";
  1695. break;
  1696. case 0x01:
  1697. str = "Data block based";
  1698. break;
  1699. default:
  1700. str = "Reserved";
  1701. break;
  1702. }
  1703. print_field("Flow control mode: %s (0x%2.2x)", str, mode);
  1704. }
  1705. static void print_flow_direction(uint8_t direction)
  1706. {
  1707. const char *str;
  1708. switch (direction) {
  1709. case 0x00:
  1710. str = "Outgoing";
  1711. break;
  1712. case 0x01:
  1713. str = "Incoming";
  1714. break;
  1715. default:
  1716. str = "Reserved";
  1717. break;
  1718. }
  1719. print_field("Flow direction: %s (0x%2.2x)", str, direction);
  1720. }
  1721. static void print_service_type(uint8_t service_type)
  1722. {
  1723. const char *str;
  1724. switch (service_type) {
  1725. case 0x00:
  1726. str = "No Traffic";
  1727. break;
  1728. case 0x01:
  1729. str = "Best Effort";
  1730. break;
  1731. case 0x02:
  1732. str = "Guaranteed";
  1733. break;
  1734. default:
  1735. str = "Reserved";
  1736. break;
  1737. }
  1738. print_field("Service type: %s (0x%2.2x)", str, service_type);
  1739. }
  1740. static void print_flow_spec(const char *label, const uint8_t *data)
  1741. {
  1742. const char *str;
  1743. switch (data[1]) {
  1744. case 0x00:
  1745. str = "No traffic";
  1746. break;
  1747. case 0x01:
  1748. str = "Best effort";
  1749. break;
  1750. case 0x02:
  1751. str = "Guaranteed";
  1752. break;
  1753. default:
  1754. str = "Reserved";
  1755. break;
  1756. }
  1757. print_field("%s flow spec: 0x%2.2x", label, data[0]);
  1758. print_field(" Service type: %s (0x%2.2x)", str, data[1]);
  1759. print_field(" Maximum SDU size: 0x%4.4x", get_le16(data + 2));
  1760. print_field(" SDU inter-arrival time: 0x%8.8x", get_le32(data + 4));
  1761. print_field(" Access latency: 0x%8.8x", get_le32(data + 8));
  1762. print_field(" Flush timeout: 0x%8.8x", get_le32(data + 12));
  1763. }
  1764. static void print_amp_status(uint8_t amp_status)
  1765. {
  1766. const char *str;
  1767. switch (amp_status) {
  1768. case 0x00:
  1769. str = "Present";
  1770. break;
  1771. case 0x01:
  1772. str = "Bluetooth only";
  1773. break;
  1774. case 0x02:
  1775. str = "No capacity";
  1776. break;
  1777. case 0x03:
  1778. str = "Low capacity";
  1779. break;
  1780. case 0x04:
  1781. str = "Medium capacity";
  1782. break;
  1783. case 0x05:
  1784. str = "High capacity";
  1785. break;
  1786. case 0x06:
  1787. str = "Full capacity";
  1788. break;
  1789. default:
  1790. str = "Reserved";
  1791. break;
  1792. }
  1793. print_field("AMP status: %s (0x%2.2x)", str, amp_status);
  1794. }
  1795. static void print_num_resp(uint8_t num_resp)
  1796. {
  1797. print_field("Num responses: %d", num_resp);
  1798. }
  1799. static void print_num_reports(uint8_t num_reports)
  1800. {
  1801. print_field("Num reports: %d", num_reports);
  1802. }
  1803. static void print_adv_event_type(const char *label, uint8_t type)
  1804. {
  1805. const char *str;
  1806. switch (type) {
  1807. case 0x00:
  1808. str = "Connectable undirected - ADV_IND";
  1809. break;
  1810. case 0x01:
  1811. str = "Connectable directed - ADV_DIRECT_IND";
  1812. break;
  1813. case 0x02:
  1814. str = "Scannable undirected - ADV_SCAN_IND";
  1815. break;
  1816. case 0x03:
  1817. str = "Non connectable undirected - ADV_NONCONN_IND";
  1818. break;
  1819. case 0x04:
  1820. str = "Scan response - SCAN_RSP";
  1821. break;
  1822. default:
  1823. str = "Reserved";
  1824. break;
  1825. }
  1826. print_field("%s: %s (0x%2.2x)", label, str, type);
  1827. }
  1828. static void print_adv_channel_map(const char *label, uint8_t value)
  1829. {
  1830. const char *str;
  1831. switch (value) {
  1832. case 0x01:
  1833. str = "37";
  1834. break;
  1835. case 0x02:
  1836. str = "38";
  1837. break;
  1838. case 0x03:
  1839. str = "37, 38";
  1840. break;
  1841. case 0x04:
  1842. str = "39";
  1843. break;
  1844. case 0x05:
  1845. str = "37, 39";
  1846. break;
  1847. case 0x06:
  1848. str = "38, 39";
  1849. break;
  1850. case 0x07:
  1851. str = "37, 38, 39";
  1852. break;
  1853. default:
  1854. str = "Reserved";
  1855. break;
  1856. }
  1857. print_field("%s: %s (0x%2.2x)", label, str, value);
  1858. }
  1859. static void print_adv_filter_policy(const char *label, uint8_t value)
  1860. {
  1861. const char *str;
  1862. switch (value) {
  1863. case 0x00:
  1864. str = "Allow Scan Request from Any, "
  1865. "Allow Connect Request from Any";
  1866. break;
  1867. case 0x01:
  1868. str = "Allow Scan Request from Accept List Only, "
  1869. "Allow Connect Request from Any";
  1870. break;
  1871. case 0x02:
  1872. str = "Allow Scan Request from Any, "
  1873. "Allow Connect Request from Accept List Only";
  1874. break;
  1875. case 0x03:
  1876. str = "Allow Scan Request from Accept List Only, "
  1877. "Allow Connect Request from Accept List Only";
  1878. break;
  1879. default:
  1880. str = "Reserved";
  1881. break;
  1882. }
  1883. print_field("%s: %s (0x%2.2x)", label, str, value);
  1884. }
  1885. static void print_rssi(int8_t rssi)
  1886. {
  1887. packet_print_rssi("RSSI", rssi);
  1888. }
  1889. static void print_slot_625(const char *label, uint16_t value)
  1890. {
  1891. print_field("%s: %.3f msec (0x%4.4x)", label,
  1892. le16_to_cpu(value) * 0.625, le16_to_cpu(value));
  1893. }
  1894. static void print_slot_125(const char *label, uint16_t value)
  1895. {
  1896. print_field("%s: %.2f msec (0x%4.4x)", label,
  1897. le16_to_cpu(value) * 1.25, le16_to_cpu(value));
  1898. }
  1899. static void print_timeout(uint16_t timeout)
  1900. {
  1901. print_slot_625("Timeout", timeout);
  1902. }
  1903. static void print_interval(uint16_t interval)
  1904. {
  1905. print_slot_625("Interval", interval);
  1906. }
  1907. static void print_window(uint16_t window)
  1908. {
  1909. print_slot_625("Window", window);
  1910. }
  1911. static void print_conn_latency(const char *label, uint16_t value)
  1912. {
  1913. print_field("%s: %u (0x%4.4x)", label, le16_to_cpu(value),
  1914. le16_to_cpu(value));
  1915. }
  1916. static void print_role(uint8_t role)
  1917. {
  1918. const char *str;
  1919. switch (role) {
  1920. case 0x00:
  1921. str = "Central";
  1922. break;
  1923. case 0x01:
  1924. str = "Peripheral";
  1925. break;
  1926. default:
  1927. str = "Reserved";
  1928. break;
  1929. }
  1930. print_field("Role: %s (0x%2.2x)", str, role);
  1931. }
  1932. static void print_mode(uint8_t mode)
  1933. {
  1934. const char *str;
  1935. switch (mode) {
  1936. case 0x00:
  1937. str = "Active";
  1938. break;
  1939. case 0x01:
  1940. str = "Hold";
  1941. break;
  1942. case 0x02:
  1943. str = "Sniff";
  1944. break;
  1945. case 0x03:
  1946. str = "Park";
  1947. break;
  1948. default:
  1949. str = "Reserved";
  1950. break;
  1951. }
  1952. print_field("Mode: %s (0x%2.2x)", str, mode);
  1953. }
  1954. static void print_name(const uint8_t *name)
  1955. {
  1956. char str[249];
  1957. memcpy(str, name, 248);
  1958. str[248] = '\0';
  1959. print_field("Name: %s", str);
  1960. }
  1961. static void print_channel_map(const uint8_t *map)
  1962. {
  1963. unsigned int count = 0, start = 0;
  1964. char str[21];
  1965. int i, n;
  1966. for (i = 0; i < 10; i++)
  1967. sprintf(str + (i * 2), "%2.2x", map[i]);
  1968. print_field("Channel map: 0x%s", str);
  1969. for (i = 0; i < 10; i++) {
  1970. for (n = 0; n < 8; n++) {
  1971. if (map[i] & (1 << n)) {
  1972. if (count == 0)
  1973. start = (i * 8) + n;
  1974. count++;
  1975. continue;
  1976. }
  1977. if (count > 1) {
  1978. print_field(" Channel %u-%u",
  1979. start, start + count - 1);
  1980. count = 0;
  1981. } else if (count > 0) {
  1982. print_field(" Channel %u", start);
  1983. count = 0;
  1984. }
  1985. }
  1986. }
  1987. }
  1988. void packet_print_channel_map_lmp(const uint8_t *map)
  1989. {
  1990. print_channel_map(map);
  1991. }
  1992. static void print_flush_timeout(uint16_t timeout)
  1993. {
  1994. if (timeout)
  1995. print_timeout(timeout);
  1996. else
  1997. print_field("Timeout: No Automatic Flush");
  1998. }
  1999. void packet_print_version(const char *label, uint8_t version,
  2000. const char *sublabel, uint16_t subversion)
  2001. {
  2002. const char *str;
  2003. switch (version) {
  2004. case 0x00:
  2005. str = "Bluetooth 1.0b";
  2006. break;
  2007. case 0x01:
  2008. str = "Bluetooth 1.1";
  2009. break;
  2010. case 0x02:
  2011. str = "Bluetooth 1.2";
  2012. break;
  2013. case 0x03:
  2014. str = "Bluetooth 2.0";
  2015. break;
  2016. case 0x04:
  2017. str = "Bluetooth 2.1";
  2018. break;
  2019. case 0x05:
  2020. str = "Bluetooth 3.0";
  2021. break;
  2022. case 0x06:
  2023. str = "Bluetooth 4.0";
  2024. break;
  2025. case 0x07:
  2026. str = "Bluetooth 4.1";
  2027. break;
  2028. case 0x08:
  2029. str = "Bluetooth 4.2";
  2030. break;
  2031. case 0x09:
  2032. str = "Bluetooth 5.0";
  2033. break;
  2034. case 0x0a:
  2035. str = "Bluetooth 5.1";
  2036. break;
  2037. default:
  2038. str = "Reserved";
  2039. break;
  2040. }
  2041. if (sublabel)
  2042. print_field("%s: %s (0x%2.2x) - %s %d (0x%4.4x)",
  2043. label, str, version,
  2044. sublabel, subversion, subversion);
  2045. else
  2046. print_field("%s: %s (0x%2.2x)", label, str, version);
  2047. }
  2048. static void print_hci_version(uint8_t version, uint16_t revision)
  2049. {
  2050. packet_print_version("HCI version", version,
  2051. "Revision", le16_to_cpu(revision));
  2052. }
  2053. static void print_lmp_version(uint8_t version, uint16_t subversion)
  2054. {
  2055. packet_print_version("LMP version", version,
  2056. "Subversion", le16_to_cpu(subversion));
  2057. }
  2058. static void print_pal_version(uint8_t version, uint16_t subversion)
  2059. {
  2060. const char *str;
  2061. switch (version) {
  2062. case 0x01:
  2063. str = "Bluetooth 3.0";
  2064. break;
  2065. default:
  2066. str = "Reserved";
  2067. break;
  2068. }
  2069. print_field("PAL version: %s (0x%2.2x) - Subversion %d (0x%4.4x)",
  2070. str, version,
  2071. le16_to_cpu(subversion),
  2072. le16_to_cpu(subversion));
  2073. }
  2074. void packet_print_company(const char *label, uint16_t company)
  2075. {
  2076. print_field("%s: %s (%d)", label, bt_compidtostr(company), company);
  2077. }
  2078. static void print_manufacturer(uint16_t manufacturer)
  2079. {
  2080. packet_print_company("Manufacturer", le16_to_cpu(manufacturer));
  2081. }
  2082. static const struct {
  2083. uint16_t ver;
  2084. const char *str;
  2085. } broadcom_uart_subversion_table[] = {
  2086. { 0x210b, "BCM43142A0" }, /* 001.001.011 */
  2087. { 0x410e, "BCM43341B0" }, /* 002.001.014 */
  2088. { 0x4406, "BCM4324B3" }, /* 002.004.006 */
  2089. { }
  2090. };
  2091. static const struct {
  2092. uint16_t ver;
  2093. const char *str;
  2094. } broadcom_usb_subversion_table[] = {
  2095. { 0x210b, "BCM43142A0" }, /* 001.001.011 */
  2096. { 0x2112, "BCM4314A0" }, /* 001.001.018 */
  2097. { 0x2118, "BCM20702A0" }, /* 001.001.024 */
  2098. { 0x2126, "BCM4335A0" }, /* 001.001.038 */
  2099. { 0x220e, "BCM20702A1" }, /* 001.002.014 */
  2100. { 0x230f, "BCM4354A2" }, /* 001.003.015 */
  2101. { 0x4106, "BCM4335B0" }, /* 002.001.006 */
  2102. { 0x410e, "BCM20702B0" }, /* 002.001.014 */
  2103. { 0x6109, "BCM4335C0" }, /* 003.001.009 */
  2104. { 0x610c, "BCM4354" }, /* 003.001.012 */
  2105. { }
  2106. };
  2107. static void print_manufacturer_broadcom(uint16_t subversion, uint16_t revision)
  2108. {
  2109. uint16_t ver = le16_to_cpu(subversion);
  2110. uint16_t rev = le16_to_cpu(revision);
  2111. const char *str = NULL;
  2112. int i;
  2113. switch ((rev & 0xf000) >> 12) {
  2114. case 0:
  2115. case 3:
  2116. for (i = 0; broadcom_uart_subversion_table[i].str; i++) {
  2117. if (broadcom_uart_subversion_table[i].ver == ver) {
  2118. str = broadcom_uart_subversion_table[i].str;
  2119. break;
  2120. }
  2121. }
  2122. break;
  2123. case 1:
  2124. case 2:
  2125. for (i = 0; broadcom_usb_subversion_table[i].str; i++) {
  2126. if (broadcom_usb_subversion_table[i].ver == ver) {
  2127. str = broadcom_usb_subversion_table[i].str;
  2128. break;
  2129. }
  2130. }
  2131. break;
  2132. }
  2133. if (str)
  2134. print_field(" Firmware: %3.3u.%3.3u.%3.3u (%s)",
  2135. (ver & 0xe000) >> 13,
  2136. (ver & 0x1f00) >> 8, ver & 0x00ff, str);
  2137. else
  2138. print_field(" Firmware: %3.3u.%3.3u.%3.3u",
  2139. (ver & 0xe000) >> 13,
  2140. (ver & 0x1f00) >> 8, ver & 0x00ff);
  2141. if (rev != 0xffff)
  2142. print_field(" Build: %4.4u", rev & 0x0fff);
  2143. }
  2144. static const char *get_supported_command(int bit);
  2145. static void print_commands(const uint8_t *commands)
  2146. {
  2147. unsigned int count = 0;
  2148. int i, n;
  2149. for (i = 0; i < 64; i++) {
  2150. for (n = 0; n < 8; n++) {
  2151. if (commands[i] & (1 << n))
  2152. count++;
  2153. }
  2154. }
  2155. print_field("Commands: %u entr%s", count, count == 1 ? "y" : "ies");
  2156. for (i = 0; i < 64; i++) {
  2157. for (n = 0; n < 8; n++) {
  2158. const char *cmd;
  2159. if (!(commands[i] & (1 << n)))
  2160. continue;
  2161. cmd = get_supported_command((i * 8) + n);
  2162. if (cmd)
  2163. print_field(" %s (Octet %d - Bit %d)",
  2164. cmd, i, n);
  2165. else
  2166. print_text(COLOR_UNKNOWN_COMMAND_BIT,
  2167. " Octet %d - Bit %d ", i, n);
  2168. }
  2169. }
  2170. }
  2171. static const struct bitfield_data features_page0[] = {
  2172. { 0, "3 slot packets" },
  2173. { 1, "5 slot packets" },
  2174. { 2, "Encryption" },
  2175. { 3, "Slot offset" },
  2176. { 4, "Timing accuracy" },
  2177. { 5, "Role switch" },
  2178. { 6, "Hold mode" },
  2179. { 7, "Sniff mode" },
  2180. { 8, "Park state" },
  2181. { 9, "Power control requests" },
  2182. { 10, "Channel quality driven data rate (CQDDR)"},
  2183. { 11, "SCO link" },
  2184. { 12, "HV2 packets" },
  2185. { 13, "HV3 packets" },
  2186. { 14, "u-law log synchronous data" },
  2187. { 15, "A-law log synchronous data" },
  2188. { 16, "CVSD synchronous data" },
  2189. { 17, "Paging parameter negotiation" },
  2190. { 18, "Power control" },
  2191. { 19, "Transparent synchronous data" },
  2192. { 20, "Flow control lag (least significant bit)"},
  2193. { 21, "Flow control lag (middle bit)" },
  2194. { 22, "Flow control lag (most significant bit)" },
  2195. { 23, "Broadcast Encryption" },
  2196. { 25, "Enhanced Data Rate ACL 2 Mbps mode" },
  2197. { 26, "Enhanced Data Rate ACL 3 Mbps mode" },
  2198. { 27, "Enhanced inquiry scan" },
  2199. { 28, "Interlaced inquiry scan" },
  2200. { 29, "Interlaced page scan" },
  2201. { 30, "RSSI with inquiry results" },
  2202. { 31, "Extended SCO link (EV3 packets)" },
  2203. { 32, "EV4 packets" },
  2204. { 33, "EV5 packets" },
  2205. { 35, "AFH capable peripheral" },
  2206. { 36, "AFH classification peripheral" },
  2207. { 37, "BR/EDR Not Supported" },
  2208. { 38, "LE Supported (Controller)" },
  2209. { 39, "3-slot Enhanced Data Rate ACL packets" },
  2210. { 40, "5-slot Enhanced Data Rate ACL packets" },
  2211. { 41, "Sniff subrating" },
  2212. { 42, "Pause encryption" },
  2213. { 43, "AFH capable central" },
  2214. { 44, "AFH classification central" },
  2215. { 45, "Enhanced Data Rate eSCO 2 Mbps mode" },
  2216. { 46, "Enhanced Data Rate eSCO 3 Mbps mode" },
  2217. { 47, "3-slot Enhanced Data Rate eSCO packets" },
  2218. { 48, "Extended Inquiry Response" },
  2219. { 49, "Simultaneous LE and BR/EDR (Controller)" },
  2220. { 51, "Secure Simple Pairing" },
  2221. { 52, "Encapsulated PDU" },
  2222. { 53, "Erroneous Data Reporting" },
  2223. { 54, "Non-flushable Packet Boundary Flag" },
  2224. { 56, "Link Supervision Timeout Changed Event" },
  2225. { 57, "Inquiry TX Power Level" },
  2226. { 58, "Enhanced Power Control" },
  2227. { 63, "Extended features" },
  2228. { }
  2229. };
  2230. static const struct bitfield_data features_page1[] = {
  2231. { 0, "Secure Simple Pairing (Host Support)" },
  2232. { 1, "LE Supported (Host)" },
  2233. { 2, "Simultaneous LE and BR/EDR (Host)" },
  2234. { 3, "Secure Connections (Host Support)" },
  2235. { }
  2236. };
  2237. static const struct bitfield_data features_page2[] = {
  2238. { 0, "Connectionless Peripheral Broadcast - Central" },
  2239. { 1, "Connectionless Peripheral Broadcast - Peripheral"},
  2240. { 2, "Synchronization Train" },
  2241. { 3, "Synchronization Scan" },
  2242. { 4, "Inquiry Response Notification Event" },
  2243. { 5, "Generalized interlaced scan" },
  2244. { 6, "Coarse Clock Adjustment" },
  2245. { 8, "Secure Connections (Controller Support)" },
  2246. { 9, "Ping" },
  2247. { 10, "Slot Availability Mask" },
  2248. { 11, "Train nudging" },
  2249. { }
  2250. };
  2251. static const struct bitfield_data features_le[] = {
  2252. { 0, "LE Encryption" },
  2253. { 1, "Connection Parameter Request Procedure" },
  2254. { 2, "Extended Reject Indication" },
  2255. { 3, "Peripheral-initiated Features Exchange" },
  2256. { 4, "LE Ping" },
  2257. { 5, "LE Data Packet Length Extension" },
  2258. { 6, "LL Privacy" },
  2259. { 7, "Extended Scanner Filter Policies" },
  2260. { 8, "LE 2M PHY" },
  2261. { 9, "Stable Modulation Index - Transmitter" },
  2262. { 10, "Stable Modulation Index - Receiver" },
  2263. { 11, "LE Coded PHY" },
  2264. { 12, "LE Extended Advertising" },
  2265. { 13, "LE Periodic Advertising" },
  2266. { 14, "Channel Selection Algorithm #2" },
  2267. { 15, "LE Power Class 1" },
  2268. { 16, "Minimum Number of Used Channels Procedure" },
  2269. { 17, "Connection CTE Request" },
  2270. { 18, "Connection CTE Response" },
  2271. { 19, "Connectionless CTE Transmitter" },
  2272. { 20, "Connectionless CTE Receiver" },
  2273. { 21, "Antenna Switching During CTE Transmission (AoD)" },
  2274. { 22, "Antenna Switching During CTE Reception (AoA)" },
  2275. { 23, "Receiving Constant Tone Extensions" },
  2276. { 24, "Periodic Advertising Sync Transfer - Sender" },
  2277. { 25, "Periodic Advertising Sync Transfer - Recipient" },
  2278. { 26, "Sleep Clock Accuracy Updates" },
  2279. { 27, "Remote Public Key Validation" },
  2280. { 28, "Connected Isochronous Stream - Central" },
  2281. { 29, "Connected Isochronous Stream - Peripheral" },
  2282. { 30, "Isochronous Broadcaster" },
  2283. { 31, "Synchronized Receiver" },
  2284. { 32, "Isochronous Channels (Host Support)" },
  2285. { }
  2286. };
  2287. static const struct bitfield_data features_msft[] = {
  2288. { 0, "RSSI Monitoring feature for BR/EDR" },
  2289. { 1, "RSSI Monitoring feature for LE connections" },
  2290. { 2, "RSSI Monitoring of LE advertisements" },
  2291. { 3, "Advertising Monitoring of LE advertisements" },
  2292. { 4, "Verifying the validity of P-192 and P-256 keys" },
  2293. { 5, "Continuous Advertising Monitoring" },
  2294. { }
  2295. };
  2296. static void print_features(uint8_t page, const uint8_t *features_array,
  2297. uint8_t type)
  2298. {
  2299. const struct bitfield_data *features_table = NULL;
  2300. uint64_t mask, features = 0;
  2301. char str[41];
  2302. int i;
  2303. for (i = 0; i < 8; i++) {
  2304. sprintf(str + (i * 5), " 0x%2.2x", features_array[i]);
  2305. features |= ((uint64_t) features_array[i]) << (i * 8);
  2306. }
  2307. print_field("Features:%s", str);
  2308. switch (type) {
  2309. case 0x00:
  2310. switch (page) {
  2311. case 0:
  2312. features_table = features_page0;
  2313. break;
  2314. case 1:
  2315. features_table = features_page1;
  2316. break;
  2317. case 2:
  2318. features_table = features_page2;
  2319. break;
  2320. }
  2321. break;
  2322. case 0x01:
  2323. switch (page) {
  2324. case 0:
  2325. features_table = features_le;
  2326. break;
  2327. }
  2328. break;
  2329. case 0xf0:
  2330. switch (page) {
  2331. case 0:
  2332. features_table = features_msft;
  2333. break;
  2334. }
  2335. break;
  2336. }
  2337. if (!features_table)
  2338. return;
  2339. mask = print_bitfield(2, features, features_table);
  2340. if (mask)
  2341. print_text(COLOR_UNKNOWN_FEATURE_BIT, " Unknown features "
  2342. "(0x%16.16" PRIx64 ")", mask);
  2343. }
  2344. void packet_print_features_lmp(const uint8_t *features, uint8_t page)
  2345. {
  2346. print_features(page, features, 0x00);
  2347. }
  2348. void packet_print_features_ll(const uint8_t *features)
  2349. {
  2350. print_features(0, features, 0x01);
  2351. }
  2352. void packet_print_features_msft(const uint8_t *features)
  2353. {
  2354. print_features(0, features, 0xf0);
  2355. }
  2356. #define LE_STATE_SCAN_ADV 0x0001
  2357. #define LE_STATE_CONN_ADV 0x0002
  2358. #define LE_STATE_NONCONN_ADV 0x0004
  2359. #define LE_STATE_HIGH_DIRECT_ADV 0x0008
  2360. #define LE_STATE_LOW_DIRECT_ADV 0x0010
  2361. #define LE_STATE_ACTIVE_SCAN 0x0020
  2362. #define LE_STATE_PASSIVE_SCAN 0x0040
  2363. #define LE_STATE_INITIATING 0x0080
  2364. #define LE_STATE_CONN_CENTRAL 0x0100
  2365. #define LE_STATE_CONN_PERIPHERAL 0x0200
  2366. #define LE_STATE_CENTRAL_CENTRAL 0x0400
  2367. #define LE_STATE_PERIPHERAL_PERIPHERAL 0x0800
  2368. #define LE_STATE_CENTRAL_PERIPHERAL 0x1000
  2369. static const struct bitfield_data le_states_desc_table[] = {
  2370. { 0, "Scannable Advertising State" },
  2371. { 1, "Connectable Advertising State" },
  2372. { 2, "Non-connectable Advertising State" },
  2373. { 3, "High Duty Cycle Directed Advertising State" },
  2374. { 4, "Low Duty Cycle Directed Advertising State" },
  2375. { 5, "Active Scanning State" },
  2376. { 6, "Passive Scanning State" },
  2377. { 7, "Initiating State" },
  2378. { 8, "Connection State (Central Role)" },
  2379. { 9, "Connection State (Peripheral Role)" },
  2380. { 10, "Central Role & Central Role" },
  2381. { 11, "Peripheral Role & Peripheral Role" },
  2382. { 12, "Central Role & Peripheral Role" },
  2383. { }
  2384. };
  2385. static const struct {
  2386. uint8_t bit;
  2387. uint16_t states;
  2388. } le_states_comb_table[] = {
  2389. { 0, LE_STATE_NONCONN_ADV },
  2390. { 1, LE_STATE_SCAN_ADV },
  2391. { 2, LE_STATE_CONN_ADV },
  2392. { 3, LE_STATE_HIGH_DIRECT_ADV },
  2393. { 4, LE_STATE_PASSIVE_SCAN },
  2394. { 5, LE_STATE_ACTIVE_SCAN },
  2395. { 6, LE_STATE_INITIATING | LE_STATE_CONN_CENTRAL },
  2396. { 7, LE_STATE_CONN_PERIPHERAL },
  2397. { 8, LE_STATE_PASSIVE_SCAN | LE_STATE_NONCONN_ADV },
  2398. { 9, LE_STATE_PASSIVE_SCAN | LE_STATE_SCAN_ADV },
  2399. { 10, LE_STATE_PASSIVE_SCAN | LE_STATE_CONN_ADV },
  2400. { 11, LE_STATE_PASSIVE_SCAN | LE_STATE_HIGH_DIRECT_ADV },
  2401. { 12, LE_STATE_ACTIVE_SCAN | LE_STATE_NONCONN_ADV },
  2402. { 13, LE_STATE_ACTIVE_SCAN | LE_STATE_SCAN_ADV },
  2403. { 14, LE_STATE_ACTIVE_SCAN | LE_STATE_CONN_ADV },
  2404. { 15, LE_STATE_ACTIVE_SCAN | LE_STATE_HIGH_DIRECT_ADV },
  2405. { 16, LE_STATE_INITIATING | LE_STATE_NONCONN_ADV },
  2406. { 17, LE_STATE_INITIATING | LE_STATE_SCAN_ADV },
  2407. { 18, LE_STATE_CONN_CENTRAL | LE_STATE_NONCONN_ADV },
  2408. { 19, LE_STATE_CONN_CENTRAL | LE_STATE_SCAN_ADV },
  2409. { 20, LE_STATE_CONN_PERIPHERAL | LE_STATE_NONCONN_ADV },
  2410. { 21, LE_STATE_CONN_PERIPHERAL | LE_STATE_SCAN_ADV },
  2411. { 22, LE_STATE_INITIATING | LE_STATE_PASSIVE_SCAN },
  2412. { 23, LE_STATE_INITIATING | LE_STATE_ACTIVE_SCAN },
  2413. { 24, LE_STATE_CONN_CENTRAL | LE_STATE_PASSIVE_SCAN },
  2414. { 25, LE_STATE_CONN_CENTRAL | LE_STATE_ACTIVE_SCAN },
  2415. { 26, LE_STATE_CONN_PERIPHERAL | LE_STATE_PASSIVE_SCAN },
  2416. { 27, LE_STATE_CONN_PERIPHERAL | LE_STATE_ACTIVE_SCAN },
  2417. { 28, LE_STATE_INITIATING | LE_STATE_CONN_CENTRAL |
  2418. LE_STATE_CENTRAL_CENTRAL },
  2419. { 29, LE_STATE_LOW_DIRECT_ADV },
  2420. { 30, LE_STATE_LOW_DIRECT_ADV | LE_STATE_PASSIVE_SCAN },
  2421. { 31, LE_STATE_LOW_DIRECT_ADV | LE_STATE_ACTIVE_SCAN },
  2422. { 32, LE_STATE_INITIATING | LE_STATE_CONN_ADV |
  2423. LE_STATE_CENTRAL_PERIPHERAL },
  2424. { 33, LE_STATE_INITIATING | LE_STATE_HIGH_DIRECT_ADV |
  2425. LE_STATE_CENTRAL_PERIPHERAL },
  2426. { 34, LE_STATE_INITIATING | LE_STATE_LOW_DIRECT_ADV |
  2427. LE_STATE_CENTRAL_PERIPHERAL },
  2428. { 35, LE_STATE_CONN_CENTRAL | LE_STATE_CONN_ADV |
  2429. LE_STATE_CENTRAL_PERIPHERAL },
  2430. { 36, LE_STATE_CONN_CENTRAL | LE_STATE_HIGH_DIRECT_ADV |
  2431. LE_STATE_CENTRAL_PERIPHERAL },
  2432. { 37, LE_STATE_CONN_CENTRAL | LE_STATE_LOW_DIRECT_ADV |
  2433. LE_STATE_CENTRAL_PERIPHERAL },
  2434. { 38, LE_STATE_CONN_PERIPHERAL | LE_STATE_CONN_ADV |
  2435. LE_STATE_CENTRAL_PERIPHERAL },
  2436. { 39, LE_STATE_CONN_PERIPHERAL | LE_STATE_HIGH_DIRECT_ADV |
  2437. LE_STATE_PERIPHERAL_PERIPHERAL },
  2438. { 40, LE_STATE_CONN_PERIPHERAL | LE_STATE_LOW_DIRECT_ADV |
  2439. LE_STATE_PERIPHERAL_PERIPHERAL },
  2440. { 41, LE_STATE_INITIATING | LE_STATE_CONN_PERIPHERAL |
  2441. LE_STATE_CENTRAL_PERIPHERAL },
  2442. { }
  2443. };
  2444. static void print_le_states(const uint8_t *states_array)
  2445. {
  2446. uint64_t mask, states = 0;
  2447. int i, n;
  2448. for (i = 0; i < 8; i++)
  2449. states |= ((uint64_t) states_array[i]) << (i * 8);
  2450. print_field("States: 0x%16.16" PRIx64, states);
  2451. mask = states;
  2452. for (i = 0; le_states_comb_table[i].states; i++) {
  2453. uint64_t val = (((uint64_t) 1) << le_states_comb_table[i].bit);
  2454. const char *str[3] = { NULL, };
  2455. int num = 0;
  2456. if (!(states & val))
  2457. continue;
  2458. for (n = 0; n < 16; n++) {
  2459. if (le_states_comb_table[i].states & (1 << n))
  2460. str[num++] = le_states_desc_table[n].str;
  2461. }
  2462. if (num > 0) {
  2463. print_field(" %s", str[0]);
  2464. for (n = 1; n < num; n++)
  2465. print_field(" and %s", str[n]);
  2466. }
  2467. mask &= ~val;
  2468. }
  2469. if (mask)
  2470. print_text(COLOR_UNKNOWN_LE_STATES, " Unknown states "
  2471. "(0x%16.16" PRIx64 ")", mask);
  2472. }
  2473. static void print_le_channel_map(const uint8_t *map)
  2474. {
  2475. unsigned int count = 0, start = 0;
  2476. char str[11];
  2477. int i, n;
  2478. for (i = 0; i < 5; i++)
  2479. sprintf(str + (i * 2), "%2.2x", map[i]);
  2480. print_field("Channel map: 0x%s", str);
  2481. for (i = 0; i < 5; i++) {
  2482. for (n = 0; n < 8; n++) {
  2483. if (map[i] & (1 << n)) {
  2484. if (count == 0)
  2485. start = (i * 8) + n;
  2486. count++;
  2487. continue;
  2488. }
  2489. if (count > 1) {
  2490. print_field(" Channel %u-%u",
  2491. start, start + count - 1);
  2492. count = 0;
  2493. } else if (count > 0) {
  2494. print_field(" Channel %u", start);
  2495. count = 0;
  2496. }
  2497. }
  2498. }
  2499. }
  2500. void packet_print_channel_map_ll(const uint8_t *map)
  2501. {
  2502. print_le_channel_map(map);
  2503. }
  2504. static void print_random_number(uint64_t rand)
  2505. {
  2506. print_field("Random number: 0x%16.16" PRIx64, le64_to_cpu(rand));
  2507. }
  2508. static void print_encrypted_diversifier(uint16_t ediv)
  2509. {
  2510. print_field("Encrypted diversifier: 0x%4.4x", le16_to_cpu(ediv));
  2511. }
  2512. static const struct bitfield_data events_table[] = {
  2513. { 0, "Inquiry Complete" },
  2514. { 1, "Inquiry Result" },
  2515. { 2, "Connection Complete" },
  2516. { 3, "Connection Request" },
  2517. { 4, "Disconnection Complete" },
  2518. { 5, "Authentication Complete" },
  2519. { 6, "Remote Name Request Complete" },
  2520. { 7, "Encryption Change" },
  2521. { 8, "Change Connection Link Key Complete" },
  2522. { 9, "Link Key Type Changed" },
  2523. { 10, "Read Remote Supported Features Complete" },
  2524. { 11, "Read Remote Version Information Complete" },
  2525. { 12, "QoS Setup Complete" },
  2526. { 13, "Command Complete" },
  2527. { 14, "Command Status" },
  2528. { 15, "Hardware Error" },
  2529. { 16, "Flush Occurred" },
  2530. { 17, "Role Change" },
  2531. { 18, "Number of Completed Packets" },
  2532. { 19, "Mode Change" },
  2533. { 20, "Return Link Keys" },
  2534. { 21, "PIN Code Request" },
  2535. { 22, "Link Key Request" },
  2536. { 23, "Link Key Notification" },
  2537. { 24, "Loopback Command" },
  2538. { 25, "Data Buffer Overflow" },
  2539. { 26, "Max Slots Change" },
  2540. { 27, "Read Clock Offset Complete" },
  2541. { 28, "Connection Packet Type Changed" },
  2542. { 29, "QoS Violation" },
  2543. { 30, "Page Scan Mode Change" },
  2544. { 31, "Page Scan Repetition Mode Change" },
  2545. { 32, "Flow Specification Complete" },
  2546. { 33, "Inquiry Result with RSSI" },
  2547. { 34, "Read Remote Extended Features Complete" },
  2548. { 43, "Synchronous Connection Complete" },
  2549. { 44, "Synchronous Connection Changed" },
  2550. { 45, "Sniff Subrating" },
  2551. { 46, "Extended Inquiry Result" },
  2552. { 47, "Encryption Key Refresh Complete" },
  2553. { 48, "IO Capability Request" },
  2554. { 49, "IO Capability Request Reply" },
  2555. { 50, "User Confirmation Request" },
  2556. { 51, "User Passkey Request" },
  2557. { 52, "Remote OOB Data Request" },
  2558. { 53, "Simple Pairing Complete" },
  2559. { 55, "Link Supervision Timeout Changed" },
  2560. { 56, "Enhanced Flush Complete" },
  2561. { 58, "User Passkey Notification" },
  2562. { 59, "Keypress Notification" },
  2563. { 60, "Remote Host Supported Features Notification" },
  2564. { 61, "LE Meta" },
  2565. { }
  2566. };
  2567. static void print_event_mask(const uint8_t *events_array,
  2568. const struct bitfield_data *table)
  2569. {
  2570. uint64_t mask, events = 0;
  2571. int i;
  2572. for (i = 0; i < 8; i++)
  2573. events |= ((uint64_t) events_array[i]) << (i * 8);
  2574. print_field("Mask: 0x%16.16" PRIx64, events);
  2575. mask = print_bitfield(2, events, table);
  2576. if (mask)
  2577. print_text(COLOR_UNKNOWN_EVENT_MASK, " Unknown mask "
  2578. "(0x%16.16" PRIx64 ")", mask);
  2579. }
  2580. static const struct bitfield_data events_page2_table[] = {
  2581. { 0, "Physical Link Complete" },
  2582. { 1, "Channel Selected" },
  2583. { 2, "Disconnection Physical Link Complete" },
  2584. { 3, "Physical Link Loss Early Warning" },
  2585. { 4, "Physical Link Recovery" },
  2586. { 5, "Logical Link Complete" },
  2587. { 6, "Disconnection Logical Link Complete" },
  2588. { 7, "Flow Specification Modify Complete" },
  2589. { 8, "Number of Completed Data Blocks" },
  2590. { 9, "AMP Start Test" },
  2591. { 10, "AMP Test End" },
  2592. { 11, "AMP Receiver Report" },
  2593. { 12, "Short Range Mode Change Complete" },
  2594. { 13, "AMP Status Change" },
  2595. { 14, "Triggered Clock Capture" },
  2596. { 15, "Synchronization Train Complete" },
  2597. { 16, "Synchronization Train Received" },
  2598. { 17, "Connectionless Peripheral Broadcast Receive" },
  2599. { 18, "Connectionless Peripheral Broadcast Timeout" },
  2600. { 19, "Truncated Page Complete" },
  2601. { 20, "Peripheral Page Response Timeout" },
  2602. { 21, "Connectionless Peripheral Broadcast Channel Map Change" },
  2603. { 22, "Inquiry Response Notification" },
  2604. { 23, "Authenticated Payload Timeout Expired" },
  2605. { 24, "SAM Status Change" },
  2606. { }
  2607. };
  2608. static const struct bitfield_data events_le_table[] = {
  2609. { 0, "LE Connection Complete" },
  2610. { 1, "LE Advertising Report" },
  2611. { 2, "LE Connection Update Complete" },
  2612. { 3, "LE Read Remote Used Features Complete" },
  2613. { 4, "LE Long Term Key Request" },
  2614. { 5, "LE Remote Connection Parameter Request" },
  2615. { 6, "LE Data Length Change" },
  2616. { 7, "LE Read Local P-256 Public Key Complete" },
  2617. { 8, "LE Generate DHKey Complete" },
  2618. { 9, "LE Enhanced Connection Complete" },
  2619. { 10, "LE Direct Advertising Report" },
  2620. { 11, "LE PHY Update Complete" },
  2621. { 12, "LE Extended Advertising Report" },
  2622. { 13, "LE Periodic Advertising Sync Established"},
  2623. { 14, "LE Periodic Advertising Report" },
  2624. { 15, "LE Periodic Advertising Sync Lost" },
  2625. { 16, "LE Extended Scan Timeout" },
  2626. { 17, "LE Extended Advertising Set Terminated" },
  2627. { 18, "LE Scan Request Received" },
  2628. { 19, "LE Channel Selection Algorithm" },
  2629. { 24, "LE CIS Established" },
  2630. { 25, "LE CIS Request" },
  2631. { 26, "LE Create BIG Complete" },
  2632. { 27, "LE Terminate BIG Complete" },
  2633. { 28, "LE BIG Sync Estabilished Complete" },
  2634. { 29, "LE BIG Sync Lost" },
  2635. { }
  2636. };
  2637. static void print_fec(uint8_t fec)
  2638. {
  2639. const char *str;
  2640. switch (fec) {
  2641. case 0x00:
  2642. str = "Not required";
  2643. break;
  2644. case 0x01:
  2645. str = "Required";
  2646. break;
  2647. default:
  2648. str = "Reserved";
  2649. break;
  2650. }
  2651. print_field("FEC: %s (0x%02x)", str, fec);
  2652. }
  2653. #define BT_EIR_FLAGS 0x01
  2654. #define BT_EIR_UUID16_SOME 0x02
  2655. #define BT_EIR_UUID16_ALL 0x03
  2656. #define BT_EIR_UUID32_SOME 0x04
  2657. #define BT_EIR_UUID32_ALL 0x05
  2658. #define BT_EIR_UUID128_SOME 0x06
  2659. #define BT_EIR_UUID128_ALL 0x07
  2660. #define BT_EIR_NAME_SHORT 0x08
  2661. #define BT_EIR_NAME_COMPLETE 0x09
  2662. #define BT_EIR_TX_POWER 0x0a
  2663. #define BT_EIR_CLASS_OF_DEV 0x0d
  2664. #define BT_EIR_SSP_HASH_P192 0x0e
  2665. #define BT_EIR_SSP_RANDOMIZER_P192 0x0f
  2666. #define BT_EIR_DEVICE_ID 0x10
  2667. #define BT_EIR_SMP_TK 0x10
  2668. #define BT_EIR_SMP_OOB_FLAGS 0x11
  2669. #define BT_EIR_PERIPHERAL_CONN_INTERVAL 0x12
  2670. #define BT_EIR_SERVICE_UUID16 0x14
  2671. #define BT_EIR_SERVICE_UUID128 0x15
  2672. #define BT_EIR_SERVICE_DATA 0x16
  2673. #define BT_EIR_PUBLIC_ADDRESS 0x17
  2674. #define BT_EIR_RANDOM_ADDRESS 0x18
  2675. #define BT_EIR_GAP_APPEARANCE 0x19
  2676. #define BT_EIR_ADVERTISING_INTERVAL 0x1a
  2677. #define BT_EIR_LE_DEVICE_ADDRESS 0x1b
  2678. #define BT_EIR_LE_ROLE 0x1c
  2679. #define BT_EIR_SSP_HASH_P256 0x1d
  2680. #define BT_EIR_SSP_RANDOMIZER_P256 0x1e
  2681. #define BT_EIR_SERVICE_UUID32 0x1f
  2682. #define BT_EIR_SERVICE_DATA32 0x20
  2683. #define BT_EIR_SERVICE_DATA128 0x21
  2684. #define BT_EIR_LE_SC_CONFIRM_VALUE 0x22
  2685. #define BT_EIR_LE_SC_RANDOM_VALUE 0x23
  2686. #define BT_EIR_URI 0x24
  2687. #define BT_EIR_INDOOR_POSITIONING 0x25
  2688. #define BT_EIR_TRANSPORT_DISCOVERY 0x26
  2689. #define BT_EIR_LE_SUPPORTED_FEATURES 0x27
  2690. #define BT_EIR_CHANNEL_MAP_UPDATE_IND 0x28
  2691. #define BT_EIR_MESH_PROV 0x29
  2692. #define BT_EIR_MESH_DATA 0x2a
  2693. #define BT_EIR_MESH_BEACON 0x2b
  2694. #define BT_EIR_3D_INFO_DATA 0x3d
  2695. #define BT_EIR_MANUFACTURER_DATA 0xff
  2696. static void print_manufacturer_apple(const void *data, uint8_t data_len)
  2697. {
  2698. uint8_t type = *((uint8_t *) data);
  2699. if (data_len < 1)
  2700. return;
  2701. if (type == 0x01) {
  2702. char identifier[100];
  2703. snprintf(identifier, sizeof(identifier) - 1, "%s",
  2704. (const char *) (data + 1));
  2705. print_field(" Identifier: %s", identifier);
  2706. return;
  2707. }
  2708. while (data_len > 0) {
  2709. uint8_t len;
  2710. const char *str;
  2711. type = *((uint8_t *) data);
  2712. data++;
  2713. data_len--;
  2714. if (type == 0x00)
  2715. continue;
  2716. if (data_len < 1)
  2717. break;
  2718. switch (type) {
  2719. case 0x02:
  2720. str = "iBeacon";
  2721. break;
  2722. case 0x05:
  2723. str = "AirDrop";
  2724. break;
  2725. case 0x09:
  2726. str = "Apple TV";
  2727. break;
  2728. default:
  2729. str = "Unknown";
  2730. break;
  2731. }
  2732. print_field(" Type: %s (%u)", str, type);
  2733. len = *((uint8_t *) data);
  2734. data++;
  2735. data_len--;
  2736. if (len < 1)
  2737. continue;
  2738. if (len > data_len)
  2739. break;
  2740. if (type == 0x02 && len == 0x15) {
  2741. const uint8_t *uuid;
  2742. uint16_t minor, major;
  2743. int8_t tx_power;
  2744. uuid = data;
  2745. print_field(" UUID: %8.8x-%4.4x-%4.4x-%4.4x-%8.8x%4.4x",
  2746. get_le32(&uuid[12]), get_le16(&uuid[10]),
  2747. get_le16(&uuid[8]), get_le16(&uuid[6]),
  2748. get_le32(&uuid[2]), get_le16(&uuid[0]));
  2749. major = get_le16(data + 16);
  2750. minor = get_le16(data + 18);
  2751. print_field(" Version: %u.%u", major, minor);
  2752. tx_power = *(int8_t *) (data + 20);
  2753. print_field(" TX power: %d dB", tx_power);
  2754. } else
  2755. print_hex_field(" Data", data, len);
  2756. data += len;
  2757. data_len -= len;
  2758. }
  2759. packet_hexdump(data, data_len);
  2760. }
  2761. static void print_manufacturer_data(const void *data, uint8_t data_len)
  2762. {
  2763. uint16_t company = get_le16(data);
  2764. packet_print_company("Company", company);
  2765. switch (company) {
  2766. case 76:
  2767. case 19456:
  2768. print_manufacturer_apple(data + 2, data_len - 2);
  2769. break;
  2770. default:
  2771. print_hex_field(" Data", data + 2, data_len - 2);
  2772. break;
  2773. }
  2774. }
  2775. static void print_device_id(const void *data, uint8_t data_len)
  2776. {
  2777. uint16_t source, vendor, product, version;
  2778. char modalias[26], *vendor_str, *product_str;
  2779. const char *str;
  2780. if (data_len < 8)
  2781. return;
  2782. source = get_le16(data);
  2783. vendor = get_le16(data + 2);
  2784. product = get_le16(data + 4);
  2785. version = get_le16(data + 6);
  2786. switch (source) {
  2787. case 0x0001:
  2788. str = "Bluetooth SIG assigned";
  2789. sprintf(modalias, "bluetooth:v%04Xp%04Xd%04X",
  2790. vendor, product, version);
  2791. break;
  2792. case 0x0002:
  2793. str = "USB Implementer's Forum assigned";
  2794. sprintf(modalias, "usb:v%04Xp%04Xd%04X",
  2795. vendor, product, version);
  2796. break;
  2797. default:
  2798. str = "Reserved";
  2799. modalias[0] = '\0';
  2800. break;
  2801. }
  2802. print_field("Device ID: %s (0x%4.4x)", str, source);
  2803. if (!hwdb_get_vendor_model(modalias, &vendor_str, &product_str)) {
  2804. vendor_str = NULL;
  2805. product_str = NULL;
  2806. }
  2807. if (source != 0x0001) {
  2808. if (vendor_str)
  2809. print_field(" Vendor: %s (0x%4.4x)",
  2810. vendor_str, vendor);
  2811. else
  2812. print_field(" Vendor: 0x%4.4x", vendor);
  2813. } else
  2814. packet_print_company(" Vendor", vendor);
  2815. if (product_str)
  2816. print_field(" Product: %s (0x%4.4x)", product_str, product);
  2817. else
  2818. print_field(" Product: 0x%4.4x", product);
  2819. print_field(" Version: %u.%u.%u (0x%4.4x)",
  2820. (version & 0xff00) >> 8,
  2821. (version & 0x00f0) >> 4,
  2822. (version & 0x000f), version);
  2823. free(vendor_str);
  2824. free(product_str);
  2825. }
  2826. static void print_uuid16_list(const char *label, const void *data,
  2827. uint8_t data_len)
  2828. {
  2829. uint8_t count = data_len / sizeof(uint16_t);
  2830. unsigned int i;
  2831. print_field("%s: %u entr%s", label, count, count == 1 ? "y" : "ies");
  2832. for (i = 0; i < count; i++) {
  2833. uint16_t uuid = get_le16(data + (i * 2));
  2834. print_field(" %s (0x%4.4x)", bt_uuid16_to_str(uuid), uuid);
  2835. }
  2836. }
  2837. static void print_uuid32_list(const char *label, const void *data,
  2838. uint8_t data_len)
  2839. {
  2840. uint8_t count = data_len / sizeof(uint32_t);
  2841. unsigned int i;
  2842. print_field("%s: %u entr%s", label, count, count == 1 ? "y" : "ies");
  2843. for (i = 0; i < count; i++) {
  2844. uint32_t uuid = get_le32(data + (i * 4));
  2845. print_field(" %s (0x%8.8x)", bt_uuid32_to_str(uuid), uuid);
  2846. }
  2847. }
  2848. static void print_uuid128_list(const char *label, const void *data,
  2849. uint8_t data_len)
  2850. {
  2851. uint8_t count = data_len / 16;
  2852. unsigned int i;
  2853. print_field("%s: %u entr%s", label, count, count == 1 ? "y" : "ies");
  2854. for (i = 0; i < count; i++) {
  2855. const uint8_t *uuid = data + (i * 16);
  2856. print_field(" %s", bt_uuid128_to_str(uuid));
  2857. }
  2858. }
  2859. static const struct bitfield_data eir_flags_table[] = {
  2860. { 0, "LE Limited Discoverable Mode" },
  2861. { 1, "LE General Discoverable Mode" },
  2862. { 2, "BR/EDR Not Supported" },
  2863. { 3, "Simultaneous LE and BR/EDR (Controller)" },
  2864. { 4, "Simultaneous LE and BR/EDR (Host)" },
  2865. { }
  2866. };
  2867. static const struct bitfield_data eir_3d_table[] = {
  2868. { 0, "Association Notification" },
  2869. { 1, "Battery Level Reporting" },
  2870. { 2, "Send Battery Level Report on Start-up Synchronization" },
  2871. { 7, "Factory Test Mode" },
  2872. { }
  2873. };
  2874. static const struct bitfield_data mesh_oob_table[] = {
  2875. { 0, "Other" },
  2876. { 1, "Electronic / URI" },
  2877. { 2, "2D machine-readable code" },
  2878. { 3, "Bar code" },
  2879. { 4, "Near Field Communication (NFC)" },
  2880. { 5, "Number" },
  2881. { 6, "String" },
  2882. { 11, "On box" },
  2883. { 12, "Inside box" },
  2884. { 13, "On piece of paper" },
  2885. { 14, "Inside manual" },
  2886. { 15, "On device" },
  2887. { }
  2888. };
  2889. static void print_mesh_beacon(const uint8_t *data, uint8_t len)
  2890. {
  2891. uint16_t oob;
  2892. print_hex_field("Mesh Beacon", data, len);
  2893. if (len < 1)
  2894. return;
  2895. switch (data[0]) {
  2896. case 0x00:
  2897. print_field(" Unprovisioned Device Beacon (0x00)");
  2898. if (len < 18) {
  2899. packet_hexdump(data + 1, len - 1);
  2900. break;
  2901. }
  2902. print_hex_field(" Device UUID", data + 1, 16);
  2903. oob = get_be16(data + 17);
  2904. print_field(" OOB Information: 0x%4.4x", oob);
  2905. print_bitfield(4, oob, mesh_oob_table);
  2906. if (len < 23) {
  2907. packet_hexdump(data + 18, len - 18);
  2908. break;
  2909. }
  2910. print_field(" URI Hash: 0x%8.8x", get_be32(data + 19));
  2911. packet_hexdump(data + 23, len - 23);
  2912. break;
  2913. case 0x01:
  2914. print_field(" Secure Network Beacon (0x01)");
  2915. if (len < 22) {
  2916. packet_hexdump(data + 1, len - 1);
  2917. break;
  2918. }
  2919. print_field(" Flags: 0x%2.2x", data[0]);
  2920. if (data[1] & 0x01)
  2921. print_field(" Key Refresh");
  2922. if (data[1] & 0x02)
  2923. print_field(" IV Update");
  2924. print_hex_field(" Network Id", data + 2, 8);
  2925. print_field(" IV Index: 0x%08x", get_be32(data + 10));
  2926. print_hex_field(" Authentication Value", data + 14, 8);
  2927. packet_hexdump(data + 22, len - 22);
  2928. break;
  2929. default:
  2930. print_field(" Invalid Beacon (0x%02x)", data[0]);
  2931. packet_hexdump(data, len);
  2932. break;
  2933. }
  2934. }
  2935. static void print_mesh_prov(const uint8_t *data, uint8_t len)
  2936. {
  2937. print_hex_field("Mesh Provisioning", data, len);
  2938. if (len < 6) {
  2939. packet_hexdump(data, len);
  2940. return;
  2941. }
  2942. print_field(" Link ID: 0x%08x", get_be32(data));
  2943. print_field(" Transaction Number: %u", data[4]);
  2944. data += 5;
  2945. len -= 5;
  2946. switch (data[0] & 0x03) {
  2947. case 0x00:
  2948. print_field(" Transaction Start (0x00)");
  2949. if (len < 5) {
  2950. packet_hexdump(data + 1, len - 1);
  2951. return;
  2952. }
  2953. print_field(" SeqN: %u", data[0] & 0xfc >> 2);
  2954. print_field(" TotalLength: %u", get_be16(data + 1));
  2955. print_field(" FCS: 0x%2.2x", data[3]);
  2956. print_hex_field(" Data", data + 4, len - 4);
  2957. packet_hexdump(data + 5, len - 5);
  2958. break;
  2959. case 0x01:
  2960. print_field(" Transaction Acknowledgment (0x01)");
  2961. packet_hexdump(data + 1, len - 1);
  2962. break;
  2963. case 0x02:
  2964. print_field(" Transaction Continuation (0x02)");
  2965. print_field(" SegmentIndex: %u", data[0] >> 2);
  2966. if (len < 2) {
  2967. packet_hexdump(data + 1, len - 1);
  2968. return;
  2969. }
  2970. print_hex_field(" Data", data + 1, len - 1);
  2971. packet_hexdump(data + 2, len - 2);
  2972. break;
  2973. case 0x03:
  2974. print_field(" Provisioning Bearer Control (0x03)");
  2975. switch (data[0] >> 2) {
  2976. case 0x00:
  2977. print_field(" Link Open (0x00)");
  2978. if (len < 17) {
  2979. packet_hexdump(data + 1, len - 1);
  2980. break;
  2981. }
  2982. print_hex_field(" Device UUID", data, 16);
  2983. break;
  2984. case 0x01:
  2985. print_field(" Link Ack (0x01)");
  2986. break;
  2987. case 0x02:
  2988. print_field(" Link Close (0x02)");
  2989. if (len < 2) {
  2990. packet_hexdump(data + 1, len - 1);
  2991. break;
  2992. }
  2993. switch (data[1]) {
  2994. case 0x00:
  2995. print_field(" Reason: Success (0x00)");
  2996. break;
  2997. case 0x01:
  2998. print_field(" Reason: Timeout (0x01)");
  2999. break;
  3000. case 0x02:
  3001. print_field(" Reason: Fail (0x02)");
  3002. break;
  3003. default:
  3004. print_field(" Reason: Unrecognized (0x%2.2x)",
  3005. data[1]);
  3006. }
  3007. packet_hexdump(data + 2, len - 2);
  3008. break;
  3009. default:
  3010. packet_hexdump(data + 1, len - 1);
  3011. break;
  3012. }
  3013. break;
  3014. default:
  3015. print_field(" Invalid Command (0x%02x)", data[0]);
  3016. packet_hexdump(data, len);
  3017. break;
  3018. }
  3019. }
  3020. static void print_mesh_data(const uint8_t *data, uint8_t len)
  3021. {
  3022. print_hex_field("Mesh Data", data, len);
  3023. if (len < 1)
  3024. return;
  3025. print_field(" IVI: %u", data[0] >> 7);
  3026. print_field(" NID: 0x%2.2x", data[0] & 0x7f);
  3027. packet_hexdump(data + 1, len - 1);
  3028. }
  3029. static void print_transport_data(const uint8_t *data, uint8_t len)
  3030. {
  3031. print_field("Transport Discovery Data");
  3032. if (len < 3)
  3033. return;
  3034. print_field(" Organization: %s (0x%02x)",
  3035. data[0] == 0x01 ? "Bluetooth SIG" : "RFU", data[0]);
  3036. print_field(" Flags: 0x%2.2x", data[1]);
  3037. print_field(" Role: 0x%2.2x", data[1] & 0x03);
  3038. switch (data[1] & 0x03) {
  3039. case 0x00:
  3040. print_field(" Not Specified");
  3041. break;
  3042. case 0x01:
  3043. print_field(" Seeker Only");
  3044. break;
  3045. case 0x02:
  3046. print_field(" Provider Only");
  3047. break;
  3048. case 0x03:
  3049. print_field(" Both Seeker an Provider");
  3050. break;
  3051. }
  3052. print_field(" Transport Data Incomplete: %s (0x%2.2x)",
  3053. data[1] & 0x04 ? "True" : "False", data[1] & 0x04);
  3054. print_field(" Transport State: 0x%2.2x", data[1] & 0x18);
  3055. switch (data[1] & 0x18) {
  3056. case 0x00:
  3057. print_field(" Off");
  3058. break;
  3059. case 0x08:
  3060. print_field(" On");
  3061. break;
  3062. case 0x10:
  3063. print_field(" Temporary Unavailable");
  3064. break;
  3065. case 0x18:
  3066. print_field(" RFU");
  3067. break;
  3068. }
  3069. print_field(" Length: %u", data[2]);
  3070. print_hex_field(" Data", data + 3, len - 3);
  3071. }
  3072. static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
  3073. {
  3074. uint16_t len = 0;
  3075. if (eir_len == 0)
  3076. return;
  3077. while (len < eir_len - 1) {
  3078. uint8_t field_len = eir[0];
  3079. const uint8_t *data = &eir[2];
  3080. uint8_t data_len;
  3081. char name[239], label[100];
  3082. uint8_t flags, mask;
  3083. /* Check for the end of EIR */
  3084. if (field_len == 0)
  3085. break;
  3086. len += field_len + 1;
  3087. /* Do not continue EIR Data parsing if got incorrect length */
  3088. if (len > eir_len) {
  3089. len -= field_len + 1;
  3090. break;
  3091. }
  3092. data_len = field_len - 1;
  3093. switch (eir[1]) {
  3094. case BT_EIR_FLAGS:
  3095. flags = *data;
  3096. print_field("Flags: 0x%2.2x", flags);
  3097. mask = print_bitfield(2, flags, eir_flags_table);
  3098. if (mask)
  3099. print_text(COLOR_UNKNOWN_SERVICE_CLASS,
  3100. " Unknown flags (0x%2.2x)", mask);
  3101. break;
  3102. case BT_EIR_UUID16_SOME:
  3103. if (data_len < sizeof(uint16_t))
  3104. break;
  3105. print_uuid16_list("16-bit Service UUIDs (partial)",
  3106. data, data_len);
  3107. break;
  3108. case BT_EIR_UUID16_ALL:
  3109. if (data_len < sizeof(uint16_t))
  3110. break;
  3111. print_uuid16_list("16-bit Service UUIDs (complete)",
  3112. data, data_len);
  3113. break;
  3114. case BT_EIR_UUID32_SOME:
  3115. if (data_len < sizeof(uint32_t))
  3116. break;
  3117. print_uuid32_list("32-bit Service UUIDs (partial)",
  3118. data, data_len);
  3119. break;
  3120. case BT_EIR_UUID32_ALL:
  3121. if (data_len < sizeof(uint32_t))
  3122. break;
  3123. print_uuid32_list("32-bit Service UUIDs (complete)",
  3124. data, data_len);
  3125. break;
  3126. case BT_EIR_UUID128_SOME:
  3127. if (data_len < 16)
  3128. break;
  3129. print_uuid128_list("128-bit Service UUIDs (partial)",
  3130. data, data_len);
  3131. break;
  3132. case BT_EIR_UUID128_ALL:
  3133. if (data_len < 16)
  3134. break;
  3135. print_uuid128_list("128-bit Service UUIDs (complete)",
  3136. data, data_len);
  3137. break;
  3138. case BT_EIR_NAME_SHORT:
  3139. memset(name, 0, sizeof(name));
  3140. memcpy(name, data, data_len);
  3141. print_field("Name (short): %s", name);
  3142. break;
  3143. case BT_EIR_NAME_COMPLETE:
  3144. memset(name, 0, sizeof(name));
  3145. memcpy(name, data, data_len);
  3146. print_field("Name (complete): %s", name);
  3147. break;
  3148. case BT_EIR_TX_POWER:
  3149. if (data_len < 1)
  3150. break;
  3151. print_field("TX power: %d dBm", (int8_t) *data);
  3152. break;
  3153. case BT_EIR_CLASS_OF_DEV:
  3154. if (data_len < 3)
  3155. break;
  3156. print_dev_class(data);
  3157. break;
  3158. case BT_EIR_SSP_HASH_P192:
  3159. if (data_len < 16)
  3160. break;
  3161. print_hash_p192(data);
  3162. break;
  3163. case BT_EIR_SSP_RANDOMIZER_P192:
  3164. if (data_len < 16)
  3165. break;
  3166. print_randomizer_p192(data);
  3167. break;
  3168. case BT_EIR_DEVICE_ID:
  3169. /* SMP TK has the same value as Device ID */
  3170. if (le)
  3171. print_hex_field("SMP TK", data, data_len);
  3172. else if (data_len >= 8)
  3173. print_device_id(data, data_len);
  3174. break;
  3175. case BT_EIR_SMP_OOB_FLAGS:
  3176. print_field("SMP OOB Flags: 0x%2.2x", *data);
  3177. break;
  3178. case BT_EIR_PERIPHERAL_CONN_INTERVAL:
  3179. if (data_len < 4)
  3180. break;
  3181. print_field("Peripheral Conn. Interval: "
  3182. "0x%4.4x - 0x%4.4x",
  3183. get_le16(&data[0]),
  3184. get_le16(&data[2]));
  3185. break;
  3186. case BT_EIR_SERVICE_UUID16:
  3187. if (data_len < sizeof(uint16_t))
  3188. break;
  3189. print_uuid16_list("16-bit Service UUIDs",
  3190. data, data_len);
  3191. break;
  3192. case BT_EIR_SERVICE_UUID128:
  3193. if (data_len < 16)
  3194. break;
  3195. print_uuid128_list("128-bit Service UUIDs",
  3196. data, data_len);
  3197. break;
  3198. case BT_EIR_SERVICE_DATA:
  3199. if (data_len < 2)
  3200. break;
  3201. sprintf(label, "Service Data (UUID 0x%4.4x)",
  3202. get_le16(&data[0]));
  3203. print_hex_field(label, &data[2], data_len - 2);
  3204. break;
  3205. case BT_EIR_RANDOM_ADDRESS:
  3206. if (data_len < 6)
  3207. break;
  3208. print_addr("Random Address", data, 0x01);
  3209. break;
  3210. case BT_EIR_PUBLIC_ADDRESS:
  3211. if (data_len < 6)
  3212. break;
  3213. print_addr("Public Address", data, 0x00);
  3214. break;
  3215. case BT_EIR_GAP_APPEARANCE:
  3216. if (data_len < 2)
  3217. break;
  3218. print_appearance(get_le16(data));
  3219. break;
  3220. case BT_EIR_SSP_HASH_P256:
  3221. if (data_len < 16)
  3222. break;
  3223. print_hash_p256(data);
  3224. break;
  3225. case BT_EIR_SSP_RANDOMIZER_P256:
  3226. if (data_len < 16)
  3227. break;
  3228. print_randomizer_p256(data);
  3229. break;
  3230. case BT_EIR_TRANSPORT_DISCOVERY:
  3231. print_transport_data(data, data_len);
  3232. break;
  3233. case BT_EIR_3D_INFO_DATA:
  3234. print_hex_field("3D Information Data", data, data_len);
  3235. if (data_len < 2)
  3236. break;
  3237. flags = *data;
  3238. print_field(" Features: 0x%2.2x", flags);
  3239. mask = print_bitfield(4, flags, eir_3d_table);
  3240. if (mask)
  3241. print_text(COLOR_UNKNOWN_FEATURE_BIT,
  3242. " Unknown features (0x%2.2x)", mask);
  3243. print_field(" Path Loss Threshold: %d", data[1]);
  3244. break;
  3245. case BT_EIR_MESH_DATA:
  3246. print_mesh_data(data, data_len);
  3247. break;
  3248. case BT_EIR_MESH_PROV:
  3249. print_mesh_prov(data, data_len);
  3250. break;
  3251. case BT_EIR_MESH_BEACON:
  3252. print_mesh_beacon(data, data_len);
  3253. break;
  3254. case BT_EIR_MANUFACTURER_DATA:
  3255. if (data_len < 2)
  3256. break;
  3257. print_manufacturer_data(data, data_len);
  3258. break;
  3259. default:
  3260. sprintf(label, "Unknown EIR field 0x%2.2x", eir[1]);
  3261. print_hex_field(label, data, data_len);
  3262. break;
  3263. }
  3264. eir += field_len + 1;
  3265. }
  3266. if (len < eir_len && eir[0] != 0)
  3267. packet_hexdump(eir, eir_len - len);
  3268. }
  3269. void packet_print_addr(const char *label, const void *data, uint8_t type)
  3270. {
  3271. print_addr(label ? : "Address", data, type);
  3272. }
  3273. void packet_print_handle(uint16_t handle)
  3274. {
  3275. print_handle_native(handle);
  3276. }
  3277. void packet_print_rssi(const char *label, int8_t rssi)
  3278. {
  3279. if ((uint8_t) rssi == 0x99 || rssi == 127)
  3280. print_field("%s: invalid (0x%2.2x)", label, (uint8_t) rssi);
  3281. else
  3282. print_field("%s: %d dBm (0x%2.2x)", label, rssi,
  3283. (uint8_t) rssi);
  3284. }
  3285. void packet_print_ad(const void *data, uint8_t size)
  3286. {
  3287. print_eir(data, size, true);
  3288. }
  3289. struct broadcast_message {
  3290. uint32_t frame_sync_instant;
  3291. uint16_t bluetooth_clock_phase;
  3292. uint16_t left_open_offset;
  3293. uint16_t left_close_offset;
  3294. uint16_t right_open_offset;
  3295. uint16_t right_close_offset;
  3296. uint16_t frame_sync_period;
  3297. uint8_t frame_sync_period_fraction;
  3298. } __attribute__ ((packed));
  3299. static void print_3d_broadcast(const void *data, uint8_t size)
  3300. {
  3301. const struct broadcast_message *msg = data;
  3302. uint32_t instant;
  3303. uint16_t left_open, left_close, right_open, right_close;
  3304. uint16_t phase, period;
  3305. uint8_t period_frac;
  3306. bool mode;
  3307. instant = le32_to_cpu(msg->frame_sync_instant);
  3308. mode = !!(instant & 0x40000000);
  3309. phase = le16_to_cpu(msg->bluetooth_clock_phase);
  3310. left_open = le16_to_cpu(msg->left_open_offset);
  3311. left_close = le16_to_cpu(msg->left_close_offset);
  3312. right_open = le16_to_cpu(msg->right_open_offset);
  3313. right_close = le16_to_cpu(msg->right_close_offset);
  3314. period = le16_to_cpu(msg->frame_sync_period);
  3315. period_frac = msg->frame_sync_period_fraction;
  3316. print_field(" Frame sync instant: 0x%8.8x", instant & 0x7fffffff);
  3317. print_field(" Video mode: %s (%d)", mode ? "Dual View" : "3D", mode);
  3318. print_field(" Bluetooth clock phase: %d usec (0x%4.4x)",
  3319. phase, phase);
  3320. print_field(" Left lense shutter open offset: %d usec (0x%4.4x)",
  3321. left_open, left_open);
  3322. print_field(" Left lense shutter close offset: %d usec (0x%4.4x)",
  3323. left_close, left_close);
  3324. print_field(" Right lense shutter open offset: %d usec (0x%4.4x)",
  3325. right_open, right_open);
  3326. print_field(" Right lense shutter close offset: %d usec (0x%4.4x)",
  3327. right_close, right_close);
  3328. print_field(" Frame sync period: %d.%d usec (0x%4.4x 0x%2.2x)",
  3329. period, period_frac * 256,
  3330. period, period_frac);
  3331. }
  3332. void packet_hexdump(const unsigned char *buf, uint16_t len)
  3333. {
  3334. static const char hexdigits[] = "0123456789abcdef";
  3335. char str[68];
  3336. uint16_t i;
  3337. if (!len)
  3338. return;
  3339. for (i = 0; i < len; i++) {
  3340. str[((i % 16) * 3) + 0] = hexdigits[buf[i] >> 4];
  3341. str[((i % 16) * 3) + 1] = hexdigits[buf[i] & 0xf];
  3342. str[((i % 16) * 3) + 2] = ' ';
  3343. str[(i % 16) + 49] = isprint(buf[i]) ? buf[i] : '.';
  3344. if ((i + 1) % 16 == 0) {
  3345. str[47] = ' ';
  3346. str[48] = ' ';
  3347. str[65] = '\0';
  3348. print_text(COLOR_WHITE, "%s", str);
  3349. str[0] = ' ';
  3350. }
  3351. }
  3352. if (i % 16 > 0) {
  3353. uint16_t j;
  3354. for (j = (i % 16); j < 16; j++) {
  3355. str[(j * 3) + 0] = ' ';
  3356. str[(j * 3) + 1] = ' ';
  3357. str[(j * 3) + 2] = ' ';
  3358. str[j + 49] = ' ';
  3359. }
  3360. str[47] = ' ';
  3361. str[48] = ' ';
  3362. str[65] = '\0';
  3363. print_text(COLOR_WHITE, "%s", str);
  3364. }
  3365. }
  3366. void packet_control(struct timeval *tv, struct ucred *cred,
  3367. uint16_t index, uint16_t opcode,
  3368. const void *data, uint16_t size)
  3369. {
  3370. control_message(opcode, data, size);
  3371. }
  3372. static int addr2str(const uint8_t *addr, char *str)
  3373. {
  3374. return sprintf(str, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
  3375. addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]);
  3376. }
  3377. void packet_monitor(struct timeval *tv, struct ucred *cred,
  3378. uint16_t index, uint16_t opcode,
  3379. const void *data, uint16_t size)
  3380. {
  3381. const struct btsnoop_opcode_new_index *ni;
  3382. const struct btsnoop_opcode_index_info *ii;
  3383. const struct btsnoop_opcode_user_logging *ul;
  3384. char str[18], extra_str[24];
  3385. uint16_t manufacturer;
  3386. const char *ident;
  3387. if (index != HCI_DEV_NONE) {
  3388. index_current = index;
  3389. }
  3390. if (index != HCI_DEV_NONE && index >= MAX_INDEX) {
  3391. print_field("Invalid index (%d)", index);
  3392. return;
  3393. }
  3394. if (tv && time_offset == ((time_t) -1))
  3395. time_offset = tv->tv_sec;
  3396. switch (opcode) {
  3397. case BTSNOOP_OPCODE_NEW_INDEX:
  3398. ni = data;
  3399. if (index < MAX_INDEX) {
  3400. index_list[index].type = ni->type;
  3401. memcpy(index_list[index].bdaddr, ni->bdaddr, 6);
  3402. index_list[index].manufacturer = fallback_manufacturer;
  3403. index_list[index].msft_opcode = BT_HCI_CMD_NOP;
  3404. }
  3405. addr2str(ni->bdaddr, str);
  3406. packet_new_index(tv, index, str, ni->type, ni->bus, ni->name);
  3407. break;
  3408. case BTSNOOP_OPCODE_DEL_INDEX:
  3409. if (index < MAX_INDEX)
  3410. addr2str(index_list[index].bdaddr, str);
  3411. else
  3412. sprintf(str, "00:00:00:00:00:00");
  3413. packet_del_index(tv, index, str);
  3414. break;
  3415. case BTSNOOP_OPCODE_COMMAND_PKT:
  3416. packet_hci_command(tv, cred, index, data, size);
  3417. break;
  3418. case BTSNOOP_OPCODE_EVENT_PKT:
  3419. packet_hci_event(tv, cred, index, data, size);
  3420. break;
  3421. case BTSNOOP_OPCODE_ACL_TX_PKT:
  3422. packet_hci_acldata(tv, cred, index, false, data, size);
  3423. break;
  3424. case BTSNOOP_OPCODE_ACL_RX_PKT:
  3425. packet_hci_acldata(tv, cred, index, true, data, size);
  3426. break;
  3427. case BTSNOOP_OPCODE_SCO_TX_PKT:
  3428. packet_hci_scodata(tv, cred, index, false, data, size);
  3429. break;
  3430. case BTSNOOP_OPCODE_SCO_RX_PKT:
  3431. packet_hci_scodata(tv, cred, index, true, data, size);
  3432. break;
  3433. case BTSNOOP_OPCODE_ISO_TX_PKT:
  3434. packet_hci_isodata(tv, cred, index, false, data, size);
  3435. break;
  3436. case BTSNOOP_OPCODE_ISO_RX_PKT:
  3437. packet_hci_isodata(tv, cred, index, true, data, size);
  3438. break;
  3439. case BTSNOOP_OPCODE_OPEN_INDEX:
  3440. if (index < MAX_INDEX)
  3441. addr2str(index_list[index].bdaddr, str);
  3442. else
  3443. sprintf(str, "00:00:00:00:00:00");
  3444. packet_open_index(tv, index, str);
  3445. break;
  3446. case BTSNOOP_OPCODE_CLOSE_INDEX:
  3447. if (index < MAX_INDEX)
  3448. addr2str(index_list[index].bdaddr, str);
  3449. else
  3450. sprintf(str, "00:00:00:00:00:00");
  3451. packet_close_index(tv, index, str);
  3452. break;
  3453. case BTSNOOP_OPCODE_INDEX_INFO:
  3454. ii = data;
  3455. manufacturer = le16_to_cpu(ii->manufacturer);
  3456. if (index < MAX_INDEX) {
  3457. memcpy(index_list[index].bdaddr, ii->bdaddr, 6);
  3458. index_list[index].manufacturer = manufacturer;
  3459. switch (manufacturer) {
  3460. case 2:
  3461. /*
  3462. * Intel controllers that support the
  3463. * Microsoft vendor extension are using
  3464. * 0xFC1E for VsMsftOpCode.
  3465. */
  3466. index_list[index].msft_opcode = 0xFC1E;
  3467. break;
  3468. case 93:
  3469. /*
  3470. * Realtek controllers that support the
  3471. * Microsoft vendor extenions are using
  3472. * 0xFCF0 for VsMsftOpCode.
  3473. */
  3474. index_list[index].msft_opcode = 0xFCF0;
  3475. break;
  3476. }
  3477. }
  3478. addr2str(ii->bdaddr, str);
  3479. packet_index_info(tv, index, str, manufacturer);
  3480. break;
  3481. case BTSNOOP_OPCODE_VENDOR_DIAG:
  3482. if (index < MAX_INDEX)
  3483. manufacturer = index_list[index].manufacturer;
  3484. else
  3485. manufacturer = fallback_manufacturer;
  3486. packet_vendor_diag(tv, index, manufacturer, data, size);
  3487. break;
  3488. case BTSNOOP_OPCODE_SYSTEM_NOTE:
  3489. packet_system_note(tv, cred, index, data);
  3490. break;
  3491. case BTSNOOP_OPCODE_USER_LOGGING:
  3492. ul = data;
  3493. ident = ul->ident_len ? data + sizeof(*ul) : NULL;
  3494. packet_user_logging(tv, cred, index, ul->priority, ident,
  3495. data + sizeof(*ul) + ul->ident_len,
  3496. size - (sizeof(*ul) + ul->ident_len));
  3497. break;
  3498. case BTSNOOP_OPCODE_CTRL_OPEN:
  3499. control_disable_decoding();
  3500. packet_ctrl_open(tv, cred, index, data, size);
  3501. break;
  3502. case BTSNOOP_OPCODE_CTRL_CLOSE:
  3503. packet_ctrl_close(tv, cred, index, data, size);
  3504. break;
  3505. case BTSNOOP_OPCODE_CTRL_COMMAND:
  3506. packet_ctrl_command(tv, cred, index, data, size);
  3507. break;
  3508. case BTSNOOP_OPCODE_CTRL_EVENT:
  3509. packet_ctrl_event(tv, cred, index, data, size);
  3510. break;
  3511. default:
  3512. sprintf(extra_str, "(code %d len %d)", opcode, size);
  3513. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  3514. "Unknown packet", NULL, extra_str);
  3515. packet_hexdump(data, size);
  3516. break;
  3517. }
  3518. }
  3519. void packet_simulator(struct timeval *tv, uint16_t frequency,
  3520. const void *data, uint16_t size)
  3521. {
  3522. char str[10];
  3523. if (tv && time_offset == ((time_t) -1))
  3524. time_offset = tv->tv_sec;
  3525. sprintf(str, "%u MHz", frequency);
  3526. print_packet(tv, NULL, '*', 0, NULL, COLOR_PHY_PACKET,
  3527. "Physical packet:", NULL, str);
  3528. ll_packet(frequency, data, size, false);
  3529. }
  3530. static void null_cmd(const void *data, uint8_t size)
  3531. {
  3532. }
  3533. static void status_rsp(const void *data, uint8_t size)
  3534. {
  3535. uint8_t status = *((const uint8_t *) data);
  3536. print_status(status);
  3537. }
  3538. static void status_handle_rsp(const void *data, uint8_t size)
  3539. {
  3540. uint8_t status = *((const uint8_t *) data);
  3541. print_status(status);
  3542. print_field("Connection handle: %d", get_u8(data + 1));
  3543. }
  3544. static void status_bdaddr_rsp(const void *data, uint8_t size)
  3545. {
  3546. uint8_t status = *((const uint8_t *) data);
  3547. print_status(status);
  3548. print_bdaddr(data + 1);
  3549. }
  3550. static void inquiry_cmd(const void *data, uint8_t size)
  3551. {
  3552. const struct bt_hci_cmd_inquiry *cmd = data;
  3553. print_iac(cmd->lap);
  3554. print_field("Length: %.2fs (0x%2.2x)",
  3555. cmd->length * 1.28, cmd->length);
  3556. print_num_resp(cmd->num_resp);
  3557. }
  3558. static void periodic_inquiry_cmd(const void *data, uint8_t size)
  3559. {
  3560. const struct bt_hci_cmd_periodic_inquiry *cmd = data;
  3561. print_field("Max period: %.2fs (0x%2.2x)",
  3562. cmd->max_period * 1.28, cmd->max_period);
  3563. print_field("Min period: %.2fs (0x%2.2x)",
  3564. cmd->min_period * 1.28, cmd->min_period);
  3565. print_iac(cmd->lap);
  3566. print_field("Length: %.2fs (0x%2.2x)",
  3567. cmd->length * 1.28, cmd->length);
  3568. print_num_resp(cmd->num_resp);
  3569. }
  3570. static void create_conn_cmd(const void *data, uint8_t size)
  3571. {
  3572. const struct bt_hci_cmd_create_conn *cmd = data;
  3573. const char *str;
  3574. print_bdaddr(cmd->bdaddr);
  3575. print_pkt_type(cmd->pkt_type);
  3576. print_pscan_rep_mode(cmd->pscan_rep_mode);
  3577. print_pscan_mode(cmd->pscan_mode);
  3578. print_clock_offset(cmd->clock_offset);
  3579. switch (cmd->role_switch) {
  3580. case 0x00:
  3581. str = "Stay central";
  3582. break;
  3583. case 0x01:
  3584. str = "Allow peripheral";
  3585. break;
  3586. default:
  3587. str = "Reserved";
  3588. break;
  3589. }
  3590. print_field("Role switch: %s (0x%2.2x)", str, cmd->role_switch);
  3591. }
  3592. static void disconnect_cmd(const void *data, uint8_t size)
  3593. {
  3594. const struct bt_hci_cmd_disconnect *cmd = data;
  3595. print_handle(cmd->handle);
  3596. print_reason(cmd->reason);
  3597. }
  3598. static void add_sco_conn_cmd(const void *data, uint8_t size)
  3599. {
  3600. const struct bt_hci_cmd_add_sco_conn *cmd = data;
  3601. print_handle(cmd->handle);
  3602. print_pkt_type_sco(cmd->pkt_type);
  3603. }
  3604. static void create_conn_cancel_cmd(const void *data, uint8_t size)
  3605. {
  3606. const struct bt_hci_cmd_create_conn_cancel *cmd = data;
  3607. print_bdaddr(cmd->bdaddr);
  3608. }
  3609. static void accept_conn_request_cmd(const void *data, uint8_t size)
  3610. {
  3611. const struct bt_hci_cmd_accept_conn_request *cmd = data;
  3612. print_bdaddr(cmd->bdaddr);
  3613. print_role(cmd->role);
  3614. }
  3615. static void reject_conn_request_cmd(const void *data, uint8_t size)
  3616. {
  3617. const struct bt_hci_cmd_reject_conn_request *cmd = data;
  3618. print_bdaddr(cmd->bdaddr);
  3619. print_reason(cmd->reason);
  3620. }
  3621. static void link_key_request_reply_cmd(const void *data, uint8_t size)
  3622. {
  3623. const struct bt_hci_cmd_link_key_request_reply *cmd = data;
  3624. print_bdaddr(cmd->bdaddr);
  3625. print_link_key(cmd->link_key);
  3626. }
  3627. static void link_key_request_neg_reply_cmd(const void *data, uint8_t size)
  3628. {
  3629. const struct bt_hci_cmd_link_key_request_neg_reply *cmd = data;
  3630. print_bdaddr(cmd->bdaddr);
  3631. }
  3632. static void pin_code_request_reply_cmd(const void *data, uint8_t size)
  3633. {
  3634. const struct bt_hci_cmd_pin_code_request_reply *cmd = data;
  3635. print_bdaddr(cmd->bdaddr);
  3636. print_field("PIN length: %d", cmd->pin_len);
  3637. print_pin_code(cmd->pin_code, cmd->pin_len);
  3638. }
  3639. static void pin_code_request_neg_reply_cmd(const void *data, uint8_t size)
  3640. {
  3641. const struct bt_hci_cmd_pin_code_request_neg_reply *cmd = data;
  3642. print_bdaddr(cmd->bdaddr);
  3643. }
  3644. static void change_conn_pkt_type_cmd(const void *data, uint8_t size)
  3645. {
  3646. const struct bt_hci_cmd_change_conn_pkt_type *cmd = data;
  3647. print_handle(cmd->handle);
  3648. print_pkt_type(cmd->pkt_type);
  3649. }
  3650. static void auth_requested_cmd(const void *data, uint8_t size)
  3651. {
  3652. const struct bt_hci_cmd_auth_requested *cmd = data;
  3653. print_handle(cmd->handle);
  3654. }
  3655. static void set_conn_encrypt_cmd(const void *data, uint8_t size)
  3656. {
  3657. const struct bt_hci_cmd_set_conn_encrypt *cmd = data;
  3658. print_handle(cmd->handle);
  3659. print_enable("Encryption", cmd->encr_mode);
  3660. }
  3661. static void change_conn_link_key_cmd(const void *data, uint8_t size)
  3662. {
  3663. const struct bt_hci_cmd_change_conn_link_key *cmd = data;
  3664. print_handle(cmd->handle);
  3665. }
  3666. static void link_key_selection_cmd(const void *data, uint8_t size)
  3667. {
  3668. const struct bt_hci_cmd_link_key_selection *cmd = data;
  3669. print_key_flag(cmd->key_flag);
  3670. }
  3671. static void remote_name_request_cmd(const void *data, uint8_t size)
  3672. {
  3673. const struct bt_hci_cmd_remote_name_request *cmd = data;
  3674. print_bdaddr(cmd->bdaddr);
  3675. print_pscan_rep_mode(cmd->pscan_rep_mode);
  3676. print_pscan_mode(cmd->pscan_mode);
  3677. print_clock_offset(cmd->clock_offset);
  3678. }
  3679. static void remote_name_request_cancel_cmd(const void *data, uint8_t size)
  3680. {
  3681. const struct bt_hci_cmd_remote_name_request_cancel *cmd = data;
  3682. print_bdaddr(cmd->bdaddr);
  3683. }
  3684. static void read_remote_features_cmd(const void *data, uint8_t size)
  3685. {
  3686. const struct bt_hci_cmd_read_remote_features *cmd = data;
  3687. print_handle(cmd->handle);
  3688. }
  3689. static void read_remote_ext_features_cmd(const void *data, uint8_t size)
  3690. {
  3691. const struct bt_hci_cmd_read_remote_ext_features *cmd = data;
  3692. print_handle(cmd->handle);
  3693. print_field("Page: %d", cmd->page);
  3694. }
  3695. static void read_remote_version_cmd(const void *data, uint8_t size)
  3696. {
  3697. const struct bt_hci_cmd_read_remote_version *cmd = data;
  3698. print_handle(cmd->handle);
  3699. }
  3700. static void read_clock_offset_cmd(const void *data, uint8_t size)
  3701. {
  3702. const struct bt_hci_cmd_read_clock_offset *cmd = data;
  3703. print_handle(cmd->handle);
  3704. }
  3705. static void read_lmp_handle_cmd(const void *data, uint8_t size)
  3706. {
  3707. const struct bt_hci_cmd_read_lmp_handle *cmd = data;
  3708. print_handle(cmd->handle);
  3709. }
  3710. static void read_lmp_handle_rsp(const void *data, uint8_t size)
  3711. {
  3712. const struct bt_hci_rsp_read_lmp_handle *rsp = data;
  3713. print_status(rsp->status);
  3714. print_handle(rsp->handle);
  3715. print_field("LMP handle: %d", rsp->lmp_handle);
  3716. print_field("Reserved: %d", le32_to_cpu(rsp->reserved));
  3717. }
  3718. static void setup_sync_conn_cmd(const void *data, uint8_t size)
  3719. {
  3720. const struct bt_hci_cmd_setup_sync_conn *cmd = data;
  3721. print_handle(cmd->handle);
  3722. print_field("Transmit bandwidth: %d", le32_to_cpu(cmd->tx_bandwidth));
  3723. print_field("Receive bandwidth: %d", le32_to_cpu(cmd->rx_bandwidth));
  3724. print_field("Max latency: %d", le16_to_cpu(cmd->max_latency));
  3725. print_voice_setting(cmd->voice_setting);
  3726. print_retransmission_effort(cmd->retrans_effort);
  3727. print_pkt_type_sco(cmd->pkt_type);
  3728. }
  3729. static void accept_sync_conn_request_cmd(const void *data, uint8_t size)
  3730. {
  3731. const struct bt_hci_cmd_accept_sync_conn_request *cmd = data;
  3732. print_bdaddr(cmd->bdaddr);
  3733. print_field("Transmit bandwidth: %d", le32_to_cpu(cmd->tx_bandwidth));
  3734. print_field("Receive bandwidth: %d", le32_to_cpu(cmd->rx_bandwidth));
  3735. print_field("Max latency: %d", le16_to_cpu(cmd->max_latency));
  3736. print_voice_setting(cmd->voice_setting);
  3737. print_retransmission_effort(cmd->retrans_effort);
  3738. print_pkt_type_sco(cmd->pkt_type);
  3739. }
  3740. static void reject_sync_conn_request_cmd(const void *data, uint8_t size)
  3741. {
  3742. const struct bt_hci_cmd_reject_sync_conn_request *cmd = data;
  3743. print_bdaddr(cmd->bdaddr);
  3744. print_reason(cmd->reason);
  3745. }
  3746. static void io_capability_request_reply_cmd(const void *data, uint8_t size)
  3747. {
  3748. const struct bt_hci_cmd_io_capability_request_reply *cmd = data;
  3749. print_bdaddr(cmd->bdaddr);
  3750. print_io_capability(cmd->capability);
  3751. print_oob_data(cmd->oob_data);
  3752. print_authentication(cmd->authentication);
  3753. }
  3754. static void user_confirm_request_reply_cmd(const void *data, uint8_t size)
  3755. {
  3756. const struct bt_hci_cmd_user_confirm_request_reply *cmd = data;
  3757. print_bdaddr(cmd->bdaddr);
  3758. }
  3759. static void user_confirm_request_neg_reply_cmd(const void *data, uint8_t size)
  3760. {
  3761. const struct bt_hci_cmd_user_confirm_request_neg_reply *cmd = data;
  3762. print_bdaddr(cmd->bdaddr);
  3763. }
  3764. static void user_passkey_request_reply_cmd(const void *data, uint8_t size)
  3765. {
  3766. const struct bt_hci_cmd_user_passkey_request_reply *cmd = data;
  3767. print_bdaddr(cmd->bdaddr);
  3768. print_passkey(cmd->passkey);
  3769. }
  3770. static void user_passkey_request_neg_reply_cmd(const void *data, uint8_t size)
  3771. {
  3772. const struct bt_hci_cmd_user_passkey_request_neg_reply *cmd = data;
  3773. print_bdaddr(cmd->bdaddr);
  3774. }
  3775. static void remote_oob_data_request_reply_cmd(const void *data, uint8_t size)
  3776. {
  3777. const struct bt_hci_cmd_remote_oob_data_request_reply *cmd = data;
  3778. print_bdaddr(cmd->bdaddr);
  3779. print_hash_p192(cmd->hash);
  3780. print_randomizer_p192(cmd->randomizer);
  3781. }
  3782. static void remote_oob_data_request_neg_reply_cmd(const void *data, uint8_t size)
  3783. {
  3784. const struct bt_hci_cmd_remote_oob_data_request_neg_reply *cmd = data;
  3785. print_bdaddr(cmd->bdaddr);
  3786. }
  3787. static void io_capability_request_neg_reply_cmd(const void *data, uint8_t size)
  3788. {
  3789. const struct bt_hci_cmd_io_capability_request_neg_reply *cmd = data;
  3790. print_bdaddr(cmd->bdaddr);
  3791. print_reason(cmd->reason);
  3792. }
  3793. static void create_phy_link_cmd(const void *data, uint8_t size)
  3794. {
  3795. const struct bt_hci_cmd_create_phy_link *cmd = data;
  3796. print_phy_handle(cmd->phy_handle);
  3797. print_key_len(cmd->key_len);
  3798. print_key_type(cmd->key_type);
  3799. packet_hexdump(data + 3, size - 3);
  3800. }
  3801. static void accept_phy_link_cmd(const void *data, uint8_t size)
  3802. {
  3803. const struct bt_hci_cmd_accept_phy_link *cmd = data;
  3804. print_phy_handle(cmd->phy_handle);
  3805. print_key_len(cmd->key_len);
  3806. print_key_type(cmd->key_type);
  3807. packet_hexdump(data + 3, size - 3);
  3808. }
  3809. static void disconn_phy_link_cmd(const void *data, uint8_t size)
  3810. {
  3811. const struct bt_hci_cmd_disconn_phy_link *cmd = data;
  3812. print_phy_handle(cmd->phy_handle);
  3813. print_reason(cmd->reason);
  3814. }
  3815. static void create_logic_link_cmd(const void *data, uint8_t size)
  3816. {
  3817. const struct bt_hci_cmd_create_logic_link *cmd = data;
  3818. print_phy_handle(cmd->phy_handle);
  3819. print_flow_spec("TX", cmd->tx_flow_spec);
  3820. print_flow_spec("RX", cmd->rx_flow_spec);
  3821. }
  3822. static void accept_logic_link_cmd(const void *data, uint8_t size)
  3823. {
  3824. const struct bt_hci_cmd_accept_logic_link *cmd = data;
  3825. print_phy_handle(cmd->phy_handle);
  3826. print_flow_spec("TX", cmd->tx_flow_spec);
  3827. print_flow_spec("RX", cmd->rx_flow_spec);
  3828. }
  3829. static void disconn_logic_link_cmd(const void *data, uint8_t size)
  3830. {
  3831. const struct bt_hci_cmd_disconn_logic_link *cmd = data;
  3832. print_handle(cmd->handle);
  3833. }
  3834. static void logic_link_cancel_cmd(const void *data, uint8_t size)
  3835. {
  3836. const struct bt_hci_cmd_logic_link_cancel *cmd = data;
  3837. print_phy_handle(cmd->phy_handle);
  3838. print_field("TX flow spec: 0x%2.2x", cmd->flow_spec);
  3839. }
  3840. static void logic_link_cancel_rsp(const void *data, uint8_t size)
  3841. {
  3842. const struct bt_hci_rsp_logic_link_cancel *rsp = data;
  3843. print_status(rsp->status);
  3844. print_phy_handle(rsp->phy_handle);
  3845. print_field("TX flow spec: 0x%2.2x", rsp->flow_spec);
  3846. }
  3847. static void flow_spec_modify_cmd(const void *data, uint8_t size)
  3848. {
  3849. const struct bt_hci_cmd_flow_spec_modify *cmd = data;
  3850. print_handle(cmd->handle);
  3851. print_flow_spec("TX", cmd->tx_flow_spec);
  3852. print_flow_spec("RX", cmd->rx_flow_spec);
  3853. }
  3854. static void enhanced_setup_sync_conn_cmd(const void *data, uint8_t size)
  3855. {
  3856. const struct bt_hci_cmd_enhanced_setup_sync_conn *cmd = data;
  3857. print_handle(cmd->handle);
  3858. print_field("Transmit bandwidth: %d", le32_to_cpu(cmd->tx_bandwidth));
  3859. print_field("Receive bandwidth: %d", le32_to_cpu(cmd->rx_bandwidth));
  3860. /* TODO */
  3861. print_field("Max latency: %d", le16_to_cpu(cmd->max_latency));
  3862. print_pkt_type_sco(cmd->pkt_type);
  3863. print_retransmission_effort(cmd->retrans_effort);
  3864. }
  3865. static void enhanced_accept_sync_conn_request_cmd(const void *data, uint8_t size)
  3866. {
  3867. const struct bt_hci_cmd_enhanced_accept_sync_conn_request *cmd = data;
  3868. print_bdaddr(cmd->bdaddr);
  3869. print_field("Transmit bandwidth: %d", le32_to_cpu(cmd->tx_bandwidth));
  3870. print_field("Receive bandwidth: %d", le32_to_cpu(cmd->rx_bandwidth));
  3871. /* TODO */
  3872. print_field("Max latency: %d", le16_to_cpu(cmd->max_latency));
  3873. print_pkt_type_sco(cmd->pkt_type);
  3874. print_retransmission_effort(cmd->retrans_effort);
  3875. }
  3876. static void truncated_page_cmd(const void *data, uint8_t size)
  3877. {
  3878. const struct bt_hci_cmd_truncated_page *cmd = data;
  3879. print_bdaddr(cmd->bdaddr);
  3880. print_pscan_rep_mode(cmd->pscan_rep_mode);
  3881. print_clock_offset(cmd->clock_offset);
  3882. }
  3883. static void truncated_page_cancel_cmd(const void *data, uint8_t size)
  3884. {
  3885. const struct bt_hci_cmd_truncated_page_cancel *cmd = data;
  3886. print_bdaddr(cmd->bdaddr);
  3887. }
  3888. static void set_peripheral_broadcast_cmd(const void *data, uint8_t size)
  3889. {
  3890. const struct bt_hci_cmd_set_peripheral_broadcast *cmd = data;
  3891. print_field("Enable: 0x%2.2x", cmd->enable);
  3892. print_lt_addr(cmd->lt_addr);
  3893. print_lpo_allowed(cmd->lpo_allowed);
  3894. print_pkt_type(cmd->pkt_type);
  3895. print_slot_625("Min interval", cmd->min_interval);
  3896. print_slot_625("Max interval", cmd->max_interval);
  3897. print_slot_625("Supervision timeout", cmd->timeout);
  3898. }
  3899. static void set_peripheral_broadcast_rsp(const void *data, uint8_t size)
  3900. {
  3901. const struct bt_hci_rsp_set_peripheral_broadcast *rsp = data;
  3902. print_status(rsp->status);
  3903. print_lt_addr(rsp->lt_addr);
  3904. print_interval(rsp->interval);
  3905. }
  3906. static void set_peripheral_broadcast_receive_cmd(const void *data, uint8_t size)
  3907. {
  3908. const struct bt_hci_cmd_set_peripheral_broadcast_receive *cmd = data;
  3909. print_field("Enable: 0x%2.2x", cmd->enable);
  3910. print_bdaddr(cmd->bdaddr);
  3911. print_lt_addr(cmd->lt_addr);
  3912. print_interval(cmd->interval);
  3913. print_field("Offset: 0x%8.8x", le32_to_cpu(cmd->offset));
  3914. print_field("Next broadcast instant: 0x%4.4x",
  3915. le16_to_cpu(cmd->instant));
  3916. print_slot_625("Supervision timeout", cmd->timeout);
  3917. print_field("Remote timing accuracy: %d ppm", cmd->accuracy);
  3918. print_field("Skip: 0x%2.2x", cmd->skip);
  3919. print_pkt_type(cmd->pkt_type);
  3920. print_channel_map(cmd->map);
  3921. }
  3922. static void set_peripheral_broadcast_receive_rsp(const void *data, uint8_t size)
  3923. {
  3924. const struct bt_hci_rsp_set_peripheral_broadcast_receive *rsp = data;
  3925. print_status(rsp->status);
  3926. print_bdaddr(rsp->bdaddr);
  3927. print_lt_addr(rsp->lt_addr);
  3928. }
  3929. static void receive_sync_train_cmd(const void *data, uint8_t size)
  3930. {
  3931. const struct bt_hci_cmd_receive_sync_train *cmd = data;
  3932. print_bdaddr(cmd->bdaddr);
  3933. print_timeout(cmd->timeout);
  3934. print_window(cmd->window);
  3935. print_interval(cmd->interval);
  3936. }
  3937. static void remote_oob_ext_data_request_reply_cmd(const void *data, uint8_t size)
  3938. {
  3939. const struct bt_hci_cmd_remote_oob_ext_data_request_reply *cmd = data;
  3940. print_bdaddr(cmd->bdaddr);
  3941. print_hash_p192(cmd->hash192);
  3942. print_randomizer_p192(cmd->randomizer192);
  3943. print_hash_p256(cmd->hash256);
  3944. print_randomizer_p256(cmd->randomizer256);
  3945. }
  3946. static void hold_mode_cmd(const void *data, uint8_t size)
  3947. {
  3948. const struct bt_hci_cmd_hold_mode *cmd = data;
  3949. print_handle(cmd->handle);
  3950. print_slot_625("Hold max interval", cmd->max_interval);
  3951. print_slot_625("Hold min interval", cmd->min_interval);
  3952. }
  3953. static void sniff_mode_cmd(const void *data, uint8_t size)
  3954. {
  3955. const struct bt_hci_cmd_sniff_mode *cmd = data;
  3956. print_handle(cmd->handle);
  3957. print_slot_625("Sniff max interval", cmd->max_interval);
  3958. print_slot_625("Sniff min interval", cmd->min_interval);
  3959. print_slot_125("Sniff attempt", cmd->attempt);
  3960. print_slot_125("Sniff timeout", cmd->timeout);
  3961. }
  3962. static void exit_sniff_mode_cmd(const void *data, uint8_t size)
  3963. {
  3964. const struct bt_hci_cmd_exit_sniff_mode *cmd = data;
  3965. print_handle(cmd->handle);
  3966. }
  3967. static void park_state_cmd(const void *data, uint8_t size)
  3968. {
  3969. const struct bt_hci_cmd_park_state *cmd = data;
  3970. print_handle(cmd->handle);
  3971. print_slot_625("Beacon max interval", cmd->max_interval);
  3972. print_slot_625("Beacon min interval", cmd->min_interval);
  3973. }
  3974. static void exit_park_state_cmd(const void *data, uint8_t size)
  3975. {
  3976. const struct bt_hci_cmd_exit_park_state *cmd = data;
  3977. print_handle(cmd->handle);
  3978. }
  3979. static void qos_setup_cmd(const void *data, uint8_t size)
  3980. {
  3981. const struct bt_hci_cmd_qos_setup *cmd = data;
  3982. print_handle(cmd->handle);
  3983. print_field("Flags: 0x%2.2x", cmd->flags);
  3984. print_service_type(cmd->service_type);
  3985. print_field("Token rate: %d", le32_to_cpu(cmd->token_rate));
  3986. print_field("Peak bandwidth: %d", le32_to_cpu(cmd->peak_bandwidth));
  3987. print_field("Latency: %d", le32_to_cpu(cmd->latency));
  3988. print_field("Delay variation: %d", le32_to_cpu(cmd->delay_variation));
  3989. }
  3990. static void role_discovery_cmd(const void *data, uint8_t size)
  3991. {
  3992. const struct bt_hci_cmd_role_discovery *cmd = data;
  3993. print_handle(cmd->handle);
  3994. }
  3995. static void role_discovery_rsp(const void *data, uint8_t size)
  3996. {
  3997. const struct bt_hci_rsp_role_discovery *rsp = data;
  3998. print_status(rsp->status);
  3999. print_handle(rsp->handle);
  4000. print_role(rsp->role);
  4001. }
  4002. static void switch_role_cmd(const void *data, uint8_t size)
  4003. {
  4004. const struct bt_hci_cmd_switch_role *cmd = data;
  4005. print_bdaddr(cmd->bdaddr);
  4006. print_role(cmd->role);
  4007. }
  4008. static void read_link_policy_cmd(const void *data, uint8_t size)
  4009. {
  4010. const struct bt_hci_cmd_read_link_policy *cmd = data;
  4011. print_handle(cmd->handle);
  4012. }
  4013. static void read_link_policy_rsp(const void *data, uint8_t size)
  4014. {
  4015. const struct bt_hci_rsp_read_link_policy *rsp = data;
  4016. print_status(rsp->status);
  4017. print_handle(rsp->handle);
  4018. print_link_policy(rsp->policy);
  4019. }
  4020. static void write_link_policy_cmd(const void *data, uint8_t size)
  4021. {
  4022. const struct bt_hci_cmd_write_link_policy *cmd = data;
  4023. print_handle(cmd->handle);
  4024. print_link_policy(cmd->policy);
  4025. }
  4026. static void write_link_policy_rsp(const void *data, uint8_t size)
  4027. {
  4028. const struct bt_hci_rsp_write_link_policy *rsp = data;
  4029. print_status(rsp->status);
  4030. print_handle(rsp->handle);
  4031. }
  4032. static void read_default_link_policy_rsp(const void *data, uint8_t size)
  4033. {
  4034. const struct bt_hci_rsp_read_default_link_policy *rsp = data;
  4035. print_status(rsp->status);
  4036. print_link_policy(rsp->policy);
  4037. }
  4038. static void write_default_link_policy_cmd(const void *data, uint8_t size)
  4039. {
  4040. const struct bt_hci_cmd_write_default_link_policy *cmd = data;
  4041. print_link_policy(cmd->policy);
  4042. }
  4043. static void flow_spec_cmd(const void *data, uint8_t size)
  4044. {
  4045. const struct bt_hci_cmd_flow_spec *cmd = data;
  4046. print_handle(cmd->handle);
  4047. print_field("Flags: 0x%2.2x", cmd->flags);
  4048. print_flow_direction(cmd->direction);
  4049. print_service_type(cmd->service_type);
  4050. print_field("Token rate: %d", le32_to_cpu(cmd->token_rate));
  4051. print_field("Token bucket size: %d",
  4052. le32_to_cpu(cmd->token_bucket_size));
  4053. print_field("Peak bandwidth: %d", le32_to_cpu(cmd->peak_bandwidth));
  4054. print_field("Access latency: %d", le32_to_cpu(cmd->access_latency));
  4055. }
  4056. static void sniff_subrating_cmd(const void *data, uint8_t size)
  4057. {
  4058. const struct bt_hci_cmd_sniff_subrating *cmd = data;
  4059. print_handle(cmd->handle);
  4060. print_slot_625("Max latency", cmd->max_latency);
  4061. print_slot_625("Min remote timeout", cmd->min_remote_timeout);
  4062. print_slot_625("Min local timeout", cmd->min_local_timeout);
  4063. }
  4064. static void sniff_subrating_rsp(const void *data, uint8_t size)
  4065. {
  4066. const struct bt_hci_rsp_sniff_subrating *rsp = data;
  4067. print_status(rsp->status);
  4068. print_handle(rsp->handle);
  4069. }
  4070. static void set_event_mask_cmd(const void *data, uint8_t size)
  4071. {
  4072. const struct bt_hci_cmd_set_event_mask *cmd = data;
  4073. print_event_mask(cmd->mask, events_table);
  4074. }
  4075. static void set_event_filter_cmd(const void *data, uint8_t size)
  4076. {
  4077. uint8_t type = *((const uint8_t *) data);
  4078. uint8_t filter;
  4079. const char *str;
  4080. switch (type) {
  4081. case 0x00:
  4082. str = "Clear All Filters";
  4083. break;
  4084. case 0x01:
  4085. str = "Inquiry Result";
  4086. break;
  4087. case 0x02:
  4088. str = "Connection Setup";
  4089. break;
  4090. default:
  4091. str = "Reserved";
  4092. break;
  4093. }
  4094. print_field("Type: %s (0x%2.2x)", str, type);
  4095. switch (type) {
  4096. case 0x00:
  4097. if (size > 1) {
  4098. print_text(COLOR_ERROR, " invalid parameter size");
  4099. packet_hexdump(data + 1, size - 1);
  4100. }
  4101. break;
  4102. case 0x01:
  4103. if (size < 2) {
  4104. print_text(COLOR_ERROR, " invalid parameter size");
  4105. break;
  4106. }
  4107. filter = *((const uint8_t *) (data + 1));
  4108. switch (filter) {
  4109. case 0x00:
  4110. str = "Return responses from all devices";
  4111. break;
  4112. case 0x01:
  4113. str = "Device with specific Class of Device";
  4114. break;
  4115. case 0x02:
  4116. str = "Device with specific BD_ADDR";
  4117. break;
  4118. default:
  4119. str = "Reserved";
  4120. break;
  4121. }
  4122. print_field("Filter: %s (0x%2.2x)", str, filter);
  4123. packet_hexdump(data + 2, size - 2);
  4124. break;
  4125. case 0x02:
  4126. filter = *((const uint8_t *) (data + 1));
  4127. switch (filter) {
  4128. case 0x00:
  4129. str = "Allow connections all devices";
  4130. break;
  4131. case 0x01:
  4132. str = "Allow connections with specific Class of Device";
  4133. break;
  4134. case 0x02:
  4135. str = "Allow connections with specific BD_ADDR";
  4136. break;
  4137. default:
  4138. str = "Reserved";
  4139. break;
  4140. }
  4141. if (size < 2) {
  4142. print_text(COLOR_ERROR, " invalid parameter size");
  4143. break;
  4144. }
  4145. print_field("Filter: %s (0x%2.2x)", str, filter);
  4146. packet_hexdump(data + 2, size - 2);
  4147. break;
  4148. default:
  4149. if (size < 2) {
  4150. print_text(COLOR_ERROR, " invalid parameter size");
  4151. break;
  4152. }
  4153. filter = *((const uint8_t *) (data + 1));
  4154. print_field("Filter: Reserved (0x%2.2x)", filter);
  4155. packet_hexdump(data + 2, size - 2);
  4156. break;
  4157. }
  4158. }
  4159. static void flush_cmd(const void *data, uint8_t size)
  4160. {
  4161. const struct bt_hci_cmd_flush *cmd = data;
  4162. print_handle(cmd->handle);
  4163. }
  4164. static void flush_rsp(const void *data, uint8_t size)
  4165. {
  4166. const struct bt_hci_rsp_flush *rsp = data;
  4167. print_status(rsp->status);
  4168. print_handle(rsp->handle);
  4169. }
  4170. static void read_pin_type_rsp(const void *data, uint8_t size)
  4171. {
  4172. const struct bt_hci_rsp_read_pin_type *rsp = data;
  4173. print_status(rsp->status);
  4174. print_pin_type(rsp->pin_type);
  4175. }
  4176. static void write_pin_type_cmd(const void *data, uint8_t size)
  4177. {
  4178. const struct bt_hci_cmd_write_pin_type *cmd = data;
  4179. print_pin_type(cmd->pin_type);
  4180. }
  4181. static void read_stored_link_key_cmd(const void *data, uint8_t size)
  4182. {
  4183. const struct bt_hci_cmd_read_stored_link_key *cmd = data;
  4184. print_bdaddr(cmd->bdaddr);
  4185. print_field("Read all: 0x%2.2x", cmd->read_all);
  4186. }
  4187. static void read_stored_link_key_rsp(const void *data, uint8_t size)
  4188. {
  4189. const struct bt_hci_rsp_read_stored_link_key *rsp = data;
  4190. print_status(rsp->status);
  4191. print_field("Max num keys: %d", le16_to_cpu(rsp->max_num_keys));
  4192. print_field("Num keys: %d", le16_to_cpu(rsp->num_keys));
  4193. }
  4194. static void write_stored_link_key_cmd(const void *data, uint8_t size)
  4195. {
  4196. const struct bt_hci_cmd_write_stored_link_key *cmd = data;
  4197. print_field("Num keys: %d", cmd->num_keys);
  4198. packet_hexdump(data + 1, size - 1);
  4199. }
  4200. static void write_stored_link_key_rsp(const void *data, uint8_t size)
  4201. {
  4202. const struct bt_hci_rsp_write_stored_link_key *rsp = data;
  4203. print_status(rsp->status);
  4204. print_field("Num keys: %d", rsp->num_keys);
  4205. }
  4206. static void delete_stored_link_key_cmd(const void *data, uint8_t size)
  4207. {
  4208. const struct bt_hci_cmd_delete_stored_link_key *cmd = data;
  4209. print_bdaddr(cmd->bdaddr);
  4210. print_field("Delete all: 0x%2.2x", cmd->delete_all);
  4211. }
  4212. static void delete_stored_link_key_rsp(const void *data, uint8_t size)
  4213. {
  4214. const struct bt_hci_rsp_delete_stored_link_key *rsp = data;
  4215. print_status(rsp->status);
  4216. print_field("Num keys: %d", le16_to_cpu(rsp->num_keys));
  4217. }
  4218. static void write_local_name_cmd(const void *data, uint8_t size)
  4219. {
  4220. const struct bt_hci_cmd_write_local_name *cmd = data;
  4221. print_name(cmd->name);
  4222. }
  4223. static void read_local_name_rsp(const void *data, uint8_t size)
  4224. {
  4225. const struct bt_hci_rsp_read_local_name *rsp = data;
  4226. print_status(rsp->status);
  4227. print_name(rsp->name);
  4228. }
  4229. static void read_conn_accept_timeout_rsp(const void *data, uint8_t size)
  4230. {
  4231. const struct bt_hci_rsp_read_conn_accept_timeout *rsp = data;
  4232. print_status(rsp->status);
  4233. print_timeout(rsp->timeout);
  4234. }
  4235. static void write_conn_accept_timeout_cmd(const void *data, uint8_t size)
  4236. {
  4237. const struct bt_hci_cmd_write_conn_accept_timeout *cmd = data;
  4238. print_timeout(cmd->timeout);
  4239. }
  4240. static void read_page_timeout_rsp(const void *data, uint8_t size)
  4241. {
  4242. const struct bt_hci_rsp_read_page_timeout *rsp = data;
  4243. print_status(rsp->status);
  4244. print_timeout(rsp->timeout);
  4245. }
  4246. static void write_page_timeout_cmd(const void *data, uint8_t size)
  4247. {
  4248. const struct bt_hci_cmd_write_page_timeout *cmd = data;
  4249. print_timeout(cmd->timeout);
  4250. }
  4251. static void read_scan_enable_rsp(const void *data, uint8_t size)
  4252. {
  4253. const struct bt_hci_rsp_read_scan_enable *rsp = data;
  4254. print_status(rsp->status);
  4255. print_scan_enable(rsp->enable);
  4256. }
  4257. static void write_scan_enable_cmd(const void *data, uint8_t size)
  4258. {
  4259. const struct bt_hci_cmd_write_scan_enable *cmd = data;
  4260. print_scan_enable(cmd->enable);
  4261. }
  4262. static void read_page_scan_activity_rsp(const void *data, uint8_t size)
  4263. {
  4264. const struct bt_hci_rsp_read_page_scan_activity *rsp = data;
  4265. print_status(rsp->status);
  4266. print_interval(rsp->interval);
  4267. print_window(rsp->window);
  4268. }
  4269. static void write_page_scan_activity_cmd(const void *data, uint8_t size)
  4270. {
  4271. const struct bt_hci_cmd_write_page_scan_activity *cmd = data;
  4272. print_interval(cmd->interval);
  4273. print_window(cmd->window);
  4274. }
  4275. static void read_inquiry_scan_activity_rsp(const void *data, uint8_t size)
  4276. {
  4277. const struct bt_hci_rsp_read_inquiry_scan_activity *rsp = data;
  4278. print_status(rsp->status);
  4279. print_interval(rsp->interval);
  4280. print_window(rsp->window);
  4281. }
  4282. static void write_inquiry_scan_activity_cmd(const void *data, uint8_t size)
  4283. {
  4284. const struct bt_hci_cmd_write_inquiry_scan_activity *cmd = data;
  4285. print_interval(cmd->interval);
  4286. print_window(cmd->window);
  4287. }
  4288. static void read_auth_enable_rsp(const void *data, uint8_t size)
  4289. {
  4290. const struct bt_hci_rsp_read_auth_enable *rsp = data;
  4291. print_status(rsp->status);
  4292. print_auth_enable(rsp->enable);
  4293. }
  4294. static void write_auth_enable_cmd(const void *data, uint8_t size)
  4295. {
  4296. const struct bt_hci_cmd_write_auth_enable *cmd = data;
  4297. print_auth_enable(cmd->enable);
  4298. }
  4299. static void read_encrypt_mode_rsp(const void *data, uint8_t size)
  4300. {
  4301. const struct bt_hci_rsp_read_encrypt_mode *rsp = data;
  4302. print_status(rsp->status);
  4303. print_encrypt_mode(rsp->mode);
  4304. }
  4305. static void write_encrypt_mode_cmd(const void *data, uint8_t size)
  4306. {
  4307. const struct bt_hci_cmd_write_encrypt_mode *cmd = data;
  4308. print_encrypt_mode(cmd->mode);
  4309. }
  4310. static void read_class_of_dev_rsp(const void *data, uint8_t size)
  4311. {
  4312. const struct bt_hci_rsp_read_class_of_dev *rsp = data;
  4313. print_status(rsp->status);
  4314. print_dev_class(rsp->dev_class);
  4315. }
  4316. static void write_class_of_dev_cmd(const void *data, uint8_t size)
  4317. {
  4318. const struct bt_hci_cmd_write_class_of_dev *cmd = data;
  4319. print_dev_class(cmd->dev_class);
  4320. }
  4321. static void read_voice_setting_rsp(const void *data, uint8_t size)
  4322. {
  4323. const struct bt_hci_rsp_read_voice_setting *rsp = data;
  4324. print_status(rsp->status);
  4325. print_voice_setting(rsp->setting);
  4326. }
  4327. static void write_voice_setting_cmd(const void *data, uint8_t size)
  4328. {
  4329. const struct bt_hci_cmd_write_voice_setting *cmd = data;
  4330. print_voice_setting(cmd->setting);
  4331. }
  4332. static void read_auto_flush_timeout_cmd(const void *data, uint8_t size)
  4333. {
  4334. const struct bt_hci_cmd_read_auto_flush_timeout *cmd = data;
  4335. print_handle(cmd->handle);
  4336. }
  4337. static void read_auto_flush_timeout_rsp(const void *data, uint8_t size)
  4338. {
  4339. const struct bt_hci_rsp_read_auto_flush_timeout *rsp = data;
  4340. print_status(rsp->status);
  4341. print_handle(rsp->handle);
  4342. print_flush_timeout(rsp->timeout);
  4343. }
  4344. static void write_auto_flush_timeout_cmd(const void *data, uint8_t size)
  4345. {
  4346. const struct bt_hci_cmd_write_auto_flush_timeout *cmd = data;
  4347. print_handle(cmd->handle);
  4348. print_flush_timeout(cmd->timeout);
  4349. }
  4350. static void write_auto_flush_timeout_rsp(const void *data, uint8_t size)
  4351. {
  4352. const struct bt_hci_rsp_write_auto_flush_timeout *rsp = data;
  4353. print_status(rsp->status);
  4354. print_handle(rsp->handle);
  4355. }
  4356. static void read_num_broadcast_retrans_rsp(const void *data, uint8_t size)
  4357. {
  4358. const struct bt_hci_rsp_read_num_broadcast_retrans *rsp = data;
  4359. print_status(rsp->status);
  4360. print_num_broadcast_retrans(rsp->num_retrans);
  4361. }
  4362. static void write_num_broadcast_retrans_cmd(const void *data, uint8_t size)
  4363. {
  4364. const struct bt_hci_cmd_write_num_broadcast_retrans *cmd = data;
  4365. print_num_broadcast_retrans(cmd->num_retrans);
  4366. }
  4367. static void read_hold_mode_activity_rsp(const void *data, uint8_t size)
  4368. {
  4369. const struct bt_hci_rsp_read_hold_mode_activity *rsp = data;
  4370. print_status(rsp->status);
  4371. print_hold_mode_activity(rsp->activity);
  4372. }
  4373. static void write_hold_mode_activity_cmd(const void *data, uint8_t size)
  4374. {
  4375. const struct bt_hci_cmd_write_hold_mode_activity *cmd = data;
  4376. print_hold_mode_activity(cmd->activity);
  4377. }
  4378. static void read_tx_power_cmd(const void *data, uint8_t size)
  4379. {
  4380. const struct bt_hci_cmd_read_tx_power *cmd = data;
  4381. print_handle(cmd->handle);
  4382. print_power_type(cmd->type);
  4383. }
  4384. static void read_tx_power_rsp(const void *data, uint8_t size)
  4385. {
  4386. const struct bt_hci_rsp_read_tx_power *rsp = data;
  4387. print_status(rsp->status);
  4388. print_handle(rsp->handle);
  4389. print_power_level(rsp->level, NULL);
  4390. }
  4391. static void read_sync_flow_control_rsp(const void *data, uint8_t size)
  4392. {
  4393. const struct bt_hci_rsp_read_sync_flow_control *rsp = data;
  4394. print_status(rsp->status);
  4395. print_enable("Flow control", rsp->enable);
  4396. }
  4397. static void write_sync_flow_control_cmd(const void *data, uint8_t size)
  4398. {
  4399. const struct bt_hci_cmd_write_sync_flow_control *cmd = data;
  4400. print_enable("Flow control", cmd->enable);
  4401. }
  4402. static void set_host_flow_control_cmd(const void *data, uint8_t size)
  4403. {
  4404. const struct bt_hci_cmd_set_host_flow_control *cmd = data;
  4405. print_host_flow_control(cmd->enable);
  4406. }
  4407. static void host_buffer_size_cmd(const void *data, uint8_t size)
  4408. {
  4409. const struct bt_hci_cmd_host_buffer_size *cmd = data;
  4410. print_field("ACL MTU: %-4d ACL max packet: %d",
  4411. le16_to_cpu(cmd->acl_mtu),
  4412. le16_to_cpu(cmd->acl_max_pkt));
  4413. print_field("SCO MTU: %-4d SCO max packet: %d",
  4414. cmd->sco_mtu,
  4415. le16_to_cpu(cmd->sco_max_pkt));
  4416. }
  4417. static void host_num_completed_packets_cmd(const void *data, uint8_t size)
  4418. {
  4419. const struct bt_hci_cmd_host_num_completed_packets *cmd = data;
  4420. print_field("Num handles: %d", cmd->num_handles);
  4421. print_handle(cmd->handle);
  4422. print_field("Count: %d", le16_to_cpu(cmd->count));
  4423. if (size > sizeof(*cmd))
  4424. packet_hexdump(data + sizeof(*cmd), size - sizeof(*cmd));
  4425. }
  4426. static void read_link_supv_timeout_cmd(const void *data, uint8_t size)
  4427. {
  4428. const struct bt_hci_cmd_read_link_supv_timeout *cmd = data;
  4429. print_handle(cmd->handle);
  4430. }
  4431. static void read_link_supv_timeout_rsp(const void *data, uint8_t size)
  4432. {
  4433. const struct bt_hci_rsp_read_link_supv_timeout *rsp = data;
  4434. print_status(rsp->status);
  4435. print_handle(rsp->handle);
  4436. print_timeout(rsp->timeout);
  4437. }
  4438. static void write_link_supv_timeout_cmd(const void *data, uint8_t size)
  4439. {
  4440. const struct bt_hci_cmd_write_link_supv_timeout *cmd = data;
  4441. print_handle(cmd->handle);
  4442. print_timeout(cmd->timeout);
  4443. }
  4444. static void write_link_supv_timeout_rsp(const void *data, uint8_t size)
  4445. {
  4446. const struct bt_hci_rsp_write_link_supv_timeout *rsp = data;
  4447. print_status(rsp->status);
  4448. print_handle(rsp->handle);
  4449. }
  4450. static void read_num_supported_iac_rsp(const void *data, uint8_t size)
  4451. {
  4452. const struct bt_hci_rsp_read_num_supported_iac *rsp = data;
  4453. print_status(rsp->status);
  4454. print_field("Number of IAC: %d", rsp->num_iac);
  4455. }
  4456. static void read_current_iac_lap_rsp(const void *data, uint8_t size)
  4457. {
  4458. const struct bt_hci_rsp_read_current_iac_lap *rsp = data;
  4459. uint8_t i;
  4460. print_status(rsp->status);
  4461. print_field("Number of IAC: %d", rsp->num_iac);
  4462. for (i = 0; i < rsp->num_iac; i++)
  4463. print_iac(rsp->iac_lap + (i * 3));
  4464. }
  4465. static void write_current_iac_lap_cmd(const void *data, uint8_t size)
  4466. {
  4467. const struct bt_hci_cmd_write_current_iac_lap *cmd = data;
  4468. uint8_t i;
  4469. print_field("Number of IAC: %d", cmd->num_iac);
  4470. for (i = 0; i < cmd->num_iac; i++)
  4471. print_iac(cmd->iac_lap + (i * 3));
  4472. }
  4473. static void read_page_scan_period_mode_rsp(const void *data, uint8_t size)
  4474. {
  4475. const struct bt_hci_rsp_read_page_scan_period_mode *rsp = data;
  4476. print_status(rsp->status);
  4477. print_pscan_period_mode(rsp->mode);
  4478. }
  4479. static void write_page_scan_period_mode_cmd(const void *data, uint8_t size)
  4480. {
  4481. const struct bt_hci_cmd_write_page_scan_period_mode *cmd = data;
  4482. print_pscan_period_mode(cmd->mode);
  4483. }
  4484. static void read_page_scan_mode_rsp(const void *data, uint8_t size)
  4485. {
  4486. const struct bt_hci_rsp_read_page_scan_mode *rsp = data;
  4487. print_status(rsp->status);
  4488. print_pscan_mode(rsp->mode);
  4489. }
  4490. static void write_page_scan_mode_cmd(const void *data, uint8_t size)
  4491. {
  4492. const struct bt_hci_cmd_write_page_scan_mode *cmd = data;
  4493. print_pscan_mode(cmd->mode);
  4494. }
  4495. static void set_afh_host_classification_cmd(const void *data, uint8_t size)
  4496. {
  4497. const struct bt_hci_cmd_set_afh_host_classification *cmd = data;
  4498. print_channel_map(cmd->map);
  4499. }
  4500. static void read_inquiry_scan_type_rsp(const void *data, uint8_t size)
  4501. {
  4502. const struct bt_hci_rsp_read_inquiry_scan_type *rsp = data;
  4503. print_status(rsp->status);
  4504. print_inquiry_scan_type(rsp->type);
  4505. }
  4506. static void write_inquiry_scan_type_cmd(const void *data, uint8_t size)
  4507. {
  4508. const struct bt_hci_cmd_write_inquiry_scan_type *cmd = data;
  4509. print_inquiry_scan_type(cmd->type);
  4510. }
  4511. static void read_inquiry_mode_rsp(const void *data, uint8_t size)
  4512. {
  4513. const struct bt_hci_rsp_read_inquiry_mode *rsp = data;
  4514. print_status(rsp->status);
  4515. print_inquiry_mode(rsp->mode);
  4516. }
  4517. static void write_inquiry_mode_cmd(const void *data, uint8_t size)
  4518. {
  4519. const struct bt_hci_cmd_write_inquiry_mode *cmd = data;
  4520. print_inquiry_mode(cmd->mode);
  4521. }
  4522. static void read_page_scan_type_rsp(const void *data, uint8_t size)
  4523. {
  4524. const struct bt_hci_rsp_read_page_scan_type *rsp = data;
  4525. print_status(rsp->status);
  4526. print_pscan_type(rsp->type);
  4527. }
  4528. static void write_page_scan_type_cmd(const void *data, uint8_t size)
  4529. {
  4530. const struct bt_hci_cmd_write_page_scan_type *cmd = data;
  4531. print_pscan_type(cmd->type);
  4532. }
  4533. static void read_afh_assessment_mode_rsp(const void *data, uint8_t size)
  4534. {
  4535. const struct bt_hci_rsp_read_afh_assessment_mode *rsp = data;
  4536. print_status(rsp->status);
  4537. print_enable("Mode", rsp->mode);
  4538. }
  4539. static void write_afh_assessment_mode_cmd(const void *data, uint8_t size)
  4540. {
  4541. const struct bt_hci_cmd_write_afh_assessment_mode *cmd = data;
  4542. print_enable("Mode", cmd->mode);
  4543. }
  4544. static void read_ext_inquiry_response_rsp(const void *data, uint8_t size)
  4545. {
  4546. const struct bt_hci_rsp_read_ext_inquiry_response *rsp = data;
  4547. print_status(rsp->status);
  4548. print_fec(rsp->fec);
  4549. print_eir(rsp->data, sizeof(rsp->data), false);
  4550. }
  4551. static void write_ext_inquiry_response_cmd(const void *data, uint8_t size)
  4552. {
  4553. const struct bt_hci_cmd_write_ext_inquiry_response *cmd = data;
  4554. print_fec(cmd->fec);
  4555. print_eir(cmd->data, sizeof(cmd->data), false);
  4556. }
  4557. static void refresh_encrypt_key_cmd(const void *data, uint8_t size)
  4558. {
  4559. const struct bt_hci_cmd_refresh_encrypt_key *cmd = data;
  4560. print_handle(cmd->handle);
  4561. }
  4562. static void read_simple_pairing_mode_rsp(const void *data, uint8_t size)
  4563. {
  4564. const struct bt_hci_rsp_read_simple_pairing_mode *rsp = data;
  4565. print_status(rsp->status);
  4566. print_enable("Mode", rsp->mode);
  4567. }
  4568. static void write_simple_pairing_mode_cmd(const void *data, uint8_t size)
  4569. {
  4570. const struct bt_hci_cmd_write_simple_pairing_mode *cmd = data;
  4571. print_enable("Mode", cmd->mode);
  4572. }
  4573. static void read_local_oob_data_rsp(const void *data, uint8_t size)
  4574. {
  4575. const struct bt_hci_rsp_read_local_oob_data *rsp = data;
  4576. print_status(rsp->status);
  4577. print_hash_p192(rsp->hash);
  4578. print_randomizer_p192(rsp->randomizer);
  4579. }
  4580. static void read_inquiry_resp_tx_power_rsp(const void *data, uint8_t size)
  4581. {
  4582. const struct bt_hci_rsp_read_inquiry_resp_tx_power *rsp = data;
  4583. print_status(rsp->status);
  4584. print_power_level(rsp->level, NULL);
  4585. }
  4586. static void write_inquiry_tx_power_cmd(const void *data, uint8_t size)
  4587. {
  4588. const struct bt_hci_cmd_write_inquiry_tx_power *cmd = data;
  4589. print_power_level(cmd->level, NULL);
  4590. }
  4591. static void read_erroneous_reporting_rsp(const void *data, uint8_t size)
  4592. {
  4593. const struct bt_hci_rsp_read_erroneous_reporting *rsp = data;
  4594. print_status(rsp->status);
  4595. print_enable("Mode", rsp->mode);
  4596. }
  4597. static void write_erroneous_reporting_cmd(const void *data, uint8_t size)
  4598. {
  4599. const struct bt_hci_cmd_write_erroneous_reporting *cmd = data;
  4600. print_enable("Mode", cmd->mode);
  4601. }
  4602. static void enhanced_flush_cmd(const void *data, uint8_t size)
  4603. {
  4604. const struct bt_hci_cmd_enhanced_flush *cmd = data;
  4605. const char *str;
  4606. print_handle(cmd->handle);
  4607. switch (cmd->type) {
  4608. case 0x00:
  4609. str = "Automatic flushable only";
  4610. break;
  4611. default:
  4612. str = "Reserved";
  4613. break;
  4614. }
  4615. print_field("Type: %s (0x%2.2x)", str, cmd->type);
  4616. }
  4617. static void send_keypress_notify_cmd(const void *data, uint8_t size)
  4618. {
  4619. const struct bt_hci_cmd_send_keypress_notify *cmd = data;
  4620. const char *str;
  4621. print_bdaddr(cmd->bdaddr);
  4622. switch (cmd->type) {
  4623. case 0x00:
  4624. str = "Passkey entry started";
  4625. break;
  4626. case 0x01:
  4627. str = "Passkey digit entered";
  4628. break;
  4629. case 0x02:
  4630. str = "Passkey digit erased";
  4631. break;
  4632. case 0x03:
  4633. str = "Passkey cleared";
  4634. break;
  4635. case 0x04:
  4636. str = "Passkey entry completed";
  4637. break;
  4638. default:
  4639. str = "Reserved";
  4640. break;
  4641. }
  4642. print_field("Type: %s (0x%2.2x)", str, cmd->type);
  4643. }
  4644. static void send_keypress_notify_rsp(const void *data, uint8_t size)
  4645. {
  4646. const struct bt_hci_rsp_send_keypress_notify *rsp = data;
  4647. print_status(rsp->status);
  4648. print_bdaddr(rsp->bdaddr);
  4649. }
  4650. static void set_event_mask_page2_cmd(const void *data, uint8_t size)
  4651. {
  4652. const struct bt_hci_cmd_set_event_mask_page2 *cmd = data;
  4653. print_event_mask(cmd->mask, events_page2_table);
  4654. }
  4655. static void read_location_data_rsp(const void *data, uint8_t size)
  4656. {
  4657. const struct bt_hci_rsp_read_location_data *rsp = data;
  4658. print_status(rsp->status);
  4659. print_location_domain_aware(rsp->domain_aware);
  4660. print_location_domain(rsp->domain);
  4661. print_location_domain_options(rsp->domain_options);
  4662. print_location_options(rsp->options);
  4663. }
  4664. static void write_location_data_cmd(const void *data, uint8_t size)
  4665. {
  4666. const struct bt_hci_cmd_write_location_data *cmd = data;
  4667. print_location_domain_aware(cmd->domain_aware);
  4668. print_location_domain(cmd->domain);
  4669. print_location_domain_options(cmd->domain_options);
  4670. print_location_options(cmd->options);
  4671. }
  4672. static void read_flow_control_mode_rsp(const void *data, uint8_t size)
  4673. {
  4674. const struct bt_hci_rsp_read_flow_control_mode *rsp = data;
  4675. print_status(rsp->status);
  4676. print_flow_control_mode(rsp->mode);
  4677. }
  4678. static void write_flow_control_mode_cmd(const void *data, uint8_t size)
  4679. {
  4680. const struct bt_hci_cmd_write_flow_control_mode *cmd = data;
  4681. print_flow_control_mode(cmd->mode);
  4682. }
  4683. static void read_enhanced_tx_power_cmd(const void *data, uint8_t size)
  4684. {
  4685. const struct bt_hci_cmd_read_enhanced_tx_power *cmd = data;
  4686. print_handle(cmd->handle);
  4687. print_power_type(cmd->type);
  4688. }
  4689. static void read_enhanced_tx_power_rsp(const void *data, uint8_t size)
  4690. {
  4691. const struct bt_hci_rsp_read_enhanced_tx_power *rsp = data;
  4692. print_status(rsp->status);
  4693. print_handle(rsp->handle);
  4694. print_power_level(rsp->level_gfsk, "GFSK");
  4695. print_power_level(rsp->level_dqpsk, "DQPSK");
  4696. print_power_level(rsp->level_8dpsk, "8DPSK");
  4697. }
  4698. static void short_range_mode_cmd(const void *data, uint8_t size)
  4699. {
  4700. const struct bt_hci_cmd_short_range_mode *cmd = data;
  4701. print_phy_handle(cmd->phy_handle);
  4702. print_enable("Short range mode", cmd->mode);
  4703. }
  4704. static void read_le_host_supported_rsp(const void *data, uint8_t size)
  4705. {
  4706. const struct bt_hci_rsp_read_le_host_supported *rsp = data;
  4707. print_status(rsp->status);
  4708. print_field("Supported: 0x%2.2x", rsp->supported);
  4709. print_field("Simultaneous: 0x%2.2x", rsp->simultaneous);
  4710. }
  4711. static void write_le_host_supported_cmd(const void *data, uint8_t size)
  4712. {
  4713. const struct bt_hci_cmd_write_le_host_supported *cmd = data;
  4714. print_field("Supported: 0x%2.2x", cmd->supported);
  4715. print_field("Simultaneous: 0x%2.2x", cmd->simultaneous);
  4716. }
  4717. static void set_reserved_lt_addr_cmd(const void *data, uint8_t size)
  4718. {
  4719. const struct bt_hci_cmd_set_reserved_lt_addr *cmd = data;
  4720. print_lt_addr(cmd->lt_addr);
  4721. }
  4722. static void set_reserved_lt_addr_rsp(const void *data, uint8_t size)
  4723. {
  4724. const struct bt_hci_rsp_set_reserved_lt_addr *rsp = data;
  4725. print_status(rsp->status);
  4726. print_lt_addr(rsp->lt_addr);
  4727. }
  4728. static void delete_reserved_lt_addr_cmd(const void *data, uint8_t size)
  4729. {
  4730. const struct bt_hci_cmd_delete_reserved_lt_addr *cmd = data;
  4731. print_lt_addr(cmd->lt_addr);
  4732. }
  4733. static void delete_reserved_lt_addr_rsp(const void *data, uint8_t size)
  4734. {
  4735. const struct bt_hci_rsp_delete_reserved_lt_addr *rsp = data;
  4736. print_status(rsp->status);
  4737. print_lt_addr(rsp->lt_addr);
  4738. }
  4739. static void set_peripheral_broadcast_data_cmd(const void *data, uint8_t size)
  4740. {
  4741. const struct bt_hci_cmd_set_peripheral_broadcast_data *cmd = data;
  4742. print_lt_addr(cmd->lt_addr);
  4743. print_broadcast_fragment(cmd->fragment);
  4744. print_field("Length: %d", cmd->length);
  4745. if (size - 3 != cmd->length)
  4746. print_text(COLOR_ERROR, "invalid data size (%d != %d)",
  4747. size - 3, cmd->length);
  4748. packet_hexdump(data + 3, size - 3);
  4749. }
  4750. static void set_peripheral_broadcast_data_rsp(const void *data, uint8_t size)
  4751. {
  4752. const struct bt_hci_rsp_set_peripheral_broadcast_data *rsp = data;
  4753. print_status(rsp->status);
  4754. print_lt_addr(rsp->lt_addr);
  4755. }
  4756. static void read_sync_train_params_rsp(const void *data, uint8_t size)
  4757. {
  4758. const struct bt_hci_rsp_read_sync_train_params *rsp = data;
  4759. print_status(rsp->status);
  4760. print_interval(rsp->interval);
  4761. print_field("Timeout: %.3f msec (0x%8.8x)",
  4762. le32_to_cpu(rsp->timeout) * 0.625,
  4763. le32_to_cpu(rsp->timeout));
  4764. print_field("Service data: 0x%2.2x", rsp->service_data);
  4765. }
  4766. static void write_sync_train_params_cmd(const void *data, uint8_t size)
  4767. {
  4768. const struct bt_hci_cmd_write_sync_train_params *cmd = data;
  4769. print_slot_625("Min interval", cmd->min_interval);
  4770. print_slot_625("Max interval", cmd->max_interval);
  4771. print_field("Timeout: %.3f msec (0x%8.8x)",
  4772. le32_to_cpu(cmd->timeout) * 0.625,
  4773. le32_to_cpu(cmd->timeout));
  4774. print_field("Service data: 0x%2.2x", cmd->service_data);
  4775. }
  4776. static void write_sync_train_params_rsp(const void *data, uint8_t size)
  4777. {
  4778. const struct bt_hci_rsp_write_sync_train_params *rsp = data;
  4779. print_status(rsp->status);
  4780. print_interval(rsp->interval);
  4781. }
  4782. static void read_secure_conn_support_rsp(const void *data, uint8_t size)
  4783. {
  4784. const struct bt_hci_rsp_read_secure_conn_support *rsp = data;
  4785. print_status(rsp->status);
  4786. print_enable("Support", rsp->support);
  4787. }
  4788. static void write_secure_conn_support_cmd(const void *data, uint8_t size)
  4789. {
  4790. const struct bt_hci_cmd_write_secure_conn_support *cmd = data;
  4791. print_enable("Support", cmd->support);
  4792. }
  4793. static void read_auth_payload_timeout_cmd(const void *data, uint8_t size)
  4794. {
  4795. const struct bt_hci_cmd_read_auth_payload_timeout *cmd = data;
  4796. print_handle(cmd->handle);
  4797. }
  4798. static void read_auth_payload_timeout_rsp(const void *data, uint8_t size)
  4799. {
  4800. const struct bt_hci_rsp_read_auth_payload_timeout *rsp = data;
  4801. print_status(rsp->status);
  4802. print_handle(rsp->handle);
  4803. print_auth_payload_timeout(rsp->timeout);
  4804. }
  4805. static void write_auth_payload_timeout_cmd(const void *data, uint8_t size)
  4806. {
  4807. const struct bt_hci_cmd_write_auth_payload_timeout *cmd = data;
  4808. print_handle(cmd->handle);
  4809. print_auth_payload_timeout(cmd->timeout);
  4810. }
  4811. static void write_auth_payload_timeout_rsp(const void *data, uint8_t size)
  4812. {
  4813. const struct bt_hci_rsp_write_auth_payload_timeout *rsp = data;
  4814. print_status(rsp->status);
  4815. print_handle(rsp->handle);
  4816. }
  4817. static void read_local_oob_ext_data_rsp(const void *data, uint8_t size)
  4818. {
  4819. const struct bt_hci_rsp_read_local_oob_ext_data *rsp = data;
  4820. print_status(rsp->status);
  4821. print_hash_p192(rsp->hash192);
  4822. print_randomizer_p192(rsp->randomizer192);
  4823. print_hash_p256(rsp->hash256);
  4824. print_randomizer_p256(rsp->randomizer256);
  4825. }
  4826. static void read_ext_page_timeout_rsp(const void *data, uint8_t size)
  4827. {
  4828. const struct bt_hci_rsp_read_ext_page_timeout *rsp = data;
  4829. print_status(rsp->status);
  4830. print_timeout(rsp->timeout);
  4831. }
  4832. static void write_ext_page_timeout_cmd(const void *data, uint8_t size)
  4833. {
  4834. const struct bt_hci_cmd_write_ext_page_timeout *cmd = data;
  4835. print_timeout(cmd->timeout);
  4836. }
  4837. static void read_ext_inquiry_length_rsp(const void *data, uint8_t size)
  4838. {
  4839. const struct bt_hci_rsp_read_ext_inquiry_length *rsp = data;
  4840. print_status(rsp->status);
  4841. print_interval(rsp->interval);
  4842. }
  4843. static void write_ext_inquiry_length_cmd(const void *data, uint8_t size)
  4844. {
  4845. const struct bt_hci_cmd_write_ext_inquiry_length *cmd = data;
  4846. print_interval(cmd->interval);
  4847. }
  4848. static void read_local_version_rsp(const void *data, uint8_t size)
  4849. {
  4850. const struct bt_hci_rsp_read_local_version *rsp = data;
  4851. uint16_t manufacturer;
  4852. print_status(rsp->status);
  4853. print_hci_version(rsp->hci_ver, rsp->hci_rev);
  4854. manufacturer = le16_to_cpu(rsp->manufacturer);
  4855. if (index_current < MAX_INDEX) {
  4856. switch (index_list[index_current].type) {
  4857. case HCI_PRIMARY:
  4858. print_lmp_version(rsp->lmp_ver, rsp->lmp_subver);
  4859. break;
  4860. case HCI_AMP:
  4861. print_pal_version(rsp->lmp_ver, rsp->lmp_subver);
  4862. break;
  4863. }
  4864. index_list[index_current].manufacturer = manufacturer;
  4865. }
  4866. print_manufacturer(rsp->manufacturer);
  4867. switch (manufacturer) {
  4868. case 15:
  4869. print_manufacturer_broadcom(rsp->lmp_subver, rsp->hci_rev);
  4870. break;
  4871. }
  4872. }
  4873. static void read_local_commands_rsp(const void *data, uint8_t size)
  4874. {
  4875. const struct bt_hci_rsp_read_local_commands *rsp = data;
  4876. print_status(rsp->status);
  4877. print_commands(rsp->commands);
  4878. }
  4879. static void read_local_features_rsp(const void *data, uint8_t size)
  4880. {
  4881. const struct bt_hci_rsp_read_local_features *rsp = data;
  4882. print_status(rsp->status);
  4883. print_features(0, rsp->features, 0x00);
  4884. }
  4885. static void read_local_ext_features_cmd(const void *data, uint8_t size)
  4886. {
  4887. const struct bt_hci_cmd_read_local_ext_features *cmd = data;
  4888. print_field("Page: %d", cmd->page);
  4889. }
  4890. static void read_local_ext_features_rsp(const void *data, uint8_t size)
  4891. {
  4892. const struct bt_hci_rsp_read_local_ext_features *rsp = data;
  4893. print_status(rsp->status);
  4894. print_field("Page: %d/%d", rsp->page, rsp->max_page);
  4895. print_features(rsp->page, rsp->features, 0x00);
  4896. }
  4897. static void read_buffer_size_rsp(const void *data, uint8_t size)
  4898. {
  4899. const struct bt_hci_rsp_read_buffer_size *rsp = data;
  4900. print_status(rsp->status);
  4901. print_field("ACL MTU: %-4d ACL max packet: %d",
  4902. le16_to_cpu(rsp->acl_mtu),
  4903. le16_to_cpu(rsp->acl_max_pkt));
  4904. print_field("SCO MTU: %-4d SCO max packet: %d",
  4905. rsp->sco_mtu,
  4906. le16_to_cpu(rsp->sco_max_pkt));
  4907. }
  4908. static void read_country_code_rsp(const void *data, uint8_t size)
  4909. {
  4910. const struct bt_hci_rsp_read_country_code *rsp = data;
  4911. const char *str;
  4912. print_status(rsp->status);
  4913. switch (rsp->code) {
  4914. case 0x00:
  4915. str = "North America, Europe*, Japan";
  4916. break;
  4917. case 0x01:
  4918. str = "France";
  4919. break;
  4920. default:
  4921. str = "Reserved";
  4922. break;
  4923. }
  4924. print_field("Country code: %s (0x%2.2x)", str, rsp->code);
  4925. }
  4926. static void read_bd_addr_rsp(const void *data, uint8_t size)
  4927. {
  4928. const struct bt_hci_rsp_read_bd_addr *rsp = data;
  4929. print_status(rsp->status);
  4930. print_bdaddr(rsp->bdaddr);
  4931. if (index_current < MAX_INDEX)
  4932. memcpy(index_list[index_current].bdaddr, rsp->bdaddr, 6);
  4933. }
  4934. static void read_data_block_size_rsp(const void *data, uint8_t size)
  4935. {
  4936. const struct bt_hci_rsp_read_data_block_size *rsp = data;
  4937. print_status(rsp->status);
  4938. print_field("Max ACL length: %d", le16_to_cpu(rsp->max_acl_len));
  4939. print_field("Block length: %d", le16_to_cpu(rsp->block_len));
  4940. print_field("Num blocks: %d", le16_to_cpu(rsp->num_blocks));
  4941. }
  4942. static void read_local_codecs_rsp(const void *data, uint8_t size)
  4943. {
  4944. const struct bt_hci_rsp_read_local_codecs *rsp = data;
  4945. uint8_t i, num_vnd_codecs;
  4946. if (rsp->num_codecs + 3 > size) {
  4947. print_field("Invalid number of codecs.");
  4948. return;
  4949. }
  4950. print_status(rsp->status);
  4951. print_field("Number of supported codecs: %d", rsp->num_codecs);
  4952. for (i = 0; i < rsp->num_codecs; i++)
  4953. print_codec_id(" Codec", rsp->codec[i]);
  4954. num_vnd_codecs = rsp->codec[rsp->num_codecs];
  4955. print_field("Number of vendor codecs: %d", num_vnd_codecs);
  4956. packet_hexdump(data + rsp->num_codecs + 3,
  4957. size - rsp->num_codecs - 3);
  4958. }
  4959. static void print_codecs(const void *data, int i)
  4960. {
  4961. const struct bt_hci_codec *codec = data;
  4962. print_codec(" Codec", codec);
  4963. }
  4964. typedef void (*print_list_func_t)(const void *data, int i);
  4965. static void print_list(const void *data, uint8_t size, int num_items,
  4966. size_t item_size, print_list_func_t func)
  4967. {
  4968. int i;
  4969. for (i = 0; size >= item_size && num_items; i++) {
  4970. if (func)
  4971. func(data, i);
  4972. data += item_size;
  4973. size -= item_size;
  4974. num_items--;
  4975. }
  4976. if (num_items)
  4977. print_hex_field("", data, size);
  4978. }
  4979. static void read_local_codecs_rsp_v2(const void *data, uint8_t size)
  4980. {
  4981. const struct bt_hci_rsp_read_local_codecs_v2 *rsp = data;
  4982. uint8_t num_vnd_codecs;
  4983. if (rsp->num_codecs + 3 > size) {
  4984. print_field("Invalid number of codecs.");
  4985. return;
  4986. }
  4987. print_status(rsp->status);
  4988. print_field("Number of supported codecs: %d", rsp->num_codecs);
  4989. size -= sizeof(*rsp);
  4990. if (size < rsp->num_codecs * sizeof(*rsp->codec)) {
  4991. print_field("Invalid number of codecs.");
  4992. return;
  4993. }
  4994. print_list(rsp->codec, size, rsp->num_codecs, sizeof(*rsp->codec),
  4995. print_codecs);
  4996. size -= rsp->num_codecs * sizeof(*rsp->codec);
  4997. if (size < sizeof(uint8_t)) {
  4998. print_field("Invalid number of vendor codecs.");
  4999. return;
  5000. }
  5001. num_vnd_codecs = rsp->codec[rsp->num_codecs].id;
  5002. print_field("Number of vendor codecs: %d", num_vnd_codecs);
  5003. }
  5004. static void print_path_direction(const char *prefix, uint8_t dir)
  5005. {
  5006. const char *str;
  5007. switch (dir) {
  5008. case 0x00:
  5009. str = "Input (Host to Controller)";
  5010. break;
  5011. case 0x01:
  5012. str = "Output (Controller to Host)";
  5013. break;
  5014. default:
  5015. str = "Reserved";
  5016. break;
  5017. }
  5018. print_field("%s: %s (0x%2.2x)", prefix, str, dir);
  5019. }
  5020. static void print_vnd_codec(const char *label,
  5021. const struct bt_hci_vnd_codec *codec)
  5022. {
  5023. uint8_t mask;
  5024. print_codec_id(label, codec->id);
  5025. if (codec->id == 0xff) {
  5026. packet_print_company("Company Codec ID",
  5027. le16_to_cpu(codec->cid));
  5028. print_field("Vendor Codec ID: %d", le16_to_cpu(codec->vid));
  5029. }
  5030. print_field("Logical Transport Type: 0x%02x", codec->transport);
  5031. mask = print_bitfield(2, codec->transport, codec_transport_table);
  5032. if (mask)
  5033. print_text(COLOR_UNKNOWN_SERVICE_CLASS,
  5034. " Unknown transport (0x%2.2x)", mask);
  5035. }
  5036. static void read_local_codec_caps_cmd(const void *data, uint8_t size)
  5037. {
  5038. const struct bt_hci_cmd_read_local_codec_caps *cmd = data;
  5039. print_vnd_codec("Codec", &cmd->codec);
  5040. print_path_direction("Direction", cmd->dir);
  5041. }
  5042. static void read_local_codec_caps_rsp(const void *data, uint8_t size)
  5043. {
  5044. const struct bt_hci_rsp_read_local_codec_caps *rsp = data;
  5045. uint8_t i;
  5046. print_status(rsp->status);
  5047. print_field("Number of codec capabilities: %d", rsp->num);
  5048. data += sizeof(*rsp);
  5049. size -= sizeof(*rsp);
  5050. for (i = 0; i < rsp->num; i++) {
  5051. const struct bt_hci_codec_caps *caps = data;
  5052. if (size < sizeof(*caps)) {
  5053. print_field("Invalid capabilities: %u < %zu",
  5054. size, sizeof(*caps));
  5055. return;
  5056. }
  5057. print_field(" Capabilities #%u:", i);
  5058. packet_hexdump(caps->data, caps->len);
  5059. data += 1 + caps->len;
  5060. size -= 1 + caps->len;
  5061. }
  5062. }
  5063. static void read_local_ctrl_delay_cmd(const void *data, uint8_t size)
  5064. {
  5065. const struct bt_hci_cmd_read_local_ctrl_delay *cmd = data;
  5066. print_vnd_codec("Codec", &cmd->codec);
  5067. print_path_direction("Direction", cmd->dir);
  5068. print_field("Length Codec Configuration: %u", cmd->codec_cfg_len);
  5069. }
  5070. static void config_data_path_cmd(const void *data, uint8_t size)
  5071. {
  5072. const struct bt_hci_cmd_config_data_path *cmd = data;
  5073. print_path_direction("Direction", cmd->dir);
  5074. print_field("ID: %u", cmd->id);
  5075. print_field("Vendor Specific Config Length: %u", cmd->vnd_config_len);
  5076. print_hex_field("Vendor Specific Config", cmd->vnd_config,
  5077. cmd->vnd_config_len);
  5078. }
  5079. static void print_usec_interval(const char *prefix, const uint8_t interval[3])
  5080. {
  5081. uint32_t u24 = 0;
  5082. memcpy(&u24, interval, 3);
  5083. print_field("%s: %u us (0x%6.6x)", prefix, le32_to_cpu(u24),
  5084. le32_to_cpu(u24));
  5085. }
  5086. static void read_local_ctrl_delay_rsp(const void *data, uint8_t size)
  5087. {
  5088. const struct bt_hci_rsp_read_local_ctrl_delay *rsp = data;
  5089. print_status(rsp->status);
  5090. print_usec_interval("Minimum Controller delay", rsp->min_delay);
  5091. print_usec_interval("Maximum Controller delay", rsp->max_delay);
  5092. }
  5093. static void read_local_pairing_options_rsp(const void *data, uint8_t size)
  5094. {
  5095. const struct bt_hci_rsp_read_local_pairing_options *rsp = data;
  5096. print_status(rsp->status);
  5097. print_field("Pairing options: 0x%2.2x", rsp->pairing_options);
  5098. print_field("Max encryption key size: %u octets", rsp->max_key_size);
  5099. }
  5100. static void read_failed_contact_counter_cmd(const void *data, uint8_t size)
  5101. {
  5102. const struct bt_hci_cmd_read_failed_contact_counter *cmd = data;
  5103. print_handle(cmd->handle);
  5104. }
  5105. static void read_failed_contact_counter_rsp(const void *data, uint8_t size)
  5106. {
  5107. const struct bt_hci_rsp_read_failed_contact_counter *rsp = data;
  5108. print_status(rsp->status);
  5109. print_handle(rsp->handle);
  5110. print_field("Counter: %u", le16_to_cpu(rsp->counter));
  5111. }
  5112. static void reset_failed_contact_counter_cmd(const void *data, uint8_t size)
  5113. {
  5114. const struct bt_hci_cmd_reset_failed_contact_counter *cmd = data;
  5115. print_handle(cmd->handle);
  5116. }
  5117. static void reset_failed_contact_counter_rsp(const void *data, uint8_t size)
  5118. {
  5119. const struct bt_hci_rsp_reset_failed_contact_counter *rsp = data;
  5120. print_status(rsp->status);
  5121. print_handle(rsp->handle);
  5122. }
  5123. static void read_link_quality_cmd(const void *data, uint8_t size)
  5124. {
  5125. const struct bt_hci_cmd_read_link_quality *cmd = data;
  5126. print_handle(cmd->handle);
  5127. }
  5128. static void read_link_quality_rsp(const void *data, uint8_t size)
  5129. {
  5130. const struct bt_hci_rsp_read_link_quality *rsp = data;
  5131. print_status(rsp->status);
  5132. print_handle(rsp->handle);
  5133. print_field("Link quality: 0x%2.2x", rsp->link_quality);
  5134. }
  5135. static void read_rssi_cmd(const void *data, uint8_t size)
  5136. {
  5137. const struct bt_hci_cmd_read_rssi *cmd = data;
  5138. print_handle(cmd->handle);
  5139. }
  5140. static void read_rssi_rsp(const void *data, uint8_t size)
  5141. {
  5142. const struct bt_hci_rsp_read_rssi *rsp = data;
  5143. print_status(rsp->status);
  5144. print_handle(rsp->handle);
  5145. print_rssi(rsp->rssi);
  5146. }
  5147. static void read_afh_channel_map_cmd(const void *data, uint8_t size)
  5148. {
  5149. const struct bt_hci_cmd_read_afh_channel_map *cmd = data;
  5150. print_handle(cmd->handle);
  5151. }
  5152. static void read_afh_channel_map_rsp(const void *data, uint8_t size)
  5153. {
  5154. const struct bt_hci_rsp_read_afh_channel_map *rsp = data;
  5155. print_status(rsp->status);
  5156. print_handle(rsp->handle);
  5157. print_enable("Mode", rsp->mode);
  5158. print_channel_map(rsp->map);
  5159. }
  5160. static void read_clock_cmd(const void *data, uint8_t size)
  5161. {
  5162. const struct bt_hci_cmd_read_clock *cmd = data;
  5163. print_handle(cmd->handle);
  5164. print_clock_type(cmd->type);
  5165. }
  5166. static void read_clock_rsp(const void *data, uint8_t size)
  5167. {
  5168. const struct bt_hci_rsp_read_clock *rsp = data;
  5169. print_status(rsp->status);
  5170. print_handle(rsp->handle);
  5171. print_clock(rsp->clock);
  5172. print_clock_accuracy(rsp->accuracy);
  5173. }
  5174. static void read_encrypt_key_size_cmd(const void *data, uint8_t size)
  5175. {
  5176. const struct bt_hci_cmd_read_encrypt_key_size *cmd = data;
  5177. print_handle(cmd->handle);
  5178. }
  5179. static void read_encrypt_key_size_rsp(const void *data, uint8_t size)
  5180. {
  5181. const struct bt_hci_rsp_read_encrypt_key_size *rsp = data;
  5182. print_status(rsp->status);
  5183. print_handle(rsp->handle);
  5184. print_key_size(rsp->key_size);
  5185. }
  5186. static void read_local_amp_info_rsp(const void *data, uint8_t size)
  5187. {
  5188. const struct bt_hci_rsp_read_local_amp_info *rsp = data;
  5189. const char *str;
  5190. print_status(rsp->status);
  5191. print_amp_status(rsp->amp_status);
  5192. print_field("Total bandwidth: %d kbps", le32_to_cpu(rsp->total_bw));
  5193. print_field("Max guaranteed bandwidth: %d kbps",
  5194. le32_to_cpu(rsp->max_bw));
  5195. print_field("Min latency: %d", le32_to_cpu(rsp->min_latency));
  5196. print_field("Max PDU size: %d", le32_to_cpu(rsp->max_pdu));
  5197. switch (rsp->amp_type) {
  5198. case 0x00:
  5199. str = "Primary BR/EDR Controller";
  5200. break;
  5201. case 0x01:
  5202. str = "802.11 AMP Controller";
  5203. break;
  5204. default:
  5205. str = "Reserved";
  5206. break;
  5207. }
  5208. print_field("Controller type: %s (0x%2.2x)", str, rsp->amp_type);
  5209. print_field("PAL capabilities: 0x%4.4x", le16_to_cpu(rsp->pal_cap));
  5210. print_field("Max ASSOC length: %d", le16_to_cpu(rsp->max_assoc_len));
  5211. print_field("Max flush timeout: %d", le32_to_cpu(rsp->max_flush_to));
  5212. print_field("Best effort flush timeout: %d",
  5213. le32_to_cpu(rsp->be_flush_to));
  5214. }
  5215. static void read_local_amp_assoc_cmd(const void *data, uint8_t size)
  5216. {
  5217. const struct bt_hci_cmd_read_local_amp_assoc *cmd = data;
  5218. print_phy_handle(cmd->phy_handle);
  5219. print_field("Length so far: %d", le16_to_cpu(cmd->len_so_far));
  5220. print_field("Max ASSOC length: %d", le16_to_cpu(cmd->max_assoc_len));
  5221. }
  5222. static void read_local_amp_assoc_rsp(const void *data, uint8_t size)
  5223. {
  5224. const struct bt_hci_rsp_read_local_amp_assoc *rsp = data;
  5225. print_status(rsp->status);
  5226. print_phy_handle(rsp->phy_handle);
  5227. print_field("Remaining ASSOC length: %d",
  5228. le16_to_cpu(rsp->remain_assoc_len));
  5229. packet_hexdump(data + 4, size - 4);
  5230. }
  5231. static void write_remote_amp_assoc_cmd(const void *data, uint8_t size)
  5232. {
  5233. const struct bt_hci_cmd_write_remote_amp_assoc *cmd = data;
  5234. print_phy_handle(cmd->phy_handle);
  5235. print_field("Length so far: %d", le16_to_cpu(cmd->len_so_far));
  5236. print_field("Remaining ASSOC length: %d",
  5237. le16_to_cpu(cmd->remain_assoc_len));
  5238. packet_hexdump(data + 5, size - 5);
  5239. }
  5240. static void write_remote_amp_assoc_rsp(const void *data, uint8_t size)
  5241. {
  5242. const struct bt_hci_rsp_write_remote_amp_assoc *rsp = data;
  5243. print_status(rsp->status);
  5244. print_phy_handle(rsp->phy_handle);
  5245. }
  5246. static void get_mws_transport_config_rsp(const void *data, uint8_t size)
  5247. {
  5248. const struct bt_hci_rsp_get_mws_transport_config *rsp = data;
  5249. uint8_t sum_baud_rates = 0;
  5250. int i;
  5251. print_status(rsp->status);
  5252. print_field("Number of transports: %d", rsp->num_transports);
  5253. for (i = 0; i < rsp->num_transports; i++) {
  5254. uint8_t transport = rsp->transport[0];
  5255. uint8_t num_baud_rates = rsp->transport[1];
  5256. const char *str;
  5257. switch (transport) {
  5258. case 0x00:
  5259. str = "Disbabled";
  5260. break;
  5261. case 0x01:
  5262. str = "WCI-1";
  5263. break;
  5264. case 0x02:
  5265. str = "WCI-2";
  5266. break;
  5267. default:
  5268. str = "Reserved";
  5269. break;
  5270. }
  5271. print_field(" Transport layer: %s (0x%2.2x)", str, transport);
  5272. print_field(" Number of baud rates: %d", num_baud_rates);
  5273. sum_baud_rates += num_baud_rates;
  5274. }
  5275. print_field("Baud rate list: %u entr%s", sum_baud_rates,
  5276. sum_baud_rates == 1 ? "y" : "ies");
  5277. for (i = 0; i < sum_baud_rates; i++) {
  5278. uint32_t to_baud_rate, from_baud_rate;
  5279. to_baud_rate = get_le32(data + 2 +
  5280. rsp->num_transports * 2 + i * 4);
  5281. from_baud_rate = get_le32(data + 2 +
  5282. rsp->num_transports * 2 +
  5283. sum_baud_rates * 4 + i * 4);
  5284. print_field(" Bluetooth to MWS: %d", to_baud_rate);
  5285. print_field(" MWS to Bluetooth: %d", from_baud_rate);
  5286. }
  5287. packet_hexdump(data + 2 + rsp->num_transports * 2 + sum_baud_rates * 8,
  5288. size - 2 - rsp->num_transports * 2 - sum_baud_rates * 8);
  5289. }
  5290. static void set_triggered_clock_capture_cmd(const void *data, uint8_t size)
  5291. {
  5292. const struct bt_hci_cmd_set_triggered_clock_capture *cmd = data;
  5293. print_handle(cmd->handle);
  5294. print_enable("Capture", cmd->enable);
  5295. print_clock_type(cmd->type);
  5296. print_lpo_allowed(cmd->lpo_allowed);
  5297. print_field("Clock captures to filter: %u", cmd->num_filter);
  5298. }
  5299. static void read_loopback_mode_rsp(const void *data, uint8_t size)
  5300. {
  5301. const struct bt_hci_rsp_read_loopback_mode *rsp = data;
  5302. print_status(rsp->status);
  5303. print_loopback_mode(rsp->mode);
  5304. }
  5305. static void write_loopback_mode_cmd(const void *data, uint8_t size)
  5306. {
  5307. const struct bt_hci_cmd_write_loopback_mode *cmd = data;
  5308. print_loopback_mode(cmd->mode);
  5309. }
  5310. static void write_ssp_debug_mode_cmd(const void *data, uint8_t size)
  5311. {
  5312. const struct bt_hci_cmd_write_ssp_debug_mode *cmd = data;
  5313. print_enable("Debug Mode", cmd->mode);
  5314. }
  5315. static void le_set_event_mask_cmd(const void *data, uint8_t size)
  5316. {
  5317. const struct bt_hci_cmd_le_set_event_mask *cmd = data;
  5318. print_event_mask(cmd->mask, events_le_table);
  5319. }
  5320. static void le_read_buffer_size_rsp(const void *data, uint8_t size)
  5321. {
  5322. const struct bt_hci_rsp_le_read_buffer_size *rsp = data;
  5323. print_status(rsp->status);
  5324. print_field("Data packet length: %d", le16_to_cpu(rsp->le_mtu));
  5325. print_field("Num data packets: %d", rsp->le_max_pkt);
  5326. }
  5327. static void le_read_local_features_rsp(const void *data, uint8_t size)
  5328. {
  5329. const struct bt_hci_rsp_le_read_local_features *rsp = data;
  5330. print_status(rsp->status);
  5331. print_features(0, rsp->features, 0x01);
  5332. }
  5333. static void le_set_random_address_cmd(const void *data, uint8_t size)
  5334. {
  5335. const struct bt_hci_cmd_le_set_random_address *cmd = data;
  5336. print_addr("Address", cmd->addr, 0x01);
  5337. }
  5338. static void le_set_adv_parameters_cmd(const void *data, uint8_t size)
  5339. {
  5340. const struct bt_hci_cmd_le_set_adv_parameters *cmd = data;
  5341. const char *str;
  5342. print_slot_625("Min advertising interval", cmd->min_interval);
  5343. print_slot_625("Max advertising interval", cmd->max_interval);
  5344. switch (cmd->type) {
  5345. case 0x00:
  5346. str = "Connectable undirected - ADV_IND";
  5347. break;
  5348. case 0x01:
  5349. str = "Connectable directed - ADV_DIRECT_IND (high duty cycle)";
  5350. break;
  5351. case 0x02:
  5352. str = "Scannable undirected - ADV_SCAN_IND";
  5353. break;
  5354. case 0x03:
  5355. str = "Non connectable undirected - ADV_NONCONN_IND";
  5356. break;
  5357. case 0x04:
  5358. str = "Connectable directed - ADV_DIRECT_IND (low duty cycle)";
  5359. break;
  5360. default:
  5361. str = "Reserved";
  5362. break;
  5363. }
  5364. print_field("Type: %s (0x%2.2x)", str, cmd->type);
  5365. print_own_addr_type(cmd->own_addr_type);
  5366. print_addr_type("Direct address type", cmd->direct_addr_type);
  5367. print_addr("Direct address", cmd->direct_addr, cmd->direct_addr_type);
  5368. print_adv_channel_map("Channel map", cmd->channel_map);
  5369. print_adv_filter_policy("Filter policy", cmd->filter_policy);
  5370. }
  5371. static void le_read_adv_tx_power_rsp(const void *data, uint8_t size)
  5372. {
  5373. const struct bt_hci_rsp_le_read_adv_tx_power *rsp = data;
  5374. print_status(rsp->status);
  5375. print_power_level(rsp->level, NULL);
  5376. }
  5377. static void le_set_adv_data_cmd(const void *data, uint8_t size)
  5378. {
  5379. const struct bt_hci_cmd_le_set_adv_data *cmd = data;
  5380. print_field("Length: %d", cmd->len);
  5381. print_eir(cmd->data, cmd->len, true);
  5382. }
  5383. static void le_set_scan_rsp_data_cmd(const void *data, uint8_t size)
  5384. {
  5385. const struct bt_hci_cmd_le_set_scan_rsp_data *cmd = data;
  5386. print_field("Length: %d", cmd->len);
  5387. print_eir(cmd->data, cmd->len, true);
  5388. }
  5389. static void le_set_adv_enable_cmd(const void *data, uint8_t size)
  5390. {
  5391. const struct bt_hci_cmd_le_set_adv_enable *cmd = data;
  5392. print_enable("Advertising", cmd->enable);
  5393. }
  5394. static void print_scan_type(const char *label, uint8_t type)
  5395. {
  5396. const char *str;
  5397. switch (type) {
  5398. case 0x00:
  5399. str = "Passive";
  5400. break;
  5401. case 0x01:
  5402. str = "Active";
  5403. break;
  5404. default:
  5405. str = "Reserved";
  5406. break;
  5407. }
  5408. print_field("%s: %s (0x%2.2x)", label, str, type);
  5409. }
  5410. static void print_scan_filter_policy(uint8_t policy)
  5411. {
  5412. const char *str;
  5413. switch (policy) {
  5414. case 0x00:
  5415. str = "Accept all advertisement";
  5416. break;
  5417. case 0x01:
  5418. str = "Ignore not in accept list";
  5419. break;
  5420. case 0x02:
  5421. str = "Accept all advertisement, inc. directed unresolved RPA";
  5422. break;
  5423. case 0x03:
  5424. str = "Ignore not in accept list, exc. directed unresolved RPA";
  5425. break;
  5426. default:
  5427. str = "Reserved";
  5428. break;
  5429. }
  5430. print_field("Filter policy: %s (0x%2.2x)", str, policy);
  5431. }
  5432. static void le_set_scan_parameters_cmd(const void *data, uint8_t size)
  5433. {
  5434. const struct bt_hci_cmd_le_set_scan_parameters *cmd = data;
  5435. print_scan_type("Type", cmd->type);
  5436. print_interval(cmd->interval);
  5437. print_window(cmd->window);
  5438. print_own_addr_type(cmd->own_addr_type);
  5439. print_scan_filter_policy(cmd->filter_policy);
  5440. }
  5441. static void le_set_scan_enable_cmd(const void *data, uint8_t size)
  5442. {
  5443. const struct bt_hci_cmd_le_set_scan_enable *cmd = data;
  5444. print_enable("Scanning", cmd->enable);
  5445. print_enable("Filter duplicates", cmd->filter_dup);
  5446. }
  5447. static void le_create_conn_cmd(const void *data, uint8_t size)
  5448. {
  5449. const struct bt_hci_cmd_le_create_conn *cmd = data;
  5450. const char *str;
  5451. print_slot_625("Scan interval", cmd->scan_interval);
  5452. print_slot_625("Scan window", cmd->scan_window);
  5453. switch (cmd->filter_policy) {
  5454. case 0x00:
  5455. str = "Accept list is not used";
  5456. break;
  5457. case 0x01:
  5458. str = "Accept list is used";
  5459. break;
  5460. default:
  5461. str = "Reserved";
  5462. break;
  5463. }
  5464. print_field("Filter policy: %s (0x%2.2x)", str, cmd->filter_policy);
  5465. print_peer_addr_type("Peer address type", cmd->peer_addr_type);
  5466. print_addr("Peer address", cmd->peer_addr, cmd->peer_addr_type);
  5467. print_own_addr_type(cmd->own_addr_type);
  5468. print_slot_125("Min connection interval", cmd->min_interval);
  5469. print_slot_125("Max connection interval", cmd->max_interval);
  5470. print_conn_latency("Connection latency", cmd->latency);
  5471. print_field("Supervision timeout: %d msec (0x%4.4x)",
  5472. le16_to_cpu(cmd->supv_timeout) * 10,
  5473. le16_to_cpu(cmd->supv_timeout));
  5474. print_slot_625("Min connection length", cmd->min_length);
  5475. print_slot_625("Max connection length", cmd->max_length);
  5476. }
  5477. static void le_read_accept_list_size_rsp(const void *data, uint8_t size)
  5478. {
  5479. const struct bt_hci_rsp_le_read_accept_list_size *rsp = data;
  5480. print_status(rsp->status);
  5481. print_field("Size: %u", rsp->size);
  5482. }
  5483. static void le_add_to_accept_list_cmd(const void *data, uint8_t size)
  5484. {
  5485. const struct bt_hci_cmd_le_add_to_accept_list *cmd = data;
  5486. print_addr_type("Address type", cmd->addr_type);
  5487. print_addr("Address", cmd->addr, cmd->addr_type);
  5488. }
  5489. static void le_remove_from_accept_list_cmd(const void *data, uint8_t size)
  5490. {
  5491. const struct bt_hci_cmd_le_remove_from_accept_list *cmd = data;
  5492. print_addr_type("Address type", cmd->addr_type);
  5493. print_addr("Address", cmd->addr, cmd->addr_type);
  5494. }
  5495. static void le_conn_update_cmd(const void *data, uint8_t size)
  5496. {
  5497. const struct bt_hci_cmd_le_conn_update *cmd = data;
  5498. print_handle(cmd->handle);
  5499. print_slot_125("Min connection interval", cmd->min_interval);
  5500. print_slot_125("Max connection interval", cmd->max_interval);
  5501. print_conn_latency("Connection latency", cmd->latency);
  5502. print_field("Supervision timeout: %d msec (0x%4.4x)",
  5503. le16_to_cpu(cmd->supv_timeout) * 10,
  5504. le16_to_cpu(cmd->supv_timeout));
  5505. print_slot_625("Min connection length", cmd->min_length);
  5506. print_slot_625("Max connection length", cmd->max_length);
  5507. }
  5508. static void le_set_host_classification_cmd(const void *data, uint8_t size)
  5509. {
  5510. const struct bt_hci_cmd_le_set_host_classification *cmd = data;
  5511. print_le_channel_map(cmd->map);
  5512. }
  5513. static void le_read_channel_map_cmd(const void *data, uint8_t size)
  5514. {
  5515. const struct bt_hci_cmd_le_read_channel_map *cmd = data;
  5516. print_handle(cmd->handle);
  5517. }
  5518. static void le_read_channel_map_rsp(const void *data, uint8_t size)
  5519. {
  5520. const struct bt_hci_rsp_le_read_channel_map *rsp = data;
  5521. print_status(rsp->status);
  5522. print_handle(rsp->handle);
  5523. print_le_channel_map(rsp->map);
  5524. }
  5525. static void le_read_remote_features_cmd(const void *data, uint8_t size)
  5526. {
  5527. const struct bt_hci_cmd_le_read_remote_features *cmd = data;
  5528. print_handle(cmd->handle);
  5529. }
  5530. static void le_encrypt_cmd(const void *data, uint8_t size)
  5531. {
  5532. const struct bt_hci_cmd_le_encrypt *cmd = data;
  5533. print_key("Key", cmd->key);
  5534. print_key("Plaintext data", cmd->plaintext);
  5535. }
  5536. static void le_encrypt_rsp(const void *data, uint8_t size)
  5537. {
  5538. const struct bt_hci_rsp_le_encrypt *rsp = data;
  5539. print_status(rsp->status);
  5540. print_key("Encrypted data", rsp->data);
  5541. }
  5542. static void le_rand_rsp(const void *data, uint8_t size)
  5543. {
  5544. const struct bt_hci_rsp_le_rand *rsp = data;
  5545. print_status(rsp->status);
  5546. print_random_number(rsp->number);
  5547. }
  5548. static void le_start_encrypt_cmd(const void *data, uint8_t size)
  5549. {
  5550. const struct bt_hci_cmd_le_start_encrypt *cmd = data;
  5551. print_handle(cmd->handle);
  5552. print_random_number(cmd->rand);
  5553. print_encrypted_diversifier(cmd->ediv);
  5554. print_key("Long term key", cmd->ltk);
  5555. }
  5556. static void le_ltk_req_reply_cmd(const void *data, uint8_t size)
  5557. {
  5558. const struct bt_hci_cmd_le_ltk_req_reply *cmd = data;
  5559. print_handle(cmd->handle);
  5560. print_key("Long term key", cmd->ltk);
  5561. }
  5562. static void le_ltk_req_reply_rsp(const void *data, uint8_t size)
  5563. {
  5564. const struct bt_hci_rsp_le_ltk_req_reply *rsp = data;
  5565. print_status(rsp->status);
  5566. print_handle(rsp->handle);
  5567. }
  5568. static void le_ltk_req_neg_reply_cmd(const void *data, uint8_t size)
  5569. {
  5570. const struct bt_hci_cmd_le_ltk_req_neg_reply *cmd = data;
  5571. print_handle(cmd->handle);
  5572. }
  5573. static void le_ltk_req_neg_reply_rsp(const void *data, uint8_t size)
  5574. {
  5575. const struct bt_hci_rsp_le_ltk_req_neg_reply *rsp = data;
  5576. print_status(rsp->status);
  5577. print_handle(rsp->handle);
  5578. }
  5579. static void le_read_supported_states_rsp(const void *data, uint8_t size)
  5580. {
  5581. const struct bt_hci_rsp_le_read_supported_states *rsp = data;
  5582. print_status(rsp->status);
  5583. print_le_states(rsp->states);
  5584. }
  5585. static void le_receiver_test_cmd(const void *data, uint8_t size)
  5586. {
  5587. const struct bt_hci_cmd_le_receiver_test *cmd = data;
  5588. print_field("RX frequency: %d MHz (0x%2.2x)",
  5589. (cmd->frequency * 2) + 2402, cmd->frequency);
  5590. }
  5591. static void le_transmitter_test_cmd(const void *data, uint8_t size)
  5592. {
  5593. const struct bt_hci_cmd_le_transmitter_test *cmd = data;
  5594. print_field("TX frequency: %d MHz (0x%2.2x)",
  5595. (cmd->frequency * 2) + 2402, cmd->frequency);
  5596. print_field("Test data length: %d bytes", cmd->data_len);
  5597. print_field("Packet payload: 0x%2.2x", cmd->payload);
  5598. }
  5599. static void le_test_end_rsp(const void *data, uint8_t size)
  5600. {
  5601. const struct bt_hci_rsp_le_test_end *rsp = data;
  5602. print_status(rsp->status);
  5603. print_field("Number of packets: %d", le16_to_cpu(rsp->num_packets));
  5604. }
  5605. static void le_conn_param_req_reply_cmd(const void *data, uint8_t size)
  5606. {
  5607. const struct bt_hci_cmd_le_conn_param_req_reply *cmd = data;
  5608. print_handle(cmd->handle);
  5609. print_slot_125("Min connection interval", cmd->min_interval);
  5610. print_slot_125("Max connection interval", cmd->max_interval);
  5611. print_conn_latency("Connection latency", cmd->latency);
  5612. print_field("Supervision timeout: %d msec (0x%4.4x)",
  5613. le16_to_cpu(cmd->supv_timeout) * 10,
  5614. le16_to_cpu(cmd->supv_timeout));
  5615. print_slot_625("Min connection length", cmd->min_length);
  5616. print_slot_625("Max connection length", cmd->max_length);
  5617. }
  5618. static void le_conn_param_req_reply_rsp(const void *data, uint8_t size)
  5619. {
  5620. const struct bt_hci_rsp_le_conn_param_req_reply *rsp = data;
  5621. print_status(rsp->status);
  5622. print_handle(rsp->handle);
  5623. }
  5624. static void le_conn_param_req_neg_reply_cmd(const void *data, uint8_t size)
  5625. {
  5626. const struct bt_hci_cmd_le_conn_param_req_neg_reply *cmd = data;
  5627. print_handle(cmd->handle);
  5628. print_reason(cmd->reason);
  5629. }
  5630. static void le_conn_param_req_neg_reply_rsp(const void *data, uint8_t size)
  5631. {
  5632. const struct bt_hci_rsp_le_conn_param_req_neg_reply *rsp = data;
  5633. print_status(rsp->status);
  5634. print_handle(rsp->handle);
  5635. }
  5636. static void le_set_data_length_cmd(const void *data, uint8_t size)
  5637. {
  5638. const struct bt_hci_cmd_le_set_data_length *cmd = data;
  5639. print_handle(cmd->handle);
  5640. print_field("TX octets: %d", le16_to_cpu(cmd->tx_len));
  5641. print_field("TX time: %d", le16_to_cpu(cmd->tx_time));
  5642. }
  5643. static void le_set_data_length_rsp(const void *data, uint8_t size)
  5644. {
  5645. const struct bt_hci_rsp_le_set_data_length *rsp = data;
  5646. print_status(rsp->status);
  5647. print_handle(rsp->handle);
  5648. }
  5649. static void le_read_default_data_length_rsp(const void *data, uint8_t size)
  5650. {
  5651. const struct bt_hci_rsp_le_read_default_data_length *rsp = data;
  5652. print_status(rsp->status);
  5653. print_field("TX octets: %d", le16_to_cpu(rsp->tx_len));
  5654. print_field("TX time: %d", le16_to_cpu(rsp->tx_time));
  5655. }
  5656. static void le_write_default_data_length_cmd(const void *data, uint8_t size)
  5657. {
  5658. const struct bt_hci_cmd_le_write_default_data_length *cmd = data;
  5659. print_field("TX octets: %d", le16_to_cpu(cmd->tx_len));
  5660. print_field("TX time: %d", le16_to_cpu(cmd->tx_time));
  5661. }
  5662. static void le_generate_dhkey_cmd(const void *data, uint8_t size)
  5663. {
  5664. const struct bt_hci_cmd_le_generate_dhkey *cmd = data;
  5665. print_pk256("Remote P-256 public key", cmd->remote_pk256);
  5666. }
  5667. static void le_add_to_resolv_list_cmd(const void *data, uint8_t size)
  5668. {
  5669. const struct bt_hci_cmd_le_add_to_resolv_list *cmd = data;
  5670. print_addr_type("Address type", cmd->addr_type);
  5671. print_addr("Address", cmd->addr, cmd->addr_type);
  5672. print_key("Peer identity resolving key", cmd->peer_irk);
  5673. print_key("Local identity resolving key", cmd->local_irk);
  5674. }
  5675. static void le_remove_from_resolv_list_cmd(const void *data, uint8_t size)
  5676. {
  5677. const struct bt_hci_cmd_le_remove_from_resolv_list *cmd = data;
  5678. print_addr_type("Address type", cmd->addr_type);
  5679. print_addr("Address", cmd->addr, cmd->addr_type);
  5680. }
  5681. static void le_read_resolv_list_size_rsp(const void *data, uint8_t size)
  5682. {
  5683. const struct bt_hci_rsp_le_read_resolv_list_size *rsp = data;
  5684. print_status(rsp->status);
  5685. print_field("Size: %u", rsp->size);
  5686. }
  5687. static void le_read_peer_resolv_addr_cmd(const void *data, uint8_t size)
  5688. {
  5689. const struct bt_hci_cmd_le_read_peer_resolv_addr *cmd = data;
  5690. print_addr_type("Address type", cmd->addr_type);
  5691. print_addr("Address", cmd->addr, cmd->addr_type);
  5692. }
  5693. static void le_read_peer_resolv_addr_rsp(const void *data, uint8_t size)
  5694. {
  5695. const struct bt_hci_rsp_le_read_peer_resolv_addr *rsp = data;
  5696. print_status(rsp->status);
  5697. print_addr("Address", rsp->addr, 0x01);
  5698. }
  5699. static void le_read_local_resolv_addr_cmd(const void *data, uint8_t size)
  5700. {
  5701. const struct bt_hci_cmd_le_read_local_resolv_addr *cmd = data;
  5702. print_addr_type("Address type", cmd->addr_type);
  5703. print_addr("Address", cmd->addr, cmd->addr_type);
  5704. }
  5705. static void le_read_local_resolv_addr_rsp(const void *data, uint8_t size)
  5706. {
  5707. const struct bt_hci_rsp_le_read_local_resolv_addr *rsp = data;
  5708. print_status(rsp->status);
  5709. print_addr("Address", rsp->addr, 0x01);
  5710. }
  5711. static void le_set_resolv_enable_cmd(const void *data, uint8_t size)
  5712. {
  5713. const struct bt_hci_cmd_le_set_resolv_enable *cmd = data;
  5714. print_enable("Address resolution", cmd->enable);
  5715. }
  5716. static void le_set_resolv_timeout_cmd(const void *data, uint8_t size)
  5717. {
  5718. const struct bt_hci_cmd_le_set_resolv_timeout *cmd = data;
  5719. print_field("Timeout: %u seconds", le16_to_cpu(cmd->timeout));
  5720. }
  5721. static void le_read_max_data_length_rsp(const void *data, uint8_t size)
  5722. {
  5723. const struct bt_hci_rsp_le_read_max_data_length *rsp = data;
  5724. print_status(rsp->status);
  5725. print_field("Max TX octets: %d", le16_to_cpu(rsp->max_tx_len));
  5726. print_field("Max TX time: %d", le16_to_cpu(rsp->max_tx_time));
  5727. print_field("Max RX octets: %d", le16_to_cpu(rsp->max_rx_len));
  5728. print_field("Max RX time: %d", le16_to_cpu(rsp->max_rx_time));
  5729. }
  5730. static void le_read_phy_cmd(const void *data, uint8_t size)
  5731. {
  5732. const struct bt_hci_cmd_le_read_phy *cmd = data;
  5733. print_handle(cmd->handle);
  5734. }
  5735. static void print_le_phy(const char *prefix, uint8_t phy)
  5736. {
  5737. const char *str;
  5738. switch (phy) {
  5739. case 0x01:
  5740. str = "LE 1M";
  5741. break;
  5742. case 0x02:
  5743. str = "LE 2M";
  5744. break;
  5745. case 0x03:
  5746. str = "LE Coded";
  5747. break;
  5748. default:
  5749. str = "Reserved";
  5750. break;
  5751. }
  5752. print_field("%s: %s (0x%2.2x)", prefix, str, phy);
  5753. }
  5754. static void le_read_phy_rsp(const void *data, uint8_t size)
  5755. {
  5756. const struct bt_hci_rsp_le_read_phy *rsp = data;
  5757. print_status(rsp->status);
  5758. print_handle(rsp->handle);
  5759. print_le_phy("TX PHY", rsp->tx_phy);
  5760. print_le_phy("RX PHY", rsp->rx_phy);
  5761. }
  5762. static const struct bitfield_data le_phys[] = {
  5763. { 0, "LE 1M" },
  5764. { 1, "LE 2M" },
  5765. { 2, "LE Coded"},
  5766. { }
  5767. };
  5768. static const struct bitfield_data le_phy_preference[] = {
  5769. { 0, "No TX PHY preference" },
  5770. { 1, "No RX PHY preference" },
  5771. { }
  5772. };
  5773. static void print_le_phys_preference(uint8_t all_phys, uint8_t tx_phys,
  5774. uint8_t rx_phys)
  5775. {
  5776. uint8_t mask;
  5777. print_field("All PHYs preference: 0x%2.2x", all_phys);
  5778. mask = print_bitfield(2, all_phys, le_phy_preference);
  5779. if (mask)
  5780. print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
  5781. " (0x%2.2x)", mask);
  5782. print_field("TX PHYs preference: 0x%2.2x", tx_phys);
  5783. mask = tx_phys;
  5784. mask = print_bitfield(2, tx_phys, le_phys);
  5785. if (mask)
  5786. print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
  5787. " (0x%2.2x)", mask);
  5788. print_field("RX PHYs preference: 0x%2.2x", rx_phys);
  5789. mask = rx_phys;
  5790. mask = print_bitfield(2, rx_phys, le_phys);
  5791. if (mask)
  5792. print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
  5793. " (0x%2.2x)", mask);
  5794. }
  5795. static void le_set_default_phy_cmd(const void *data, uint8_t size)
  5796. {
  5797. const struct bt_hci_cmd_le_set_default_phy *cmd = data;
  5798. print_le_phys_preference(cmd->all_phys, cmd->tx_phys, cmd->rx_phys);
  5799. }
  5800. static void le_set_phy_cmd(const void *data, uint8_t size)
  5801. {
  5802. const struct bt_hci_cmd_le_set_phy *cmd = data;
  5803. const char *str;
  5804. print_handle(cmd->handle);
  5805. print_le_phys_preference(cmd->all_phys, cmd->tx_phys, cmd->rx_phys);
  5806. switch (le16_to_cpu(cmd->phy_opts)) {
  5807. case 0x0001:
  5808. str = "S2 coding";
  5809. break;
  5810. case 0x0002:
  5811. str = "S8 coding";
  5812. break;
  5813. default:
  5814. str = "Reserved";
  5815. break;
  5816. }
  5817. print_field("PHY options preference: %s (0x%4.4x)", str, cmd->phy_opts);
  5818. }
  5819. static void le_enhanced_receiver_test_cmd(const void *data, uint8_t size)
  5820. {
  5821. const struct bt_hci_cmd_le_enhanced_receiver_test *cmd = data;
  5822. const char *str;
  5823. print_field("RX channel frequency: %d MHz (0x%2.2x)",
  5824. (cmd->rx_channel * 2) + 2402, cmd->rx_channel);
  5825. print_le_phy("PHY", cmd->phy);
  5826. switch (cmd->modulation_index) {
  5827. case 0x00:
  5828. str = "Standard";
  5829. break;
  5830. case 0x01:
  5831. str = "Stable";
  5832. break;
  5833. default:
  5834. str = "Reserved";
  5835. break;
  5836. }
  5837. print_field("Modulation index: %s (0x%2.2x)", str,
  5838. cmd->modulation_index);
  5839. }
  5840. static void le_enhanced_transmitter_test_cmd(const void *data, uint8_t size)
  5841. {
  5842. const struct bt_hci_cmd_le_enhanced_transmitter_test *cmd = data;
  5843. const char *str;
  5844. print_field("TX channel frequency: %d MHz (0x%2.2x)",
  5845. (cmd->tx_channel * 2) + 2402, cmd->tx_channel);
  5846. print_field("Test data length: %d bytes", cmd->data_len);
  5847. print_field("Packet payload: 0x%2.2x", cmd->payload);
  5848. switch (cmd->phy) {
  5849. case 0x01:
  5850. str = "LE 1M";
  5851. break;
  5852. case 0x02:
  5853. str = "LE 2M";
  5854. break;
  5855. case 0x03:
  5856. str = "LE Coded with S=8";
  5857. break;
  5858. case 0x04:
  5859. str = "LE Coded with S=2";
  5860. break;
  5861. default:
  5862. str = "Reserved";
  5863. break;
  5864. }
  5865. print_field("PHY: %s (0x%2.2x)", str, cmd->phy);
  5866. }
  5867. static void le_set_adv_set_rand_addr(const void *data, uint8_t size)
  5868. {
  5869. const struct bt_hci_cmd_le_set_adv_set_rand_addr *cmd = data;
  5870. print_field("Advertising handle: 0x%2.2x", cmd->handle);
  5871. print_addr("Advertising random address", cmd->bdaddr, 0x01);
  5872. }
  5873. static const struct bitfield_data ext_adv_properties_table[] = {
  5874. { 0, "Connectable" },
  5875. { 1, "Scannable" },
  5876. { 2, "Directed" },
  5877. { 3, "High Duty Cycle Directed Connectable" },
  5878. { 4, "Use legacy advertising PDUs" },
  5879. { 5, "Anonymous advertising" },
  5880. { 6, "Include TxPower" },
  5881. { }
  5882. };
  5883. static const char *get_adv_pdu_desc(uint16_t flags)
  5884. {
  5885. const char *str;
  5886. switch (flags) {
  5887. case 0x10:
  5888. str = "ADV_NONCONN_IND";
  5889. break;
  5890. case 0x12:
  5891. str = "ADV_SCAN_IND";
  5892. break;
  5893. case 0x13:
  5894. str = "ADV_IND";
  5895. break;
  5896. case 0x15:
  5897. str = "ADV_DIRECT_IND (low duty cycle)";
  5898. break;
  5899. case 0x1d:
  5900. str = "ADV_DIRECT_IND (high duty cycle)";
  5901. break;
  5902. default:
  5903. str = "Reserved";
  5904. break;
  5905. }
  5906. return str;
  5907. }
  5908. static void print_ext_adv_properties(uint16_t flags)
  5909. {
  5910. uint16_t mask = flags;
  5911. const char *property;
  5912. int i;
  5913. print_field("Properties: 0x%4.4x", flags);
  5914. for (i = 0; ext_adv_properties_table[i].str; i++) {
  5915. if (flags & (1 << ext_adv_properties_table[i].bit)) {
  5916. property = ext_adv_properties_table[i].str;
  5917. if (ext_adv_properties_table[i].bit == 4) {
  5918. print_field(" %s: %s", property,
  5919. get_adv_pdu_desc(flags));
  5920. } else {
  5921. print_field(" %s", property);
  5922. }
  5923. mask &= ~(1 << ext_adv_properties_table[i].bit);
  5924. }
  5925. }
  5926. if (mask)
  5927. print_text(COLOR_UNKNOWN_ADV_FLAG,
  5928. " Unknown advertising properties (0x%4.4x)",
  5929. mask);
  5930. }
  5931. static void print_ext_slot_625(const char *label, const uint8_t value[3])
  5932. {
  5933. uint32_t value_cpu = value[0];
  5934. value_cpu |= value[1] << 8;
  5935. value_cpu |= value[2] << 16;
  5936. print_field("%s: %.3f msec (0x%4.4x)", label,
  5937. value_cpu * 0.625, value_cpu);
  5938. }
  5939. static void le_set_ext_adv_params_cmd(const void *data, uint8_t size)
  5940. {
  5941. const struct bt_hci_cmd_le_set_ext_adv_params *cmd = data;
  5942. const char *str;
  5943. print_field("Handle: 0x%2.2x", cmd->handle);
  5944. print_ext_adv_properties(le16_to_cpu(cmd->evt_properties));
  5945. print_ext_slot_625("Min advertising interval", cmd->min_interval);
  5946. print_ext_slot_625("Max advertising interval", cmd->max_interval);
  5947. print_adv_channel_map("Channel map", cmd->channel_map);
  5948. print_own_addr_type(cmd->own_addr_type);
  5949. print_peer_addr_type("Peer address type", cmd->peer_addr_type);
  5950. print_addr("Peer address", cmd->peer_addr, cmd->peer_addr_type);
  5951. print_adv_filter_policy("Filter policy", cmd->filter_policy);
  5952. if (cmd->tx_power == 0x7f)
  5953. print_field("TX power: Host has no preference (0x7f)");
  5954. else
  5955. print_power_level(cmd->tx_power, NULL);
  5956. switch (cmd->primary_phy) {
  5957. case 0x01:
  5958. str = "LE 1M";
  5959. break;
  5960. case 0x03:
  5961. str = "LE Coded";
  5962. break;
  5963. default:
  5964. str = "Reserved";
  5965. break;
  5966. }
  5967. print_field("Primary PHY: %s (0x%2.2x)", str, cmd->primary_phy);
  5968. print_field("Secondary max skip: 0x%2.2x", cmd->secondary_max_skip);
  5969. print_le_phy("Secondary PHY", cmd->secondary_phy);
  5970. print_field("SID: 0x%2.2x", cmd->sid);
  5971. print_enable("Scan request notifications", cmd->notif_enable);
  5972. }
  5973. static void le_set_ext_adv_params_rsp(const void *data, uint8_t size)
  5974. {
  5975. const struct bt_hci_rsp_le_set_ext_adv_params *rsp = data;
  5976. print_status(rsp->status);
  5977. print_power_level(rsp->tx_power, "selected");
  5978. }
  5979. static void le_set_ext_adv_data_cmd(const void *data, uint8_t size)
  5980. {
  5981. const struct bt_hci_cmd_le_set_ext_adv_data *cmd = data;
  5982. const char *str;
  5983. print_field("Handle: 0x%2.2x", cmd->handle);
  5984. switch (cmd->operation) {
  5985. case 0x00:
  5986. str = "Immediate fragment";
  5987. break;
  5988. case 0x01:
  5989. str = "First fragment";
  5990. break;
  5991. case 0x02:
  5992. str = "Last fragment";
  5993. break;
  5994. case 0x03:
  5995. str = "Complete extended advertising data";
  5996. break;
  5997. case 0x04:
  5998. str = "Unchanged data";
  5999. break;
  6000. default:
  6001. str = "Reserved";
  6002. break;
  6003. }
  6004. print_field("Operation: %s (0x%2.2x)", str, cmd->operation);
  6005. switch (cmd->fragment_preference) {
  6006. case 0x00:
  6007. str = "Fragment all";
  6008. break;
  6009. case 0x01:
  6010. str = "Minimize fragmentation";
  6011. break;
  6012. default:
  6013. str = "Reserved";
  6014. break;
  6015. }
  6016. print_field("Fragment preference: %s (0x%2.2x)", str,
  6017. cmd->fragment_preference);
  6018. print_field("Data length: 0x%2.2x", cmd->data_len);
  6019. packet_print_ad(cmd->data, size - sizeof(*cmd));
  6020. }
  6021. static void le_set_ext_scan_rsp_data_cmd(const void *data, uint8_t size)
  6022. {
  6023. const struct bt_hci_cmd_le_set_ext_scan_rsp_data *cmd = data;
  6024. const char *str;
  6025. print_field("Handle: 0x%2.2x", cmd->handle);
  6026. switch (cmd->operation) {
  6027. case 0x00:
  6028. str = "Immediate fragment";
  6029. break;
  6030. case 0x01:
  6031. str = "First fragment";
  6032. break;
  6033. case 0x02:
  6034. str = "Last fragment";
  6035. break;
  6036. case 0x03:
  6037. str = "Complete scan response data";
  6038. break;
  6039. case 0x04:
  6040. str = "Unchanged data";
  6041. break;
  6042. default:
  6043. str = "Reserved";
  6044. break;
  6045. }
  6046. print_field("Operation: %s (0x%2.2x)", str, cmd->operation);
  6047. switch (cmd->fragment_preference) {
  6048. case 0x00:
  6049. str = "Fragment all";
  6050. break;
  6051. case 0x01:
  6052. str = "Minimize fragmentation";
  6053. break;
  6054. default:
  6055. str = "Reserved";
  6056. break;
  6057. }
  6058. print_field("Fragment preference: %s (0x%2.2x)", str,
  6059. cmd->fragment_preference);
  6060. print_field("Data length: 0x%2.2x", cmd->data_len);
  6061. packet_print_ad(cmd->data, size - sizeof(*cmd));
  6062. }
  6063. static void le_set_ext_adv_enable_cmd(const void *data, uint8_t size)
  6064. {
  6065. const struct bt_hci_cmd_le_set_ext_adv_enable *cmd = data;
  6066. const struct bt_hci_cmd_ext_adv_set *adv_set;
  6067. int i;
  6068. print_enable("Extended advertising", cmd->enable);
  6069. if (cmd->num_of_sets == 0)
  6070. print_field("Number of sets: Disable all sets (0x%2.2x)",
  6071. cmd->num_of_sets);
  6072. else if (cmd->num_of_sets > 0x3f)
  6073. print_field("Number of sets: Reserved (0x%2.2x)",
  6074. cmd->num_of_sets);
  6075. else
  6076. print_field("Number of sets: %u (0x%2.2x)", cmd->num_of_sets,
  6077. cmd->num_of_sets);
  6078. for (i = 0; i < cmd->num_of_sets; ++i) {
  6079. adv_set = data + 2 + i * sizeof(struct bt_hci_cmd_ext_adv_set);
  6080. print_field("Entry %d", i);
  6081. print_field(" Handle: 0x%2.2x", adv_set->handle);
  6082. print_field(" Duration: %d ms (0x%2.2x)",
  6083. adv_set->duration * 10, adv_set->duration);
  6084. print_field(" Max ext adv events: %d", adv_set->max_events);
  6085. }
  6086. }
  6087. static void le_read_max_adv_data_len_rsp(const void *data, uint8_t size)
  6088. {
  6089. const struct bt_hci_rsp_le_read_max_adv_data_len *rsp = data;
  6090. print_status(rsp->status);
  6091. print_field("Max length: %d", rsp->max_len);
  6092. }
  6093. static void le_read_num_supported_adv_sets_rsp(const void *data, uint8_t size)
  6094. {
  6095. const struct bt_hci_rsp_le_read_num_supported_adv_sets *rsp = data;
  6096. print_status(rsp->status);
  6097. print_field("Num supported adv sets: %d", rsp->num_of_sets);
  6098. }
  6099. static void le_remove_adv_set_cmd(const void *data, uint8_t size)
  6100. {
  6101. const struct bt_hci_cmd_le_remove_adv_set *cmd = data;
  6102. print_handle(cmd->handle);
  6103. }
  6104. static const struct bitfield_data periodic_adv_properties_table[] = {
  6105. { 6, "Include TxPower" },
  6106. { }
  6107. };
  6108. static void print_periodic_adv_properties(uint16_t flags)
  6109. {
  6110. uint16_t mask;
  6111. print_field("Properties: 0x%4.4x", flags);
  6112. mask = print_bitfield(2, flags, periodic_adv_properties_table);
  6113. if (mask)
  6114. print_text(COLOR_UNKNOWN_ADV_FLAG,
  6115. " Unknown advertising properties (0x%4.4x)",
  6116. mask);
  6117. }
  6118. static void le_set_periodic_adv_params_cmd(const void *data, uint8_t size)
  6119. {
  6120. const struct bt_hci_cmd_le_set_periodic_adv_params *cmd = data;
  6121. print_handle(cmd->handle);
  6122. print_slot_125("Min interval", cmd->min_interval);
  6123. print_slot_125("Max interval", cmd->max_interval);
  6124. print_periodic_adv_properties(cmd->properties);
  6125. }
  6126. static void le_set_periodic_adv_data_cmd(const void *data, uint8_t size)
  6127. {
  6128. const struct bt_hci_cmd_le_set_periodic_adv_data *cmd = data;
  6129. const char *str;
  6130. print_handle(cmd->handle);
  6131. switch (cmd->operation) {
  6132. case 0x00:
  6133. str = "Immediate fragment";
  6134. break;
  6135. case 0x01:
  6136. str = "First fragment";
  6137. break;
  6138. case 0x02:
  6139. str = "Last fragment";
  6140. break;
  6141. case 0x03:
  6142. str = "Complete ext advertising data";
  6143. break;
  6144. default:
  6145. str = "Reserved";
  6146. break;
  6147. }
  6148. print_field("Operation: %s (0x%2.2x)", str, cmd->operation);
  6149. print_field("Data length: 0x%2.2x", cmd->data_len);
  6150. print_eir(cmd->data, cmd->data_len, true);
  6151. }
  6152. static void le_set_periodic_adv_enable_cmd(const void *data, uint8_t size)
  6153. {
  6154. const struct bt_hci_cmd_le_set_periodic_adv_enable *cmd = data;
  6155. print_enable("Periodic advertising", cmd->enable);
  6156. print_handle(cmd->handle);
  6157. }
  6158. static const struct bitfield_data ext_scan_phys_table[] = {
  6159. { 0, "LE 1M" },
  6160. { 2, "LE Coded" },
  6161. { }
  6162. };
  6163. static void print_ext_scan_phys(const void *data, uint8_t flags)
  6164. {
  6165. const struct bt_hci_le_scan_phy *scan_phy;
  6166. uint8_t mask = flags;
  6167. int bits_set = 0;
  6168. int i;
  6169. print_field("PHYs: 0x%2.2x", flags);
  6170. for (i = 0; ext_scan_phys_table[i].str; i++) {
  6171. if (flags & (1 << ext_scan_phys_table[i].bit)) {
  6172. scan_phy = data + bits_set * sizeof(*scan_phy);
  6173. mask &= ~(1 << ext_scan_phys_table[i].bit);
  6174. print_field("Entry %d: %s", bits_set,
  6175. ext_scan_phys_table[i].str);
  6176. print_scan_type(" Type", scan_phy->type);
  6177. print_slot_625(" Interval", scan_phy->interval);
  6178. print_slot_625(" Window", scan_phy->window);
  6179. ++bits_set;
  6180. }
  6181. }
  6182. if (mask)
  6183. print_text(COLOR_UNKNOWN_ADV_FLAG, " Unknown scanning PHYs"
  6184. " (0x%2.2x)", mask);
  6185. }
  6186. static void le_set_ext_scan_params_cmd(const void *data, uint8_t size)
  6187. {
  6188. const struct bt_hci_cmd_le_set_ext_scan_params *cmd = data;
  6189. print_own_addr_type(cmd->own_addr_type);
  6190. print_scan_filter_policy(cmd->filter_policy);
  6191. print_ext_scan_phys(cmd->data, cmd->num_phys);
  6192. }
  6193. static void le_set_ext_scan_enable_cmd(const void *data, uint8_t size)
  6194. {
  6195. const struct bt_hci_cmd_le_set_ext_scan_enable *cmd = data;
  6196. print_enable("Extended scan", cmd->enable);
  6197. print_enable("Filter duplicates", cmd->filter_dup);
  6198. print_field("Duration: %d msec (0x%4.4x)",
  6199. le16_to_cpu(cmd->duration) * 10,
  6200. le16_to_cpu(cmd->duration));
  6201. print_field("Period: %.2f sec (0x%4.4x)",
  6202. le16_to_cpu(cmd->period) * 1.28,
  6203. le16_to_cpu(cmd->period));
  6204. }
  6205. static const struct bitfield_data ext_conn_phys_table[] = {
  6206. { 0, "LE 1M" },
  6207. { 1, "LE 2M" },
  6208. { 2, "LE Coded" },
  6209. { }
  6210. };
  6211. static void print_ext_conn_phys(const void *data, uint8_t flags)
  6212. {
  6213. const struct bt_hci_le_ext_create_conn *entry;
  6214. uint8_t mask = flags;
  6215. int bits_set = 0;
  6216. int i;
  6217. print_field("Initiating PHYs: 0x%2.2x", flags);
  6218. for (i = 0; ext_conn_phys_table[i].str; i++) {
  6219. if (flags & (1 << ext_conn_phys_table[i].bit)) {
  6220. entry = data + bits_set * sizeof(*entry);
  6221. mask &= ~(1 << ext_conn_phys_table[i].bit);
  6222. print_field("Entry %d: %s", bits_set,
  6223. ext_conn_phys_table[i].str);
  6224. print_slot_625(" Scan interval", entry->scan_interval);
  6225. print_slot_625(" Scan window", entry->scan_window);
  6226. print_slot_125(" Min connection interval",
  6227. entry->min_interval);
  6228. print_slot_125(" Max connection interval",
  6229. entry->max_interval);
  6230. print_conn_latency(" Connection latency",
  6231. entry->latency);
  6232. print_field(" Supervision timeout: %d msec (0x%4.4x)",
  6233. le16_to_cpu(entry->supv_timeout) * 10,
  6234. le16_to_cpu(entry->supv_timeout));
  6235. print_slot_625(" Min connection length",
  6236. entry->min_length);
  6237. print_slot_625(" Max connection length",
  6238. entry->max_length);
  6239. ++bits_set;
  6240. }
  6241. }
  6242. if (mask)
  6243. print_text(COLOR_UNKNOWN_ADV_FLAG, " Unknown scanning PHYs"
  6244. " (0x%2.2x)", mask);
  6245. }
  6246. static void le_ext_create_conn_cmd(const void *data, uint8_t size)
  6247. {
  6248. const struct bt_hci_cmd_le_ext_create_conn *cmd = data;
  6249. const char *str;
  6250. switch (cmd->filter_policy) {
  6251. case 0x00:
  6252. str = "Accept list is not used";
  6253. break;
  6254. case 0x01:
  6255. str = "Accept list is used";
  6256. break;
  6257. default:
  6258. str = "Reserved";
  6259. break;
  6260. }
  6261. print_field("Filter policy: %s (0x%2.2x)", str, cmd->filter_policy);
  6262. print_own_addr_type(cmd->own_addr_type);
  6263. print_peer_addr_type("Peer address type", cmd->peer_addr_type);
  6264. print_addr("Peer address", cmd->peer_addr, cmd->peer_addr_type);
  6265. print_ext_conn_phys(cmd->data, cmd->phys);
  6266. }
  6267. static const struct bitfield_data create_sync_cte_type[] = {
  6268. { 0, "Do not sync to packets with AoA CTE" },
  6269. { 1, "Do not sync to packets with AoD CTE 1us" },
  6270. { 2, "Do not sync to packets with AoD CTE 2us" },
  6271. { 3, "Do not sync to packets with type 3 AoD" },
  6272. { 4, "Do not sync to packets without CTE" },
  6273. { },
  6274. };
  6275. static const struct bitfield_data create_sync_options[] = {
  6276. { 0, "Use Periodic Advertiser List" },
  6277. { 1, "Reporting initially disabled" },
  6278. { },
  6279. };
  6280. static const struct bitfield_data create_sync_options_alt[] = {
  6281. { 0, "Use advertising SID, Advertiser Address Type and address"},
  6282. { 1, "Reporting initially enabled" },
  6283. { },
  6284. };
  6285. static void print_create_sync_cte_type(uint8_t flags)
  6286. {
  6287. uint8_t mask = flags;
  6288. print_field("Sync CTE type: 0x%4.4x", flags);
  6289. mask = print_bitfield(2, flags, create_sync_cte_type);
  6290. if (mask) {
  6291. print_text(COLOR_UNKNOWN_ADV_FLAG,
  6292. "Unknown sync CTE type properties (0x%4.4x)",
  6293. mask);
  6294. }
  6295. }
  6296. static void print_create_sync_options(uint8_t flags)
  6297. {
  6298. uint8_t mask = flags;
  6299. int i;
  6300. print_field("Options: 0x%4.4x", flags);
  6301. for (i = 0; create_sync_options[i].str; i++) {
  6302. if (flags & (1 << create_sync_options[i].bit)) {
  6303. print_field("%s", create_sync_options[i].str);
  6304. mask &= ~(1 << create_sync_options[i].bit);
  6305. } else {
  6306. print_field("%s", create_sync_options_alt[i].str);
  6307. mask &= ~(1 << create_sync_options_alt[i].bit);
  6308. }
  6309. }
  6310. if (mask) {
  6311. print_text(COLOR_UNKNOWN_ADV_FLAG,
  6312. " Unknown options (0x%4.4x)", mask);
  6313. }
  6314. }
  6315. static void le_periodic_adv_create_sync_cmd(const void *data, uint8_t size)
  6316. {
  6317. const struct bt_hci_cmd_le_periodic_adv_create_sync *cmd = data;
  6318. print_create_sync_options(cmd->options);
  6319. print_field("SID: 0x%2.2x", cmd->sid);
  6320. print_addr_type("Adv address type", cmd->addr_type);
  6321. print_addr("Adv address", cmd->addr, cmd->addr_type);
  6322. print_field("Skip: 0x%4.4x", cmd->skip);
  6323. print_field("Sync timeout: %d msec (0x%4.4x)",
  6324. le16_to_cpu(cmd->sync_timeout) * 10,
  6325. le16_to_cpu(cmd->sync_timeout));
  6326. print_create_sync_cte_type(cmd->sync_cte_type);
  6327. }
  6328. static void le_periodic_adv_term_sync_cmd(const void *data, uint8_t size)
  6329. {
  6330. const struct bt_hci_cmd_le_periodic_adv_term_sync *cmd = data;
  6331. print_field("Sync handle: 0x%4.4x", cmd->sync_handle);
  6332. }
  6333. static void le_add_dev_periodic_adv_list_cmd(const void *data, uint8_t size)
  6334. {
  6335. const struct bt_hci_cmd_le_add_dev_periodic_adv_list *cmd = data;
  6336. print_addr_type("Adv address type", cmd->addr_type);
  6337. print_addr("Adv address", cmd->addr, cmd->addr_type);
  6338. print_field("SID: 0x%2.2x", cmd->sid);
  6339. }
  6340. static void le_remove_dev_periodic_adv_list_cmd(const void *data, uint8_t size)
  6341. {
  6342. const struct bt_hci_cmd_le_remove_dev_periodic_adv_list *cmd = data;
  6343. print_addr_type("Adv address type", cmd->addr_type);
  6344. print_addr("Adv address", cmd->addr, cmd->addr_type);
  6345. print_field("SID: 0x%2.2x", cmd->sid);
  6346. }
  6347. static void le_read_periodic_adv_list_size_rsp(const void *data, uint8_t size)
  6348. {
  6349. const struct bt_hci_rsp_le_read_dev_periodic_adv_list_size *rsp = data;
  6350. print_status(rsp->status);
  6351. print_field("List size: 0x%2.2x", rsp->list_size);
  6352. }
  6353. static void le_read_tx_power_rsp(const void *data, uint8_t size)
  6354. {
  6355. const struct bt_hci_rsp_le_read_tx_power *rsp = data;
  6356. print_status(rsp->status);
  6357. print_field("Min Tx power: %d dBm", rsp->min_tx_power);
  6358. print_field("Max Tx power: %d dBm", rsp->max_tx_power);
  6359. }
  6360. static void le_read_rf_path_comp_rsp(const void *data, uint8_t size)
  6361. {
  6362. const struct bt_hci_rsp_le_read_rf_path_comp *rsp = data;
  6363. print_status(rsp->status);
  6364. print_field("RF Tx Path Compensation Value: 0x%4.4x",
  6365. rsp->rf_tx_path_comp);
  6366. print_field("RF Rx Path Compensation Value: 0x%4.4x",
  6367. rsp->rf_rx_path_comp);
  6368. }
  6369. static void le_write_rf_path_comp_cmd(const void *data, uint8_t size)
  6370. {
  6371. const struct bt_hci_cmd_le_write_rf_path_comp *cmd = data;
  6372. print_field("RF Tx Path Compensation Value: 0x%4.4x",
  6373. cmd->rf_tx_path_comp);
  6374. print_field("RF Rx Path Compensation Value: 0x%4.4x",
  6375. cmd->rf_rx_path_comp);
  6376. }
  6377. static void le_set_priv_mode_cmd(const void *data, uint8_t size)
  6378. {
  6379. const struct bt_hci_cmd_le_set_priv_mode *cmd = data;
  6380. const char *str;
  6381. print_addr_type("Peer Identity address type", cmd->peer_id_addr_type);
  6382. print_addr("Peer Identity address", cmd->peer_id_addr,
  6383. cmd->peer_id_addr_type);
  6384. switch (cmd->priv_mode) {
  6385. case 0x00:
  6386. str = "Use Network Privacy";
  6387. break;
  6388. case 0x01:
  6389. str = "Use Device Privacy";
  6390. break;
  6391. default:
  6392. str = "Reserved";
  6393. break;
  6394. }
  6395. print_field("Privacy Mode: %s (0x%2.2x)", str, cmd->priv_mode);
  6396. }
  6397. static void le_receiver_test_cmd_v3(const void *data, uint8_t size)
  6398. {
  6399. const struct bt_hci_cmd_le_receiver_test_v3 *cmd = data;
  6400. uint8_t i;
  6401. print_field("RX Channel: %u MHz (0x%2.2x)", cmd->rx_chan * 2 + 2402,
  6402. cmd->rx_chan);
  6403. switch (cmd->phy) {
  6404. case 0x01:
  6405. print_field("PHY: LE 1M (0x%2.2x)", cmd->phy);
  6406. break;
  6407. case 0x02:
  6408. print_field("PHY: LE 2M (0x%2.2x)", cmd->phy);
  6409. break;
  6410. case 0x03:
  6411. print_field("PHY: LE Coded (0x%2.2x)", cmd->phy);
  6412. break;
  6413. }
  6414. print_field("Modulation Index: %s (0x%2.2x)",
  6415. cmd->mod_index ? "stable" : "standard", cmd->mod_index);
  6416. print_field("Expected CTE Length: %u us (0x%2.2x)", cmd->cte_len * 8,
  6417. cmd->cte_len);
  6418. print_field("Expected CTE Type: %u us slots (0x%2.2x)", cmd->cte_type,
  6419. cmd->cte_type);
  6420. print_field("Slot Duration: %u us (0x%2.2x)", cmd->duration,
  6421. cmd->duration);
  6422. print_field("Number of Antenna IDs: %u", cmd->num_antenna_id);
  6423. if (size < sizeof(*cmd) + cmd->num_antenna_id)
  6424. return;
  6425. for (i = 0; i < cmd->num_antenna_id; i++)
  6426. print_field(" Antenna ID: %u", cmd->antenna_ids[i]);
  6427. }
  6428. static const char *parse_tx_test_payload(uint8_t payload)
  6429. {
  6430. switch (payload) {
  6431. case 0x00:
  6432. return "PRBS9 sequence 11111111100000111101...";
  6433. case 0x01:
  6434. return "Repeated 11110000";
  6435. case 0x02:
  6436. return "Repeated 10101010";
  6437. case 0x03:
  6438. return "PRBS15";
  6439. case 0x04:
  6440. return "Repeated 11111111";
  6441. case 0x05:
  6442. return "Repeated 00000000";
  6443. case 0x06:
  6444. return "Repeated 00001111";
  6445. case 0x07:
  6446. return "Repeated 01010101";
  6447. default:
  6448. return "Reserved";
  6449. }
  6450. }
  6451. static void le_tx_test_cmd_v3(const void *data, uint8_t size)
  6452. {
  6453. const struct bt_hci_cmd_le_tx_test_v3 *cmd = data;
  6454. uint8_t i;
  6455. print_field("TX Channel: %u MHz (0x%2.2x)", cmd->chan * 2 + 2402,
  6456. cmd->chan);
  6457. print_field("Length of Test Data: %u", cmd->data_len);
  6458. print_field("Packet Payload: %s (0x%2.2x)",
  6459. parse_tx_test_payload(cmd->payload), cmd->payload);
  6460. switch (cmd->phy) {
  6461. case 0x01:
  6462. print_field("PHY: LE 1M (0x%2.2x)", cmd->phy);
  6463. break;
  6464. case 0x02:
  6465. print_field("PHY: LE 2M (0x%2.2x)", cmd->phy);
  6466. break;
  6467. case 0x03:
  6468. print_field("PHY: LE Coded with S=8 (0x%2.2x)", cmd->phy);
  6469. break;
  6470. case 0x04:
  6471. print_field("PHY: LE Coded with S=2 (0x%2.2x)", cmd->phy);
  6472. break;
  6473. }
  6474. print_field("Expected CTE Length: %u us (0x%2.2x)", cmd->cte_len * 8,
  6475. cmd->cte_len);
  6476. print_field("Expected CTE Type: %u us slots (0x%2.2x)", cmd->cte_type,
  6477. cmd->cte_type);
  6478. print_field("Slot Duration: %u us (0x%2.2x)", cmd->duration,
  6479. cmd->duration);
  6480. print_field("Number of Antenna IDs: %u", cmd->num_antenna_id);
  6481. if (size < sizeof(*cmd) + cmd->num_antenna_id)
  6482. return;
  6483. for (i = 0; i < cmd->num_antenna_id; i++)
  6484. print_field(" Antenna ID: %u", cmd->antenna_ids[i]);
  6485. }
  6486. static void le_periodic_adv_rec_enable(const void *data, uint8_t size)
  6487. {
  6488. const struct bt_hci_cmd_le_set_periodic_adv_enable *cmd = data;
  6489. print_field("Sync handle: %d", cmd->handle);
  6490. print_enable("Reporting", cmd->enable);
  6491. }
  6492. static void le_periodic_adv_sync_trans(const void *data, uint8_t size)
  6493. {
  6494. const struct bt_hci_cmd_periodic_sync_trans *cmd = data;
  6495. print_field("Connection handle: %d", cmd->handle);
  6496. print_field("Service data: 0x%4.4x", cmd->service_data);
  6497. print_field("Sync handle: %d", cmd->sync_handle);
  6498. }
  6499. static void le_periodic_adv_set_info_trans(const void *data, uint8_t size)
  6500. {
  6501. const struct bt_hci_cmd_periodic_adv_set_info_trans *cmd = data;
  6502. print_field("Connection handle: %d", cmd->handle);
  6503. print_field("Service data: 0x%4.4x", cmd->service_data);
  6504. print_field("Advertising handle: %d", cmd->adv_handle);
  6505. }
  6506. static void print_sync_mode(uint8_t mode)
  6507. {
  6508. const char *str;
  6509. switch (mode) {
  6510. case 0x00:
  6511. str = "Disabled";
  6512. break;
  6513. case 0x01:
  6514. str = "Enabled with report events disabled";
  6515. break;
  6516. case 0x02:
  6517. str = "Enabled with report events enabled";
  6518. break;
  6519. default:
  6520. str = "RFU";
  6521. break;
  6522. }
  6523. print_field("Mode: %s (0x%2.2x)", str, mode);
  6524. }
  6525. static void le_periodic_adv_sync_trans_params(const void *data, uint8_t size)
  6526. {
  6527. const struct bt_hci_cmd_periodic_adv_sync_trans_params *cmd = data;
  6528. print_field("Connection handle: %d", cmd->handle);
  6529. print_sync_mode(cmd->mode);
  6530. print_field("Skip: 0x%2.2x", cmd->skip);
  6531. print_field("Sync timeout: %d msec (0x%4.4x)",
  6532. le16_to_cpu(cmd->sync_timeout) * 10,
  6533. le16_to_cpu(cmd->sync_timeout));
  6534. print_create_sync_cte_type(cmd->cte_type);
  6535. }
  6536. static void le_set_default_periodic_adv_sync_trans_params(const void *data,
  6537. uint8_t size)
  6538. {
  6539. const struct bt_hci_cmd_default_periodic_adv_sync_trans_params *cmd = data;
  6540. print_sync_mode(cmd->mode);
  6541. print_field("Skip: 0x%2.2x", cmd->skip);
  6542. print_field("Sync timeout: %d msec (0x%4.4x)",
  6543. le16_to_cpu(cmd->sync_timeout) * 10,
  6544. le16_to_cpu(cmd->sync_timeout));
  6545. print_create_sync_cte_type(cmd->cte_type);
  6546. }
  6547. static void print_sca(uint8_t sca)
  6548. {
  6549. switch (sca) {
  6550. case 0x00:
  6551. print_field("SCA: 201 - 500 ppm (0x%2.2x)", sca);
  6552. return;
  6553. case 0x01:
  6554. print_field("SCA: 151 - 200 ppm (0x%2.2x)", sca);
  6555. return;
  6556. case 0x02:
  6557. print_field("SCA: 101 - 150 ppm (0x%2.2x)", sca);
  6558. return;
  6559. case 0x03:
  6560. print_field("SCA: 76 - 100 ppm (0x%2.2x)", sca);
  6561. return;
  6562. case 0x04:
  6563. print_field("SCA: 51 - 75 ppm (0x%2.2x)", sca);
  6564. return;
  6565. case 0x05:
  6566. print_field("SCA: 31 - 50 ppm (0x%2.2x)", sca);
  6567. return;
  6568. case 0x06:
  6569. print_field("SCA: 21 - 30 ppm (0x%2.2x)", sca);
  6570. return;
  6571. case 0x07:
  6572. print_field("SCA: 0 - 20 ppm (0x%2.2x)", sca);
  6573. return;
  6574. default:
  6575. print_field("SCA: Reserved (0x%2.2x)", sca);
  6576. }
  6577. }
  6578. static void print_packing(uint8_t value)
  6579. {
  6580. switch (value) {
  6581. case 0x00:
  6582. print_field("Packing: Sequential (0x%2.2x)", value);
  6583. return;
  6584. case 0x01:
  6585. print_field("Packing: Interleaved (0x%2.2x)", value);
  6586. return;
  6587. default:
  6588. print_field("Packing: Reserved (0x%2.2x)", value);
  6589. }
  6590. }
  6591. static void print_framing(uint8_t value)
  6592. {
  6593. switch (value) {
  6594. case 0x00:
  6595. print_field("Framing: Unframed (0x%2.2x)", value);
  6596. return;
  6597. case 0x01:
  6598. print_field("Framing: Framed (0x%2.2x)", value);
  6599. return;
  6600. default:
  6601. print_field("Packing: Reserved (0x%2.2x)", value);
  6602. }
  6603. }
  6604. static void le_read_buffer_size_v2_rsp(const void *data, uint8_t size)
  6605. {
  6606. const struct bt_hci_rsp_le_read_buffer_size_v2 *rsp = data;
  6607. print_status(rsp->status);
  6608. if (size == 1)
  6609. return;
  6610. print_field("ACL MTU: %d", le16_to_cpu(rsp->acl_mtu));
  6611. print_field("ACL max packet: %d", rsp->acl_max_pkt);
  6612. print_field("ISO MTU: %d", le16_to_cpu(rsp->iso_mtu));
  6613. print_field("ISO max packet: %d", rsp->iso_max_pkt);
  6614. }
  6615. static void le_read_iso_tx_sync_cmd(const void *data, uint8_t size)
  6616. {
  6617. const struct bt_hci_cmd_le_read_iso_tx_sync *cmd = data;
  6618. print_field("Handle: %d", le16_to_cpu(cmd->handle));
  6619. }
  6620. static void le_read_iso_tx_sync_rsp(const void *data, uint8_t size)
  6621. {
  6622. const struct bt_hci_rsp_le_read_iso_tx_sync *rsp = data;
  6623. uint32_t offset = 0;
  6624. print_status(rsp->status);
  6625. if (size == 1)
  6626. return;
  6627. print_field("Handle: %d", le16_to_cpu(rsp->handle));
  6628. print_field("Sequence Number: %d", le16_to_cpu(rsp->seq));
  6629. print_field("Timestamp: %d", le32_to_cpu(rsp->timestamp));
  6630. memcpy(&offset, rsp->offset, sizeof(rsp->offset));
  6631. print_field("Offset: %d", le32_to_cpu(offset));
  6632. }
  6633. static void print_cis_params(const void *data, int i)
  6634. {
  6635. const struct bt_hci_cis_params *cis = data;
  6636. print_field("CIS ID: 0x%2.2x", cis->cis_id);
  6637. print_field("Central to Peripheral Maximum SDU Size: %u",
  6638. le16_to_cpu(cis->c_sdu));
  6639. print_field("Peripheral to Central Maximum SDU Size: %u",
  6640. le16_to_cpu(cis->p_sdu));
  6641. print_le_phy("Central to Peripheral PHY", cis->c_phy);
  6642. print_le_phy("Peripheral to Central PHY", cis->p_phy);
  6643. print_field("Central to Peripheral Retransmission attempts: 0x%2.2x",
  6644. cis->c_rtn);
  6645. print_field("Peripheral to Central Retransmission attempts: 0x%2.2x",
  6646. cis->p_rtn);
  6647. }
  6648. static void le_set_cig_params_cmd(const void *data, uint8_t size)
  6649. {
  6650. const struct bt_hci_cmd_le_set_cig_params *cmd = data;
  6651. print_field("CIG ID: 0x%2.2x", cmd->cig_id);
  6652. print_usec_interval("Central to Peripheral SDU Interval",
  6653. cmd->c_interval);
  6654. print_usec_interval("Peripheral to Central SDU Interval",
  6655. cmd->p_interval);
  6656. print_sca(cmd->sca);
  6657. print_packing(cmd->packing);
  6658. print_framing(cmd->framing);
  6659. print_field("Central to Peripheral Maximum Latency: %d ms (0x%4.4x)",
  6660. le16_to_cpu(cmd->c_latency), le16_to_cpu(cmd->c_latency));
  6661. print_field("Peripheral to Central Maximum Latency: %d ms (0x%4.4x)",
  6662. le16_to_cpu(cmd->p_latency), le16_to_cpu(cmd->p_latency));
  6663. print_field("Number of CIS: %u", cmd->num_cis);
  6664. size -= sizeof(*cmd);
  6665. print_list(cmd->cis, size, cmd->num_cis, sizeof(*cmd->cis),
  6666. print_cis_params);
  6667. }
  6668. static void print_cis_params_test(const void *data, int i)
  6669. {
  6670. const struct bt_hci_cis_params_test *cis = data;
  6671. print_field("CIS ID: 0x%2.2x", cis->cis_id);
  6672. print_field("NSE: 0x%2.2x", cis->nse);
  6673. print_field("Central to Peripheral Maximum SDU: 0x%4.4x",
  6674. le16_to_cpu(cis->c_sdu));
  6675. print_field("Peripheral to Central Maximum SDU: 0x%4.4x",
  6676. le16_to_cpu(cis->p_sdu));
  6677. print_field("Central to Peripheral Maximum PDU: 0x%4.4x",
  6678. le16_to_cpu(cis->c_pdu));
  6679. print_field("Peripheral to Central Maximum PDU: 0x%4.4x",
  6680. le16_to_cpu(cis->p_pdu));
  6681. print_le_phy("Central to Peripheral PHY", cis->c_phy);
  6682. print_le_phy("Peripheral to Central PHY", cis->p_phy);
  6683. print_field("Central to Peripheral Burst Number: 0x%2.2x", cis->c_bn);
  6684. print_field("Peripheral to Central Burst Number: 0x%2.2x", cis->p_bn);
  6685. }
  6686. static void le_set_cig_params_test_cmd(const void *data, uint8_t size)
  6687. {
  6688. const struct bt_hci_cmd_le_set_cig_params_test *cmd = data;
  6689. print_field("CIG ID: 0x%2.2x", cmd->cig_id);
  6690. print_usec_interval("Central to Peripheral SDU Interval",
  6691. cmd->c_interval);
  6692. print_usec_interval("Peripheral to Central SDU Interval",
  6693. cmd->p_interval);
  6694. print_field("Central to Peripheral Flush Timeout: 0x%2.2x", cmd->c_ft);
  6695. print_field("Peripheral to Central Flush Timeout: 0x%2.2x", cmd->p_ft);
  6696. print_field("ISO Interval: %.2f ms (0x%4.4x)",
  6697. le16_to_cpu(cmd->iso_interval) * 1.25,
  6698. le16_to_cpu(cmd->iso_interval));
  6699. print_sca(cmd->sca);
  6700. print_packing(cmd->packing);
  6701. print_framing(cmd->framing);
  6702. print_field("Number of CIS: %u", cmd->num_cis);
  6703. size -= sizeof(*cmd);
  6704. print_list(cmd->cis, size, cmd->num_cis, sizeof(*cmd->cis),
  6705. print_cis_params_test);
  6706. }
  6707. static void print_cig_handle(const void *data, int i)
  6708. {
  6709. const uint16_t *handle = data;
  6710. print_field("Connection Handle: %d", le16_to_cpu(*handle));
  6711. }
  6712. static void le_set_cig_params_rsp(const void *data, uint8_t size)
  6713. {
  6714. const struct bt_hci_rsp_le_set_cig_params *rsp = data;
  6715. print_status(rsp->status);
  6716. if (size == 1)
  6717. return;
  6718. print_field("CIG ID: 0x%2.2x", rsp->cig_id);
  6719. print_field("Number of Handles: %u", rsp->num_handles);
  6720. size -= sizeof(*rsp);
  6721. print_list(rsp->handle, size, rsp->num_handles, sizeof(*rsp->handle),
  6722. print_cig_handle);
  6723. }
  6724. static void print_cis(const void *data, int i)
  6725. {
  6726. const struct bt_hci_cis *cis = data;
  6727. print_field("CIS Handle: %d", cis->cis_handle);
  6728. print_field("ACL Handle: %d", cis->acl_handle);
  6729. }
  6730. static void le_create_cis_cmd(const void *data, uint8_t size)
  6731. {
  6732. const struct bt_hci_cmd_le_create_cis *cmd = data;
  6733. print_field("Number of CIS: %u", cmd->num_cis);
  6734. size -= sizeof(*cmd);
  6735. print_list(cmd->cis, size, cmd->num_cis, sizeof(*cmd->cis), print_cis);
  6736. }
  6737. static void le_remove_cig_cmd(const void *data, uint8_t size)
  6738. {
  6739. const struct bt_hci_cmd_le_remove_cig *cmd = data;
  6740. print_field("CIG ID: 0x%02x", cmd->cig_id);
  6741. }
  6742. static void le_remove_cig_rsp(const void *data, uint8_t size)
  6743. {
  6744. const struct bt_hci_rsp_le_remove_cig *rsp = data;
  6745. print_status(rsp->status);
  6746. if (size == 1)
  6747. return;
  6748. print_field("CIG ID: 0x%2.2x", rsp->cig_id);
  6749. }
  6750. static void le_accept_cis_req_cmd(const void *data, uint8_t size)
  6751. {
  6752. const struct bt_hci_cmd_le_accept_cis *cmd = data;
  6753. print_field("CIS Handle: %d", le16_to_cpu(cmd->handle));
  6754. }
  6755. static void le_reject_cis_req_cmd(const void *data, uint8_t size)
  6756. {
  6757. const struct bt_hci_cmd_le_reject_cis *cmd = data;
  6758. print_field("CIS Handle: %d", le16_to_cpu(cmd->handle));
  6759. print_reason(cmd->reason);
  6760. }
  6761. static void print_bis(const void *data, int i)
  6762. {
  6763. const struct bt_hci_bis *bis = data;
  6764. print_usec_interval("SDU Interval", bis->sdu_interval);
  6765. print_field("Maximum SDU size: %u", le16_to_cpu(bis->sdu));
  6766. print_field("Maximum Latency: %u ms (0x%4.4x)",
  6767. le16_to_cpu(bis->latency), le16_to_cpu(bis->latency));
  6768. print_field("RTN: 0x%2.2x", bis->rtn);
  6769. print_le_phy("PHY", bis->phy);
  6770. print_packing(bis->packing);
  6771. print_framing(bis->framing);
  6772. print_field("Encryption: 0x%2.2x", bis->encryption);
  6773. print_hex_field("Broadcast Code", bis->bcode, 16);
  6774. }
  6775. static void le_create_big_cmd(const void *data, uint8_t size)
  6776. {
  6777. const struct bt_hci_cmd_le_create_big *cmd = data;
  6778. print_field("Handle: 0x%2.2x", cmd->handle);
  6779. print_field("Advertising Handle: 0x%2.2x", cmd->adv_handle);
  6780. print_field("Number of BIS: %u", cmd->num_bis);
  6781. size -= sizeof(*cmd);
  6782. print_list(cmd->bis, size, cmd->num_bis, sizeof(*cmd->bis), print_bis);
  6783. }
  6784. static void print_bis_test(const void *data, int i)
  6785. {
  6786. const struct bt_hci_bis_test *bis = data;
  6787. print_usec_interval("SDU Interval", bis->sdu_interval);
  6788. print_field("ISO Interval: %.2f ms (0x%4.4x)",
  6789. le16_to_cpu(bis->iso_interval) * 1.25,
  6790. le16_to_cpu(bis->iso_interval));
  6791. print_field("Number of Subevents: %u", bis->nse);
  6792. print_field("Maximum SDU: %u", bis->sdu);
  6793. print_field("Maximum PDU: %u", bis->pdu);
  6794. print_packing(bis->packing);
  6795. print_framing(bis->framing);
  6796. print_le_phy("PHY", bis->phy);
  6797. print_field("Burst Number: %u", bis->bn);
  6798. print_field("Immediate Repetition Count: %u", bis->irc);
  6799. print_field("Pre Transmission Offset: 0x%2.2x", bis->pto);
  6800. print_field("Encryption: 0x%2.2x", bis->encryption);
  6801. print_hex_field("Broadcast Code", bis->bcode, 16);
  6802. }
  6803. static void le_create_big_cmd_test_cmd(const void *data, uint8_t size)
  6804. {
  6805. const struct bt_hci_cmd_le_create_big_test *cmd = data;
  6806. print_field("BIG ID: 0x%2.2x", cmd->big_id);
  6807. print_field("Advertising Handle: 0x%2.2x", cmd->adv_handle);
  6808. print_field("Number of BIS: %u", cmd->num_bis);
  6809. size -= sizeof(*cmd);
  6810. print_list(cmd->bis, size, cmd->num_bis, sizeof(*cmd->bis),
  6811. print_bis_test);
  6812. }
  6813. static void le_terminate_big_cmd(const void *data, uint8_t size)
  6814. {
  6815. const struct bt_hci_cmd_le_term_big *cmd = data;
  6816. print_field("BIG Handle: 0x%2.2x", cmd->handle);
  6817. print_reason(cmd->reason);
  6818. }
  6819. static void print_bis_sync(const void *data, int i)
  6820. {
  6821. const uint8_t *bis_id = data;
  6822. print_field("BIS ID: 0x%2.2x", *bis_id);
  6823. }
  6824. static void le_big_create_sync_cmd(const void *data, uint8_t size)
  6825. {
  6826. const struct bt_hci_cmd_le_big_create_sync *cmd = data;
  6827. print_field("BIG Handle: 0x%2.2x", cmd->handle);
  6828. print_field("BIG Sync Handle: 0x%4.4x", le16_to_cpu(cmd->sync_handle));
  6829. print_field("Encryption: %s (0x%2.2x)",
  6830. cmd->encryption ? "Unencrypted" : "Encrypted",
  6831. cmd->encryption);
  6832. print_hex_field("Broadcast Code", cmd->bcode, 16);
  6833. print_field("Maximum Number Subevents: 0x%2.2x", cmd->mse);
  6834. print_field("Timeout: %d ms (0x%4.4x)", le16_to_cpu(cmd->timeout) * 10,
  6835. le16_to_cpu(cmd->timeout));
  6836. print_field("Number of BIS: %u", cmd->num_bis);
  6837. size -= sizeof(*cmd);
  6838. print_list(cmd->bis, size, cmd->num_bis, sizeof(*cmd->bis),
  6839. print_bis_sync);
  6840. }
  6841. static void le_big_term_sync_cmd(const void *data, uint8_t size)
  6842. {
  6843. const struct bt_hci_cmd_le_big_term_sync *cmd = data;
  6844. print_field("BIG Handle: 0x%2.2x", cmd->handle);
  6845. }
  6846. static void print_iso_path(const char *prefix, uint8_t path)
  6847. {
  6848. switch (path) {
  6849. case 0x00:
  6850. print_field("%s: HCI (0x%2.2x)", prefix, path);
  6851. return;
  6852. case 0xff:
  6853. print_field("%s: Disabled (0x%2.2x)", prefix, path);
  6854. return;
  6855. default:
  6856. print_field("%s: Logical Channel Number %u", prefix, path);
  6857. }
  6858. }
  6859. static void le_setup_iso_path_cmd(const void *data, uint8_t size)
  6860. {
  6861. const struct bt_hci_cmd_le_setup_iso_path *cmd = data;
  6862. print_field("Handle: %d", le16_to_cpu(cmd->handle));
  6863. print_path_direction("Data Path Direction", cmd->direction);
  6864. print_iso_path("Data Path", cmd->path);
  6865. print_codec_id("Coding Format", cmd->codec);
  6866. packet_print_company("Company Codec ID", le16_to_cpu(cmd->codec_cid));
  6867. print_field("Vendor Codec ID: %d", le16_to_cpu(cmd->codec_vid));
  6868. print_usec_interval("Controller Delay", cmd->delay);
  6869. print_field("Codec Configuration Length: %d", cmd->codec_cfg_len);
  6870. print_hex_field("Codec Configuration", cmd->codec_cfg,
  6871. cmd->codec_cfg_len);
  6872. }
  6873. static void le_setup_iso_path_rsp(const void *data, uint8_t size)
  6874. {
  6875. const struct bt_hci_rsp_le_setup_iso_path *rsp = data;
  6876. print_status(rsp->status);
  6877. if (size == 1)
  6878. return;
  6879. print_field("Handle: %d", le16_to_cpu(rsp->handle));
  6880. }
  6881. static void le_remove_iso_path_cmd(const void *data, uint8_t size)
  6882. {
  6883. const struct bt_hci_cmd_le_remove_iso_path *cmd = data;
  6884. print_field("Connection Handle: %d", le16_to_cpu(cmd->handle));
  6885. print_path_direction("Data Path Direction", cmd->direction);
  6886. }
  6887. static void le_req_peer_sca_cmd(const void *data, uint8_t size)
  6888. {
  6889. const struct bt_hci_cmd_le_req_peer_sca *cmd = data;
  6890. print_field("Connection Handle: %d", le16_to_cpu(cmd->handle));
  6891. }
  6892. static void le_set_host_feature_cmd(const void *data, uint8_t size)
  6893. {
  6894. const struct bt_hci_cmd_le_set_host_feature *cmd = data;
  6895. uint64_t mask;
  6896. print_field("Bit Number: %u", cmd->bit_number);
  6897. mask = print_bitfield(2, (((uint64_t) 1) << cmd->bit_number),
  6898. features_le);
  6899. if (mask)
  6900. print_text(COLOR_UNKNOWN_FEATURE_BIT, " Unknown features "
  6901. "(0x%16.16" PRIx64 ")", mask);
  6902. print_field("Bit Value: %u", cmd->bit_value);
  6903. }
  6904. struct opcode_data {
  6905. uint16_t opcode;
  6906. int bit;
  6907. const char *str;
  6908. void (*cmd_func) (const void *data, uint8_t size);
  6909. uint8_t cmd_size;
  6910. bool cmd_fixed;
  6911. void (*rsp_func) (const void *data, uint8_t size);
  6912. uint8_t rsp_size;
  6913. bool rsp_fixed;
  6914. };
  6915. static const struct opcode_data opcode_table[] = {
  6916. { 0x0000, -1, "NOP" },
  6917. /* OGF 1 - Link Control */
  6918. { 0x0401, 0, "Inquiry",
  6919. inquiry_cmd, 5, true },
  6920. { 0x0402, 1, "Inquiry Cancel",
  6921. null_cmd, 0, true,
  6922. status_rsp, 1, true },
  6923. { 0x0403, 2, "Periodic Inquiry Mode",
  6924. periodic_inquiry_cmd, 9, true,
  6925. status_rsp, 1, true },
  6926. { 0x0404, 3, "Exit Periodic Inquiry Mode",
  6927. null_cmd, 0, true,
  6928. status_rsp, 1, true },
  6929. { 0x0405, 4, "Create Connection",
  6930. create_conn_cmd, 13, true },
  6931. { 0x0406, 5, "Disconnect",
  6932. disconnect_cmd, 3, true },
  6933. { 0x0407, 6, "Add SCO Connection",
  6934. add_sco_conn_cmd, 4, true },
  6935. { 0x0408, 7, "Create Connection Cancel",
  6936. create_conn_cancel_cmd, 6, true,
  6937. status_bdaddr_rsp, 7, true },
  6938. { 0x0409, 8, "Accept Connection Request",
  6939. accept_conn_request_cmd, 7, true },
  6940. { 0x040a, 9, "Reject Connection Request",
  6941. reject_conn_request_cmd, 7, true },
  6942. { 0x040b, 10, "Link Key Request Reply",
  6943. link_key_request_reply_cmd, 22, true,
  6944. status_bdaddr_rsp, 7, true },
  6945. { 0x040c, 11, "Link Key Request Negative Reply",
  6946. link_key_request_neg_reply_cmd, 6, true,
  6947. status_bdaddr_rsp, 7, true },
  6948. { 0x040d, 12, "PIN Code Request Reply",
  6949. pin_code_request_reply_cmd, 23, true,
  6950. status_bdaddr_rsp, 7, true },
  6951. { 0x040e, 13, "PIN Code Request Negative Reply",
  6952. pin_code_request_neg_reply_cmd, 6, true,
  6953. status_bdaddr_rsp, 7, true },
  6954. { 0x040f, 14, "Change Connection Packet Type",
  6955. change_conn_pkt_type_cmd, 4, true },
  6956. { 0x0411, 15, "Authentication Requested",
  6957. auth_requested_cmd, 2, true },
  6958. { 0x0413, 16, "Set Connection Encryption",
  6959. set_conn_encrypt_cmd, 3, true },
  6960. { 0x0415, 17, "Change Connection Link Key",
  6961. change_conn_link_key_cmd, 2, true },
  6962. { 0x0417, 18, "Temporary Link Key",
  6963. link_key_selection_cmd, 1, true },
  6964. { 0x0419, 19, "Remote Name Request",
  6965. remote_name_request_cmd, 10, true },
  6966. { 0x041a, 20, "Remote Name Request Cancel",
  6967. remote_name_request_cancel_cmd, 6, true,
  6968. status_bdaddr_rsp, 7, true },
  6969. { 0x041b, 21, "Read Remote Supported Features",
  6970. read_remote_features_cmd, 2, true },
  6971. { 0x041c, 22, "Read Remote Extended Features",
  6972. read_remote_ext_features_cmd, 3, true },
  6973. { 0x041d, 23, "Read Remote Version Information",
  6974. read_remote_version_cmd, 2, true },
  6975. { 0x041f, 24, "Read Clock Offset",
  6976. read_clock_offset_cmd, 2, true },
  6977. { 0x0420, 25, "Read LMP Handle",
  6978. read_lmp_handle_cmd, 2, true,
  6979. read_lmp_handle_rsp, 8, true },
  6980. { 0x0428, 131, "Setup Synchronous Connection",
  6981. setup_sync_conn_cmd, 17, true },
  6982. { 0x0429, 132, "Accept Synchronous Connection Request",
  6983. accept_sync_conn_request_cmd, 21, true },
  6984. { 0x042a, 133, "Reject Synchronous Connection Request",
  6985. reject_sync_conn_request_cmd, 7, true },
  6986. { 0x042b, 151, "IO Capability Request Reply",
  6987. io_capability_request_reply_cmd, 9, true,
  6988. status_bdaddr_rsp, 7, true },
  6989. { 0x042c, 152, "User Confirmation Request Reply",
  6990. user_confirm_request_reply_cmd, 6, true,
  6991. status_bdaddr_rsp, 7, true },
  6992. { 0x042d, 153, "User Confirmation Request Neg Reply",
  6993. user_confirm_request_neg_reply_cmd, 6, true,
  6994. status_bdaddr_rsp, 7, true },
  6995. { 0x042e, 154, "User Passkey Request Reply",
  6996. user_passkey_request_reply_cmd, 10, true,
  6997. status_bdaddr_rsp, 7, true },
  6998. { 0x042f, 155, "User Passkey Request Negative Reply",
  6999. user_passkey_request_neg_reply_cmd, 6, true,
  7000. status_bdaddr_rsp, 7, true },
  7001. { 0x0430, 156, "Remote OOB Data Request Reply",
  7002. remote_oob_data_request_reply_cmd, 38, true,
  7003. status_bdaddr_rsp, 7, true },
  7004. { 0x0433, 159, "Remote OOB Data Request Neg Reply",
  7005. remote_oob_data_request_neg_reply_cmd, 6, true,
  7006. status_bdaddr_rsp, 7, true },
  7007. { 0x0434, 163, "IO Capability Request Negative Reply",
  7008. io_capability_request_neg_reply_cmd, 7, true,
  7009. status_bdaddr_rsp, 7, true },
  7010. { 0x0435, 168, "Create Physical Link",
  7011. create_phy_link_cmd, 3, false },
  7012. { 0x0436, 169, "Accept Physical Link",
  7013. accept_phy_link_cmd, 3, false },
  7014. { 0x0437, 170, "Disconnect Physical Link",
  7015. disconn_phy_link_cmd, 2, true },
  7016. { 0x0438, 171, "Create Logical Link",
  7017. create_logic_link_cmd, 33, true },
  7018. { 0x0439, 172, "Accept Logical Link",
  7019. accept_logic_link_cmd, 33, true },
  7020. { 0x043a, 173, "Disconnect Logical Link",
  7021. disconn_logic_link_cmd, 2, true },
  7022. { 0x043b, 174, "Logical Link Cancel",
  7023. logic_link_cancel_cmd, 2, true,
  7024. logic_link_cancel_rsp, 3, true },
  7025. { 0x043c, 175, "Flow Specifcation Modify",
  7026. flow_spec_modify_cmd, 34, true },
  7027. { 0x043d, 235, "Enhanced Setup Synchronous Connection",
  7028. enhanced_setup_sync_conn_cmd, 59, true },
  7029. { 0x043e, 236, "Enhanced Accept Synchronous Connection Request",
  7030. enhanced_accept_sync_conn_request_cmd, 63, true },
  7031. { 0x043f, 246, "Truncated Page",
  7032. truncated_page_cmd, 9, true },
  7033. { 0x0440, 247, "Truncated Page Cancel",
  7034. truncated_page_cancel_cmd, 6, true,
  7035. status_bdaddr_rsp, 7, true },
  7036. { 0x0441, 248, "Set Connectionless Peripheral Broadcast",
  7037. set_peripheral_broadcast_cmd, 11, true,
  7038. set_peripheral_broadcast_rsp, 4, true },
  7039. { 0x0442, 249, "Set Connectionless Peripheral Broadcast Receive",
  7040. set_peripheral_broadcast_receive_cmd, 34, true,
  7041. set_peripheral_broadcast_receive_rsp, 8, true },
  7042. { 0x0443, 250, "Start Synchronization Train",
  7043. null_cmd, 0, true },
  7044. { 0x0444, 251, "Receive Synchronization Train",
  7045. receive_sync_train_cmd, 12, true },
  7046. { 0x0445, 257, "Remote OOB Extended Data Request Reply",
  7047. remote_oob_ext_data_request_reply_cmd, 70, true,
  7048. status_bdaddr_rsp, 7, true },
  7049. /* OGF 2 - Link Policy */
  7050. { 0x0801, 33, "Hold Mode",
  7051. hold_mode_cmd, 6, true },
  7052. { 0x0803, 34, "Sniff Mode",
  7053. sniff_mode_cmd, 10, true },
  7054. { 0x0804, 35, "Exit Sniff Mode",
  7055. exit_sniff_mode_cmd, 2, true },
  7056. { 0x0805, 36, "Park State",
  7057. park_state_cmd, 6, true },
  7058. { 0x0806, 37, "Exit Park State",
  7059. exit_park_state_cmd, 2, true },
  7060. { 0x0807, 38, "QoS Setup",
  7061. qos_setup_cmd, 20, true },
  7062. { 0x0809, 39, "Role Discovery",
  7063. role_discovery_cmd, 2, true,
  7064. role_discovery_rsp, 4, true },
  7065. { 0x080b, 40, "Switch Role",
  7066. switch_role_cmd, 7, true },
  7067. { 0x080c, 41, "Read Link Policy Settings",
  7068. read_link_policy_cmd, 2, true,
  7069. read_link_policy_rsp, 5, true },
  7070. { 0x080d, 42, "Write Link Policy Settings",
  7071. write_link_policy_cmd, 4, true,
  7072. write_link_policy_rsp, 3, true },
  7073. { 0x080e, 43, "Read Default Link Policy Settings",
  7074. null_cmd, 0, true,
  7075. read_default_link_policy_rsp, 3, true },
  7076. { 0x080f, 44, "Write Default Link Policy Settings",
  7077. write_default_link_policy_cmd, 2, true,
  7078. status_rsp, 1, true },
  7079. { 0x0810, 45, "Flow Specification",
  7080. flow_spec_cmd, 21, true },
  7081. { 0x0811, 140, "Sniff Subrating",
  7082. sniff_subrating_cmd, 8, true,
  7083. sniff_subrating_rsp, 3, true },
  7084. /* OGF 3 - Host Control */
  7085. { 0x0c01, 46, "Set Event Mask",
  7086. set_event_mask_cmd, 8, true,
  7087. status_rsp, 1, true },
  7088. { 0x0c03, 47, "Reset",
  7089. null_cmd, 0, true,
  7090. status_rsp, 1, true },
  7091. { 0x0c05, 48, "Set Event Filter",
  7092. set_event_filter_cmd, 1, false,
  7093. status_rsp, 1, true },
  7094. { 0x0c08, 49, "Flush",
  7095. flush_cmd, 2, true,
  7096. flush_rsp, 3, true },
  7097. { 0x0c09, 50, "Read PIN Type",
  7098. null_cmd, 0, true,
  7099. read_pin_type_rsp, 2, true },
  7100. { 0x0c0a, 51, "Write PIN Type",
  7101. write_pin_type_cmd, 1, true,
  7102. status_rsp, 1, true },
  7103. { 0x0c0b, 52, "Create New Unit Key",
  7104. null_cmd, 0, true,
  7105. status_rsp, 1, true },
  7106. { 0x0c0d, 53, "Read Stored Link Key",
  7107. read_stored_link_key_cmd, 7, true,
  7108. read_stored_link_key_rsp, 5, true },
  7109. { 0x0c11, 54, "Write Stored Link Key",
  7110. write_stored_link_key_cmd, 1, false,
  7111. write_stored_link_key_rsp, 2, true },
  7112. { 0x0c12, 55, "Delete Stored Link Key",
  7113. delete_stored_link_key_cmd, 7, true,
  7114. delete_stored_link_key_rsp, 3, true },
  7115. { 0x0c13, 56, "Write Local Name",
  7116. write_local_name_cmd, 248, true,
  7117. status_rsp, 1, true },
  7118. { 0x0c14, 57, "Read Local Name",
  7119. null_cmd, 0, true,
  7120. read_local_name_rsp, 249, true },
  7121. { 0x0c15, 58, "Read Connection Accept Timeout",
  7122. null_cmd, 0, true,
  7123. read_conn_accept_timeout_rsp, 3, true },
  7124. { 0x0c16, 59, "Write Connection Accept Timeout",
  7125. write_conn_accept_timeout_cmd, 2, true,
  7126. status_rsp, 1, true },
  7127. { 0x0c17, 60, "Read Page Timeout",
  7128. null_cmd, 0, true,
  7129. read_page_timeout_rsp, 3, true },
  7130. { 0x0c18, 61, "Write Page Timeout",
  7131. write_page_timeout_cmd, 2, true,
  7132. status_rsp, 1, true },
  7133. { 0x0c19, 62, "Read Scan Enable",
  7134. null_cmd, 0, true,
  7135. read_scan_enable_rsp, 2, true },
  7136. { 0x0c1a, 63, "Write Scan Enable",
  7137. write_scan_enable_cmd, 1, true,
  7138. status_rsp, 1, true },
  7139. { 0x0c1b, 64, "Read Page Scan Activity",
  7140. null_cmd, 0, true,
  7141. read_page_scan_activity_rsp, 5, true },
  7142. { 0x0c1c, 65, "Write Page Scan Activity",
  7143. write_page_scan_activity_cmd, 4, true,
  7144. status_rsp, 1, true },
  7145. { 0x0c1d, 66, "Read Inquiry Scan Activity",
  7146. null_cmd, 0, true,
  7147. read_inquiry_scan_activity_rsp, 5, true },
  7148. { 0x0c1e, 67, "Write Inquiry Scan Activity",
  7149. write_inquiry_scan_activity_cmd, 4, true,
  7150. status_rsp, 1, true },
  7151. { 0x0c1f, 68, "Read Authentication Enable",
  7152. null_cmd, 0, true,
  7153. read_auth_enable_rsp, 2, true },
  7154. { 0x0c20, 69, "Write Authentication Enable",
  7155. write_auth_enable_cmd, 1, true,
  7156. status_rsp, 1, true },
  7157. { 0x0c21, 70, "Read Encryption Mode",
  7158. null_cmd, 0, true,
  7159. read_encrypt_mode_rsp, 2, true },
  7160. { 0x0c22, 71, "Write Encryption Mode",
  7161. write_encrypt_mode_cmd, 1, true,
  7162. status_rsp, 1, true },
  7163. { 0x0c23, 72, "Read Class of Device",
  7164. null_cmd, 0, true,
  7165. read_class_of_dev_rsp, 4, true },
  7166. { 0x0c24, 73, "Write Class of Device",
  7167. write_class_of_dev_cmd, 3, true,
  7168. status_rsp, 1, true },
  7169. { 0x0c25, 74, "Read Voice Setting",
  7170. null_cmd, 0, true,
  7171. read_voice_setting_rsp, 3, true },
  7172. { 0x0c26, 75, "Write Voice Setting",
  7173. write_voice_setting_cmd, 2, true,
  7174. status_rsp, 1, true },
  7175. { 0x0c27, 76, "Read Automatic Flush Timeout",
  7176. read_auto_flush_timeout_cmd, 2, true,
  7177. read_auto_flush_timeout_rsp, 5, true },
  7178. { 0x0c28, 77, "Write Automatic Flush Timeout",
  7179. write_auto_flush_timeout_cmd, 4, true,
  7180. write_auto_flush_timeout_rsp, 3, true },
  7181. { 0x0c29, 78, "Read Num Broadcast Retransmissions",
  7182. null_cmd, 0, true,
  7183. read_num_broadcast_retrans_rsp, 2, true },
  7184. { 0x0c2a, 79, "Write Num Broadcast Retransmissions",
  7185. write_num_broadcast_retrans_cmd, 1, true,
  7186. status_rsp, 1, true },
  7187. { 0x0c2b, 80, "Read Hold Mode Activity",
  7188. null_cmd, 0, true,
  7189. read_hold_mode_activity_rsp, 2, true },
  7190. { 0x0c2c, 81, "Write Hold Mode Activity",
  7191. write_hold_mode_activity_cmd, 1, true,
  7192. status_rsp, 1, true },
  7193. { 0x0c2d, 82, "Read Transmit Power Level",
  7194. read_tx_power_cmd, 3, true,
  7195. read_tx_power_rsp, 4, true },
  7196. { 0x0c2e, 83, "Read Sync Flow Control Enable",
  7197. null_cmd, 0, true,
  7198. read_sync_flow_control_rsp, 2, true },
  7199. { 0x0c2f, 84, "Write Sync Flow Control Enable",
  7200. write_sync_flow_control_cmd, 1, true,
  7201. status_rsp, 1, true },
  7202. { 0x0c31, 85, "Set Controller To Host Flow Control",
  7203. set_host_flow_control_cmd, 1, true,
  7204. status_rsp, 1, true },
  7205. { 0x0c33, 86, "Host Buffer Size",
  7206. host_buffer_size_cmd, 7, true,
  7207. status_rsp, 1, true },
  7208. { 0x0c35, 87, "Host Number of Completed Packets",
  7209. host_num_completed_packets_cmd, 5, false },
  7210. { 0x0c36, 88, "Read Link Supervision Timeout",
  7211. read_link_supv_timeout_cmd, 2, true,
  7212. read_link_supv_timeout_rsp, 5, true },
  7213. { 0x0c37, 89, "Write Link Supervision Timeout",
  7214. write_link_supv_timeout_cmd, 4, true,
  7215. write_link_supv_timeout_rsp, 3, true },
  7216. { 0x0c38, 90, "Read Number of Supported IAC",
  7217. null_cmd, 0, true,
  7218. read_num_supported_iac_rsp, 2, true },
  7219. { 0x0c39, 91, "Read Current IAC LAP",
  7220. null_cmd, 0, true,
  7221. read_current_iac_lap_rsp, 2, false },
  7222. { 0x0c3a, 92, "Write Current IAC LAP",
  7223. write_current_iac_lap_cmd, 1, false,
  7224. status_rsp, 1, true },
  7225. { 0x0c3b, 93, "Read Page Scan Period Mode",
  7226. null_cmd, 0, true,
  7227. read_page_scan_period_mode_rsp, 2, true },
  7228. { 0x0c3c, 94, "Write Page Scan Period Mode",
  7229. write_page_scan_period_mode_cmd, 1, true,
  7230. status_rsp, 1, true },
  7231. { 0x0c3d, 95, "Read Page Scan Mode",
  7232. null_cmd, 0, true,
  7233. read_page_scan_mode_rsp, 2, true },
  7234. { 0x0c3e, 96, "Write Page Scan Mode",
  7235. write_page_scan_mode_cmd, 1, true,
  7236. status_rsp, 1, true },
  7237. { 0x0c3f, 97, "Set AFH Host Channel Classification",
  7238. set_afh_host_classification_cmd, 10, true,
  7239. status_rsp, 1, true },
  7240. { 0x0c42, 100, "Read Inquiry Scan Type",
  7241. null_cmd, 0, true,
  7242. read_inquiry_scan_type_rsp, 2, true },
  7243. { 0x0c43, 101, "Write Inquiry Scan Type",
  7244. write_inquiry_scan_type_cmd, 1, true,
  7245. status_rsp, 1, true },
  7246. { 0x0c44, 102, "Read Inquiry Mode",
  7247. null_cmd, 0, true,
  7248. read_inquiry_mode_rsp, 2, true },
  7249. { 0x0c45, 103, "Write Inquiry Mode",
  7250. write_inquiry_mode_cmd, 1, true,
  7251. status_rsp, 1, true },
  7252. { 0x0c46, 104, "Read Page Scan Type",
  7253. null_cmd, 0, true,
  7254. read_page_scan_type_rsp, 2, true },
  7255. { 0x0c47, 105, "Write Page Scan Type",
  7256. write_page_scan_type_cmd, 1, true,
  7257. status_rsp, 1, true },
  7258. { 0x0c48, 106, "Read AFH Channel Assessment Mode",
  7259. null_cmd, 0, true,
  7260. read_afh_assessment_mode_rsp, 2, true },
  7261. { 0x0c49, 107, "Write AFH Channel Assessment Mode",
  7262. write_afh_assessment_mode_cmd, 1, true,
  7263. status_rsp, 1, true },
  7264. { 0x0c51, 136, "Read Extended Inquiry Response",
  7265. null_cmd, 0, true,
  7266. read_ext_inquiry_response_rsp, 242, true },
  7267. { 0x0c52, 137, "Write Extended Inquiry Response",
  7268. write_ext_inquiry_response_cmd, 241, true,
  7269. status_rsp, 1, true },
  7270. { 0x0c53, 138, "Refresh Encryption Key",
  7271. refresh_encrypt_key_cmd, 2, true },
  7272. { 0x0c55, 141, "Read Simple Pairing Mode",
  7273. null_cmd, 0, true,
  7274. read_simple_pairing_mode_rsp, 2, true },
  7275. { 0x0c56, 142, "Write Simple Pairing Mode",
  7276. write_simple_pairing_mode_cmd, 1, true,
  7277. status_rsp, 1, true },
  7278. { 0x0c57, 143, "Read Local OOB Data",
  7279. null_cmd, 0, true,
  7280. read_local_oob_data_rsp, 33, true },
  7281. { 0x0c58, 144, "Read Inquiry Response TX Power Level",
  7282. null_cmd, 0, true,
  7283. read_inquiry_resp_tx_power_rsp, 2, true },
  7284. { 0x0c59, 145, "Write Inquiry Transmit Power Level",
  7285. write_inquiry_tx_power_cmd, 1, true,
  7286. status_rsp, 1, true },
  7287. { 0x0c5a, 146, "Read Default Erroneous Data Reporting",
  7288. null_cmd, 0, true,
  7289. read_erroneous_reporting_rsp, 2, true },
  7290. { 0x0c5b, 147, "Write Default Erroneous Data Reporting",
  7291. write_erroneous_reporting_cmd, 1, true,
  7292. status_rsp, 1, true },
  7293. { 0x0c5f, 158, "Enhanced Flush",
  7294. enhanced_flush_cmd, 3, true },
  7295. { 0x0c60, 162, "Send Keypress Notification",
  7296. send_keypress_notify_cmd, 7, true,
  7297. send_keypress_notify_rsp, 7, true },
  7298. { 0x0c61, 176, "Read Logical Link Accept Timeout" },
  7299. { 0x0c62, 177, "Write Logical Link Accept Timeout" },
  7300. { 0x0c63, 178, "Set Event Mask Page 2",
  7301. set_event_mask_page2_cmd, 8, true,
  7302. status_rsp, 1, true },
  7303. { 0x0c64, 179, "Read Location Data",
  7304. null_cmd, 0, true,
  7305. read_location_data_rsp, 6, true },
  7306. { 0x0c65, 180, "Write Location Data",
  7307. write_location_data_cmd, 5, true,
  7308. status_rsp, 1, true },
  7309. { 0x0c66, 184, "Read Flow Control Mode",
  7310. null_cmd, 0, true,
  7311. read_flow_control_mode_rsp, 2, true },
  7312. { 0x0c67, 185, "Write Flow Control Mode",
  7313. write_flow_control_mode_cmd, 1, true,
  7314. status_rsp, 1, true },
  7315. { 0x0c68, 192, "Read Enhanced Transmit Power Level",
  7316. read_enhanced_tx_power_cmd, 3, true,
  7317. read_enhanced_tx_power_rsp, 6, true },
  7318. { 0x0c69, 194, "Read Best Effort Flush Timeout" },
  7319. { 0x0c6a, 195, "Write Best Effort Flush Timeout" },
  7320. { 0x0c6b, 196, "Short Range Mode",
  7321. short_range_mode_cmd, 2, true },
  7322. { 0x0c6c, 197, "Read LE Host Supported",
  7323. null_cmd, 0, true,
  7324. read_le_host_supported_rsp, 3, true },
  7325. { 0x0c6d, 198, "Write LE Host Supported",
  7326. write_le_host_supported_cmd, 2, true,
  7327. status_rsp, 1, true },
  7328. { 0x0c6e, 238, "Set MWS Channel Parameters" },
  7329. { 0x0c6f, 239, "Set External Frame Configuration" },
  7330. { 0x0c70, 240, "Set MWS Signaling" },
  7331. { 0x0c71, 241, "Set MWS Transport Layer" },
  7332. { 0x0c72, 242, "Set MWS Scan Frequency Table" },
  7333. { 0x0c73, 244, "Set MWS Pattern Configuration" },
  7334. { 0x0c74, 252, "Set Reserved LT_ADDR",
  7335. set_reserved_lt_addr_cmd, 1, true,
  7336. set_reserved_lt_addr_rsp, 2, true },
  7337. { 0x0c75, 253, "Delete Reserved LT_ADDR",
  7338. delete_reserved_lt_addr_cmd, 1, true,
  7339. delete_reserved_lt_addr_rsp, 2, true },
  7340. { 0x0c76, 254, "Set Connectionless Peripheral Broadcast Data",
  7341. set_peripheral_broadcast_data_cmd, 3, false,
  7342. set_peripheral_broadcast_data_rsp, 2, true },
  7343. { 0x0c77, 255, "Read Synchronization Train Parameters",
  7344. null_cmd, 0, true,
  7345. read_sync_train_params_rsp, 8, true },
  7346. { 0x0c78, 256, "Write Synchronization Train Parameters",
  7347. write_sync_train_params_cmd, 9, true,
  7348. write_sync_train_params_rsp, 3, true },
  7349. { 0x0c79, 258, "Read Secure Connections Host Support",
  7350. null_cmd, 0, true,
  7351. read_secure_conn_support_rsp, 2, true },
  7352. { 0x0c7a, 259, "Write Secure Connections Host Support",
  7353. write_secure_conn_support_cmd, 1, true,
  7354. status_rsp, 1, true },
  7355. { 0x0c7b, 260, "Read Authenticated Payload Timeout",
  7356. read_auth_payload_timeout_cmd, 2, true,
  7357. read_auth_payload_timeout_rsp, 5, true },
  7358. { 0x0c7c, 261, "Write Authenticated Payload Timeout",
  7359. write_auth_payload_timeout_cmd, 4, true,
  7360. write_auth_payload_timeout_rsp, 3, true },
  7361. { 0x0c7d, 262, "Read Local OOB Extended Data",
  7362. null_cmd, 0, true,
  7363. read_local_oob_ext_data_rsp, 65, true },
  7364. { 0x0c7e, 264, "Read Extended Page Timeout",
  7365. null_cmd, 0, true,
  7366. read_ext_page_timeout_rsp, 3, true },
  7367. { 0x0c7f, 265, "Write Extended Page Timeout",
  7368. write_ext_page_timeout_cmd, 2, true,
  7369. status_rsp, 1, true },
  7370. { 0x0c80, 266, "Read Extended Inquiry Length",
  7371. null_cmd, 0, true,
  7372. read_ext_inquiry_length_rsp, 3, true },
  7373. { 0x0c81, 267, "Write Extended Inquiry Length",
  7374. write_ext_inquiry_length_cmd, 2, true,
  7375. status_rsp, 1, true },
  7376. /* OGF 4 - Information Parameter */
  7377. { 0x1001, 115, "Read Local Version Information",
  7378. null_cmd, 0, true,
  7379. read_local_version_rsp, 9, true },
  7380. { 0x1002, 116, "Read Local Supported Commands",
  7381. null_cmd, 0, true,
  7382. read_local_commands_rsp, 65, true },
  7383. { 0x1003, 117, "Read Local Supported Features",
  7384. null_cmd, 0, true,
  7385. read_local_features_rsp, 9, true },
  7386. { 0x1004, 118, "Read Local Extended Features",
  7387. read_local_ext_features_cmd, 1, true,
  7388. read_local_ext_features_rsp, 11, true },
  7389. { 0x1005, 119, "Read Buffer Size",
  7390. null_cmd, 0, true,
  7391. read_buffer_size_rsp, 8, true },
  7392. { 0x1007, 120, "Read Country Code",
  7393. null_cmd, 0, true,
  7394. read_country_code_rsp, 2, true },
  7395. { 0x1009, 121, "Read BD ADDR",
  7396. null_cmd, 0, true,
  7397. read_bd_addr_rsp, 7, true },
  7398. { 0x100a, 186, "Read Data Block Size",
  7399. null_cmd, 0, true,
  7400. read_data_block_size_rsp, 7, true },
  7401. { 0x100b, 237, "Read Local Supported Codecs",
  7402. null_cmd, 0, true,
  7403. read_local_codecs_rsp, 3, false },
  7404. { 0x100c, 331, "Read Local Simple Pairing Options",
  7405. null_cmd, 0, true,
  7406. read_local_pairing_options_rsp, 3, true },
  7407. { BT_HCI_CMD_READ_LOCAL_CODECS_V2, BT_HCI_BIT_READ_LOCAL_CODECS_V2,
  7408. "Read Local Supported Codecs V2",
  7409. null_cmd, 0, true,
  7410. read_local_codecs_rsp_v2,
  7411. sizeof(struct bt_hci_rsp_read_local_codecs_v2), false
  7412. },
  7413. { BT_HCI_CMD_READ_LOCAL_CODEC_CAPS, BT_HCI_BIT_READ_LOCAL_CODEC_CAPS,
  7414. "Read Local Supported Codec Capabilities",
  7415. read_local_codec_caps_cmd,
  7416. sizeof(struct bt_hci_cmd_read_local_codec_caps), true,
  7417. read_local_codec_caps_rsp,
  7418. sizeof(struct bt_hci_rsp_read_local_codec_caps), false
  7419. },
  7420. { BT_HCI_CMD_READ_LOCAL_CTRL_DELAY, BT_HCI_BIT_READ_LOCAL_CTRL_DELAY,
  7421. "Read Local Supported Controller Delay",
  7422. read_local_ctrl_delay_cmd,
  7423. sizeof(struct bt_hci_cmd_read_local_ctrl_delay), false,
  7424. read_local_ctrl_delay_rsp,
  7425. sizeof(struct bt_hci_rsp_read_local_ctrl_delay), true
  7426. },
  7427. { BT_HCI_CMD_CONFIG_DATA_PATH, BT_HCI_BIT_CONFIG_DATA_PATH,
  7428. "Configure Data Path",
  7429. config_data_path_cmd,
  7430. sizeof(struct bt_hci_cmd_config_data_path), false,
  7431. status_rsp, 1, true
  7432. },
  7433. /* OGF 5 - Status Parameter */
  7434. { 0x1401, 122, "Read Failed Contact Counter",
  7435. read_failed_contact_counter_cmd, 2, true,
  7436. read_failed_contact_counter_rsp, 5, true },
  7437. { 0x1402, 123, "Reset Failed Contact Counter",
  7438. reset_failed_contact_counter_cmd, 2, true,
  7439. reset_failed_contact_counter_rsp, 3, true },
  7440. { 0x1403, 124, "Read Link Quality",
  7441. read_link_quality_cmd, 2, true,
  7442. read_link_quality_rsp, 4, true },
  7443. { 0x1405, 125, "Read RSSI",
  7444. read_rssi_cmd, 2, true,
  7445. read_rssi_rsp, 4, true },
  7446. { 0x1406, 126, "Read AFH Channel Map",
  7447. read_afh_channel_map_cmd, 2, true,
  7448. read_afh_channel_map_rsp, 14, true },
  7449. { 0x1407, 127, "Read Clock",
  7450. read_clock_cmd, 3, true,
  7451. read_clock_rsp, 9, true },
  7452. { 0x1408, 164, "Read Encryption Key Size",
  7453. read_encrypt_key_size_cmd, 2, true,
  7454. read_encrypt_key_size_rsp, 4, true },
  7455. { 0x1409, 181, "Read Local AMP Info",
  7456. null_cmd, 0, true,
  7457. read_local_amp_info_rsp, 31, true },
  7458. { 0x140a, 182, "Read Local AMP ASSOC",
  7459. read_local_amp_assoc_cmd, 5, true,
  7460. read_local_amp_assoc_rsp, 5, false },
  7461. { 0x140b, 183, "Write Remote AMP ASSOC",
  7462. write_remote_amp_assoc_cmd, 6, false,
  7463. write_remote_amp_assoc_rsp, 2, true },
  7464. { 0x140c, 243, "Get MWS Transport Layer Configuration",
  7465. null_cmd, 0, true,
  7466. get_mws_transport_config_rsp, 2, false },
  7467. { 0x140d, 245, "Set Triggered Clock Capture",
  7468. set_triggered_clock_capture_cmd, 6, true,
  7469. status_rsp, 1, true },
  7470. /* OGF 6 - Testing */
  7471. { 0x1801, 128, "Read Loopback Mode",
  7472. null_cmd, 0, true,
  7473. read_loopback_mode_rsp, 2, true },
  7474. { 0x1802, 129, "Write Loopback Mode",
  7475. write_loopback_mode_cmd, 1, true,
  7476. status_rsp, 1, true },
  7477. { 0x1803, 130, "Enable Device Under Test Mode",
  7478. null_cmd, 0, true,
  7479. status_rsp, 1, true },
  7480. { 0x1804, 157, "Write Simple Pairing Debug Mode",
  7481. write_ssp_debug_mode_cmd, 1, true,
  7482. status_rsp, 1, true },
  7483. { 0x1807, 189, "Enable AMP Receiver Reports" },
  7484. { 0x1808, 190, "AMP Test End" },
  7485. { 0x1809, 191, "AMP Test" },
  7486. { 0x180a, 263, "Write Secure Connections Test Mode" },
  7487. /* OGF 8 - LE Control */
  7488. { 0x2001, 200, "LE Set Event Mask",
  7489. le_set_event_mask_cmd, 8, true,
  7490. status_rsp, 1, true },
  7491. { 0x2002, 201, "LE Read Buffer Size",
  7492. null_cmd, 0, true,
  7493. le_read_buffer_size_rsp, 4, true },
  7494. { 0x2003, 202, "LE Read Local Supported Features",
  7495. null_cmd, 0, true,
  7496. le_read_local_features_rsp, 9, true },
  7497. { 0x2005, 204, "LE Set Random Address",
  7498. le_set_random_address_cmd, 6, true,
  7499. status_rsp, 1, true },
  7500. { 0x2006, 205, "LE Set Advertising Parameters",
  7501. le_set_adv_parameters_cmd, 15, true,
  7502. status_rsp, 1, true },
  7503. { 0x2007, 206, "LE Read Advertising Channel TX Power",
  7504. null_cmd, 0, true,
  7505. le_read_adv_tx_power_rsp, 2, true },
  7506. { 0x2008, 207, "LE Set Advertising Data",
  7507. le_set_adv_data_cmd, 32, true,
  7508. status_rsp, 1, true },
  7509. { 0x2009, 208, "LE Set Scan Response Data",
  7510. le_set_scan_rsp_data_cmd, 32, true,
  7511. status_rsp, 1, true },
  7512. { 0x200a, 209, "LE Set Advertise Enable",
  7513. le_set_adv_enable_cmd, 1, true,
  7514. status_rsp, 1, true },
  7515. { 0x200b, 210, "LE Set Scan Parameters",
  7516. le_set_scan_parameters_cmd, 7, true,
  7517. status_rsp, 1, true },
  7518. { 0x200c, 211, "LE Set Scan Enable",
  7519. le_set_scan_enable_cmd, 2, true,
  7520. status_rsp, 1, true },
  7521. { 0x200d, 212, "LE Create Connection",
  7522. le_create_conn_cmd, 25, true },
  7523. { 0x200e, 213, "LE Create Connection Cancel",
  7524. null_cmd, 0, true,
  7525. status_rsp, 1, true },
  7526. { 0x200f, 214, "LE Read Accept List Size",
  7527. null_cmd, 0, true,
  7528. le_read_accept_list_size_rsp, 2, true },
  7529. { 0x2010, 215, "LE Clear Accept List",
  7530. null_cmd, 0, true,
  7531. status_rsp, 1, true },
  7532. { 0x2011, 216, "LE Add Device To Accept List",
  7533. le_add_to_accept_list_cmd, 7, true,
  7534. status_rsp, 1, true },
  7535. { 0x2012, 217, "LE Remove Device From Accept List",
  7536. le_remove_from_accept_list_cmd, 7, true,
  7537. status_rsp, 1, true },
  7538. { 0x2013, 218, "LE Connection Update",
  7539. le_conn_update_cmd, 14, true },
  7540. { 0x2014, 219, "LE Set Host Channel Classification",
  7541. le_set_host_classification_cmd, 5, true,
  7542. status_rsp, 1, true },
  7543. { 0x2015, 220, "LE Read Channel Map",
  7544. le_read_channel_map_cmd, 2, true,
  7545. le_read_channel_map_rsp, 8, true },
  7546. { 0x2016, 221, "LE Read Remote Used Features",
  7547. le_read_remote_features_cmd, 2, true },
  7548. { 0x2017, 222, "LE Encrypt",
  7549. le_encrypt_cmd, 32, true,
  7550. le_encrypt_rsp, 17, true },
  7551. { 0x2018, 223, "LE Rand",
  7552. null_cmd, 0, true,
  7553. le_rand_rsp, 9, true },
  7554. { 0x2019, 224, "LE Start Encryption",
  7555. le_start_encrypt_cmd, 28, true },
  7556. { 0x201a, 225, "LE Long Term Key Request Reply",
  7557. le_ltk_req_reply_cmd, 18, true,
  7558. le_ltk_req_reply_rsp, 3, true },
  7559. { 0x201b, 226, "LE Long Term Key Request Neg Reply",
  7560. le_ltk_req_neg_reply_cmd, 2, true,
  7561. le_ltk_req_neg_reply_rsp, 3, true },
  7562. { 0x201c, 227, "LE Read Supported States",
  7563. null_cmd, 0, true,
  7564. le_read_supported_states_rsp, 9, true },
  7565. { 0x201d, 228, "LE Receiver Test",
  7566. le_receiver_test_cmd, 1, true,
  7567. status_rsp, 1, true },
  7568. { 0x201e, 229, "LE Transmitter Test",
  7569. le_transmitter_test_cmd, 3, true,
  7570. status_rsp, 1, true },
  7571. { 0x201f, 230, "LE Test End",
  7572. null_cmd, 0, true,
  7573. le_test_end_rsp, 3, true },
  7574. { 0x2020, 268, "LE Remote Connection Parameter Request Reply",
  7575. le_conn_param_req_reply_cmd, 14, true,
  7576. le_conn_param_req_reply_rsp, 3, true },
  7577. { 0x2021, 269, "LE Remote Connection Parameter Request Negative Reply",
  7578. le_conn_param_req_neg_reply_cmd, 3, true,
  7579. le_conn_param_req_neg_reply_rsp, 3, true },
  7580. { 0x2022, 270, "LE Set Data Length",
  7581. le_set_data_length_cmd, 6, true,
  7582. le_set_data_length_rsp, 3, true },
  7583. { 0x2023, 271, "LE Read Suggested Default Data Length",
  7584. null_cmd, 0, true,
  7585. le_read_default_data_length_rsp, 5, true },
  7586. { 0x2024, 272, "LE Write Suggested Default Data Length",
  7587. le_write_default_data_length_cmd, 4, true,
  7588. status_rsp, 1, true },
  7589. { 0x2025, 273, "LE Read Local P-256 Public Key",
  7590. null_cmd, 0, true },
  7591. { 0x2026, 274, "LE Generate DHKey",
  7592. le_generate_dhkey_cmd, 64, true },
  7593. { 0x2027, 275, "LE Add Device To Resolving List",
  7594. le_add_to_resolv_list_cmd, 39, true,
  7595. status_rsp, 1, true },
  7596. { 0x2028, 276, "LE Remove Device From Resolving List",
  7597. le_remove_from_resolv_list_cmd, 7, true,
  7598. status_rsp, 1, true },
  7599. { 0x2029, 277, "LE Clear Resolving List",
  7600. null_cmd, 0, true,
  7601. status_rsp, 1, true },
  7602. { 0x202a, 278, "LE Read Resolving List Size",
  7603. null_cmd, 0, true,
  7604. le_read_resolv_list_size_rsp, 2, true },
  7605. { 0x202b, 279, "LE Read Peer Resolvable Address",
  7606. le_read_peer_resolv_addr_cmd, 7, true,
  7607. le_read_peer_resolv_addr_rsp, 7, true },
  7608. { 0x202c, 280, "LE Read Local Resolvable Address",
  7609. le_read_local_resolv_addr_cmd, 7, true,
  7610. le_read_local_resolv_addr_rsp, 7, true },
  7611. { 0x202d, 281, "LE Set Address Resolution Enable",
  7612. le_set_resolv_enable_cmd, 1, true,
  7613. status_rsp, 1, true },
  7614. { 0x202e, 282, "LE Set Resolvable Private Address Timeout",
  7615. le_set_resolv_timeout_cmd, 2, true,
  7616. status_rsp, 1, true },
  7617. { 0x202f, 283, "LE Read Maximum Data Length",
  7618. null_cmd, 0, true,
  7619. le_read_max_data_length_rsp, 9, true },
  7620. { 0x2030, 284, "LE Read PHY",
  7621. le_read_phy_cmd, 2, true,
  7622. le_read_phy_rsp, 5, true},
  7623. { 0x2031, 285, "LE Set Default PHY",
  7624. le_set_default_phy_cmd, 3, true,
  7625. status_rsp, 1, true },
  7626. { 0x2032, 286, "LE Set PHY",
  7627. le_set_phy_cmd, 7, true},
  7628. { 0x2033, 287, "LE Enhanced Receiver Test",
  7629. le_enhanced_receiver_test_cmd, 3, true,
  7630. status_rsp, 1, true },
  7631. { 0x2034, 288, "LE Enhanced Transmitter Test",
  7632. le_enhanced_transmitter_test_cmd, 4, true,
  7633. status_rsp, 1, true },
  7634. { 0x2035, 289, "LE Set Advertising Set Random Address",
  7635. le_set_adv_set_rand_addr, 7, true,
  7636. status_rsp, 1, true },
  7637. { 0x2036, 290, "LE Set Extended Advertising Parameters",
  7638. le_set_ext_adv_params_cmd, 25, true,
  7639. le_set_ext_adv_params_rsp, 2, true },
  7640. { 0x2037, 291, "LE Set Extended Advertising Data",
  7641. le_set_ext_adv_data_cmd, 4, false,
  7642. status_rsp, 1, true },
  7643. { 0x2038, 292, "LE Set Extended Scan Response Data",
  7644. le_set_ext_scan_rsp_data_cmd, 4, false,
  7645. status_rsp, 1, true },
  7646. { 0x2039, 293, "LE Set Extended Advertising Enable",
  7647. le_set_ext_adv_enable_cmd, 2, false,
  7648. status_rsp, 1, true },
  7649. { 0x203a, 294, "LE Read Maximum Advertising Data Length",
  7650. null_cmd, 0, true,
  7651. le_read_max_adv_data_len_rsp, 3, true },
  7652. { 0x203b, 295, "LE Read Number of Supported Advertising Sets",
  7653. null_cmd, 0, true,
  7654. le_read_num_supported_adv_sets_rsp, 2, true },
  7655. { 0x203c, 296, "LE Remove Advertising Set",
  7656. le_remove_adv_set_cmd, 1, true,
  7657. status_rsp, 1, true },
  7658. { 0x203d, 297, "LE Clear Advertising Sets",
  7659. null_cmd, 0, true,
  7660. status_rsp, 1, true },
  7661. { 0x203e, 298, "LE Set Periodic Advertising Parameters",
  7662. le_set_periodic_adv_params_cmd, 7, true,
  7663. status_rsp, 1, true },
  7664. { 0x203f, 299, "LE Set Periodic Advertising Data",
  7665. le_set_periodic_adv_data_cmd, 3, false,
  7666. status_rsp, 1, true },
  7667. { 0x2040, 300, "LE Set Periodic Advertising Enable",
  7668. le_set_periodic_adv_enable_cmd, 2, true,
  7669. status_rsp, 1, true },
  7670. { 0x2041, 301, "LE Set Extended Scan Parameters",
  7671. le_set_ext_scan_params_cmd, 3, false,
  7672. status_rsp, 1, true },
  7673. { 0x2042, 302, "LE Set Extended Scan Enable",
  7674. le_set_ext_scan_enable_cmd, 6, true,
  7675. status_rsp, 1, true },
  7676. { 0x2043, 303, "LE Extended Create Connection",
  7677. le_ext_create_conn_cmd, 10, false,
  7678. status_rsp, 1, true },
  7679. { 0x2044, 304, "LE Periodic Advertising Create Sync",
  7680. le_periodic_adv_create_sync_cmd, 14, true,
  7681. status_rsp, 1, true },
  7682. { 0x2045, 305, "LE Periodic Advertising Create Sync Cancel",
  7683. null_cmd, 0, true,
  7684. status_rsp, 1, true },
  7685. { 0x2046, 306, "LE Periodic Advertising Terminate Sync",
  7686. le_periodic_adv_term_sync_cmd, 2, true,
  7687. status_rsp, 1, true },
  7688. { 0x2047, 307, "LE Add Device To Periodic Advertiser List",
  7689. le_add_dev_periodic_adv_list_cmd, 8, true,
  7690. status_rsp, 1, true },
  7691. { 0x2048, 308, "LE Remove Device From Periodic Advertiser List",
  7692. le_remove_dev_periodic_adv_list_cmd, 8, true,
  7693. status_rsp, 1, true },
  7694. { 0x2049, 309, "LE Clear Periodic Advertiser List",
  7695. null_cmd, 0, true,
  7696. status_rsp, 1, true },
  7697. { 0x204a, 310, "LE Read Periodic Advertiser List Size",
  7698. null_cmd, 0, true,
  7699. le_read_periodic_adv_list_size_rsp, 2, true },
  7700. { 0x204b, 311, "LE Read Transmit Power",
  7701. null_cmd, 0, true,
  7702. le_read_tx_power_rsp, 3, true },
  7703. { 0x204c, 312, "LE Read RF Path Compensation",
  7704. null_cmd, 0, true,
  7705. le_read_rf_path_comp_rsp, 5, true },
  7706. { 0x204d, 313, "LE Write RF Path Compensation",
  7707. le_write_rf_path_comp_cmd, 4, true,
  7708. status_rsp, 1, true },
  7709. { 0x204e, 314, "LE Set Privacy Mode",
  7710. le_set_priv_mode_cmd, 8, true,
  7711. status_rsp, 1, true },
  7712. { 0x204f, 315, "LE Receiver Test command [v3]",
  7713. le_receiver_test_cmd_v3, 7, false,
  7714. status_rsp, 1, true },
  7715. { 0x2050, 316, "LE Transmitter Test command [v3]",
  7716. le_tx_test_cmd_v3, 9, false,
  7717. status_rsp, 1, true },
  7718. { 0x2059, 325, "LE Periodic Advertising Receive Enable",
  7719. le_periodic_adv_rec_enable, 3, true,
  7720. status_rsp, 1, true },
  7721. { 0x205a, 326, "LE Periodic Advertising Sync Transfer",
  7722. le_periodic_adv_sync_trans, 6, true,
  7723. status_handle_rsp, 3, true },
  7724. { 0x205b, 327, "LE Periodic Advertising Set Info Transfer",
  7725. le_periodic_adv_set_info_trans, 5, true,
  7726. status_handle_rsp, 3, true },
  7727. { 0x205c, 328, "LE Periodic Advertising Sync Transfer Parameters",
  7728. le_periodic_adv_sync_trans_params, 8, true,
  7729. status_handle_rsp, 3, true},
  7730. { 0x205d, 329, "LE Set Default Periodic Advertisng Sync Transfer "
  7731. "Parameters",
  7732. le_set_default_periodic_adv_sync_trans_params,
  7733. 6, true, status_rsp, 1, true},
  7734. { BT_HCI_CMD_LE_READ_BUFFER_SIZE_V2,
  7735. BT_HCI_BIT_LE_READ_BUFFER_SIZE_V2,
  7736. "LE Read Buffer v2",
  7737. null_cmd, 0, true,
  7738. le_read_buffer_size_v2_rsp,
  7739. sizeof(
  7740. struct bt_hci_rsp_le_read_buffer_size_v2),
  7741. true },
  7742. { BT_HCI_CMD_LE_READ_ISO_TX_SYNC,
  7743. BT_HCI_BIT_LE_READ_ISO_TX_SYNC,
  7744. "LE Read ISO TX Sync",
  7745. le_read_iso_tx_sync_cmd,
  7746. sizeof(struct bt_hci_cmd_le_read_iso_tx_sync),
  7747. true,
  7748. le_read_iso_tx_sync_rsp,
  7749. sizeof(struct bt_hci_rsp_le_read_iso_tx_sync),
  7750. true },
  7751. { BT_HCI_CMD_LE_SET_CIG_PARAMS, BT_HCI_BIT_LE_SET_CIG_PARAMS,
  7752. "LE Set Connected Isochronous Group Parameters",
  7753. le_set_cig_params_cmd,
  7754. sizeof(struct bt_hci_cmd_le_set_cig_params),
  7755. false,
  7756. le_set_cig_params_rsp,
  7757. sizeof(struct bt_hci_rsp_le_set_cig_params),
  7758. false },
  7759. { BT_HCI_CMD_LE_SET_CIG_PARAMS_TEST, BT_HCI_BIT_LE_SET_CIG_PARAMS_TEST,
  7760. "LE Set Connected Isochronous Group Parameters"
  7761. " Test", le_set_cig_params_test_cmd,
  7762. sizeof(
  7763. struct bt_hci_cmd_le_set_cig_params_test),
  7764. false,
  7765. le_set_cig_params_rsp,
  7766. sizeof(struct bt_hci_rsp_le_set_cig_params),
  7767. false },
  7768. { BT_HCI_CMD_LE_CREATE_CIS, BT_HCI_BIT_LE_CREATE_CIS,
  7769. "LE Create Connected Isochronous Stream",
  7770. le_create_cis_cmd,
  7771. sizeof(struct bt_hci_cmd_le_create_cis),
  7772. false },
  7773. { BT_HCI_CMD_LE_REMOVE_CIG, BT_HCI_BIT_LE_REMOVE_CIG,
  7774. "LE Remove Connected Isochronous Group",
  7775. le_remove_cig_cmd,
  7776. sizeof(struct bt_hci_cmd_le_remove_cig), false,
  7777. le_remove_cig_rsp,
  7778. sizeof(struct bt_hci_rsp_le_remove_cig),
  7779. false },
  7780. { BT_HCI_CMD_LE_ACCEPT_CIS, BT_HCI_BIT_LE_ACCEPT_CIS,
  7781. "LE Accept Connected Isochronous Stream Request",
  7782. le_accept_cis_req_cmd,
  7783. sizeof(struct bt_hci_cmd_le_accept_cis), true },
  7784. { BT_HCI_CMD_LE_REJECT_CIS, BT_HCI_BIT_LE_REJECT_CIS,
  7785. "LE Reject Connected Isochronous Stream Request",
  7786. le_reject_cis_req_cmd,
  7787. sizeof(struct bt_hci_cmd_le_reject_cis), true,
  7788. status_rsp, 1, true },
  7789. { BT_HCI_CMD_LE_CREATE_BIG, BT_HCI_BIT_LE_CREATE_BIG,
  7790. "LE Create Broadcast Isochronous Group",
  7791. le_create_big_cmd },
  7792. { BT_HCI_CMD_LE_CREATE_BIG_TEST, BT_HCI_BIT_LE_CREATE_BIG_TEST,
  7793. "LE Create Broadcast Isochronous Group Test",
  7794. le_create_big_cmd_test_cmd },
  7795. { BT_HCI_CMD_LE_TERM_BIG, BT_HCI_BIT_LE_TERM_BIG,
  7796. "LE Terminate Broadcast Isochronous Group",
  7797. le_terminate_big_cmd,
  7798. sizeof(struct bt_hci_cmd_le_term_big), true,
  7799. status_rsp, 1, true},
  7800. { BT_HCI_CMD_LE_BIG_CREATE_SYNC, BT_HCI_BIT_LE_BIG_CREATE_SYNC,
  7801. "LE Broadcast Isochronous Group Create Sync",
  7802. le_big_create_sync_cmd,
  7803. sizeof(struct bt_hci_cmd_le_big_create_sync),
  7804. false },
  7805. { BT_HCI_CMD_LE_BIG_TERM_SYNC, BT_HCI_BIT_LE_BIG_TERM_SYNC,
  7806. "LE Broadcast Isochronous Group Terminate Sync",
  7807. le_big_term_sync_cmd,
  7808. sizeof(struct bt_hci_cmd_le_big_term_sync),
  7809. true },
  7810. { BT_HCI_CMD_LE_REQ_PEER_SCA, BT_HCI_BIT_LE_REQ_PEER_SCA,
  7811. "LE Request Peer SCA", le_req_peer_sca_cmd,
  7812. sizeof(struct bt_hci_cmd_le_req_peer_sca),
  7813. true },
  7814. { BT_HCI_CMD_LE_SETUP_ISO_PATH, BT_HCI_BIT_LE_SETUP_ISO_PATH,
  7815. "LE Setup Isochronous Data Path",
  7816. le_setup_iso_path_cmd,
  7817. sizeof(struct bt_hci_cmd_le_setup_iso_path),
  7818. true, le_setup_iso_path_rsp,
  7819. sizeof(struct bt_hci_rsp_le_setup_iso_path),
  7820. true },
  7821. { BT_HCI_CMD_LE_REMOVE_ISO_PATH, BT_HCI_BIT_LE_REMOVE_ISO_PATH,
  7822. "LE Remove Isochronous Data Path",
  7823. le_remove_iso_path_cmd,
  7824. sizeof(struct bt_hci_cmd_le_remove_iso_path),
  7825. true, status_rsp, 1, true },
  7826. { BT_HCI_CMD_LE_ISO_TX_TEST, BT_HCI_BIT_LE_ISO_TX_TEST,
  7827. "LE Isochronous Transmit Test", NULL, 0,
  7828. false },
  7829. { BT_HCI_CMD_LE_ISO_RX_TEST, BT_HCI_BIT_LE_ISO_RX_TEST,
  7830. "LE Isochronous Receive Test", NULL, 0,
  7831. false },
  7832. { BT_HCI_CMD_LE_ISO_READ_TEST_COUNTER,
  7833. BT_HCI_BIT_LE_ISO_READ_TEST_COUNTER,
  7834. "LE Isochronous Read Test Counters", NULL, 0,
  7835. false },
  7836. { BT_HCI_CMD_LE_ISO_TEST_END, BT_HCI_BIT_LE_ISO_TEST_END,
  7837. "LE Isochronous Read Test Counters", NULL, 0,
  7838. false },
  7839. { BT_HCI_CMD_LE_SET_HOST_FEATURE, BT_HCI_BIT_LE_SET_HOST_FEATURE,
  7840. "LE Set Host Feature", le_set_host_feature_cmd,
  7841. sizeof(struct bt_hci_cmd_le_set_host_feature),
  7842. true, status_rsp, 1, true },
  7843. { }
  7844. };
  7845. static const char *get_supported_command(int bit)
  7846. {
  7847. int i;
  7848. for (i = 0; opcode_table[i].str; i++) {
  7849. if (opcode_table[i].bit == bit)
  7850. return opcode_table[i].str;
  7851. }
  7852. return NULL;
  7853. }
  7854. static const char *current_vendor_str(void)
  7855. {
  7856. uint16_t manufacturer, msft_opcode;
  7857. if (index_current < MAX_INDEX) {
  7858. manufacturer = index_list[index_current].manufacturer;
  7859. msft_opcode = index_list[index_current].msft_opcode;
  7860. } else {
  7861. manufacturer = fallback_manufacturer;
  7862. msft_opcode = BT_HCI_CMD_NOP;
  7863. }
  7864. if (msft_opcode != BT_HCI_CMD_NOP)
  7865. return "Microsoft";
  7866. switch (manufacturer) {
  7867. case 2:
  7868. return "Intel";
  7869. case 15:
  7870. return "Broadcom";
  7871. case 93:
  7872. return "Realtek";
  7873. }
  7874. return NULL;
  7875. }
  7876. static const struct vendor_ocf *current_vendor_ocf(uint16_t ocf)
  7877. {
  7878. uint16_t manufacturer, msft_opcode;
  7879. if (index_current < MAX_INDEX) {
  7880. manufacturer = index_list[index_current].manufacturer;
  7881. msft_opcode = index_list[index_current].msft_opcode;
  7882. } else {
  7883. manufacturer = fallback_manufacturer;
  7884. msft_opcode = BT_HCI_CMD_NOP;
  7885. }
  7886. if (msft_opcode != BT_HCI_CMD_NOP &&
  7887. cmd_opcode_ocf(msft_opcode) == ocf)
  7888. return msft_vendor_ocf();
  7889. switch (manufacturer) {
  7890. case 2:
  7891. return intel_vendor_ocf(ocf);
  7892. case 15:
  7893. return broadcom_vendor_ocf(ocf);
  7894. }
  7895. return NULL;
  7896. }
  7897. static const struct vendor_evt *current_vendor_evt(const void *data,
  7898. int *consumed_size)
  7899. {
  7900. uint16_t manufacturer, msft_opcode;
  7901. uint8_t evt = *((const uint8_t *) data);
  7902. /* A regular vendor event consumes 1 byte. */
  7903. *consumed_size = 1;
  7904. if (index_current < MAX_INDEX) {
  7905. manufacturer = index_list[index_current].manufacturer;
  7906. msft_opcode = index_list[index_current].msft_opcode;
  7907. } else {
  7908. manufacturer = fallback_manufacturer;
  7909. msft_opcode = BT_HCI_CMD_NOP;
  7910. }
  7911. if (msft_opcode != BT_HCI_CMD_NOP)
  7912. return NULL;
  7913. switch (manufacturer) {
  7914. case 2:
  7915. return intel_vendor_evt(data, consumed_size);
  7916. case 15:
  7917. return broadcom_vendor_evt(evt);
  7918. }
  7919. return NULL;
  7920. }
  7921. static void inquiry_complete_evt(const void *data, uint8_t size)
  7922. {
  7923. const struct bt_hci_evt_inquiry_complete *evt = data;
  7924. print_status(evt->status);
  7925. }
  7926. static void inquiry_result_evt(const void *data, uint8_t size)
  7927. {
  7928. const struct bt_hci_evt_inquiry_result *evt = data;
  7929. print_num_resp(evt->num_resp);
  7930. print_bdaddr(evt->bdaddr);
  7931. print_pscan_rep_mode(evt->pscan_rep_mode);
  7932. print_pscan_period_mode(evt->pscan_period_mode);
  7933. print_pscan_mode(evt->pscan_mode);
  7934. print_dev_class(evt->dev_class);
  7935. print_clock_offset(evt->clock_offset);
  7936. if (size > sizeof(*evt))
  7937. packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));
  7938. }
  7939. static void conn_complete_evt(const void *data, uint8_t size)
  7940. {
  7941. const struct bt_hci_evt_conn_complete *evt = data;
  7942. print_status(evt->status);
  7943. print_handle(evt->handle);
  7944. print_bdaddr(evt->bdaddr);
  7945. print_link_type(evt->link_type);
  7946. print_enable("Encryption", evt->encr_mode);
  7947. if (evt->status == 0x00)
  7948. assign_handle(le16_to_cpu(evt->handle), 0x00);
  7949. }
  7950. static void conn_request_evt(const void *data, uint8_t size)
  7951. {
  7952. const struct bt_hci_evt_conn_request *evt = data;
  7953. print_bdaddr(evt->bdaddr);
  7954. print_dev_class(evt->dev_class);
  7955. print_link_type(evt->link_type);
  7956. }
  7957. static void disconnect_complete_evt(const void *data, uint8_t size)
  7958. {
  7959. const struct bt_hci_evt_disconnect_complete *evt = data;
  7960. print_status(evt->status);
  7961. print_handle(evt->handle);
  7962. print_reason(evt->reason);
  7963. if (evt->status == 0x00)
  7964. release_handle(le16_to_cpu(evt->handle));
  7965. }
  7966. static void auth_complete_evt(const void *data, uint8_t size)
  7967. {
  7968. const struct bt_hci_evt_auth_complete *evt = data;
  7969. print_status(evt->status);
  7970. print_handle(evt->handle);
  7971. }
  7972. static void remote_name_request_complete_evt(const void *data, uint8_t size)
  7973. {
  7974. const struct bt_hci_evt_remote_name_request_complete *evt = data;
  7975. print_status(evt->status);
  7976. print_bdaddr(evt->bdaddr);
  7977. print_name(evt->name);
  7978. }
  7979. static void encrypt_change_evt(const void *data, uint8_t size)
  7980. {
  7981. const struct bt_hci_evt_encrypt_change *evt = data;
  7982. print_status(evt->status);
  7983. print_handle(evt->handle);
  7984. print_encr_mode_change(evt->encr_mode, evt->handle);
  7985. }
  7986. static void change_conn_link_key_complete_evt(const void *data, uint8_t size)
  7987. {
  7988. const struct bt_hci_evt_change_conn_link_key_complete *evt = data;
  7989. print_status(evt->status);
  7990. print_handle(evt->handle);
  7991. }
  7992. static void link_key_type_changed_evt(const void *data, uint8_t size)
  7993. {
  7994. const struct bt_hci_evt_link_key_type_changed *evt = data;
  7995. print_status(evt->status);
  7996. print_handle(evt->handle);
  7997. print_key_flag(evt->key_flag);
  7998. }
  7999. static void remote_features_complete_evt(const void *data, uint8_t size)
  8000. {
  8001. const struct bt_hci_evt_remote_features_complete *evt = data;
  8002. print_status(evt->status);
  8003. print_handle(evt->handle);
  8004. print_features(0, evt->features, 0x00);
  8005. }
  8006. static void remote_version_complete_evt(const void *data, uint8_t size)
  8007. {
  8008. const struct bt_hci_evt_remote_version_complete *evt = data;
  8009. print_status(evt->status);
  8010. print_handle(evt->handle);
  8011. print_lmp_version(evt->lmp_ver, evt->lmp_subver);
  8012. print_manufacturer(evt->manufacturer);
  8013. switch (le16_to_cpu(evt->manufacturer)) {
  8014. case 15:
  8015. print_manufacturer_broadcom(evt->lmp_subver, 0xffff);
  8016. break;
  8017. }
  8018. }
  8019. static void qos_setup_complete_evt(const void *data, uint8_t size)
  8020. {
  8021. const struct bt_hci_evt_qos_setup_complete *evt = data;
  8022. print_status(evt->status);
  8023. print_handle(evt->handle);
  8024. print_field("Flags: 0x%2.2x", evt->flags);
  8025. print_service_type(evt->service_type);
  8026. print_field("Token rate: %d", le32_to_cpu(evt->token_rate));
  8027. print_field("Peak bandwidth: %d", le32_to_cpu(evt->peak_bandwidth));
  8028. print_field("Latency: %d", le32_to_cpu(evt->latency));
  8029. print_field("Delay variation: %d", le32_to_cpu(evt->delay_variation));
  8030. }
  8031. static void cmd_complete_evt(const void *data, uint8_t size)
  8032. {
  8033. const struct bt_hci_evt_cmd_complete *evt = data;
  8034. uint16_t opcode = le16_to_cpu(evt->opcode);
  8035. uint16_t ogf = cmd_opcode_ogf(opcode);
  8036. uint16_t ocf = cmd_opcode_ocf(opcode);
  8037. struct opcode_data vendor_data;
  8038. const struct opcode_data *opcode_data = NULL;
  8039. const char *opcode_color, *opcode_str;
  8040. char vendor_str[150];
  8041. int i;
  8042. for (i = 0; opcode_table[i].str; i++) {
  8043. if (opcode_table[i].opcode == opcode) {
  8044. opcode_data = &opcode_table[i];
  8045. break;
  8046. }
  8047. }
  8048. if (opcode_data) {
  8049. if (opcode_data->rsp_func)
  8050. opcode_color = COLOR_HCI_COMMAND;
  8051. else
  8052. opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
  8053. opcode_str = opcode_data->str;
  8054. } else {
  8055. if (ogf == 0x3f) {
  8056. const struct vendor_ocf *vnd = current_vendor_ocf(ocf);
  8057. if (vnd) {
  8058. const char *str = current_vendor_str();
  8059. if (str) {
  8060. snprintf(vendor_str, sizeof(vendor_str),
  8061. "%s %s", str, vnd->str);
  8062. vendor_data.str = vendor_str;
  8063. } else
  8064. vendor_data.str = vnd->str;
  8065. vendor_data.rsp_func = vnd->rsp_func;
  8066. vendor_data.rsp_size = vnd->rsp_size;
  8067. vendor_data.rsp_fixed = vnd->rsp_fixed;
  8068. opcode_data = &vendor_data;
  8069. if (opcode_data->rsp_func)
  8070. opcode_color = COLOR_HCI_COMMAND;
  8071. else
  8072. opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
  8073. opcode_str = opcode_data->str;
  8074. } else {
  8075. opcode_color = COLOR_HCI_COMMAND;
  8076. opcode_str = "Vendor";
  8077. }
  8078. } else {
  8079. opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
  8080. opcode_str = "Unknown";
  8081. }
  8082. }
  8083. print_indent(6, opcode_color, "", opcode_str, COLOR_OFF,
  8084. " (0x%2.2x|0x%4.4x) ncmd %d", ogf, ocf, evt->ncmd);
  8085. if (!opcode_data || !opcode_data->rsp_func) {
  8086. if (size > 3) {
  8087. uint8_t status = *((uint8_t *) (data + 3));
  8088. print_status(status);
  8089. packet_hexdump(data + 4, size - 4);
  8090. }
  8091. return;
  8092. }
  8093. if (opcode_data->rsp_size > 1 && size - 3 == 1) {
  8094. uint8_t status = *((uint8_t *) (data + 3));
  8095. print_status(status);
  8096. return;
  8097. }
  8098. if (opcode_data->rsp_fixed) {
  8099. if (size - 3 != opcode_data->rsp_size) {
  8100. print_text(COLOR_ERROR, "invalid packet size");
  8101. packet_hexdump(data + 3, size - 3);
  8102. return;
  8103. }
  8104. } else {
  8105. if (size - 3 < opcode_data->rsp_size) {
  8106. print_text(COLOR_ERROR, "too short packet");
  8107. packet_hexdump(data + 3, size - 3);
  8108. return;
  8109. }
  8110. }
  8111. opcode_data->rsp_func(data + 3, size - 3);
  8112. }
  8113. static void cmd_status_evt(const void *data, uint8_t size)
  8114. {
  8115. const struct bt_hci_evt_cmd_status *evt = data;
  8116. uint16_t opcode = le16_to_cpu(evt->opcode);
  8117. uint16_t ogf = cmd_opcode_ogf(opcode);
  8118. uint16_t ocf = cmd_opcode_ocf(opcode);
  8119. const struct opcode_data *opcode_data = NULL;
  8120. const char *opcode_color, *opcode_str;
  8121. char vendor_str[150];
  8122. int i;
  8123. for (i = 0; opcode_table[i].str; i++) {
  8124. if (opcode_table[i].opcode == opcode) {
  8125. opcode_data = &opcode_table[i];
  8126. break;
  8127. }
  8128. }
  8129. if (opcode_data) {
  8130. opcode_color = COLOR_HCI_COMMAND;
  8131. opcode_str = opcode_data->str;
  8132. } else {
  8133. if (ogf == 0x3f) {
  8134. const struct vendor_ocf *vnd = current_vendor_ocf(ocf);
  8135. if (vnd) {
  8136. const char *str = current_vendor_str();
  8137. if (str) {
  8138. snprintf(vendor_str, sizeof(vendor_str),
  8139. "%s %s", str, vnd->str);
  8140. opcode_str = vendor_str;
  8141. } else
  8142. opcode_str = vnd->str;
  8143. opcode_color = COLOR_HCI_COMMAND;
  8144. } else {
  8145. opcode_color = COLOR_HCI_COMMAND;
  8146. opcode_str = "Vendor";
  8147. }
  8148. } else {
  8149. opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
  8150. opcode_str = "Unknown";
  8151. }
  8152. }
  8153. print_indent(6, opcode_color, "", opcode_str, COLOR_OFF,
  8154. " (0x%2.2x|0x%4.4x) ncmd %d", ogf, ocf, evt->ncmd);
  8155. print_status(evt->status);
  8156. }
  8157. static void hardware_error_evt(const void *data, uint8_t size)
  8158. {
  8159. const struct bt_hci_evt_hardware_error *evt = data;
  8160. print_field("Code: 0x%2.2x", evt->code);
  8161. }
  8162. static void flush_occurred_evt(const void *data, uint8_t size)
  8163. {
  8164. const struct bt_hci_evt_flush_occurred *evt = data;
  8165. print_handle(evt->handle);
  8166. }
  8167. static void role_change_evt(const void *data, uint8_t size)
  8168. {
  8169. const struct bt_hci_evt_role_change *evt = data;
  8170. print_status(evt->status);
  8171. print_bdaddr(evt->bdaddr);
  8172. print_role(evt->role);
  8173. }
  8174. static void num_completed_packets_evt(const void *data, uint8_t size)
  8175. {
  8176. const struct bt_hci_evt_num_completed_packets *evt = data;
  8177. print_field("Num handles: %d", evt->num_handles);
  8178. print_handle(evt->handle);
  8179. print_field("Count: %d", le16_to_cpu(evt->count));
  8180. if (size > sizeof(*evt))
  8181. packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));
  8182. }
  8183. static void mode_change_evt(const void *data, uint8_t size)
  8184. {
  8185. const struct bt_hci_evt_mode_change *evt = data;
  8186. print_status(evt->status);
  8187. print_handle(evt->handle);
  8188. print_mode(evt->mode);
  8189. print_interval(evt->interval);
  8190. }
  8191. static void return_link_keys_evt(const void *data, uint8_t size)
  8192. {
  8193. const struct bt_hci_evt_return_link_keys *evt = data;
  8194. uint8_t i;
  8195. print_field("Num keys: %d", evt->num_keys);
  8196. for (i = 0; i < evt->num_keys; i++) {
  8197. print_bdaddr(evt->keys + (i * 22));
  8198. print_link_key(evt->keys + (i * 22) + 6);
  8199. }
  8200. }
  8201. static void pin_code_request_evt(const void *data, uint8_t size)
  8202. {
  8203. const struct bt_hci_evt_pin_code_request *evt = data;
  8204. print_bdaddr(evt->bdaddr);
  8205. }
  8206. static void link_key_request_evt(const void *data, uint8_t size)
  8207. {
  8208. const struct bt_hci_evt_link_key_request *evt = data;
  8209. print_bdaddr(evt->bdaddr);
  8210. }
  8211. static void link_key_notify_evt(const void *data, uint8_t size)
  8212. {
  8213. const struct bt_hci_evt_link_key_notify *evt = data;
  8214. print_bdaddr(evt->bdaddr);
  8215. print_link_key(evt->link_key);
  8216. print_key_type(evt->key_type);
  8217. }
  8218. static void loopback_command_evt(const void *data, uint8_t size)
  8219. {
  8220. packet_hexdump(data, size);
  8221. }
  8222. static void data_buffer_overflow_evt(const void *data, uint8_t size)
  8223. {
  8224. const struct bt_hci_evt_data_buffer_overflow *evt = data;
  8225. print_link_type(evt->link_type);
  8226. }
  8227. static void max_slots_change_evt(const void *data, uint8_t size)
  8228. {
  8229. const struct bt_hci_evt_max_slots_change *evt = data;
  8230. print_handle(evt->handle);
  8231. print_field("Max slots: %d", evt->max_slots);
  8232. }
  8233. static void clock_offset_complete_evt(const void *data, uint8_t size)
  8234. {
  8235. const struct bt_hci_evt_clock_offset_complete *evt = data;
  8236. print_status(evt->status);
  8237. print_handle(evt->handle);
  8238. print_clock_offset(evt->clock_offset);
  8239. }
  8240. static void conn_pkt_type_changed_evt(const void *data, uint8_t size)
  8241. {
  8242. const struct bt_hci_evt_conn_pkt_type_changed *evt = data;
  8243. print_status(evt->status);
  8244. print_handle(evt->handle);
  8245. print_pkt_type(evt->pkt_type);
  8246. }
  8247. static void qos_violation_evt(const void *data, uint8_t size)
  8248. {
  8249. const struct bt_hci_evt_qos_violation *evt = data;
  8250. print_handle(evt->handle);
  8251. }
  8252. static void pscan_mode_change_evt(const void *data, uint8_t size)
  8253. {
  8254. const struct bt_hci_evt_pscan_mode_change *evt = data;
  8255. print_bdaddr(evt->bdaddr);
  8256. print_pscan_mode(evt->pscan_mode);
  8257. }
  8258. static void pscan_rep_mode_change_evt(const void *data, uint8_t size)
  8259. {
  8260. const struct bt_hci_evt_pscan_rep_mode_change *evt = data;
  8261. print_bdaddr(evt->bdaddr);
  8262. print_pscan_rep_mode(evt->pscan_rep_mode);
  8263. }
  8264. static void flow_spec_complete_evt(const void *data, uint8_t size)
  8265. {
  8266. const struct bt_hci_evt_flow_spec_complete *evt = data;
  8267. print_status(evt->status);
  8268. print_handle(evt->handle);
  8269. print_field("Flags: 0x%2.2x", evt->flags);
  8270. print_flow_direction(evt->direction);
  8271. print_service_type(evt->service_type);
  8272. print_field("Token rate: %d", le32_to_cpu(evt->token_rate));
  8273. print_field("Token bucket size: %d",
  8274. le32_to_cpu(evt->token_bucket_size));
  8275. print_field("Peak bandwidth: %d", le32_to_cpu(evt->peak_bandwidth));
  8276. print_field("Access latency: %d", le32_to_cpu(evt->access_latency));
  8277. }
  8278. static void inquiry_result_with_rssi_evt(const void *data, uint8_t size)
  8279. {
  8280. const struct bt_hci_evt_inquiry_result_with_rssi *evt = data;
  8281. print_num_resp(evt->num_resp);
  8282. print_bdaddr(evt->bdaddr);
  8283. print_pscan_rep_mode(evt->pscan_rep_mode);
  8284. print_pscan_period_mode(evt->pscan_period_mode);
  8285. print_dev_class(evt->dev_class);
  8286. print_clock_offset(evt->clock_offset);
  8287. print_rssi(evt->rssi);
  8288. if (size > sizeof(*evt))
  8289. packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));
  8290. }
  8291. static void remote_ext_features_complete_evt(const void *data, uint8_t size)
  8292. {
  8293. const struct bt_hci_evt_remote_ext_features_complete *evt = data;
  8294. print_status(evt->status);
  8295. print_handle(evt->handle);
  8296. print_field("Page: %d/%d", evt->page, evt->max_page);
  8297. print_features(evt->page, evt->features, 0x00);
  8298. }
  8299. static void sync_conn_complete_evt(const void *data, uint8_t size)
  8300. {
  8301. const struct bt_hci_evt_sync_conn_complete *evt = data;
  8302. print_status(evt->status);
  8303. print_handle(evt->handle);
  8304. print_bdaddr(evt->bdaddr);
  8305. print_link_type(evt->link_type);
  8306. print_field("Transmission interval: 0x%2.2x", evt->tx_interval);
  8307. print_field("Retransmission window: 0x%2.2x", evt->retrans_window);
  8308. print_field("RX packet length: %d", le16_to_cpu(evt->rx_pkt_len));
  8309. print_field("TX packet length: %d", le16_to_cpu(evt->tx_pkt_len));
  8310. print_air_mode(evt->air_mode);
  8311. }
  8312. static void sync_conn_changed_evt(const void *data, uint8_t size)
  8313. {
  8314. const struct bt_hci_evt_sync_conn_changed *evt = data;
  8315. print_status(evt->status);
  8316. print_handle(evt->handle);
  8317. print_field("Transmission interval: 0x%2.2x", evt->tx_interval);
  8318. print_field("Retransmission window: 0x%2.2x", evt->retrans_window);
  8319. print_field("RX packet length: %d", le16_to_cpu(evt->rx_pkt_len));
  8320. print_field("TX packet length: %d", le16_to_cpu(evt->tx_pkt_len));
  8321. }
  8322. static void sniff_subrating_evt(const void *data, uint8_t size)
  8323. {
  8324. const struct bt_hci_evt_sniff_subrating *evt = data;
  8325. print_status(evt->status);
  8326. print_handle(evt->handle);
  8327. print_slot_625("Max transmit latency", evt->max_tx_latency);
  8328. print_slot_625("Max receive latency", evt->max_rx_latency);
  8329. print_slot_625("Min remote timeout", evt->min_remote_timeout);
  8330. print_slot_625("Min local timeout", evt->min_local_timeout);
  8331. }
  8332. static void ext_inquiry_result_evt(const void *data, uint8_t size)
  8333. {
  8334. const struct bt_hci_evt_ext_inquiry_result *evt = data;
  8335. print_num_resp(evt->num_resp);
  8336. print_bdaddr(evt->bdaddr);
  8337. print_pscan_rep_mode(evt->pscan_rep_mode);
  8338. print_pscan_period_mode(evt->pscan_period_mode);
  8339. print_dev_class(evt->dev_class);
  8340. print_clock_offset(evt->clock_offset);
  8341. print_rssi(evt->rssi);
  8342. print_eir(evt->data, sizeof(evt->data), false);
  8343. }
  8344. static void encrypt_key_refresh_complete_evt(const void *data, uint8_t size)
  8345. {
  8346. const struct bt_hci_evt_encrypt_key_refresh_complete *evt = data;
  8347. print_status(evt->status);
  8348. print_handle(evt->handle);
  8349. }
  8350. static void io_capability_request_evt(const void *data, uint8_t size)
  8351. {
  8352. const struct bt_hci_evt_io_capability_request *evt = data;
  8353. print_bdaddr(evt->bdaddr);
  8354. }
  8355. static void io_capability_response_evt(const void *data, uint8_t size)
  8356. {
  8357. const struct bt_hci_evt_io_capability_response *evt = data;
  8358. print_bdaddr(evt->bdaddr);
  8359. print_io_capability(evt->capability);
  8360. print_oob_data_response(evt->oob_data);
  8361. print_authentication(evt->authentication);
  8362. }
  8363. static void user_confirm_request_evt(const void *data, uint8_t size)
  8364. {
  8365. const struct bt_hci_evt_user_confirm_request *evt = data;
  8366. print_bdaddr(evt->bdaddr);
  8367. print_passkey(evt->passkey);
  8368. }
  8369. static void user_passkey_request_evt(const void *data, uint8_t size)
  8370. {
  8371. const struct bt_hci_evt_user_passkey_request *evt = data;
  8372. print_bdaddr(evt->bdaddr);
  8373. }
  8374. static void remote_oob_data_request_evt(const void *data, uint8_t size)
  8375. {
  8376. const struct bt_hci_evt_remote_oob_data_request *evt = data;
  8377. print_bdaddr(evt->bdaddr);
  8378. }
  8379. static void simple_pairing_complete_evt(const void *data, uint8_t size)
  8380. {
  8381. const struct bt_hci_evt_simple_pairing_complete *evt = data;
  8382. print_status(evt->status);
  8383. print_bdaddr(evt->bdaddr);
  8384. }
  8385. static void link_supv_timeout_changed_evt(const void *data, uint8_t size)
  8386. {
  8387. const struct bt_hci_evt_link_supv_timeout_changed *evt = data;
  8388. print_handle(evt->handle);
  8389. print_timeout(evt->timeout);
  8390. }
  8391. static void enhanced_flush_complete_evt(const void *data, uint8_t size)
  8392. {
  8393. const struct bt_hci_evt_enhanced_flush_complete *evt = data;
  8394. print_handle(evt->handle);
  8395. }
  8396. static void user_passkey_notify_evt(const void *data, uint8_t size)
  8397. {
  8398. const struct bt_hci_evt_user_passkey_notify *evt = data;
  8399. print_bdaddr(evt->bdaddr);
  8400. print_passkey(evt->passkey);
  8401. }
  8402. static void keypress_notify_evt(const void *data, uint8_t size)
  8403. {
  8404. const struct bt_hci_evt_keypress_notify *evt = data;
  8405. const char *str;
  8406. print_bdaddr(evt->bdaddr);
  8407. switch (evt->type) {
  8408. case 0x00:
  8409. str = "Passkey entry started";
  8410. break;
  8411. case 0x01:
  8412. str = "Passkey digit entered";
  8413. break;
  8414. case 0x02:
  8415. str = "Passkey digit erased";
  8416. break;
  8417. case 0x03:
  8418. str = "Passkey clared";
  8419. break;
  8420. case 0x04:
  8421. str = "Passkey entry completed";
  8422. break;
  8423. default:
  8424. str = "Reserved";
  8425. break;
  8426. }
  8427. print_field("Notification type: %s (0x%2.2x)", str, evt->type);
  8428. }
  8429. static void remote_host_features_notify_evt(const void *data, uint8_t size)
  8430. {
  8431. const struct bt_hci_evt_remote_host_features_notify *evt = data;
  8432. print_bdaddr(evt->bdaddr);
  8433. print_features(1, evt->features, 0x00);
  8434. }
  8435. static void phy_link_complete_evt(const void *data, uint8_t size)
  8436. {
  8437. const struct bt_hci_evt_phy_link_complete *evt = data;
  8438. print_status(evt->status);
  8439. print_phy_handle(evt->phy_handle);
  8440. }
  8441. static void channel_selected_evt(const void *data, uint8_t size)
  8442. {
  8443. const struct bt_hci_evt_channel_selected *evt = data;
  8444. print_phy_handle(evt->phy_handle);
  8445. }
  8446. static void disconn_phy_link_complete_evt(const void *data, uint8_t size)
  8447. {
  8448. const struct bt_hci_evt_disconn_phy_link_complete *evt = data;
  8449. print_status(evt->status);
  8450. print_phy_handle(evt->phy_handle);
  8451. print_reason(evt->reason);
  8452. }
  8453. static void phy_link_loss_early_warning_evt(const void *data, uint8_t size)
  8454. {
  8455. const struct bt_hci_evt_phy_link_loss_early_warning *evt = data;
  8456. const char *str;
  8457. print_phy_handle(evt->phy_handle);
  8458. switch (evt->reason) {
  8459. case 0x00:
  8460. str = "Unknown";
  8461. break;
  8462. case 0x01:
  8463. str = "Range related";
  8464. break;
  8465. case 0x02:
  8466. str = "Bandwidth related";
  8467. break;
  8468. case 0x03:
  8469. str = "Resolving conflict";
  8470. break;
  8471. case 0x04:
  8472. str = "Interference";
  8473. break;
  8474. default:
  8475. str = "Reserved";
  8476. break;
  8477. }
  8478. print_field("Reason: %s (0x%2.2x)", str, evt->reason);
  8479. }
  8480. static void phy_link_recovery_evt(const void *data, uint8_t size)
  8481. {
  8482. const struct bt_hci_evt_phy_link_recovery *evt = data;
  8483. print_phy_handle(evt->phy_handle);
  8484. }
  8485. static void logic_link_complete_evt(const void *data, uint8_t size)
  8486. {
  8487. const struct bt_hci_evt_logic_link_complete *evt = data;
  8488. print_status(evt->status);
  8489. print_handle(evt->handle);
  8490. print_phy_handle(evt->phy_handle);
  8491. print_field("TX flow spec: 0x%2.2x", evt->flow_spec);
  8492. }
  8493. static void disconn_logic_link_complete_evt(const void *data, uint8_t size)
  8494. {
  8495. const struct bt_hci_evt_disconn_logic_link_complete *evt = data;
  8496. print_status(evt->status);
  8497. print_handle(evt->handle);
  8498. print_reason(evt->reason);
  8499. }
  8500. static void flow_spec_modify_complete_evt(const void *data, uint8_t size)
  8501. {
  8502. const struct bt_hci_evt_flow_spec_modify_complete *evt = data;
  8503. print_status(evt->status);
  8504. print_handle(evt->handle);
  8505. }
  8506. static void num_completed_data_blocks_evt(const void *data, uint8_t size)
  8507. {
  8508. const struct bt_hci_evt_num_completed_data_blocks *evt = data;
  8509. print_field("Total num data blocks: %d",
  8510. le16_to_cpu(evt->total_num_blocks));
  8511. print_field("Num handles: %d", evt->num_handles);
  8512. print_handle(evt->handle);
  8513. print_field("Num packets: %d", evt->num_packets);
  8514. print_field("Num blocks: %d", evt->num_blocks);
  8515. if (size > sizeof(*evt))
  8516. packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));
  8517. }
  8518. static void short_range_mode_change_evt(const void *data, uint8_t size)
  8519. {
  8520. const struct bt_hci_evt_short_range_mode_change *evt = data;
  8521. print_status(evt->status);
  8522. print_phy_handle(evt->phy_handle);
  8523. print_enable("Short range mode", evt->mode);
  8524. }
  8525. static void amp_status_change_evt(const void *data, uint8_t size)
  8526. {
  8527. const struct bt_hci_evt_amp_status_change *evt = data;
  8528. print_status(evt->status);
  8529. print_amp_status(evt->amp_status);
  8530. }
  8531. static void triggered_clock_capture_evt(const void *data, uint8_t size)
  8532. {
  8533. const struct bt_hci_evt_triggered_clock_capture *evt = data;
  8534. print_handle(evt->handle);
  8535. print_clock_type(evt->type);
  8536. print_clock(evt->clock);
  8537. print_clock_offset(evt->clock_offset);
  8538. }
  8539. static void sync_train_complete_evt(const void *data, uint8_t size)
  8540. {
  8541. const struct bt_hci_evt_sync_train_complete *evt = data;
  8542. print_status(evt->status);
  8543. }
  8544. static void sync_train_received_evt(const void *data, uint8_t size)
  8545. {
  8546. const struct bt_hci_evt_sync_train_received *evt = data;
  8547. print_status(evt->status);
  8548. print_bdaddr(evt->bdaddr);
  8549. print_field("Offset: 0x%8.8x", le32_to_cpu(evt->offset));
  8550. print_channel_map(evt->map);
  8551. print_lt_addr(evt->lt_addr);
  8552. print_field("Next broadcast instant: 0x%4.4x",
  8553. le16_to_cpu(evt->instant));
  8554. print_interval(evt->interval);
  8555. print_field("Service Data: 0x%2.2x", evt->service_data);
  8556. }
  8557. static void peripheral_broadcast_receive_evt(const void *data, uint8_t size)
  8558. {
  8559. const struct bt_hci_evt_peripheral_broadcast_receive *evt = data;
  8560. print_bdaddr(evt->bdaddr);
  8561. print_lt_addr(evt->lt_addr);
  8562. print_field("Clock: 0x%8.8x", le32_to_cpu(evt->clock));
  8563. print_field("Offset: 0x%8.8x", le32_to_cpu(evt->offset));
  8564. print_field("Receive status: 0x%2.2x", evt->status);
  8565. print_broadcast_fragment(evt->fragment);
  8566. print_field("Length: %d", evt->length);
  8567. if (size - 18 != evt->length)
  8568. print_text(COLOR_ERROR, "invalid data size (%d != %d)",
  8569. size - 18, evt->length);
  8570. if (evt->lt_addr == 0x01 && evt->length == 17)
  8571. print_3d_broadcast(data + 18, size - 18);
  8572. else
  8573. packet_hexdump(data + 18, size - 18);
  8574. }
  8575. static void peripheral_broadcast_timeout_evt(const void *data, uint8_t size)
  8576. {
  8577. const struct bt_hci_evt_peripheral_broadcast_timeout *evt = data;
  8578. print_bdaddr(evt->bdaddr);
  8579. print_lt_addr(evt->lt_addr);
  8580. }
  8581. static void truncated_page_complete_evt(const void *data, uint8_t size)
  8582. {
  8583. const struct bt_hci_evt_truncated_page_complete *evt = data;
  8584. print_status(evt->status);
  8585. print_bdaddr(evt->bdaddr);
  8586. }
  8587. static void peripheral_page_response_timeout_evt(const void *data, uint8_t size)
  8588. {
  8589. }
  8590. static void channel_map_change_evt(const void *data, uint8_t size)
  8591. {
  8592. const struct bt_hci_evt_channel_map_change *evt = data;
  8593. print_channel_map(evt->map);
  8594. }
  8595. static void inquiry_response_notify_evt(const void *data, uint8_t size)
  8596. {
  8597. const struct bt_hci_evt_inquiry_response_notify *evt = data;
  8598. print_iac(evt->lap);
  8599. print_rssi(evt->rssi);
  8600. }
  8601. static void auth_payload_timeout_expired_evt(const void *data, uint8_t size)
  8602. {
  8603. const struct bt_hci_evt_auth_payload_timeout_expired *evt = data;
  8604. print_handle(evt->handle);
  8605. }
  8606. static void le_conn_complete_evt(const void *data, uint8_t size)
  8607. {
  8608. const struct bt_hci_evt_le_conn_complete *evt = data;
  8609. print_status(evt->status);
  8610. print_handle(evt->handle);
  8611. print_role(evt->role);
  8612. print_peer_addr_type("Peer address type", evt->peer_addr_type);
  8613. print_addr("Peer address", evt->peer_addr, evt->peer_addr_type);
  8614. print_slot_125("Connection interval", evt->interval);
  8615. print_conn_latency("Connection latency", evt->latency);
  8616. print_field("Supervision timeout: %d msec (0x%4.4x)",
  8617. le16_to_cpu(evt->supv_timeout) * 10,
  8618. le16_to_cpu(evt->supv_timeout));
  8619. print_field("Central clock accuracy: 0x%2.2x", evt->clock_accuracy);
  8620. if (evt->status == 0x00)
  8621. assign_handle(le16_to_cpu(evt->handle), 0x01);
  8622. }
  8623. static void le_adv_report_evt(const void *data, uint8_t size)
  8624. {
  8625. const struct bt_hci_evt_le_adv_report *evt = data;
  8626. uint8_t evt_len;
  8627. int8_t *rssi;
  8628. print_num_reports(evt->num_reports);
  8629. report:
  8630. print_adv_event_type("Event type", evt->event_type);
  8631. print_peer_addr_type("Address type", evt->addr_type);
  8632. print_addr("Address", evt->addr, evt->addr_type);
  8633. print_field("Data length: %d", evt->data_len);
  8634. print_eir(evt->data, evt->data_len, true);
  8635. rssi = (int8_t *) (evt->data + evt->data_len);
  8636. print_rssi(*rssi);
  8637. evt_len = sizeof(*evt) + evt->data_len + 1;
  8638. if (size > evt_len) {
  8639. data += evt_len - 1;
  8640. size -= evt_len - 1;
  8641. evt = data;
  8642. goto report;
  8643. }
  8644. }
  8645. static void le_conn_update_complete_evt(const void *data, uint8_t size)
  8646. {
  8647. const struct bt_hci_evt_le_conn_update_complete *evt = data;
  8648. print_status(evt->status);
  8649. print_handle(evt->handle);
  8650. print_slot_125("Connection interval", evt->interval);
  8651. print_conn_latency("Connection latency", evt->latency);
  8652. print_field("Supervision timeout: %d msec (0x%4.4x)",
  8653. le16_to_cpu(evt->supv_timeout) * 10,
  8654. le16_to_cpu(evt->supv_timeout));
  8655. }
  8656. static void le_remote_features_complete_evt(const void *data, uint8_t size)
  8657. {
  8658. const struct bt_hci_evt_le_remote_features_complete *evt = data;
  8659. print_status(evt->status);
  8660. print_handle(evt->handle);
  8661. print_features(0, evt->features, 0x01);
  8662. }
  8663. static void le_long_term_key_request_evt(const void *data, uint8_t size)
  8664. {
  8665. const struct bt_hci_evt_le_long_term_key_request *evt = data;
  8666. print_handle(evt->handle);
  8667. print_random_number(evt->rand);
  8668. print_encrypted_diversifier(evt->ediv);
  8669. }
  8670. static void le_conn_param_request_evt(const void *data, uint8_t size)
  8671. {
  8672. const struct bt_hci_evt_le_conn_param_request *evt = data;
  8673. print_handle(evt->handle);
  8674. print_slot_125("Min connection interval", evt->min_interval);
  8675. print_slot_125("Max connection interval", evt->max_interval);
  8676. print_conn_latency("Connection latency", evt->latency);
  8677. print_field("Supervision timeout: %d msec (0x%4.4x)",
  8678. le16_to_cpu(evt->supv_timeout) * 10,
  8679. le16_to_cpu(evt->supv_timeout));
  8680. }
  8681. static void le_data_length_change_evt(const void *data, uint8_t size)
  8682. {
  8683. const struct bt_hci_evt_le_data_length_change *evt = data;
  8684. print_handle(evt->handle);
  8685. print_field("Max TX octets: %d", le16_to_cpu(evt->max_tx_len));
  8686. print_field("Max TX time: %d", le16_to_cpu(evt->max_tx_time));
  8687. print_field("Max RX octets: %d", le16_to_cpu(evt->max_rx_len));
  8688. print_field("Max RX time: %d", le16_to_cpu(evt->max_rx_time));
  8689. }
  8690. static void le_read_local_pk256_complete_evt(const void *data, uint8_t size)
  8691. {
  8692. const struct bt_hci_evt_le_read_local_pk256_complete *evt = data;
  8693. print_status(evt->status);
  8694. print_pk256("Local P-256 public key", evt->local_pk256);
  8695. }
  8696. static void le_generate_dhkey_complete_evt(const void *data, uint8_t size)
  8697. {
  8698. const struct bt_hci_evt_le_generate_dhkey_complete *evt = data;
  8699. print_status(evt->status);
  8700. print_dhkey(evt->dhkey);
  8701. }
  8702. static void le_enhanced_conn_complete_evt(const void *data, uint8_t size)
  8703. {
  8704. const struct bt_hci_evt_le_enhanced_conn_complete *evt = data;
  8705. print_status(evt->status);
  8706. print_handle(evt->handle);
  8707. print_role(evt->role);
  8708. print_peer_addr_type("Peer address type", evt->peer_addr_type);
  8709. print_addr("Peer address", evt->peer_addr, evt->peer_addr_type);
  8710. print_addr("Local resolvable private address", evt->local_rpa, 0x01);
  8711. print_addr("Peer resolvable private address", evt->peer_rpa, 0x01);
  8712. print_slot_125("Connection interval", evt->interval);
  8713. print_conn_latency("Connection latency", evt->latency);
  8714. print_field("Supervision timeout: %d msec (0x%4.4x)",
  8715. le16_to_cpu(evt->supv_timeout) * 10,
  8716. le16_to_cpu(evt->supv_timeout));
  8717. print_field("Central clock accuracy: 0x%2.2x", evt->clock_accuracy);
  8718. if (evt->status == 0x00)
  8719. assign_handle(le16_to_cpu(evt->handle), 0x01);
  8720. }
  8721. static void le_direct_adv_report_evt(const void *data, uint8_t size)
  8722. {
  8723. const struct bt_hci_evt_le_direct_adv_report *evt = data;
  8724. print_num_reports(evt->num_reports);
  8725. print_adv_event_type("Event type", evt->event_type);
  8726. print_peer_addr_type("Address type", evt->addr_type);
  8727. print_addr("Address", evt->addr, evt->addr_type);
  8728. print_addr_type("Direct address type", evt->direct_addr_type);
  8729. print_addr("Direct address", evt->direct_addr, evt->direct_addr_type);
  8730. print_rssi(evt->rssi);
  8731. if (size > sizeof(*evt))
  8732. packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));
  8733. }
  8734. static void le_phy_update_complete_evt(const void *data, uint8_t size)
  8735. {
  8736. const struct bt_hci_evt_le_phy_update_complete *evt = data;
  8737. print_status(evt->status);
  8738. print_handle(evt->handle);
  8739. print_le_phy("TX PHY", evt->tx_phy);
  8740. print_le_phy("RX PHY", evt->rx_phy);
  8741. }
  8742. static const struct bitfield_data ext_adv_report_evt_type[] = {
  8743. { 0, "Connectable" },
  8744. { 1, "Scannable" },
  8745. { 2, "Directed" },
  8746. { 3, "Scan response" },
  8747. { 4, "Use legacy advertising PDUs" },
  8748. { }
  8749. };
  8750. static void print_ext_adv_report_evt_type(const char *indent, uint16_t flags)
  8751. {
  8752. uint16_t mask = flags;
  8753. uint16_t props = flags;
  8754. uint8_t data_status;
  8755. const char *str;
  8756. const char *color_on;
  8757. int i;
  8758. print_field("%sEvent type: 0x%4.4x", indent, flags);
  8759. props &= 0x1f;
  8760. print_field("%s Props: 0x%4.4x", indent, props);
  8761. for (i = 0; ext_adv_report_evt_type[i].str; i++) {
  8762. if (flags & (1 << ext_adv_report_evt_type[i].bit)) {
  8763. print_field("%s %s", indent,
  8764. ext_adv_report_evt_type[i].str);
  8765. mask &= ~(1 << ext_adv_report_evt_type[i].bit);
  8766. }
  8767. }
  8768. data_status = (flags >> 5) & 3;
  8769. mask &= ~(data_status << 5);
  8770. switch (data_status) {
  8771. case 0x00:
  8772. str = "Complete";
  8773. color_on = COLOR_GREEN;
  8774. break;
  8775. case 0x01:
  8776. str = "Incomplete, more data to come";
  8777. color_on = COLOR_YELLOW;
  8778. break;
  8779. case 0x02:
  8780. str = "Incomplete, data truncated, no more to come";
  8781. color_on = COLOR_RED;
  8782. break;
  8783. default:
  8784. str = "Reserved";
  8785. color_on = COLOR_RED;
  8786. break;
  8787. }
  8788. print_field("%s Data status: %s%s%s", indent, color_on, str, COLOR_OFF);
  8789. if (mask)
  8790. print_text(COLOR_UNKNOWN_ADV_FLAG,
  8791. "%s Reserved (0x%4.4x)", indent, mask);
  8792. }
  8793. static void print_legacy_adv_report_pdu(uint16_t flags)
  8794. {
  8795. const char *str;
  8796. if (!(flags & (1 << 4)))
  8797. return;
  8798. switch (flags) {
  8799. case 0x10:
  8800. str = "ADV_NONCONN_IND";
  8801. break;
  8802. case 0x12:
  8803. str = "ADV_SCAN_IND";
  8804. break;
  8805. case 0x13:
  8806. str = "ADV_IND";
  8807. break;
  8808. case 0x15:
  8809. str = "ADV_DIRECT_IND";
  8810. break;
  8811. case 0x1a:
  8812. str = "SCAN_RSP to an ADV_IND";
  8813. break;
  8814. case 0x1b:
  8815. str = "SCAN_RSP to an ADV_SCAN_IND";
  8816. break;
  8817. default:
  8818. str = "Reserved";
  8819. break;
  8820. }
  8821. print_field(" Legacy PDU Type: %s (0x%4.4x)", str, flags);
  8822. }
  8823. static void le_ext_adv_report_evt(const void *data, uint8_t size)
  8824. {
  8825. const struct bt_hci_evt_le_ext_adv_report *evt = data;
  8826. const struct bt_hci_le_ext_adv_report *report;
  8827. const char *str;
  8828. int i;
  8829. print_num_reports(evt->num_reports);
  8830. data += sizeof(evt->num_reports);
  8831. for (i = 0; i < evt->num_reports; ++i) {
  8832. report = data;
  8833. print_field("Entry %d", i);
  8834. print_ext_adv_report_evt_type(" ", report->event_type);
  8835. print_legacy_adv_report_pdu(report->event_type);
  8836. print_peer_addr_type(" Address type", report->addr_type);
  8837. print_addr(" Address", report->addr, report->addr_type);
  8838. switch (report->primary_phy) {
  8839. case 0x01:
  8840. str = "LE 1M";
  8841. break;
  8842. case 0x03:
  8843. str = "LE Coded";
  8844. break;
  8845. default:
  8846. str = "Reserved";
  8847. break;
  8848. }
  8849. print_field(" Primary PHY: %s", str);
  8850. switch (report->secondary_phy) {
  8851. case 0x00:
  8852. str = "No packets";
  8853. break;
  8854. case 0x01:
  8855. str = "LE 1M";
  8856. break;
  8857. case 0x02:
  8858. str = "LE 2M";
  8859. break;
  8860. case 0x03:
  8861. str = "LE Coded";
  8862. break;
  8863. default:
  8864. str = "Reserved";
  8865. break;
  8866. }
  8867. print_field(" Secondary PHY: %s", str);
  8868. if (report->sid == 0xff)
  8869. print_field(" SID: no ADI field (0x%2.2x)",
  8870. report->sid);
  8871. else if (report->sid > 0x0f)
  8872. print_field(" SID: Reserved (0x%2.2x)", report->sid);
  8873. else
  8874. print_field(" SID: 0x%2.2x", report->sid);
  8875. print_field(" TX power: %d dBm", report->tx_power);
  8876. if (report->rssi == 127)
  8877. print_field(" RSSI: not available (0x%2.2x)",
  8878. (uint8_t) report->rssi);
  8879. else if (report->rssi >= -127 && report->rssi <= 20)
  8880. print_field(" RSSI: %d dBm (0x%2.2x)",
  8881. report->rssi, (uint8_t) report->rssi);
  8882. else
  8883. print_field(" RSSI: reserved (0x%2.2x)",
  8884. (uint8_t) report->rssi);
  8885. print_slot_125(" Periodic advertising interval",
  8886. report->interval);
  8887. print_peer_addr_type(" Direct address type",
  8888. report->direct_addr_type);
  8889. print_addr(" Direct address", report->direct_addr,
  8890. report->direct_addr_type);
  8891. print_field(" Data length: 0x%2.2x", report->data_len);
  8892. data += sizeof(struct bt_hci_le_ext_adv_report);
  8893. packet_hexdump(data, report->data_len);
  8894. print_eir(data, report->data_len, true);
  8895. data += report->data_len;
  8896. }
  8897. }
  8898. static void le_per_adv_sync(const void *data, uint8_t size)
  8899. {
  8900. const struct bt_hci_evt_le_per_sync_established *evt = data;
  8901. print_status(evt->status);
  8902. print_field("Sync handle: %d", evt->handle);
  8903. if (evt->sid > 0x0f)
  8904. print_field("Advertising SID: Reserved (0x%2.2x)", evt->sid);
  8905. else
  8906. print_field("Advertising SID: 0x%2.2x", evt->sid);
  8907. print_peer_addr_type("Advertiser address type", evt->addr_type);
  8908. print_addr("Advertiser address", evt->addr, evt->addr_type);
  8909. print_le_phy("Advertiser PHY", evt->phy);
  8910. print_slot_125("Periodic advertising interval", evt->interval);
  8911. print_field("Advertiser clock accuracy: 0x%2.2x", evt->clock_accuracy);
  8912. }
  8913. static void le_per_adv_report_evt(const void *data, uint8_t size)
  8914. {
  8915. const struct bt_hci_le_per_adv_report *evt = data;
  8916. const char *color_on;
  8917. const char *str;
  8918. print_field("Sync handle: %d", evt->handle);
  8919. print_power_level(evt->tx_power, NULL);
  8920. if (evt->rssi == 127)
  8921. print_field("RSSI: not available (0x%2.2x)",
  8922. (uint8_t) evt->rssi);
  8923. else if (evt->rssi >= -127 && evt->rssi <= 20)
  8924. print_field("RSSI: %d dBm (0x%2.2x)",
  8925. evt->rssi, (uint8_t) evt->rssi);
  8926. else
  8927. print_field("RSSI: reserved (0x%2.2x)",
  8928. (uint8_t) evt->rssi);
  8929. switch (evt->cte_type) {
  8930. case 0x00:
  8931. str = "AoA Constant Tone Extension";
  8932. break;
  8933. case 0x01:
  8934. str = "AoA Constant Tone Extension with 1us slots";
  8935. break;
  8936. case 0x02:
  8937. str = "AoD Constant Tone Extension with 2us slots";
  8938. break;
  8939. case 0xff:
  8940. str = "No Constant Tone Extension";
  8941. break;
  8942. default:
  8943. str = "Reserved";
  8944. color_on = COLOR_RED;
  8945. break;
  8946. }
  8947. switch (evt->data_status) {
  8948. case 0x00:
  8949. str = "Complete";
  8950. color_on = COLOR_GREEN;
  8951. break;
  8952. case 0x01:
  8953. str = "Incomplete, more data to come";
  8954. color_on = COLOR_YELLOW;
  8955. break;
  8956. case 0x02:
  8957. str = "Incomplete, data truncated, no more to come";
  8958. color_on = COLOR_RED;
  8959. break;
  8960. default:
  8961. str = "Reserved";
  8962. color_on = COLOR_RED;
  8963. break;
  8964. }
  8965. print_field("Data status: %s%s%s", color_on, str, COLOR_OFF);
  8966. print_field("Data length: 0x%2.2x", evt->data_len);
  8967. packet_hexdump(evt->data, evt->data_len);
  8968. }
  8969. static void le_per_adv_sync_lost(const void *data, uint8_t size)
  8970. {
  8971. const struct bt_hci_evt_le_per_sync_lost *evt = data;
  8972. print_field("Sync handle: %d", evt->handle);
  8973. }
  8974. static void le_adv_set_term_evt(const void *data, uint8_t size)
  8975. {
  8976. const struct bt_hci_evt_le_adv_set_term *evt = data;
  8977. print_status(evt->status);
  8978. print_field("Handle: %d", evt->handle);
  8979. print_field("Connection handle: %d", evt->conn_handle);
  8980. print_field("Number of completed extended advertising events: %d",
  8981. evt->num_evts);
  8982. }
  8983. static void le_scan_req_received_evt(const void *data, uint8_t size)
  8984. {
  8985. const struct bt_hci_evt_le_scan_req_received *evt = data;
  8986. print_field("Handle: %d", evt->handle);
  8987. print_peer_addr_type("Scanner address type", evt->scanner_addr_type);
  8988. print_addr("Scanner address", evt->scanner_addr,
  8989. evt->scanner_addr_type);
  8990. }
  8991. static void le_chan_select_alg_evt(const void *data, uint8_t size)
  8992. {
  8993. const struct bt_hci_evt_le_chan_select_alg *evt = data;
  8994. const char *str;
  8995. print_handle(evt->handle);
  8996. switch (evt->algorithm) {
  8997. case 0x00:
  8998. str = "#1";
  8999. break;
  9000. case 0x01:
  9001. str = "#2";
  9002. break;
  9003. default:
  9004. str = "Reserved";
  9005. break;
  9006. }
  9007. print_field("Algorithm: %s (0x%2.2x)", str, evt->algorithm);
  9008. }
  9009. static void le_cte_request_failed_evt(const void *data, uint8_t size)
  9010. {
  9011. const struct bt_hci_evt_le_cte_request_failed *evt = data;
  9012. print_status(evt->status);
  9013. print_field("Connection handle: %d", evt->handle);
  9014. }
  9015. static void le_per_adv_sync_trans_rec_evt(const void *data, uint8_t size)
  9016. {
  9017. const struct bt_hci_evt_le_per_adv_sync_trans_rec *evt = data;
  9018. print_status(evt->status);
  9019. print_field("Handle: %d", evt->handle);
  9020. print_field("Connection handle: %d", evt->handle);
  9021. print_field("Service data: 0x%4.4x", evt->service_data);
  9022. print_field("Sync handle: %d", evt->sync_handle);
  9023. print_field("SID: 0x%2.2x", evt->sid);
  9024. print_peer_addr_type("Address type:", evt->addr_type);
  9025. print_addr("Address:", evt->addr, evt->addr_type);
  9026. print_le_phy("PHY:", evt->phy);
  9027. print_field("Periodic advertising Interval: %.3f",
  9028. 1.25 * evt->interval);
  9029. print_clock_accuracy(evt->clock_accuracy);
  9030. }
  9031. static void le_cis_established_evt(const void *data, uint8_t size)
  9032. {
  9033. const struct bt_hci_evt_le_cis_established *evt = data;
  9034. print_status(evt->status);
  9035. print_field("Connection Handle: %d", le16_to_cpu(evt->conn_handle));
  9036. print_usec_interval("CIG Synchronization Delay", evt->cig_sync_delay);
  9037. print_usec_interval("CIS Synchronization Delay", evt->cis_sync_delay);
  9038. print_usec_interval("Central to Peripheral Latency", evt->c_latency);
  9039. print_usec_interval("Peripheral to Central Latency", evt->p_latency);
  9040. print_le_phy("Central to Peripheral PHY", evt->c_phy);
  9041. print_le_phy("Peripheral to Central PHY", evt->p_phy);
  9042. print_field("Number of Subevents: %u", evt->nse);
  9043. print_field("Central to Peripheral Burst Number: %u", evt->c_bn);
  9044. print_field("Peripheral to Central Burst Number: %u", evt->p_bn);
  9045. print_field("Central to Peripheral Flush Timeout: %u", evt->c_ft);
  9046. print_field("Peripheral to Central Flush Timeout: %u", evt->p_ft);
  9047. print_field("Central to Peripheral MTU: %u", le16_to_cpu(evt->c_mtu));
  9048. print_field("Peripheral to Central MTU: %u", le16_to_cpu(evt->p_mtu));
  9049. print_field("ISO Interval: %u", le16_to_cpu(evt->interval));
  9050. }
  9051. static void le_req_cis_evt(const void *data, uint8_t size)
  9052. {
  9053. const struct bt_hci_evt_le_cis_req *evt = data;
  9054. print_field("ACL Handle: %d", le16_to_cpu(evt->acl_handle));
  9055. print_field("CIS Handle: %d", le16_to_cpu(evt->cis_handle));
  9056. print_field("CIG ID: 0x%2.2x", evt->cig_id);
  9057. print_field("CIS ID: 0x%2.2x", evt->cis_id);
  9058. }
  9059. static void print_bis_handle(const void *data, int i)
  9060. {
  9061. const uint16_t *handle = data;
  9062. print_field("Connection Handle: %d", le16_to_cpu(*handle));
  9063. }
  9064. static void le_big_complete_evt(const void *data, uint8_t size)
  9065. {
  9066. const struct bt_hci_evt_le_big_complete *evt = data;
  9067. print_status(evt->status);
  9068. print_field("Handle: 0x%2.2x", evt->handle);
  9069. print_usec_interval("BIG Synchronization Delay", evt->sync_delay);
  9070. print_usec_interval("Transport Latency", evt->latency);
  9071. print_le_phy("PHY", evt->phy);
  9072. print_field("NSE: %u", evt->nse);
  9073. print_field("BN: %u", evt->bn);
  9074. print_field("PTO: %u", evt->bn);
  9075. print_field("IRC: %u", evt->irc);
  9076. print_field("Maximum PDU: %u", evt->max_pdu);
  9077. print_slot_125("ISO Interval", evt->interval);
  9078. print_list(evt->bis_handle, size, evt->num_bis,
  9079. sizeof(*evt->bis_handle), print_bis_handle);
  9080. }
  9081. static void le_big_terminate_evt(const void *data, uint8_t size)
  9082. {
  9083. const struct bt_hci_evt_le_big_terminate *evt = data;
  9084. print_field("BIG Handle: 0x%2.2x", evt->handle);
  9085. print_reason(evt->reason);
  9086. }
  9087. static void le_big_sync_estabilished_evt(const void *data, uint8_t size)
  9088. {
  9089. const struct bt_hci_evt_le_big_sync_estabilished *evt = data;
  9090. print_status(evt->status);
  9091. print_field("BIG Handle: 0x%2.2x", evt->handle);
  9092. print_usec_interval("Transport Latency", evt->latency);
  9093. print_field("NSE: %u", evt->nse);
  9094. print_field("BN: %u", evt->bn);
  9095. print_field("PTO: %u", evt->bn);
  9096. print_field("IRC: %u", evt->irc);
  9097. print_field("Maximum PDU: %u", evt->max_pdu);
  9098. print_slot_125("ISO Interval", evt->interval);
  9099. print_list(evt->bis, size, evt->num_bis, sizeof(*evt->bis),
  9100. print_bis_handle);
  9101. }
  9102. static void le_big_sync_lost_evt(const void *data, uint8_t size)
  9103. {
  9104. const struct bt_hci_evt_le_big_sync_lost *evt = data;
  9105. print_field("BIG ID: 0x%2.2x", evt->big_id);
  9106. print_reason(evt->reason);
  9107. }
  9108. static void le_req_sca_complete_evt(const void *data, uint8_t size)
  9109. {
  9110. const struct bt_hci_evt_le_req_peer_sca_complete *evt = data;
  9111. print_status(evt->status);
  9112. print_field("Connection Handle: %d", le16_to_cpu(evt->handle));
  9113. print_sca(evt->sca);
  9114. }
  9115. struct subevent_data {
  9116. uint8_t subevent;
  9117. const char *str;
  9118. void (*func) (const void *data, uint8_t size);
  9119. uint8_t size;
  9120. bool fixed;
  9121. };
  9122. static void print_subevent(const struct subevent_data *subevent_data,
  9123. const void *data, uint8_t size)
  9124. {
  9125. const char *subevent_color;
  9126. if (subevent_data->func)
  9127. subevent_color = COLOR_HCI_EVENT;
  9128. else
  9129. subevent_color = COLOR_HCI_EVENT_UNKNOWN;
  9130. print_indent(6, subevent_color, "", subevent_data->str, COLOR_OFF,
  9131. " (0x%2.2x)", subevent_data->subevent);
  9132. if (!subevent_data->func) {
  9133. packet_hexdump(data, size);
  9134. return;
  9135. }
  9136. if (subevent_data->fixed) {
  9137. if (size != subevent_data->size) {
  9138. print_text(COLOR_ERROR, "invalid packet size");
  9139. packet_hexdump(data, size);
  9140. return;
  9141. }
  9142. } else {
  9143. if (size < subevent_data->size) {
  9144. print_text(COLOR_ERROR, "too short packet");
  9145. packet_hexdump(data, size);
  9146. return;
  9147. }
  9148. }
  9149. subevent_data->func(data, size);
  9150. }
  9151. static const struct subevent_data le_meta_event_table[] = {
  9152. { 0x01, "LE Connection Complete",
  9153. le_conn_complete_evt, 18, true },
  9154. { 0x02, "LE Advertising Report",
  9155. le_adv_report_evt, 1, false },
  9156. { 0x03, "LE Connection Update Complete",
  9157. le_conn_update_complete_evt, 9, true },
  9158. { 0x04, "LE Read Remote Used Features",
  9159. le_remote_features_complete_evt, 11, true },
  9160. { 0x05, "LE Long Term Key Request",
  9161. le_long_term_key_request_evt, 12, true },
  9162. { 0x06, "LE Remote Connection Parameter Request",
  9163. le_conn_param_request_evt, 10, true },
  9164. { 0x07, "LE Data Length Change",
  9165. le_data_length_change_evt, 10, true },
  9166. { 0x08, "LE Read Local P-256 Public Key Complete",
  9167. le_read_local_pk256_complete_evt, 65, true },
  9168. { 0x09, "LE Generate DHKey Complete",
  9169. le_generate_dhkey_complete_evt, 33, true },
  9170. { 0x0a, "LE Enhanced Connection Complete",
  9171. le_enhanced_conn_complete_evt, 30, true },
  9172. { 0x0b, "LE Direct Advertising Report",
  9173. le_direct_adv_report_evt, 1, false },
  9174. { 0x0c, "LE PHY Update Complete",
  9175. le_phy_update_complete_evt, 5, true},
  9176. { 0x0d, "LE Extended Advertising Report",
  9177. le_ext_adv_report_evt, 1, false},
  9178. { 0x0e, "LE Periodic Advertising Sync Established",
  9179. le_per_adv_sync, 15, true },
  9180. { 0x0f, "LE Periodic Advertising Report",
  9181. le_per_adv_report_evt, 7, false},
  9182. { 0x10, "LE Periodic Advertising Sync Lost",
  9183. le_per_adv_sync_lost, 2, true},
  9184. { 0x11, "LE Scan Timeout" },
  9185. { 0x12, "LE Advertising Set Terminated",
  9186. le_adv_set_term_evt, 5, true},
  9187. { 0x13, "LE Scan Request Received",
  9188. le_scan_req_received_evt, 8, true},
  9189. { 0x14, "LE Channel Selection Algorithm",
  9190. le_chan_select_alg_evt, 3, true},
  9191. { 0x17, "LE CTE Request Failed",
  9192. le_cte_request_failed_evt, 3, true},
  9193. { 0x18, "LE Periodic Advertising Sync Transfer Received",
  9194. le_per_adv_sync_trans_rec_evt, 19,
  9195. true},
  9196. { BT_HCI_EVT_LE_CIS_ESTABLISHED,
  9197. "LE Connected Isochronous Stream Established",
  9198. le_cis_established_evt,
  9199. sizeof(struct bt_hci_evt_le_cis_established),
  9200. true },
  9201. { BT_HCI_EVT_LE_CIS_REQ, "LE Connected Isochronous Stream Request",
  9202. le_req_cis_evt,
  9203. sizeof(struct bt_hci_evt_le_cis_req),
  9204. true },
  9205. { BT_HCI_EVT_LE_BIG_COMPLETE,
  9206. "LE Broadcast Isochronous Group Complete",
  9207. le_big_complete_evt,
  9208. sizeof(struct bt_hci_evt_le_big_complete) },
  9209. { BT_HCI_EVT_LE_BIG_TERMINATE,
  9210. "LE Broadcast Isochronous Group Terminate",
  9211. le_big_terminate_evt,
  9212. sizeof(struct bt_hci_evt_le_big_terminate) },
  9213. { BT_HCI_EVT_LE_BIG_SYNC_ESTABILISHED,
  9214. "LE Broadcast Isochronous Group Sync "
  9215. "Estabilished", le_big_sync_estabilished_evt,
  9216. sizeof(struct bt_hci_evt_le_big_sync_lost) },
  9217. { BT_HCI_EVT_LE_BIG_SYNC_LOST,
  9218. "LE Broadcast Isochronous Group Sync Lost",
  9219. le_big_sync_lost_evt,
  9220. sizeof(struct bt_hci_evt_le_big_sync_lost) },
  9221. { BT_HCI_EVT_LE_REQ_PEER_SCA_COMPLETE,
  9222. "LE Request Peer SCA Complete",
  9223. le_req_sca_complete_evt,
  9224. sizeof(
  9225. struct bt_hci_evt_le_req_peer_sca_complete)},
  9226. { }
  9227. };
  9228. static void le_meta_event_evt(const void *data, uint8_t size)
  9229. {
  9230. uint8_t subevent = *((const uint8_t *) data);
  9231. struct subevent_data unknown;
  9232. const struct subevent_data *subevent_data = &unknown;
  9233. int i;
  9234. unknown.subevent = subevent;
  9235. unknown.str = "Unknown";
  9236. unknown.func = NULL;
  9237. unknown.size = 0;
  9238. unknown.fixed = true;
  9239. for (i = 0; le_meta_event_table[i].str; i++) {
  9240. if (le_meta_event_table[i].subevent == subevent) {
  9241. subevent_data = &le_meta_event_table[i];
  9242. break;
  9243. }
  9244. }
  9245. print_subevent(subevent_data, data + 1, size - 1);
  9246. }
  9247. static void vendor_evt(const void *data, uint8_t size)
  9248. {
  9249. struct subevent_data vendor_data;
  9250. char vendor_str[150];
  9251. int consumed_size;
  9252. const struct vendor_evt *vnd = current_vendor_evt(data, &consumed_size);
  9253. if (vnd) {
  9254. const char *str = current_vendor_str();
  9255. if (str) {
  9256. snprintf(vendor_str, sizeof(vendor_str),
  9257. "%s %s", str, vnd->str);
  9258. vendor_data.str = vendor_str;
  9259. } else
  9260. vendor_data.str = vnd->str;
  9261. vendor_data.subevent = vnd->evt;
  9262. vendor_data.func = vnd->evt_func;
  9263. vendor_data.size = vnd->evt_size;
  9264. vendor_data.fixed = vnd->evt_fixed;
  9265. print_subevent(&vendor_data, data + consumed_size,
  9266. size - consumed_size);
  9267. } else {
  9268. uint16_t manufacturer;
  9269. if (index_current < MAX_INDEX)
  9270. manufacturer = index_list[index_current].manufacturer;
  9271. else
  9272. manufacturer = fallback_manufacturer;
  9273. vendor_event(manufacturer, data, size);
  9274. }
  9275. }
  9276. struct event_data {
  9277. uint8_t event;
  9278. const char *str;
  9279. void (*func) (const void *data, uint8_t size);
  9280. uint8_t size;
  9281. bool fixed;
  9282. };
  9283. static const struct event_data event_table[] = {
  9284. { 0x01, "Inquiry Complete",
  9285. inquiry_complete_evt, 1, true },
  9286. { 0x02, "Inquiry Result",
  9287. inquiry_result_evt, 1, false },
  9288. { 0x03, "Connect Complete",
  9289. conn_complete_evt, 11, true },
  9290. { 0x04, "Connect Request",
  9291. conn_request_evt, 10, true },
  9292. { 0x05, "Disconnect Complete",
  9293. disconnect_complete_evt, 4, true },
  9294. { 0x06, "Auth Complete",
  9295. auth_complete_evt, 3, true },
  9296. { 0x07, "Remote Name Req Complete",
  9297. remote_name_request_complete_evt, 255, true },
  9298. { 0x08, "Encryption Change",
  9299. encrypt_change_evt, 4, true },
  9300. { 0x09, "Change Connection Link Key Complete",
  9301. change_conn_link_key_complete_evt, 3, true },
  9302. { 0x0a, "Link Key Type Changed",
  9303. link_key_type_changed_evt, 4, true },
  9304. { 0x0b, "Read Remote Supported Features",
  9305. remote_features_complete_evt, 11, true },
  9306. { 0x0c, "Read Remote Version Complete",
  9307. remote_version_complete_evt, 8, true },
  9308. { 0x0d, "QoS Setup Complete",
  9309. qos_setup_complete_evt, 21, true },
  9310. { 0x0e, "Command Complete",
  9311. cmd_complete_evt, 3, false },
  9312. { 0x0f, "Command Status",
  9313. cmd_status_evt, 4, true },
  9314. { 0x10, "Hardware Error",
  9315. hardware_error_evt, 1, true },
  9316. { 0x11, "Flush Occurred",
  9317. flush_occurred_evt, 2, true },
  9318. { 0x12, "Role Change",
  9319. role_change_evt, 8, true },
  9320. { 0x13, "Number of Completed Packets",
  9321. num_completed_packets_evt, 1, false },
  9322. { 0x14, "Mode Change",
  9323. mode_change_evt, 6, true },
  9324. { 0x15, "Return Link Keys",
  9325. return_link_keys_evt, 1, false },
  9326. { 0x16, "PIN Code Request",
  9327. pin_code_request_evt, 6, true },
  9328. { 0x17, "Link Key Request",
  9329. link_key_request_evt, 6, true },
  9330. { 0x18, "Link Key Notification",
  9331. link_key_notify_evt, 23, true },
  9332. { 0x19, "Loopback Command",
  9333. loopback_command_evt, 3, false },
  9334. { 0x1a, "Data Buffer Overflow",
  9335. data_buffer_overflow_evt, 1, true },
  9336. { 0x1b, "Max Slots Change",
  9337. max_slots_change_evt, 3, true },
  9338. { 0x1c, "Read Clock Offset Complete",
  9339. clock_offset_complete_evt, 5, true },
  9340. { 0x1d, "Connection Packet Type Changed",
  9341. conn_pkt_type_changed_evt, 5, true },
  9342. { 0x1e, "QoS Violation",
  9343. qos_violation_evt, 2, true },
  9344. { 0x1f, "Page Scan Mode Change",
  9345. pscan_mode_change_evt, 7, true },
  9346. { 0x20, "Page Scan Repetition Mode Change",
  9347. pscan_rep_mode_change_evt, 7, true },
  9348. { 0x21, "Flow Specification Complete",
  9349. flow_spec_complete_evt, 22, true },
  9350. { 0x22, "Inquiry Result with RSSI",
  9351. inquiry_result_with_rssi_evt, 1, false },
  9352. { 0x23, "Read Remote Extended Features",
  9353. remote_ext_features_complete_evt, 13, true },
  9354. { 0x2c, "Synchronous Connect Complete",
  9355. sync_conn_complete_evt, 17, true },
  9356. { 0x2d, "Synchronous Connect Changed",
  9357. sync_conn_changed_evt, 9, true },
  9358. { 0x2e, "Sniff Subrating",
  9359. sniff_subrating_evt, 11, true },
  9360. { 0x2f, "Extended Inquiry Result",
  9361. ext_inquiry_result_evt, 1, false },
  9362. { 0x30, "Encryption Key Refresh Complete",
  9363. encrypt_key_refresh_complete_evt, 3, true },
  9364. { 0x31, "IO Capability Request",
  9365. io_capability_request_evt, 6, true },
  9366. { 0x32, "IO Capability Response",
  9367. io_capability_response_evt, 9, true },
  9368. { 0x33, "User Confirmation Request",
  9369. user_confirm_request_evt, 10, true },
  9370. { 0x34, "User Passkey Request",
  9371. user_passkey_request_evt, 6, true },
  9372. { 0x35, "Remote OOB Data Request",
  9373. remote_oob_data_request_evt, 6, true },
  9374. { 0x36, "Simple Pairing Complete",
  9375. simple_pairing_complete_evt, 7, true },
  9376. { 0x38, "Link Supervision Timeout Changed",
  9377. link_supv_timeout_changed_evt, 4, true },
  9378. { 0x39, "Enhanced Flush Complete",
  9379. enhanced_flush_complete_evt, 2, true },
  9380. { 0x3b, "User Passkey Notification",
  9381. user_passkey_notify_evt, 10, true },
  9382. { 0x3c, "Keypress Notification",
  9383. keypress_notify_evt, 7, true },
  9384. { 0x3d, "Remote Host Supported Features",
  9385. remote_host_features_notify_evt, 14, true },
  9386. { 0x3e, "LE Meta Event",
  9387. le_meta_event_evt, 1, false },
  9388. { 0x40, "Physical Link Complete",
  9389. phy_link_complete_evt, 2, true },
  9390. { 0x41, "Channel Selected",
  9391. channel_selected_evt, 1, true },
  9392. { 0x42, "Disconnect Physical Link Complete",
  9393. disconn_phy_link_complete_evt, 3, true },
  9394. { 0x43, "Physical Link Loss Early Warning",
  9395. phy_link_loss_early_warning_evt, 2, true },
  9396. { 0x44, "Physical Link Recovery",
  9397. phy_link_recovery_evt, 1, true },
  9398. { 0x45, "Logical Link Complete",
  9399. logic_link_complete_evt, 5, true },
  9400. { 0x46, "Disconnect Logical Link Complete",
  9401. disconn_logic_link_complete_evt, 4, true },
  9402. { 0x47, "Flow Specification Modify Complete",
  9403. flow_spec_modify_complete_evt, 3, true },
  9404. { 0x48, "Number of Completed Data Blocks",
  9405. num_completed_data_blocks_evt, 3, false },
  9406. { 0x49, "AMP Start Test" },
  9407. { 0x4a, "AMP Test End" },
  9408. { 0x4b, "AMP Receiver Report" },
  9409. { 0x4c, "Short Range Mode Change Complete",
  9410. short_range_mode_change_evt, 3, true },
  9411. { 0x4d, "AMP Status Change",
  9412. amp_status_change_evt, 2, true },
  9413. { 0x4e, "Triggered Clock Capture",
  9414. triggered_clock_capture_evt, 9, true },
  9415. { 0x4f, "Synchronization Train Complete",
  9416. sync_train_complete_evt, 1, true },
  9417. { 0x50, "Synchronization Train Received",
  9418. sync_train_received_evt, 29, true },
  9419. { 0x51, "Connectionless Peripheral Broadcast Receive",
  9420. peripheral_broadcast_receive_evt, 18, false },
  9421. { 0x52, "Connectionless Peripheral Broadcast Timeout",
  9422. peripheral_broadcast_timeout_evt, 7, true },
  9423. { 0x53, "Truncated Page Complete",
  9424. truncated_page_complete_evt, 7, true },
  9425. { 0x54, "Peripheral Page Response Timeout",
  9426. peripheral_page_response_timeout_evt, 0, true },
  9427. { 0x55, "Connectionless Peripheral Broadcast Channel Map Change",
  9428. channel_map_change_evt, 10, true },
  9429. { 0x56, "Inquiry Response Notification",
  9430. inquiry_response_notify_evt, 4, true },
  9431. { 0x57, "Authenticated Payload Timeout Expired",
  9432. auth_payload_timeout_expired_evt, 2, true },
  9433. { 0x58, "SAM Status Change" },
  9434. { 0xfe, "Testing" },
  9435. { 0xff, "Vendor", vendor_evt, 0, false },
  9436. { }
  9437. };
  9438. void packet_new_index(struct timeval *tv, uint16_t index, const char *label,
  9439. uint8_t type, uint8_t bus, const char *name)
  9440. {
  9441. char details[48];
  9442. sprintf(details, "(%s,%s,%s)", hci_typetostr(type),
  9443. hci_bustostr(bus), name);
  9444. print_packet(tv, NULL, '=', index, NULL, COLOR_NEW_INDEX,
  9445. "New Index", label, details);
  9446. }
  9447. void packet_del_index(struct timeval *tv, uint16_t index, const char *label)
  9448. {
  9449. print_packet(tv, NULL, '=', index, NULL, COLOR_DEL_INDEX,
  9450. "Delete Index", label, NULL);
  9451. }
  9452. void packet_open_index(struct timeval *tv, uint16_t index, const char *label)
  9453. {
  9454. print_packet(tv, NULL, '=', index, NULL, COLOR_OPEN_INDEX,
  9455. "Open Index", label, NULL);
  9456. }
  9457. void packet_close_index(struct timeval *tv, uint16_t index, const char *label)
  9458. {
  9459. print_packet(tv, NULL, '=', index, NULL, COLOR_CLOSE_INDEX,
  9460. "Close Index", label, NULL);
  9461. }
  9462. void packet_index_info(struct timeval *tv, uint16_t index, const char *label,
  9463. uint16_t manufacturer)
  9464. {
  9465. char details[128];
  9466. sprintf(details, "(%s)", bt_compidtostr(manufacturer));
  9467. print_packet(tv, NULL, '=', index, NULL, COLOR_INDEX_INFO,
  9468. "Index Info", label, details);
  9469. }
  9470. void packet_vendor_diag(struct timeval *tv, uint16_t index,
  9471. uint16_t manufacturer,
  9472. const void *data, uint16_t size)
  9473. {
  9474. char extra_str[16];
  9475. sprintf(extra_str, "(len %d)", size);
  9476. print_packet(tv, NULL, '=', index, NULL, COLOR_VENDOR_DIAG,
  9477. "Vendor Diagnostic", NULL, extra_str);
  9478. switch (manufacturer) {
  9479. case 15:
  9480. broadcom_lm_diag(data, size);
  9481. break;
  9482. default:
  9483. packet_hexdump(data, size);
  9484. break;
  9485. }
  9486. }
  9487. void packet_system_note(struct timeval *tv, struct ucred *cred,
  9488. uint16_t index, const void *message)
  9489. {
  9490. print_packet(tv, cred, '=', index, NULL, COLOR_SYSTEM_NOTE,
  9491. "Note", message, NULL);
  9492. }
  9493. struct monitor_l2cap_hdr {
  9494. uint16_t cid;
  9495. uint16_t psm;
  9496. };
  9497. static void packet_decode(struct timeval *tv, struct ucred *cred, char dir,
  9498. uint16_t index, const char *color,
  9499. const char *label, const void *data,
  9500. uint16_t size)
  9501. {
  9502. const struct monitor_l2cap_hdr *hdr = data;
  9503. if (size < sizeof(*hdr)) {
  9504. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  9505. "Malformed User Data packet", NULL, NULL);
  9506. }
  9507. print_packet(tv, cred, dir, index, NULL, COLOR_HCI_ACLDATA, label,
  9508. dir == '>' ? "User Data RX" : "User Data TX",
  9509. NULL);
  9510. /* Discard last byte since it just a filler */
  9511. l2cap_frame(index, dir == '>', 0, hdr->cid, hdr->psm,
  9512. data + sizeof(*hdr), size - (sizeof(*hdr) + 1));
  9513. }
  9514. void packet_user_logging(struct timeval *tv, struct ucred *cred,
  9515. uint16_t index, uint8_t priority,
  9516. const char *ident, const void *data,
  9517. uint16_t size)
  9518. {
  9519. char pid_str[140];
  9520. const char *label;
  9521. const char *color;
  9522. if (priority > priority_level)
  9523. return;
  9524. switch (priority) {
  9525. case BTSNOOP_PRIORITY_ERR:
  9526. color = COLOR_ERROR;
  9527. break;
  9528. case BTSNOOP_PRIORITY_WARNING:
  9529. color = COLOR_WARN;
  9530. break;
  9531. case BTSNOOP_PRIORITY_INFO:
  9532. color = COLOR_INFO;
  9533. break;
  9534. case BTSNOOP_PRIORITY_DEBUG:
  9535. color = COLOR_DEBUG;
  9536. break;
  9537. default:
  9538. color = COLOR_WHITE_BG;
  9539. break;
  9540. }
  9541. if (cred) {
  9542. char *path = alloca(24);
  9543. char line[128];
  9544. FILE *fp;
  9545. snprintf(path, 23, "/proc/%u/comm", cred->pid);
  9546. fp = fopen(path, "re");
  9547. if (fp) {
  9548. if (fgets(line, sizeof(line), fp)) {
  9549. line[strcspn(line, "\r\n")] = '\0';
  9550. snprintf(pid_str, sizeof(pid_str), "%s[%u]",
  9551. line, cred->pid);
  9552. } else
  9553. snprintf(pid_str, sizeof(pid_str), "%u",
  9554. cred->pid);
  9555. fclose(fp);
  9556. } else
  9557. snprintf(pid_str, sizeof(pid_str), "%u", cred->pid);
  9558. label = pid_str;
  9559. } else {
  9560. if (ident)
  9561. label = ident;
  9562. else
  9563. label = "Message";
  9564. }
  9565. if (ident && (ident[0] == '<' || ident[0] == '>')) {
  9566. packet_decode(tv, cred, ident[0], index, color,
  9567. label == ident ? &ident[2] : label,
  9568. data, size);
  9569. return;
  9570. }
  9571. print_packet(tv, cred, '=', index, NULL, color, label, data, NULL);
  9572. }
  9573. void packet_hci_command(struct timeval *tv, struct ucred *cred, uint16_t index,
  9574. const void *data, uint16_t size)
  9575. {
  9576. const hci_command_hdr *hdr = data;
  9577. uint16_t opcode = le16_to_cpu(hdr->opcode);
  9578. uint16_t ogf = cmd_opcode_ogf(opcode);
  9579. uint16_t ocf = cmd_opcode_ocf(opcode);
  9580. struct opcode_data vendor_data;
  9581. const struct opcode_data *opcode_data = NULL;
  9582. const char *opcode_color, *opcode_str;
  9583. char extra_str[25], vendor_str[150];
  9584. int i;
  9585. if (index >= MAX_INDEX) {
  9586. print_field("Invalid index (%d).", index);
  9587. return;
  9588. }
  9589. index_list[index].frame++;
  9590. if (size < HCI_COMMAND_HDR_SIZE || size > BTSNOOP_MAX_PACKET_SIZE) {
  9591. sprintf(extra_str, "(len %d)", size);
  9592. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  9593. "Malformed HCI Command packet", NULL, extra_str);
  9594. return;
  9595. }
  9596. data += HCI_COMMAND_HDR_SIZE;
  9597. size -= HCI_COMMAND_HDR_SIZE;
  9598. for (i = 0; opcode_table[i].str; i++) {
  9599. if (opcode_table[i].opcode == opcode) {
  9600. opcode_data = &opcode_table[i];
  9601. break;
  9602. }
  9603. }
  9604. if (opcode_data) {
  9605. if (opcode_data->cmd_func)
  9606. opcode_color = COLOR_HCI_COMMAND;
  9607. else
  9608. opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
  9609. opcode_str = opcode_data->str;
  9610. } else {
  9611. if (ogf == 0x3f) {
  9612. const struct vendor_ocf *vnd = current_vendor_ocf(ocf);
  9613. if (vnd) {
  9614. const char *str = current_vendor_str();
  9615. if (str) {
  9616. snprintf(vendor_str, sizeof(vendor_str),
  9617. "%s %s", str, vnd->str);
  9618. vendor_data.str = vendor_str;
  9619. } else
  9620. vendor_data.str = vnd->str;
  9621. vendor_data.cmd_func = vnd->cmd_func;
  9622. vendor_data.cmd_size = vnd->cmd_size;
  9623. vendor_data.cmd_fixed = vnd->cmd_fixed;
  9624. opcode_data = &vendor_data;
  9625. if (opcode_data->cmd_func)
  9626. opcode_color = COLOR_HCI_COMMAND;
  9627. else
  9628. opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
  9629. opcode_str = opcode_data->str;
  9630. } else {
  9631. opcode_color = COLOR_HCI_COMMAND;
  9632. opcode_str = "Vendor";
  9633. }
  9634. } else {
  9635. opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
  9636. opcode_str = "Unknown";
  9637. }
  9638. }
  9639. sprintf(extra_str, "(0x%2.2x|0x%4.4x) plen %d", ogf, ocf, hdr->plen);
  9640. print_packet(tv, cred, '<', index, NULL, opcode_color, "HCI Command",
  9641. opcode_str, extra_str);
  9642. if (!opcode_data || !opcode_data->cmd_func) {
  9643. packet_hexdump(data, size);
  9644. return;
  9645. }
  9646. if (size != hdr->plen) {
  9647. print_text(COLOR_ERROR, "invalid packet size (%u != %u)", size,
  9648. hdr->plen);
  9649. packet_hexdump(data, size);
  9650. return;
  9651. }
  9652. if (opcode_data->cmd_fixed) {
  9653. if (hdr->plen != opcode_data->cmd_size) {
  9654. print_text(COLOR_ERROR, "invalid packet size");
  9655. packet_hexdump(data, size);
  9656. return;
  9657. }
  9658. } else {
  9659. if (hdr->plen < opcode_data->cmd_size) {
  9660. print_text(COLOR_ERROR, "too short packet");
  9661. packet_hexdump(data, size);
  9662. return;
  9663. }
  9664. }
  9665. opcode_data->cmd_func(data, hdr->plen);
  9666. }
  9667. void packet_hci_event(struct timeval *tv, struct ucred *cred, uint16_t index,
  9668. const void *data, uint16_t size)
  9669. {
  9670. const hci_event_hdr *hdr = data;
  9671. const struct event_data *event_data = NULL;
  9672. const char *event_color, *event_str;
  9673. char extra_str[25];
  9674. int i;
  9675. if (index >= MAX_INDEX) {
  9676. print_field("Invalid index (%d).", index);
  9677. return;
  9678. }
  9679. index_list[index].frame++;
  9680. if (size < HCI_EVENT_HDR_SIZE) {
  9681. sprintf(extra_str, "(len %d)", size);
  9682. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  9683. "Malformed HCI Event packet", NULL, extra_str);
  9684. packet_hexdump(data, size);
  9685. return;
  9686. }
  9687. data += HCI_EVENT_HDR_SIZE;
  9688. size -= HCI_EVENT_HDR_SIZE;
  9689. for (i = 0; event_table[i].str; i++) {
  9690. if (event_table[i].event == hdr->evt) {
  9691. event_data = &event_table[i];
  9692. break;
  9693. }
  9694. }
  9695. if (event_data) {
  9696. if (event_data->func)
  9697. event_color = COLOR_HCI_EVENT;
  9698. else
  9699. event_color = COLOR_HCI_EVENT_UNKNOWN;
  9700. event_str = event_data->str;
  9701. } else {
  9702. event_color = COLOR_HCI_EVENT_UNKNOWN;
  9703. event_str = "Unknown";
  9704. }
  9705. sprintf(extra_str, "(0x%2.2x) plen %d", hdr->evt, hdr->plen);
  9706. print_packet(tv, cred, '>', index, NULL, event_color, "HCI Event",
  9707. event_str, extra_str);
  9708. if (!event_data || !event_data->func) {
  9709. packet_hexdump(data, size);
  9710. return;
  9711. }
  9712. if (size != hdr->plen) {
  9713. print_text(COLOR_ERROR, "invalid packet size (%u != %u)", size,
  9714. hdr->plen);
  9715. packet_hexdump(data, size);
  9716. return;
  9717. }
  9718. if (event_data->fixed) {
  9719. if (hdr->plen != event_data->size) {
  9720. print_text(COLOR_ERROR, "invalid packet size");
  9721. packet_hexdump(data, size);
  9722. return;
  9723. }
  9724. } else {
  9725. if (hdr->plen < event_data->size) {
  9726. print_text(COLOR_ERROR, "too short packet");
  9727. packet_hexdump(data, size);
  9728. return;
  9729. }
  9730. }
  9731. event_data->func(data, hdr->plen);
  9732. }
  9733. void packet_hci_acldata(struct timeval *tv, struct ucred *cred, uint16_t index,
  9734. bool in, const void *data, uint16_t size)
  9735. {
  9736. const struct bt_hci_acl_hdr *hdr = data;
  9737. uint16_t handle = le16_to_cpu(hdr->handle);
  9738. uint16_t dlen = le16_to_cpu(hdr->dlen);
  9739. uint8_t flags = acl_flags(handle);
  9740. char handle_str[16], extra_str[32];
  9741. if (index >= MAX_INDEX) {
  9742. print_field("Invalid index (%d).", index);
  9743. return;
  9744. }
  9745. index_list[index].frame++;
  9746. if (size < HCI_ACL_HDR_SIZE) {
  9747. if (in)
  9748. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  9749. "Malformed ACL Data RX packet", NULL, NULL);
  9750. else
  9751. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  9752. "Malformed ACL Data TX packet", NULL, NULL);
  9753. packet_hexdump(data, size);
  9754. return;
  9755. }
  9756. data += HCI_ACL_HDR_SIZE;
  9757. size -= HCI_ACL_HDR_SIZE;
  9758. sprintf(handle_str, "Handle %d", acl_handle(handle));
  9759. sprintf(extra_str, "flags 0x%2.2x dlen %d", flags, dlen);
  9760. print_packet(tv, cred, in ? '>' : '<', index, NULL, COLOR_HCI_ACLDATA,
  9761. in ? "ACL Data RX" : "ACL Data TX",
  9762. handle_str, extra_str);
  9763. if (size != dlen) {
  9764. print_text(COLOR_ERROR, "invalid packet size (%d != %d)",
  9765. size, dlen);
  9766. packet_hexdump(data, size);
  9767. return;
  9768. }
  9769. if (filter_mask & PACKET_FILTER_SHOW_ACL_DATA)
  9770. packet_hexdump(data, size);
  9771. l2cap_packet(index, in, acl_handle(handle), flags, data, size);
  9772. }
  9773. void packet_hci_scodata(struct timeval *tv, struct ucred *cred, uint16_t index,
  9774. bool in, const void *data, uint16_t size)
  9775. {
  9776. const hci_sco_hdr *hdr = data;
  9777. uint16_t handle = le16_to_cpu(hdr->handle);
  9778. uint8_t flags = acl_flags(handle);
  9779. char handle_str[16], extra_str[32];
  9780. if (index >= MAX_INDEX) {
  9781. print_field("Invalid index (%d).", index);
  9782. return;
  9783. }
  9784. index_list[index].frame++;
  9785. if (size < HCI_SCO_HDR_SIZE) {
  9786. if (in)
  9787. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  9788. "Malformed SCO Data RX packet", NULL, NULL);
  9789. else
  9790. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  9791. "Malformed SCO Data TX packet", NULL, NULL);
  9792. packet_hexdump(data, size);
  9793. return;
  9794. }
  9795. data += HCI_SCO_HDR_SIZE;
  9796. size -= HCI_SCO_HDR_SIZE;
  9797. sprintf(handle_str, "Handle %d", acl_handle(handle));
  9798. sprintf(extra_str, "flags 0x%2.2x dlen %d", flags, hdr->dlen);
  9799. print_packet(tv, cred, in ? '>' : '<', index, NULL, COLOR_HCI_SCODATA,
  9800. in ? "SCO Data RX" : "SCO Data TX",
  9801. handle_str, extra_str);
  9802. if (size != hdr->dlen) {
  9803. print_text(COLOR_ERROR, "invalid packet size (%d != %d)",
  9804. size, hdr->dlen);
  9805. packet_hexdump(data, size);
  9806. return;
  9807. }
  9808. if (filter_mask & PACKET_FILTER_SHOW_SCO_DATA)
  9809. packet_hexdump(data, size);
  9810. }
  9811. void packet_hci_isodata(struct timeval *tv, struct ucred *cred, uint16_t index,
  9812. bool in, const void *data, uint16_t size)
  9813. {
  9814. const struct bt_hci_iso_hdr *hdr = data;
  9815. uint16_t handle = le16_to_cpu(hdr->handle);
  9816. uint8_t flags = acl_flags(handle);
  9817. char handle_str[16], extra_str[32];
  9818. if (index >= MAX_INDEX) {
  9819. print_field("Invalid index (%d).", index);
  9820. return;
  9821. }
  9822. index_list[index].frame++;
  9823. if (size < sizeof(*hdr)) {
  9824. if (in)
  9825. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  9826. "Malformed ISO Data RX packet", NULL, NULL);
  9827. else
  9828. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  9829. "Malformed ISO Data TX packet", NULL, NULL);
  9830. packet_hexdump(data, size);
  9831. return;
  9832. }
  9833. data += sizeof(*hdr);
  9834. size -= sizeof(*hdr);
  9835. sprintf(handle_str, "Handle %d", acl_handle(handle));
  9836. sprintf(extra_str, "flags 0x%2.2x dlen %d", flags, hdr->dlen);
  9837. print_packet(tv, cred, in ? '>' : '<', index, NULL, COLOR_HCI_SCODATA,
  9838. in ? "ISO Data RX" : "ISO Data TX",
  9839. handle_str, extra_str);
  9840. if (size != hdr->dlen) {
  9841. print_text(COLOR_ERROR, "invalid packet size (%d != %d)",
  9842. size, hdr->dlen);
  9843. packet_hexdump(data, size);
  9844. return;
  9845. }
  9846. if (filter_mask & PACKET_FILTER_SHOW_SCO_DATA)
  9847. packet_hexdump(data, size);
  9848. }
  9849. void packet_ctrl_open(struct timeval *tv, struct ucred *cred, uint16_t index,
  9850. const void *data, uint16_t size)
  9851. {
  9852. uint32_t cookie;
  9853. uint16_t format;
  9854. char channel[11];
  9855. if (size < 6) {
  9856. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  9857. "Malformed Control Open packet", NULL, NULL);
  9858. packet_hexdump(data, size);
  9859. return;
  9860. }
  9861. cookie = get_le32(data);
  9862. format = get_le16(data + 4);
  9863. data += 6;
  9864. size -= 6;
  9865. sprintf(channel, "0x%4.4x", cookie);
  9866. if ((format == CTRL_RAW || format == CTRL_USER || format == CTRL_MGMT)
  9867. && size >= 8) {
  9868. uint8_t version;
  9869. uint16_t revision;
  9870. uint32_t flags;
  9871. uint8_t ident_len;
  9872. const char *comm;
  9873. char details[48];
  9874. const char *title;
  9875. version = get_u8(data);
  9876. revision = get_le16(data + 1);
  9877. flags = get_le32(data + 3);
  9878. ident_len = get_u8(data + 7);
  9879. if ((8 + ident_len) > size) {
  9880. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  9881. "Malformed Control Open packet", NULL, NULL);
  9882. return;
  9883. }
  9884. data += 8;
  9885. size -= 8;
  9886. comm = ident_len > 0 ? data : "unknown";
  9887. data += ident_len;
  9888. size -= ident_len;
  9889. assign_ctrl(cookie, format, comm);
  9890. sprintf(details, "%sversion %u.%u",
  9891. flags & 0x0001 ? "(privileged) " : "",
  9892. version, revision);
  9893. switch (format) {
  9894. case CTRL_RAW:
  9895. title = "RAW Open";
  9896. break;
  9897. case CTRL_USER:
  9898. title = "USER Open";
  9899. break;
  9900. case CTRL_MGMT:
  9901. title = "MGMT Open";
  9902. break;
  9903. default:
  9904. title = "Control Open";
  9905. break;
  9906. }
  9907. print_packet(tv, cred, '@', index, channel, COLOR_CTRL_OPEN,
  9908. title, comm, details);
  9909. } else {
  9910. char label[7];
  9911. assign_ctrl(cookie, format, NULL);
  9912. sprintf(label, "0x%4.4x", format);
  9913. print_packet(tv, cred, '@', index, channel, COLOR_CTRL_OPEN,
  9914. "Control Open", label, NULL);
  9915. }
  9916. packet_hexdump(data, size);
  9917. }
  9918. void packet_ctrl_close(struct timeval *tv, struct ucred *cred, uint16_t index,
  9919. const void *data, uint16_t size)
  9920. {
  9921. uint32_t cookie;
  9922. uint16_t format;
  9923. char channel[11], label[22];
  9924. const char *title;
  9925. if (size < 4) {
  9926. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  9927. "Malformed Control Close packet", NULL, NULL);
  9928. packet_hexdump(data, size);
  9929. return;
  9930. }
  9931. cookie = get_le32(data);
  9932. data += 4;
  9933. size -= 4;
  9934. sprintf(channel, "0x%4.4x", cookie);
  9935. release_ctrl(cookie, &format, label);
  9936. switch (format) {
  9937. case CTRL_RAW:
  9938. title = "RAW Close";
  9939. break;
  9940. case CTRL_USER:
  9941. title = "USER Close";
  9942. break;
  9943. case CTRL_MGMT:
  9944. title = "MGMT Close";
  9945. break;
  9946. default:
  9947. sprintf(label, "0x%4.4x", format);
  9948. title = "Control Close";
  9949. break;
  9950. }
  9951. print_packet(tv, cred, '@', index, channel, COLOR_CTRL_CLOSE,
  9952. title, label, NULL);
  9953. packet_hexdump(data, size);
  9954. }
  9955. static const struct {
  9956. uint8_t status;
  9957. const char *str;
  9958. } mgmt_status_table[] = {
  9959. { 0x00, "Success" },
  9960. { 0x01, "Unknown Command" },
  9961. { 0x02, "Not Connected" },
  9962. { 0x03, "Failed" },
  9963. { 0x04, "Connect Failed" },
  9964. { 0x05, "Authentication Failed" },
  9965. { 0x06, "Not Paired" },
  9966. { 0x07, "No Resources" },
  9967. { 0x08, "Timeout" },
  9968. { 0x09, "Already Connected" },
  9969. { 0x0a, "Busy" },
  9970. { 0x0b, "Rejected" },
  9971. { 0x0c, "Not Supported" },
  9972. { 0x0d, "Invalid Parameters" },
  9973. { 0x0e, "Disconnected" },
  9974. { 0x0f, "Not Powered" },
  9975. { 0x10, "Cancelled" },
  9976. { 0x11, "Invalid Index" },
  9977. { 0x12, "RFKilled" },
  9978. { 0x13, "Already Paired" },
  9979. { 0x14, "Permission Denied" },
  9980. { }
  9981. };
  9982. static void mgmt_print_status(uint8_t status)
  9983. {
  9984. const char *str = "Unknown";
  9985. const char *color_on, *color_off;
  9986. bool unknown = true;
  9987. int i;
  9988. for (i = 0; mgmt_status_table[i].str; i++) {
  9989. if (mgmt_status_table[i].status == status) {
  9990. str = mgmt_status_table[i].str;
  9991. unknown = false;
  9992. break;
  9993. }
  9994. }
  9995. if (use_color()) {
  9996. if (status) {
  9997. if (unknown)
  9998. color_on = COLOR_UNKNOWN_ERROR;
  9999. else
  10000. color_on = COLOR_RED;
  10001. } else
  10002. color_on = COLOR_GREEN;
  10003. color_off = COLOR_OFF;
  10004. } else {
  10005. color_on = "";
  10006. color_off = "";
  10007. }
  10008. print_field("Status: %s%s%s (0x%2.2x)",
  10009. color_on, str, color_off, status);
  10010. }
  10011. static void mgmt_print_address(const uint8_t *address, uint8_t type)
  10012. {
  10013. switch (type) {
  10014. case 0x00:
  10015. print_addr_resolve("BR/EDR Address", address, 0x00, false);
  10016. break;
  10017. case 0x01:
  10018. print_addr_resolve("LE Address", address, 0x00, false);
  10019. break;
  10020. case 0x02:
  10021. print_addr_resolve("LE Address", address, 0x01, false);
  10022. break;
  10023. default:
  10024. print_addr_resolve("Address", address, 0xff, false);
  10025. break;
  10026. }
  10027. }
  10028. static const struct bitfield_data mgmt_address_type_table[] = {
  10029. { 0, "BR/EDR" },
  10030. { 1, "LE Public" },
  10031. { 2, "LE Random" },
  10032. { }
  10033. };
  10034. static void mgmt_print_address_type(uint8_t type)
  10035. {
  10036. uint8_t mask;
  10037. print_field("Address type: 0x%2.2x", type);
  10038. mask = print_bitfield(2, type, mgmt_address_type_table);
  10039. if (mask)
  10040. print_text(COLOR_UNKNOWN_ADDRESS_TYPE, " Unknown address type"
  10041. " (0x%2.2x)", mask);
  10042. }
  10043. static void mgmt_print_version(uint8_t version)
  10044. {
  10045. packet_print_version("Version", version, NULL, 0x0000);
  10046. }
  10047. static void mgmt_print_manufacturer(uint16_t manufacturer)
  10048. {
  10049. packet_print_company("Manufacturer", manufacturer);
  10050. }
  10051. static const struct bitfield_data mgmt_options_table[] = {
  10052. { 0, "External configuration" },
  10053. { 1, "Bluetooth public address configuration" },
  10054. { }
  10055. };
  10056. static void mgmt_print_options(const char *label, uint32_t options)
  10057. {
  10058. uint32_t mask;
  10059. print_field("%s: 0x%8.8x", label, options);
  10060. mask = print_bitfield(2, options, mgmt_options_table);
  10061. if (mask)
  10062. print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Unknown options"
  10063. " (0x%8.8x)", mask);
  10064. }
  10065. static const struct bitfield_data mgmt_settings_table[] = {
  10066. { 0, "Powered" },
  10067. { 1, "Connectable" },
  10068. { 2, "Fast Connectable" },
  10069. { 3, "Discoverable" },
  10070. { 4, "Bondable" },
  10071. { 5, "Link Security" },
  10072. { 6, "Secure Simple Pairing" },
  10073. { 7, "BR/EDR" },
  10074. { 8, "High Speed" },
  10075. { 9, "Low Energy" },
  10076. { 10, "Advertising" },
  10077. { 11, "Secure Connections" },
  10078. { 12, "Debug Keys" },
  10079. { 13, "Privacy" },
  10080. { 14, "Controller Configuration"},
  10081. { 15, "Static Address" },
  10082. { 16, "PHY Configuration" },
  10083. { 17, "Wideband Speech" },
  10084. { }
  10085. };
  10086. static void mgmt_print_settings(const char *label, uint32_t settings)
  10087. {
  10088. uint32_t mask;
  10089. print_field("%s: 0x%8.8x", label, settings);
  10090. mask = print_bitfield(2, settings, mgmt_settings_table);
  10091. if (mask)
  10092. print_text(COLOR_UNKNOWN_SETTINGS_BIT, " Unknown settings"
  10093. " (0x%8.8x)", mask);
  10094. }
  10095. static void mgmt_print_name(const void *data)
  10096. {
  10097. print_field("Name: %s", (char *) data);
  10098. print_field("Short name: %s", (char *) (data + 249));
  10099. }
  10100. static void mgmt_print_io_capability(uint8_t capability)
  10101. {
  10102. const char *str;
  10103. switch (capability) {
  10104. case 0x00:
  10105. str = "DisplayOnly";
  10106. break;
  10107. case 0x01:
  10108. str = "DisplayYesNo";
  10109. break;
  10110. case 0x02:
  10111. str = "KeyboardOnly";
  10112. break;
  10113. case 0x03:
  10114. str = "NoInputNoOutput";
  10115. break;
  10116. case 0x04:
  10117. str = "KeyboardDisplay";
  10118. break;
  10119. default:
  10120. str = "Reserved";
  10121. break;
  10122. }
  10123. print_field("Capability: %s (0x%2.2x)", str, capability);
  10124. }
  10125. static const struct bitfield_data mgmt_device_flags_table[] = {
  10126. { 0, "Confirm Name" },
  10127. { 1, "Legacy Pairing" },
  10128. { 2, "Not Connectable" },
  10129. { 3, "Connection Locally Initiated" },
  10130. { }
  10131. };
  10132. static void mgmt_print_device_flags(uint32_t flags)
  10133. {
  10134. uint32_t mask;
  10135. print_field("Flags: 0x%8.8x", flags);
  10136. mask = print_bitfield(2, flags, mgmt_device_flags_table);
  10137. if (mask)
  10138. print_text(COLOR_UNKNOWN_DEVICE_FLAG, " Unknown device flag"
  10139. " (0x%8.8x)", mask);
  10140. }
  10141. static void mgmt_print_device_action(uint8_t action)
  10142. {
  10143. const char *str;
  10144. switch (action) {
  10145. case 0x00:
  10146. str = "Background scan for device";
  10147. break;
  10148. case 0x01:
  10149. str = "Allow incoming connection";
  10150. break;
  10151. case 0x02:
  10152. str = "Auto-connect remote device";
  10153. break;
  10154. default:
  10155. str = "Reserved";
  10156. break;
  10157. }
  10158. print_field("Action: %s (0x%2.2x)", str, action);
  10159. }
  10160. static const struct bitfield_data mgmt_adv_flags_table[] = {
  10161. { 0, "Switch into Connectable mode" },
  10162. { 1, "Advertise as Discoverable" },
  10163. { 2, "Advertise as Limited Discoverable" },
  10164. { 3, "Add Flags field to Advertising Data" },
  10165. { 4, "Add TX Power field to Advertising Data" },
  10166. { 5, "Add Appearance field to Scan Response" },
  10167. { 6, "Add Local Name in Scan Response" },
  10168. { 7, "Advertise in 1M on Secondary channel" },
  10169. { 8, "Advertise in 2M on Secondary channel" },
  10170. { 9, "Advertise in CODED on Secondary channel" },
  10171. { 12, "Use provided duration parameter" },
  10172. { 13, "Use provided timeout parameter" },
  10173. { 14, "Use provided interval parameters" },
  10174. { 15, "Use provided tx power parameter" },
  10175. { }
  10176. };
  10177. #define MGMT_ADV_PARAM_DURATION (1 << 12)
  10178. #define MGMT_ADV_PARAM_TIMEOUT (1 << 13)
  10179. #define MGMT_ADV_PARAM_INTERVALS (1 << 14)
  10180. #define MGMT_ADV_PARAM_TX_POWER (1 << 15)
  10181. static void mgmt_print_adv_flags(uint32_t flags)
  10182. {
  10183. uint32_t mask;
  10184. print_field("Flags: 0x%8.8x", flags);
  10185. mask = print_bitfield(2, flags, mgmt_adv_flags_table);
  10186. if (mask)
  10187. print_text(COLOR_UNKNOWN_ADV_FLAG, " Unknown advertising flag"
  10188. " (0x%8.8x)", mask);
  10189. }
  10190. static void mgmt_print_store_hint(uint8_t hint)
  10191. {
  10192. const char *str;
  10193. switch (hint) {
  10194. case 0x00:
  10195. str = "No";
  10196. break;
  10197. case 0x01:
  10198. str = "Yes";
  10199. break;
  10200. default:
  10201. str = "Reserved";
  10202. break;
  10203. }
  10204. print_field("Store hint: %s (0x%2.2x)", str, hint);
  10205. }
  10206. static void mgmt_print_connection_parameter(const void *data)
  10207. {
  10208. uint8_t address_type = get_u8(data + 6);
  10209. uint16_t min_conn_interval = get_le16(data + 7);
  10210. uint16_t max_conn_interval = get_le16(data + 9);
  10211. uint16_t conn_latency = get_le16(data + 11);
  10212. uint16_t supv_timeout = get_le16(data + 13);
  10213. mgmt_print_address(data, address_type);
  10214. print_field("Min connection interval: %u", min_conn_interval);
  10215. print_field("Max connection interval: %u", max_conn_interval);
  10216. print_conn_latency("Connection latency", conn_latency);
  10217. print_field("Supervision timeout: %u", supv_timeout);
  10218. }
  10219. static void mgmt_print_link_key(const void *data)
  10220. {
  10221. uint8_t address_type = get_u8(data + 6);
  10222. uint8_t key_type = get_u8(data + 7);
  10223. uint8_t pin_len = get_u8(data + 24);
  10224. mgmt_print_address(data, address_type);
  10225. print_key_type(key_type);
  10226. print_link_key(data + 8);
  10227. print_field("PIN length: %d", pin_len);
  10228. }
  10229. static void mgmt_print_long_term_key(const void *data)
  10230. {
  10231. uint8_t address_type = get_u8(data + 6);
  10232. uint8_t key_type = get_u8(data + 7);
  10233. uint8_t central = get_u8(data + 8);
  10234. uint8_t enc_size = get_u8(data + 9);
  10235. const char *str;
  10236. mgmt_print_address(data, address_type);
  10237. switch (key_type) {
  10238. case 0x00:
  10239. str = "Unauthenticated legacy key";
  10240. break;
  10241. case 0x01:
  10242. str = "Authenticated legacy key";
  10243. break;
  10244. case 0x02:
  10245. str = "Unauthenticated key from P-256";
  10246. break;
  10247. case 0x03:
  10248. str = "Authenticated key from P-256";
  10249. break;
  10250. case 0x04:
  10251. str = "Debug key from P-256";
  10252. break;
  10253. default:
  10254. str = "Reserved";
  10255. break;
  10256. }
  10257. print_field("Key type: %s (0x%2.2x)", str, key_type);
  10258. print_field("Central: 0x%2.2x", central);
  10259. print_field("Encryption size: %u", enc_size);
  10260. print_hex_field("Diversifier", data + 10, 2);
  10261. print_hex_field("Randomizer", data + 12, 8);
  10262. print_hex_field("Key", data + 20, 16);
  10263. }
  10264. static void mgmt_print_identity_resolving_key(const void *data)
  10265. {
  10266. uint8_t address_type = get_u8(data + 6);
  10267. mgmt_print_address(data, address_type);
  10268. print_hex_field("Key", data + 7, 16);
  10269. }
  10270. static void mgmt_print_signature_resolving_key(const void *data)
  10271. {
  10272. uint8_t address_type = get_u8(data + 6);
  10273. uint8_t key_type = get_u8(data + 7);
  10274. const char *str;
  10275. mgmt_print_address(data, address_type);
  10276. switch (key_type) {
  10277. case 0x00:
  10278. str = "Unauthenticated local CSRK";
  10279. break;
  10280. case 0x01:
  10281. str = "Unauthenticated remote CSRK";
  10282. break;
  10283. case 0x02:
  10284. str = "Authenticated local CSRK";
  10285. break;
  10286. case 0x03:
  10287. str = "Authenticated remote CSRK";
  10288. break;
  10289. default:
  10290. str = "Reserved";
  10291. break;
  10292. }
  10293. print_field("Key type: %s (0x%2.2x)", str, key_type);
  10294. print_hex_field("Key", data + 8, 16);
  10295. }
  10296. static void mgmt_print_oob_data(const void *data)
  10297. {
  10298. print_hash_p192(data);
  10299. print_randomizer_p192(data + 16);
  10300. print_hash_p256(data + 32);
  10301. print_randomizer_p256(data + 48);
  10302. }
  10303. static const struct bitfield_data mgmt_exp_feature_flags_table[] = {
  10304. { 0, "Active" },
  10305. { 1, "Settings change" },
  10306. { }
  10307. };
  10308. static void mgmt_print_exp_feature(const void *data)
  10309. {
  10310. uint32_t flags = get_le32(data + 16);
  10311. uint32_t mask;
  10312. print_field("UUID: %s", bt_uuid128_to_str(data));
  10313. print_field("Flags: 0x%8.8x", flags);
  10314. mask = print_bitfield(2, flags, mgmt_exp_feature_flags_table);
  10315. if (mask)
  10316. print_text(COLOR_UNKNOWN_EXP_FEATURE_FLAG,
  10317. " Unknown feature flag (0x%8.8x)", mask);
  10318. }
  10319. static void mgmt_null_cmd(const void *data, uint16_t size)
  10320. {
  10321. }
  10322. static void mgmt_null_rsp(const void *data, uint16_t size)
  10323. {
  10324. }
  10325. static void mgmt_read_version_info_rsp(const void *data, uint16_t size)
  10326. {
  10327. uint8_t version;
  10328. uint16_t revision;
  10329. version = get_u8(data);
  10330. revision = get_le16(data + 1);
  10331. print_field("Version: %u.%u", version, revision);
  10332. }
  10333. static void mgmt_print_commands(const void *data, uint16_t num);
  10334. static void mgmt_print_events(const void *data, uint16_t num);
  10335. static void mgmt_read_supported_commands_rsp(const void *data, uint16_t size)
  10336. {
  10337. uint16_t num_commands = get_le16(data);
  10338. uint16_t num_events = get_le16(data + 2);
  10339. if (size - 4 != (num_commands * 2) + (num_events *2)) {
  10340. packet_hexdump(data, size);
  10341. return;
  10342. }
  10343. mgmt_print_commands(data + 4, num_commands);
  10344. mgmt_print_events(data + 4 + num_commands * 2, num_events);
  10345. }
  10346. static void mgmt_read_index_list_rsp(const void *data, uint16_t size)
  10347. {
  10348. uint16_t num_controllers = get_le16(data);
  10349. int i;
  10350. print_field("Controllers: %u", num_controllers);
  10351. if (size - 2 != num_controllers * 2) {
  10352. packet_hexdump(data + 2, size - 2);
  10353. return;
  10354. }
  10355. for (i = 0; i < num_controllers; i++) {
  10356. uint16_t index = get_le16(data + 2 + (i * 2));
  10357. print_field(" hci%u", index);
  10358. }
  10359. }
  10360. static void mgmt_read_controller_info_rsp(const void *data, uint16_t size)
  10361. {
  10362. uint8_t version = get_u8(data + 6);
  10363. uint16_t manufacturer = get_le16(data + 7);
  10364. uint32_t supported_settings = get_le32(data + 9);
  10365. uint32_t current_settings = get_le32(data + 13);
  10366. print_addr_resolve("Address", data, 0x00, false);
  10367. mgmt_print_version(version);
  10368. mgmt_print_manufacturer(manufacturer);
  10369. mgmt_print_settings("Supported settings", supported_settings);
  10370. mgmt_print_settings("Current settings", current_settings);
  10371. print_dev_class(data + 17);
  10372. mgmt_print_name(data + 20);
  10373. }
  10374. static void mgmt_set_powered_cmd(const void *data, uint16_t size)
  10375. {
  10376. uint8_t enable = get_u8(data);
  10377. print_enable("Powered", enable);
  10378. }
  10379. static void mgmt_set_discoverable_cmd(const void *data, uint16_t size)
  10380. {
  10381. uint8_t enable = get_u8(data);
  10382. uint16_t timeout = get_le16(data + 1);
  10383. const char *str;
  10384. switch (enable) {
  10385. case 0x00:
  10386. str = "Disabled";
  10387. break;
  10388. case 0x01:
  10389. str = "General";
  10390. break;
  10391. case 0x02:
  10392. str = "Limited";
  10393. break;
  10394. default:
  10395. str = "Reserved";
  10396. break;
  10397. }
  10398. print_field("Discoverable: %s (0x%2.2x)", str, enable);
  10399. print_field("Timeout: %u", timeout);
  10400. }
  10401. static void mgmt_set_connectable_cmd(const void *data, uint16_t size)
  10402. {
  10403. uint8_t enable = get_u8(data);
  10404. print_enable("Connectable", enable);
  10405. }
  10406. static void mgmt_set_fast_connectable_cmd(const void *data, uint16_t size)
  10407. {
  10408. uint8_t enable = get_u8(data);
  10409. print_enable("Fast Connectable", enable);
  10410. }
  10411. static void mgmt_set_bondable_cmd(const void *data, uint16_t size)
  10412. {
  10413. uint8_t enable = get_u8(data);
  10414. print_enable("Bondable", enable);
  10415. }
  10416. static void mgmt_set_link_security_cmd(const void *data, uint16_t size)
  10417. {
  10418. uint8_t enable = get_u8(data);
  10419. print_enable("Link Security", enable);
  10420. }
  10421. static void mgmt_set_secure_simple_pairing_cmd(const void *data, uint16_t size)
  10422. {
  10423. uint8_t enable = get_u8(data);
  10424. print_enable("Secure Simple Pairing", enable);
  10425. }
  10426. static void mgmt_set_high_speed_cmd(const void *data, uint16_t size)
  10427. {
  10428. uint8_t enable = get_u8(data);
  10429. print_enable("High Speed", enable);
  10430. }
  10431. static void mgmt_set_low_energy_cmd(const void *data, uint16_t size)
  10432. {
  10433. uint8_t enable = get_u8(data);
  10434. print_enable("Low Energy", enable);
  10435. }
  10436. static void mgmt_new_settings_rsp(const void *data, uint16_t size)
  10437. {
  10438. uint32_t current_settings = get_le32(data);
  10439. mgmt_print_settings("Current settings", current_settings);
  10440. }
  10441. static void mgmt_set_device_class_cmd(const void *data, uint16_t size)
  10442. {
  10443. uint8_t major = get_u8(data);
  10444. uint8_t minor = get_u8(data + 1);
  10445. print_field("Major class: 0x%2.2x", major);
  10446. print_field("Minor class: 0x%2.2x", minor);
  10447. }
  10448. static void mgmt_set_device_class_rsp(const void *data, uint16_t size)
  10449. {
  10450. print_dev_class(data);
  10451. }
  10452. static void mgmt_set_local_name_cmd(const void *data, uint16_t size)
  10453. {
  10454. mgmt_print_name(data);
  10455. }
  10456. static void mgmt_set_local_name_rsp(const void *data, uint16_t size)
  10457. {
  10458. mgmt_print_name(data);
  10459. }
  10460. static void mgmt_add_uuid_cmd(const void *data, uint16_t size)
  10461. {
  10462. uint8_t service_class = get_u8(data + 16);
  10463. print_field("UUID: %s", bt_uuid128_to_str(data));
  10464. print_field("Service class: 0x%2.2x", service_class);
  10465. }
  10466. static void mgmt_add_uuid_rsp(const void *data, uint16_t size)
  10467. {
  10468. print_dev_class(data);
  10469. }
  10470. static void mgmt_remove_uuid_cmd(const void *data, uint16_t size)
  10471. {
  10472. print_field("UUID: %s", bt_uuid128_to_str(data));
  10473. }
  10474. static void mgmt_remove_uuid_rsp(const void *data, uint16_t size)
  10475. {
  10476. print_dev_class(data);
  10477. }
  10478. static void mgmt_load_link_keys_cmd(const void *data, uint16_t size)
  10479. {
  10480. uint8_t debug_keys = get_u8(data);
  10481. uint16_t num_keys = get_le16(data + 1);
  10482. int i;
  10483. print_enable("Debug keys", debug_keys);
  10484. print_field("Keys: %u", num_keys);
  10485. if (size - 3 != num_keys * 25) {
  10486. packet_hexdump(data + 3, size - 3);
  10487. return;
  10488. }
  10489. for (i = 0; i < num_keys; i++)
  10490. mgmt_print_link_key(data + 3 + (i * 25));
  10491. }
  10492. static void mgmt_load_long_term_keys_cmd(const void *data, uint16_t size)
  10493. {
  10494. uint16_t num_keys = get_le16(data);
  10495. int i;
  10496. print_field("Keys: %u", num_keys);
  10497. if (size - 2 != num_keys * 36) {
  10498. packet_hexdump(data + 2, size - 2);
  10499. return;
  10500. }
  10501. for (i = 0; i < num_keys; i++)
  10502. mgmt_print_long_term_key(data + 2 + (i * 36));
  10503. }
  10504. static void mgmt_disconnect_cmd(const void *data, uint16_t size)
  10505. {
  10506. uint8_t address_type = get_u8(data + 6);
  10507. mgmt_print_address(data, address_type);
  10508. }
  10509. static void mgmt_disconnect_rsp(const void *data, uint16_t size)
  10510. {
  10511. uint8_t address_type = get_u8(data + 6);
  10512. mgmt_print_address(data, address_type);
  10513. }
  10514. static void mgmt_get_connections_rsp(const void *data, uint16_t size)
  10515. {
  10516. uint16_t num_connections = get_le16(data);
  10517. int i;
  10518. print_field("Connections: %u", num_connections);
  10519. if (size - 2 != num_connections * 7) {
  10520. packet_hexdump(data + 2, size - 2);
  10521. return;
  10522. }
  10523. for (i = 0; i < num_connections; i++) {
  10524. uint8_t address_type = get_u8(data + 2 + (i * 7) + 6);
  10525. mgmt_print_address(data + 2 + (i * 7), address_type);
  10526. }
  10527. }
  10528. static void mgmt_pin_code_reply_cmd(const void *data, uint16_t size)
  10529. {
  10530. uint8_t address_type = get_u8(data + 6);
  10531. uint8_t pin_len = get_u8(data + 7);
  10532. mgmt_print_address(data, address_type);
  10533. print_field("PIN length: %u", pin_len);
  10534. print_hex_field("PIN code", data + 8, 16);
  10535. }
  10536. static void mgmt_pin_code_reply_rsp(const void *data, uint16_t size)
  10537. {
  10538. uint8_t address_type = get_u8(data + 6);
  10539. mgmt_print_address(data, address_type);
  10540. }
  10541. static void mgmt_pin_code_neg_reply_cmd(const void *data, uint16_t size)
  10542. {
  10543. uint8_t address_type = get_u8(data + 6);
  10544. mgmt_print_address(data, address_type);
  10545. }
  10546. static void mgmt_pin_code_neg_reply_rsp(const void *data, uint16_t size)
  10547. {
  10548. uint8_t address_type = get_u8(data + 6);
  10549. mgmt_print_address(data, address_type);
  10550. }
  10551. static void mgmt_set_io_capability_cmd(const void *data, uint16_t size)
  10552. {
  10553. uint8_t capability = get_u8(data);
  10554. mgmt_print_io_capability(capability);
  10555. }
  10556. static void mgmt_pair_device_cmd(const void *data, uint16_t size)
  10557. {
  10558. uint8_t address_type = get_u8(data + 6);
  10559. uint8_t capability = get_u8(data + 7);
  10560. mgmt_print_address(data, address_type);
  10561. mgmt_print_io_capability(capability);
  10562. }
  10563. static void mgmt_pair_device_rsp(const void *data, uint16_t size)
  10564. {
  10565. uint8_t address_type = get_u8(data + 6);
  10566. mgmt_print_address(data, address_type);
  10567. }
  10568. static void mgmt_cancel_pair_device_cmd(const void *data, uint16_t size)
  10569. {
  10570. uint8_t address_type = get_u8(data + 6);
  10571. mgmt_print_address(data, address_type);
  10572. }
  10573. static void mgmt_cancel_pair_device_rsp(const void *data, uint16_t size)
  10574. {
  10575. uint8_t address_type = get_u8(data + 6);
  10576. mgmt_print_address(data, address_type);
  10577. }
  10578. static void mgmt_unpair_device_cmd(const void *data, uint16_t size)
  10579. {
  10580. uint8_t address_type = get_u8(data + 6);
  10581. uint8_t disconnect = get_u8(data + 7);
  10582. mgmt_print_address(data, address_type);
  10583. print_enable("Disconnect", disconnect);
  10584. }
  10585. static void mgmt_unpair_device_rsp(const void *data, uint16_t size)
  10586. {
  10587. uint8_t address_type = get_u8(data + 6);
  10588. mgmt_print_address(data, address_type);
  10589. }
  10590. static void mgmt_user_confirmation_reply_cmd(const void *data, uint16_t size)
  10591. {
  10592. uint8_t address_type = get_u8(data + 6);
  10593. mgmt_print_address(data, address_type);
  10594. }
  10595. static void mgmt_user_confirmation_reply_rsp(const void *data, uint16_t size)
  10596. {
  10597. uint8_t address_type = get_u8(data + 6);
  10598. mgmt_print_address(data, address_type);
  10599. }
  10600. static void mgmt_user_confirmation_neg_reply_cmd(const void *data, uint16_t size)
  10601. {
  10602. uint8_t address_type = get_u8(data + 6);
  10603. mgmt_print_address(data, address_type);
  10604. }
  10605. static void mgmt_user_confirmation_neg_reply_rsp(const void *data, uint16_t size)
  10606. {
  10607. uint8_t address_type = get_u8(data + 6);
  10608. mgmt_print_address(data, address_type);
  10609. }
  10610. static void mgmt_user_passkey_reply_cmd(const void *data, uint16_t size)
  10611. {
  10612. uint8_t address_type = get_u8(data + 6);
  10613. uint32_t passkey = get_le32(data + 7);
  10614. mgmt_print_address(data, address_type);
  10615. print_field("Passkey: 0x%4.4x", passkey);
  10616. }
  10617. static void mgmt_user_passkey_reply_rsp(const void *data, uint16_t size)
  10618. {
  10619. uint8_t address_type = get_u8(data + 6);
  10620. mgmt_print_address(data, address_type);
  10621. }
  10622. static void mgmt_user_passkey_neg_reply_cmd(const void *data, uint16_t size)
  10623. {
  10624. uint8_t address_type = get_u8(data + 6);
  10625. mgmt_print_address(data, address_type);
  10626. }
  10627. static void mgmt_user_passkey_neg_reply_rsp(const void *data, uint16_t size)
  10628. {
  10629. uint8_t address_type = get_u8(data + 6);
  10630. mgmt_print_address(data, address_type);
  10631. }
  10632. static void mgmt_read_local_oob_data_rsp(const void *data, uint16_t size)
  10633. {
  10634. mgmt_print_oob_data(data);
  10635. }
  10636. static void mgmt_add_remote_oob_data_cmd(const void *data, uint16_t size)
  10637. {
  10638. uint8_t address_type = get_u8(data + 6);
  10639. mgmt_print_address(data, address_type);
  10640. mgmt_print_oob_data(data + 7);
  10641. }
  10642. static void mgmt_add_remote_oob_data_rsp(const void *data, uint16_t size)
  10643. {
  10644. uint8_t address_type = get_u8(data + 6);
  10645. mgmt_print_address(data, address_type);
  10646. }
  10647. static void mgmt_remove_remote_oob_data_cmd(const void *data, uint16_t size)
  10648. {
  10649. uint8_t address_type = get_u8(data + 6);
  10650. mgmt_print_address(data, address_type);
  10651. }
  10652. static void mgmt_remove_remote_oob_data_rsp(const void *data, uint16_t size)
  10653. {
  10654. uint8_t address_type = get_u8(data + 6);
  10655. mgmt_print_address(data, address_type);
  10656. }
  10657. static void mgmt_start_discovery_cmd(const void *data, uint16_t size)
  10658. {
  10659. uint8_t type = get_u8(data);
  10660. mgmt_print_address_type(type);
  10661. }
  10662. static void mgmt_start_discovery_rsp(const void *data, uint16_t size)
  10663. {
  10664. uint8_t type = get_u8(data);
  10665. mgmt_print_address_type(type);
  10666. }
  10667. static void mgmt_stop_discovery_cmd(const void *data, uint16_t size)
  10668. {
  10669. uint8_t type = get_u8(data);
  10670. mgmt_print_address_type(type);
  10671. }
  10672. static void mgmt_stop_discovery_rsp(const void *data, uint16_t size)
  10673. {
  10674. uint8_t type = get_u8(data);
  10675. mgmt_print_address_type(type);
  10676. }
  10677. static void mgmt_confirm_name_cmd(const void *data, uint16_t size)
  10678. {
  10679. uint8_t address_type = get_u8(data + 6);
  10680. uint8_t name_known = get_u8(data + 7);
  10681. const char *str;
  10682. mgmt_print_address(data, address_type);
  10683. switch (name_known) {
  10684. case 0x00:
  10685. str = "No";
  10686. break;
  10687. case 0x01:
  10688. str = "Yes";
  10689. break;
  10690. default:
  10691. str = "Reserved";
  10692. break;
  10693. }
  10694. print_field("Name known: %s (0x%2.2x)", str, name_known);
  10695. }
  10696. static void mgmt_confirm_name_rsp(const void *data, uint16_t size)
  10697. {
  10698. uint8_t address_type = get_u8(data + 6);
  10699. mgmt_print_address(data, address_type);
  10700. }
  10701. static void mgmt_block_device_cmd(const void *data, uint16_t size)
  10702. {
  10703. uint8_t address_type = get_u8(data + 6);
  10704. mgmt_print_address(data, address_type);
  10705. }
  10706. static void mgmt_block_device_rsp(const void *data, uint16_t size)
  10707. {
  10708. uint8_t address_type = get_u8(data + 6);
  10709. mgmt_print_address(data, address_type);
  10710. }
  10711. static void mgmt_unblock_device_cmd(const void *data, uint16_t size)
  10712. {
  10713. uint8_t address_type = get_u8(data + 6);
  10714. mgmt_print_address(data, address_type);
  10715. }
  10716. static void mgmt_unblock_device_rsp(const void *data, uint16_t size)
  10717. {
  10718. uint8_t address_type = get_u8(data + 6);
  10719. mgmt_print_address(data, address_type);
  10720. }
  10721. static void mgmt_set_device_id_cmd(const void *data, uint16_t size)
  10722. {
  10723. print_device_id(data, size);
  10724. }
  10725. static void mgmt_set_advertising_cmd(const void *data, uint16_t size)
  10726. {
  10727. uint8_t enable = get_u8(data);
  10728. const char *str;
  10729. switch (enable) {
  10730. case 0x00:
  10731. str = "Disabled";
  10732. break;
  10733. case 0x01:
  10734. str = "Enabled";
  10735. break;
  10736. case 0x02:
  10737. str = "Connectable";
  10738. break;
  10739. default:
  10740. str = "Reserved";
  10741. break;
  10742. }
  10743. print_field("Advertising: %s (0x%2.2x)", str, enable);
  10744. }
  10745. static void mgmt_set_bredr_cmd(const void *data, uint16_t size)
  10746. {
  10747. uint8_t enable = get_u8(data);
  10748. print_enable("BR/EDR", enable);
  10749. }
  10750. static void mgmt_set_static_address_cmd(const void *data, uint16_t size)
  10751. {
  10752. print_addr_resolve("Address", data, 0x01, false);
  10753. }
  10754. static void mgmt_set_scan_parameters_cmd(const void *data, uint16_t size)
  10755. {
  10756. uint16_t interval = get_le16(data);
  10757. uint16_t window = get_le16(data + 2);
  10758. print_field("Interval: %u (0x%2.2x)", interval, interval);
  10759. print_field("Window: %u (0x%2.2x)", window, window);
  10760. }
  10761. static void mgmt_set_secure_connections_cmd(const void *data, uint16_t size)
  10762. {
  10763. uint8_t enable = get_u8(data);
  10764. const char *str;
  10765. switch (enable) {
  10766. case 0x00:
  10767. str = "Disabled";
  10768. break;
  10769. case 0x01:
  10770. str = "Enabled";
  10771. break;
  10772. case 0x02:
  10773. str = "Only";
  10774. break;
  10775. default:
  10776. str = "Reserved";
  10777. break;
  10778. }
  10779. print_field("Secure Connections: %s (0x%2.2x)", str, enable);
  10780. }
  10781. static void mgmt_set_debug_keys_cmd(const void *data, uint16_t size)
  10782. {
  10783. uint8_t enable = get_u8(data);
  10784. const char *str;
  10785. switch (enable) {
  10786. case 0x00:
  10787. str = "Disabled";
  10788. break;
  10789. case 0x01:
  10790. str = "Enabled";
  10791. break;
  10792. case 0x02:
  10793. str = "Generate";
  10794. break;
  10795. default:
  10796. str = "Reserved";
  10797. break;
  10798. }
  10799. print_field("Debug Keys: %s (0x%2.2x)", str, enable);
  10800. }
  10801. static void mgmt_set_privacy_cmd(const void *data, uint16_t size)
  10802. {
  10803. uint8_t enable = get_u8(data);
  10804. const char *str;
  10805. switch (enable) {
  10806. case 0x00:
  10807. str = "Disabled";
  10808. break;
  10809. case 0x01:
  10810. str = "Enabled";
  10811. break;
  10812. case 0x02:
  10813. str = "Limited";
  10814. break;
  10815. default:
  10816. str = "Reserved";
  10817. break;
  10818. }
  10819. print_field("Privacy: %s (0x%2.2x)", str, enable);
  10820. print_hex_field("Key", data + 1, 16);
  10821. }
  10822. static void mgmt_load_identity_resolving_keys_cmd(const void *data, uint16_t size)
  10823. {
  10824. uint16_t num_keys = get_le16(data);
  10825. int i;
  10826. print_field("Keys: %u", num_keys);
  10827. if (size - 2 != num_keys * 23) {
  10828. packet_hexdump(data + 2, size - 2);
  10829. return;
  10830. }
  10831. for (i = 0; i < num_keys; i++)
  10832. mgmt_print_identity_resolving_key(data + 2 + (i * 23));
  10833. }
  10834. static void mgmt_get_connection_information_cmd(const void *data, uint16_t size)
  10835. {
  10836. uint8_t address_type = get_u8(data + 6);
  10837. mgmt_print_address(data, address_type);
  10838. }
  10839. static void mgmt_get_connection_information_rsp(const void *data, uint16_t size)
  10840. {
  10841. uint8_t address_type = get_u8(data + 6);
  10842. int8_t rssi = get_s8(data + 7);
  10843. int8_t tx_power = get_s8(data + 8);
  10844. int8_t max_tx_power = get_s8(data + 9);
  10845. mgmt_print_address(data, address_type);
  10846. print_rssi(rssi);
  10847. print_power_level(tx_power, NULL);
  10848. print_power_level(max_tx_power, "max");
  10849. }
  10850. static void mgmt_get_clock_information_cmd(const void *data, uint16_t size)
  10851. {
  10852. uint8_t address_type = get_u8(data + 6);
  10853. mgmt_print_address(data, address_type);
  10854. }
  10855. static void mgmt_get_clock_information_rsp(const void *data, uint16_t size)
  10856. {
  10857. uint8_t address_type = get_u8(data + 6);
  10858. uint32_t local_clock = get_le32(data + 7);
  10859. uint32_t piconet_clock = get_le32(data + 11);
  10860. uint16_t accuracy = get_le16(data + 15);
  10861. mgmt_print_address(data, address_type);
  10862. print_field("Local clock: 0x%8.8x", local_clock);
  10863. print_field("Piconet clock: 0x%8.8x", piconet_clock);
  10864. print_field("Accuracy: 0x%4.4x", accuracy);
  10865. }
  10866. static void mgmt_add_device_cmd(const void *data, uint16_t size)
  10867. {
  10868. uint8_t address_type = get_u8(data + 6);
  10869. uint8_t action = get_u8(data + 7);
  10870. mgmt_print_address(data, address_type);
  10871. mgmt_print_device_action(action);
  10872. }
  10873. static void mgmt_add_device_rsp(const void *data, uint16_t size)
  10874. {
  10875. uint8_t address_type = get_u8(data + 6);
  10876. mgmt_print_address(data, address_type);
  10877. }
  10878. static void mgmt_remove_device_cmd(const void *data, uint16_t size)
  10879. {
  10880. uint8_t address_type = get_u8(data + 6);
  10881. mgmt_print_address(data, address_type);
  10882. }
  10883. static void mgmt_remove_device_rsp(const void *data, uint16_t size)
  10884. {
  10885. uint8_t address_type = get_u8(data + 6);
  10886. mgmt_print_address(data, address_type);
  10887. }
  10888. static void mgmt_load_connection_parameters_cmd(const void *data, uint16_t size)
  10889. {
  10890. uint16_t num_parameters = get_le16(data);
  10891. int i;
  10892. print_field("Parameters: %u", num_parameters);
  10893. if (size - 2 != num_parameters * 15) {
  10894. packet_hexdump(data + 2, size - 2);
  10895. return;
  10896. }
  10897. for (i = 0; i < num_parameters; i++)
  10898. mgmt_print_connection_parameter(data + 2 + (i * 15));
  10899. }
  10900. static void mgmt_read_unconf_index_list_rsp(const void *data, uint16_t size)
  10901. {
  10902. uint16_t num_controllers = get_le16(data);
  10903. int i;
  10904. print_field("Controllers: %u", num_controllers);
  10905. if (size - 2 != num_controllers * 2) {
  10906. packet_hexdump(data + 2, size - 2);
  10907. return;
  10908. }
  10909. for (i = 0; i < num_controllers; i++) {
  10910. uint16_t index = get_le16(data + 2 + (i * 2));
  10911. print_field(" hci%u", index);
  10912. }
  10913. }
  10914. static void mgmt_read_controller_conf_info_rsp(const void *data, uint16_t size)
  10915. {
  10916. uint16_t manufacturer = get_le16(data);
  10917. uint32_t supported_options = get_le32(data + 2);
  10918. uint32_t missing_options = get_le32(data + 6);
  10919. mgmt_print_manufacturer(manufacturer);
  10920. mgmt_print_options("Supported options", supported_options);
  10921. mgmt_print_options("Missing options", missing_options);
  10922. }
  10923. static void mgmt_set_external_configuration_cmd(const void *data, uint16_t size)
  10924. {
  10925. uint8_t enable = get_u8(data);
  10926. print_enable("Configuration", enable);
  10927. }
  10928. static void mgmt_set_public_address_cmd(const void *data, uint16_t size)
  10929. {
  10930. print_addr_resolve("Address", data, 0x00, false);
  10931. }
  10932. static void mgmt_new_options_rsp(const void *data, uint16_t size)
  10933. {
  10934. uint32_t missing_options = get_le32(data);
  10935. mgmt_print_options("Missing options", missing_options);
  10936. }
  10937. static void mgmt_start_service_discovery_cmd(const void *data, uint16_t size)
  10938. {
  10939. uint8_t type = get_u8(data);
  10940. int8_t rssi = get_s8(data + 1);
  10941. uint16_t num_uuids = get_le16(data + 2);
  10942. int i;
  10943. mgmt_print_address_type(type);
  10944. print_rssi(rssi);
  10945. print_field("UUIDs: %u", num_uuids);
  10946. if (size - 4 != num_uuids * 16) {
  10947. packet_hexdump(data + 4, size - 4);
  10948. return;
  10949. }
  10950. for (i = 0; i < num_uuids; i++)
  10951. print_field("UUID: %s", bt_uuid128_to_str(data + 4 + (i * 16)));
  10952. }
  10953. static void mgmt_start_service_discovery_rsp(const void *data, uint16_t size)
  10954. {
  10955. uint8_t type = get_u8(data);
  10956. mgmt_print_address_type(type);
  10957. }
  10958. static void mgmt_read_ext_index_list_rsp(const void *data, uint16_t size)
  10959. {
  10960. uint16_t num_controllers = get_le16(data);
  10961. int i;
  10962. print_field("Controllers: %u", num_controllers);
  10963. if (size - 2 != num_controllers * 4) {
  10964. packet_hexdump(data + 2, size - 2);
  10965. return;
  10966. }
  10967. for (i = 0; i < num_controllers; i++) {
  10968. uint16_t index = get_le16(data + 2 + (i * 4));
  10969. uint8_t type = get_u8(data + 4 + (i * 4));
  10970. uint8_t bus = get_u8(data + 5 + (i * 4));
  10971. const char *str;
  10972. switch (type) {
  10973. case 0x00:
  10974. str = "Primary";
  10975. break;
  10976. case 0x01:
  10977. str = "Unconfigured";
  10978. break;
  10979. case 0x02:
  10980. str = "AMP";
  10981. break;
  10982. default:
  10983. str = "Reserved";
  10984. break;
  10985. }
  10986. print_field(" hci%u (%s,%s)", index, str, hci_bustostr(bus));
  10987. }
  10988. }
  10989. static void mgmt_read_local_oob_ext_data_cmd(const void *data, uint16_t size)
  10990. {
  10991. uint8_t type = get_u8(data);
  10992. mgmt_print_address_type(type);
  10993. }
  10994. static void mgmt_read_local_oob_ext_data_rsp(const void *data, uint16_t size)
  10995. {
  10996. uint8_t type = get_u8(data);
  10997. uint16_t data_len = get_le16(data + 1);
  10998. mgmt_print_address_type(type);
  10999. print_field("Data length: %u", data_len);
  11000. print_eir(data + 3, size - 3, true);
  11001. }
  11002. static void mgmt_read_advertising_features_rsp(const void *data, uint16_t size)
  11003. {
  11004. uint32_t flags = get_le32(data);
  11005. uint8_t adv_data_len = get_u8(data + 4);
  11006. uint8_t scan_rsp_len = get_u8(data + 5);
  11007. uint8_t max_instances = get_u8(data + 6);
  11008. uint8_t num_instances = get_u8(data + 7);
  11009. int i;
  11010. mgmt_print_adv_flags(flags);
  11011. print_field("Advertising data length: %u", adv_data_len);
  11012. print_field("Scan response length: %u", scan_rsp_len);
  11013. print_field("Max instances: %u", max_instances);
  11014. print_field("Instances: %u", num_instances);
  11015. if (size - 8 != num_instances) {
  11016. packet_hexdump(data + 8, size - 8);
  11017. return;
  11018. }
  11019. for (i = 0; i < num_instances; i++) {
  11020. uint8_t instance = get_u8(data + 8 + i);
  11021. print_field(" %u", instance);
  11022. }
  11023. }
  11024. static void mgmt_add_advertising_cmd(const void *data, uint16_t size)
  11025. {
  11026. uint8_t instance = get_u8(data);
  11027. uint32_t flags = get_le32(data + 1);
  11028. uint16_t duration = get_le16(data + 5);
  11029. uint16_t timeout = get_le16(data + 7);
  11030. uint8_t adv_data_len = get_u8(data + 9);
  11031. uint8_t scan_rsp_len = get_u8(data + 10);
  11032. print_field("Instance: %u", instance);
  11033. mgmt_print_adv_flags(flags);
  11034. print_field("Duration: %u", duration);
  11035. print_field("Timeout: %u", timeout);
  11036. print_field("Advertising data length: %u", adv_data_len);
  11037. print_eir(data + 11, adv_data_len, false);
  11038. print_field("Scan response length: %u", scan_rsp_len);
  11039. print_eir(data + 11 + adv_data_len, scan_rsp_len, false);
  11040. }
  11041. static void mgmt_add_advertising_rsp(const void *data, uint16_t size)
  11042. {
  11043. uint8_t instance = get_u8(data);
  11044. print_field("Instance: %u", instance);
  11045. }
  11046. static void mgmt_remove_advertising_cmd(const void *data, uint16_t size)
  11047. {
  11048. uint8_t instance = get_u8(data);
  11049. print_field("Instance: %u", instance);
  11050. }
  11051. static void mgmt_remove_advertising_rsp(const void *data, uint16_t size)
  11052. {
  11053. uint8_t instance = get_u8(data);
  11054. print_field("Instance: %u", instance);
  11055. }
  11056. static void mgmt_get_advertising_size_info_cmd(const void *data, uint16_t size)
  11057. {
  11058. uint8_t instance = get_u8(data);
  11059. uint32_t flags = get_le32(data + 1);
  11060. print_field("Instance: %u", instance);
  11061. mgmt_print_adv_flags(flags);
  11062. }
  11063. static void mgmt_get_advertising_size_info_rsp(const void *data, uint16_t size)
  11064. {
  11065. uint8_t instance = get_u8(data);
  11066. uint32_t flags = get_le32(data + 1);
  11067. uint8_t adv_data_len = get_u8(data + 5);
  11068. uint8_t scan_rsp_len = get_u8(data + 6);
  11069. print_field("Instance: %u", instance);
  11070. mgmt_print_adv_flags(flags);
  11071. print_field("Advertising data length: %u", adv_data_len);
  11072. print_field("Scan response length: %u", scan_rsp_len);
  11073. }
  11074. static void mgmt_start_limited_discovery_cmd(const void *data, uint16_t size)
  11075. {
  11076. uint8_t type = get_u8(data);
  11077. mgmt_print_address_type(type);
  11078. }
  11079. static void mgmt_start_limited_discovery_rsp(const void *data, uint16_t size)
  11080. {
  11081. uint8_t type = get_u8(data);
  11082. mgmt_print_address_type(type);
  11083. }
  11084. static void mgmt_read_ext_controller_info_rsp(const void *data, uint16_t size)
  11085. {
  11086. uint8_t version = get_u8(data + 6);
  11087. uint16_t manufacturer = get_le16(data + 7);
  11088. uint32_t supported_settings = get_le32(data + 9);
  11089. uint32_t current_settings = get_le32(data + 13);
  11090. uint16_t data_len = get_le16(data + 17);
  11091. print_addr_resolve("Address", data, 0x00, false);
  11092. mgmt_print_version(version);
  11093. mgmt_print_manufacturer(manufacturer);
  11094. mgmt_print_settings("Supported settings", supported_settings);
  11095. mgmt_print_settings("Current settings", current_settings);
  11096. print_field("Data length: %u", data_len);
  11097. print_eir(data + 19, size - 19, false);
  11098. }
  11099. static void mgmt_set_apperance_cmd(const void *data, uint16_t size)
  11100. {
  11101. uint16_t appearance = get_le16(data);
  11102. print_appearance(appearance);
  11103. }
  11104. static const struct bitfield_data mgmt_phy_table[] = {
  11105. { 0, "BR 1M 1SLOT" },
  11106. { 1, "BR 1M 3SLOT" },
  11107. { 2, "BR 1M 5SLOT" },
  11108. { 3, "EDR 2M 1SLOT" },
  11109. { 4, "EDR 2M 3SLOT" },
  11110. { 5, "EDR 2M 5SLOT" },
  11111. { 6, "EDR 3M 1SLOT" },
  11112. { 7, "EDR 3M 3SLOT" },
  11113. { 8, "EDR 3M 5SLOT" },
  11114. { 9, "LE 1M TX" },
  11115. { 10, "LE 1M RX" },
  11116. { 11, "LE 2M TX" },
  11117. { 12, "LE 2M RX" },
  11118. { 13, "LE CODED TX" },
  11119. { 14, "LE CODED RX" },
  11120. { }
  11121. };
  11122. static void mgmt_print_phys(const char *label, uint16_t phys)
  11123. {
  11124. uint16_t mask;
  11125. print_field("%s: 0x%4.4x", label, phys);
  11126. mask = print_bitfield(2, phys, mgmt_phy_table);
  11127. if (mask)
  11128. print_text(COLOR_UNKNOWN_PHY, " Unknown PHYs"
  11129. " (0x%8.8x)", mask);
  11130. }
  11131. static void mgmt_get_phy_rsp(const void *data, uint16_t size)
  11132. {
  11133. uint32_t supported_phys = get_le32(data);
  11134. uint32_t configurable_phys = get_le32(data + 4);
  11135. uint32_t selected_phys = get_le32(data + 8);
  11136. mgmt_print_phys("Supported PHYs", supported_phys);
  11137. mgmt_print_phys("Configurable PHYs", configurable_phys);
  11138. mgmt_print_phys("Selected PHYs", selected_phys);
  11139. }
  11140. static void mgmt_set_phy_cmd(const void *data, uint16_t size)
  11141. {
  11142. uint32_t selected_phys = get_le32(data);
  11143. mgmt_print_phys("Selected PHYs", selected_phys);
  11144. }
  11145. static void mgmt_read_exp_features_info_rsp(const void *data, uint16_t size)
  11146. {
  11147. uint16_t num_features = get_le16(data);
  11148. int i;
  11149. print_field("Features: %u", num_features);
  11150. if (size - 2 != num_features * 20) {
  11151. packet_hexdump(data + 2, size - 2);
  11152. return;
  11153. }
  11154. for (i = 0; i < num_features; i++)
  11155. mgmt_print_exp_feature(data + 2 + (i * 20));
  11156. }
  11157. static void mgmt_set_exp_feature_cmd(const void *data, uint16_t size)
  11158. {
  11159. uint8_t enable = get_u8(data + 16);
  11160. print_field("UUID: %s", bt_uuid128_to_str(data));
  11161. print_enable("Action", enable);
  11162. }
  11163. static void mgmt_set_exp_feature_rsp(const void *data, uint16_t size)
  11164. {
  11165. mgmt_print_exp_feature(data);
  11166. }
  11167. static const struct bitfield_data mgmt_added_device_flags_table[] = {
  11168. { 0, "Remote Wakeup" },
  11169. { }
  11170. };
  11171. static void mgmt_print_added_device_flags(char *label, uint32_t flags)
  11172. {
  11173. uint32_t mask;
  11174. print_field("%s: 0x%8.8x", label, flags);
  11175. mask = print_bitfield(2, flags, mgmt_added_device_flags_table);
  11176. if (mask)
  11177. print_text(COLOR_UNKNOWN_ADDED_DEVICE_FLAG,
  11178. " Unknown Flags (0x%8.8x)", mask);
  11179. }
  11180. static void mgmt_get_device_flags_cmd(const void *data, uint16_t size)
  11181. {
  11182. uint8_t type = get_u8(data + 6);
  11183. mgmt_print_address(data, type);
  11184. }
  11185. static void mgmt_get_device_flags_rsp(const void *data, uint16_t size)
  11186. {
  11187. uint8_t type = get_u8(data + 6);
  11188. uint32_t supported_flags = get_le32(data + 7);
  11189. uint32_t current_flags = get_le32(data + 11);
  11190. mgmt_print_address(data, type);
  11191. mgmt_print_added_device_flags("Supported Flags", supported_flags);
  11192. mgmt_print_added_device_flags("Current Flags", current_flags);
  11193. }
  11194. static void mgmt_set_device_flags_cmd(const void *data, uint16_t size)
  11195. {
  11196. uint8_t type = get_u8(data + 6);
  11197. uint32_t current_flags = get_le32(data + 7);
  11198. mgmt_print_address(data, type);
  11199. mgmt_print_added_device_flags("Current Flags", current_flags);
  11200. }
  11201. static void mgmt_set_device_flags_rsp(const void *data, uint16_t size)
  11202. {
  11203. uint8_t type = get_u8(data + 6);
  11204. mgmt_print_address(data, type);
  11205. }
  11206. static void mgmt_add_ext_adv_params_cmd(const void *data, uint16_t size)
  11207. {
  11208. uint8_t instance = get_u8(data);
  11209. uint32_t flags = get_le32(data + 1);
  11210. uint16_t duration = get_le16(data + 5);
  11211. uint16_t timeout = get_le16(data + 7);
  11212. uint8_t *min_interval = (uint8_t *)(data + 9);
  11213. uint8_t *max_interval = (uint8_t *)(data + 13);
  11214. int8_t tx_power = get_s8(data + 17);
  11215. print_field("Instance: %u", instance);
  11216. mgmt_print_adv_flags(flags);
  11217. print_field("Duration: %u", duration);
  11218. print_field("Timeout: %u", timeout);
  11219. print_ext_slot_625("Min advertising interval", min_interval);
  11220. print_ext_slot_625("Max advertising interval", max_interval);
  11221. print_power_level(tx_power, NULL);
  11222. }
  11223. static void mgmt_add_ext_adv_params_rsp(const void *data, uint16_t size)
  11224. {
  11225. uint8_t instance = get_u8(data);
  11226. int8_t tx_power = get_s8(data + 1);
  11227. uint8_t max_adv_data_len = get_u8(data+2);
  11228. uint8_t max_scan_rsp_len = get_u8(data+3);
  11229. print_field("Instance: %u", instance);
  11230. print_power_level(tx_power, NULL);
  11231. print_field("Available adv data len: %u", max_adv_data_len);
  11232. print_field("Available scan rsp data len: %u", max_scan_rsp_len);
  11233. }
  11234. static void mgmt_add_ext_adv_data_cmd(const void *data, uint16_t size)
  11235. {
  11236. uint8_t instance = get_u8(data);
  11237. uint8_t adv_data_len = get_u8(data + 1);
  11238. uint8_t scan_rsp_len = get_u8(data + 2);
  11239. print_field("Instance: %u", instance);
  11240. print_field("Advertising data length: %u", adv_data_len);
  11241. print_eir(data + 3, adv_data_len, false);
  11242. print_field("Scan response length: %u", scan_rsp_len);
  11243. print_eir(data + 3 + adv_data_len, scan_rsp_len, false);
  11244. }
  11245. static void mgmt_add_ext_adv_data_rsp(const void *data, uint16_t size)
  11246. {
  11247. uint8_t instance = get_u8(data);
  11248. print_field("Instance: %u", instance);
  11249. }
  11250. static const struct bitfield_data mgmt_adv_monitor_features_table[] = {
  11251. { 1, "OR Patterns" },
  11252. { }
  11253. };
  11254. static void mgmt_print_adv_monitor_features(char *label, uint32_t flags)
  11255. {
  11256. uint32_t mask;
  11257. print_field("%s: 0x%8.8x", label, flags);
  11258. mask = print_bitfield(2, flags, mgmt_adv_monitor_features_table);
  11259. if (mask)
  11260. print_text(COLOR_UNKNOWN_ADVMON_FEATURES,
  11261. " Unknown Flags (0x%8.8x)", mask);
  11262. }
  11263. static void mgmt_print_adv_monitor_handles(const void *data, uint8_t len)
  11264. {
  11265. uint8_t idx = 0;
  11266. while (idx + 2 <= len) {
  11267. print_field(" Handle: %d", get_le16(data + idx));
  11268. idx += 2;
  11269. }
  11270. }
  11271. static void mgmt_read_adv_monitor_features_rsp(const void *data, uint16_t size)
  11272. {
  11273. uint32_t supported_features = get_le32(data);
  11274. uint32_t enabled_features = get_le32(data + 4);
  11275. uint16_t max_num_handles = get_le16(data + 8);
  11276. uint8_t max_num_patterns = get_u8(data + 10);
  11277. uint16_t num_handles = get_le16(data + 11);
  11278. mgmt_print_adv_monitor_features("Supported Features",
  11279. supported_features);
  11280. mgmt_print_adv_monitor_features("Enabled Features",
  11281. enabled_features);
  11282. print_field("Max number of handles: %d", max_num_handles);
  11283. print_field("Max number of patterns: %d", max_num_patterns);
  11284. print_field("Number of handles: %d", num_handles);
  11285. mgmt_print_adv_monitor_handles(data + 13, size - 13);
  11286. }
  11287. static void mgmt_print_adv_monitor_patterns(const void *data, uint8_t len)
  11288. {
  11289. uint8_t data_idx = 0, pattern_idx = 1;
  11290. /* Reference: struct mgmt_adv_pattern in lib/mgmt.h. */
  11291. while (data_idx + 34 <= len) {
  11292. uint8_t ad_type = get_u8(data);
  11293. uint8_t offset = get_u8(data + 1);
  11294. uint8_t length = get_u8(data + 2);
  11295. print_field(" Pattern %d:", pattern_idx);
  11296. print_field(" AD type: %d", ad_type);
  11297. print_field(" Offset: %d", offset);
  11298. print_field(" Length: %d", length);
  11299. if (length <= 31)
  11300. print_hex_field(" Value ", data + 3, length);
  11301. else
  11302. print_text(COLOR_ERROR, " invalid length");
  11303. pattern_idx += 1;
  11304. data_idx += 34;
  11305. data += 34;
  11306. }
  11307. }
  11308. static void mgmt_add_adv_monitor_patterns_cmd(const void *data, uint16_t size)
  11309. {
  11310. uint8_t pattern_count = get_u8(data);
  11311. print_field("Number of patterns: %d", pattern_count);
  11312. mgmt_print_adv_monitor_patterns(data + 1, size - 1);
  11313. }
  11314. static void mgmt_add_adv_monitor_patterns_rssi_cmd(const void *data,
  11315. uint16_t size)
  11316. {
  11317. int8_t high_rssi = get_s8(data);
  11318. uint16_t high_rssi_timeout = get_le16(data + 1);
  11319. int8_t low_rssi = get_s8(data + 3);
  11320. uint16_t low_rssi_timeout = get_le16(data + 4);
  11321. uint8_t sampling_period = get_u8(data + 6);
  11322. uint8_t pattern_count = get_u8(data + 7);
  11323. print_field("RSSI data:");
  11324. print_field(" high threshold: %d dBm", high_rssi);
  11325. print_field(" high timeout: %d seconds", high_rssi_timeout);
  11326. print_field(" low threshold: %d dBm", low_rssi);
  11327. print_field(" low timeout: %d seconds", low_rssi_timeout);
  11328. if (sampling_period == 0)
  11329. print_field(" sampling: propagate all (0x00)");
  11330. else if (sampling_period == 0xff)
  11331. print_field(" sampling: just once (0xFF)");
  11332. else
  11333. print_field(" sampling: every %d ms", 100 * sampling_period);
  11334. print_field("Number of patterns: %d", pattern_count);
  11335. mgmt_print_adv_monitor_patterns(data + 8, size - 8);
  11336. }
  11337. static void mgmt_add_adv_monitor_patterns_rsp(const void *data, uint16_t size)
  11338. {
  11339. uint16_t handle = get_le16(data);
  11340. print_field("Handle: %d", handle);
  11341. }
  11342. static void mgmt_remove_adv_monitor_patterns_cmd(const void *data,
  11343. uint16_t size)
  11344. {
  11345. uint16_t handle = get_le16(data);
  11346. print_field("Handle: %d", handle);
  11347. }
  11348. static void mgmt_remove_adv_monitor_patterns_rsp(const void *data,
  11349. uint16_t size)
  11350. {
  11351. uint16_t handle = get_le16(data);
  11352. print_field("Handle: %d", handle);
  11353. }
  11354. struct mgmt_data {
  11355. uint16_t opcode;
  11356. const char *str;
  11357. void (*func) (const void *data, uint16_t size);
  11358. uint16_t size;
  11359. bool fixed;
  11360. void (*rsp_func) (const void *data, uint16_t size);
  11361. uint16_t rsp_size;
  11362. bool rsp_fixed;
  11363. };
  11364. static const struct mgmt_data mgmt_command_table[] = {
  11365. { 0x0001, "Read Management Version Information",
  11366. mgmt_null_cmd, 0, true,
  11367. mgmt_read_version_info_rsp, 3, true },
  11368. { 0x0002, "Read Management Supported Commands",
  11369. mgmt_null_cmd, 0, true,
  11370. mgmt_read_supported_commands_rsp, 4, false },
  11371. { 0x0003, "Read Controller Index List",
  11372. mgmt_null_cmd, 0, true,
  11373. mgmt_read_index_list_rsp, 2, false },
  11374. { 0x0004, "Read Controller Information",
  11375. mgmt_null_cmd, 0, true,
  11376. mgmt_read_controller_info_rsp, 280, true },
  11377. { 0x0005, "Set Powered",
  11378. mgmt_set_powered_cmd, 1, true,
  11379. mgmt_new_settings_rsp, 4, true },
  11380. { 0x0006, "Set Discoverable",
  11381. mgmt_set_discoverable_cmd, 3, true,
  11382. mgmt_new_settings_rsp, 4, true },
  11383. { 0x0007, "Set Connectable",
  11384. mgmt_set_connectable_cmd, 1, true,
  11385. mgmt_new_settings_rsp, 4, true },
  11386. { 0x0008, "Set Fast Connectable",
  11387. mgmt_set_fast_connectable_cmd, 1, true,
  11388. mgmt_new_settings_rsp, 4, true },
  11389. { 0x0009, "Set Bondable",
  11390. mgmt_set_bondable_cmd, 1, true,
  11391. mgmt_new_settings_rsp, 4, true },
  11392. { 0x000a, "Set Link Security",
  11393. mgmt_set_link_security_cmd, 1, true,
  11394. mgmt_new_settings_rsp, 4, true },
  11395. { 0x000b, "Set Secure Simple Pairing",
  11396. mgmt_set_secure_simple_pairing_cmd, 1, true,
  11397. mgmt_new_settings_rsp, 4, true },
  11398. { 0x000c, "Set High Speed",
  11399. mgmt_set_high_speed_cmd, 1, true,
  11400. mgmt_new_settings_rsp, 4, true },
  11401. { 0x000d, "Set Low Energy",
  11402. mgmt_set_low_energy_cmd, 1, true,
  11403. mgmt_new_settings_rsp, 4, true },
  11404. { 0x000e, "Set Device Class",
  11405. mgmt_set_device_class_cmd, 2, true,
  11406. mgmt_set_device_class_rsp, 3, true },
  11407. { 0x000f, "Set Local Name",
  11408. mgmt_set_local_name_cmd, 260, true,
  11409. mgmt_set_local_name_rsp, 260, true },
  11410. { 0x0010, "Add UUID",
  11411. mgmt_add_uuid_cmd, 17, true,
  11412. mgmt_add_uuid_rsp, 3, true },
  11413. { 0x0011, "Remove UUID",
  11414. mgmt_remove_uuid_cmd, 16, true,
  11415. mgmt_remove_uuid_rsp, 3, true },
  11416. { 0x0012, "Load Link Keys",
  11417. mgmt_load_link_keys_cmd, 3, false,
  11418. mgmt_null_rsp, 0, true },
  11419. { 0x0013, "Load Long Term Keys",
  11420. mgmt_load_long_term_keys_cmd, 2, false,
  11421. mgmt_null_rsp, 0, true },
  11422. { 0x0014, "Disconnect",
  11423. mgmt_disconnect_cmd, 7, true,
  11424. mgmt_disconnect_rsp, 7, true },
  11425. { 0x0015, "Get Connections",
  11426. mgmt_null_cmd, 0, true,
  11427. mgmt_get_connections_rsp, 2, false },
  11428. { 0x0016, "PIN Code Reply",
  11429. mgmt_pin_code_reply_cmd, 24, true,
  11430. mgmt_pin_code_reply_rsp, 7, true },
  11431. { 0x0017, "PIN Code Negative Reply",
  11432. mgmt_pin_code_neg_reply_cmd, 7, true,
  11433. mgmt_pin_code_neg_reply_rsp, 7, true },
  11434. { 0x0018, "Set IO Capability",
  11435. mgmt_set_io_capability_cmd, 1, true,
  11436. mgmt_null_rsp, 0, true },
  11437. { 0x0019, "Pair Device",
  11438. mgmt_pair_device_cmd, 8, true,
  11439. mgmt_pair_device_rsp, 7, true },
  11440. { 0x001a, "Cancel Pair Device",
  11441. mgmt_cancel_pair_device_cmd, 7, true,
  11442. mgmt_cancel_pair_device_rsp, 7, true },
  11443. { 0x001b, "Unpair Device",
  11444. mgmt_unpair_device_cmd, 8, true,
  11445. mgmt_unpair_device_rsp, 7, true },
  11446. { 0x001c, "User Confirmation Reply",
  11447. mgmt_user_confirmation_reply_cmd, 7, true,
  11448. mgmt_user_confirmation_reply_rsp, 7, true },
  11449. { 0x001d, "User Confirmation Negative Reply",
  11450. mgmt_user_confirmation_neg_reply_cmd, 7, true,
  11451. mgmt_user_confirmation_neg_reply_rsp, 7, true },
  11452. { 0x001e, "User Passkey Reply",
  11453. mgmt_user_passkey_reply_cmd, 11, true,
  11454. mgmt_user_passkey_reply_rsp, 7, true },
  11455. { 0x001f, "User Passkey Negative Reply",
  11456. mgmt_user_passkey_neg_reply_cmd, 7, true,
  11457. mgmt_user_passkey_neg_reply_rsp, 7, true },
  11458. { 0x0020, "Read Local Out Of Band Data",
  11459. mgmt_null_cmd, 0, true,
  11460. mgmt_read_local_oob_data_rsp, 64, true },
  11461. { 0x0021, "Add Remote Out Of Band Data",
  11462. mgmt_add_remote_oob_data_cmd, 71, true,
  11463. mgmt_add_remote_oob_data_rsp, 7, true },
  11464. { 0x0022, "Remove Remote Out Of Band Data",
  11465. mgmt_remove_remote_oob_data_cmd, 7, true,
  11466. mgmt_remove_remote_oob_data_rsp, 7, true },
  11467. { 0x0023, "Start Discovery",
  11468. mgmt_start_discovery_cmd, 1, true,
  11469. mgmt_start_discovery_rsp, 1, true },
  11470. { 0x0024, "Stop Discovery",
  11471. mgmt_stop_discovery_cmd, 1, true,
  11472. mgmt_stop_discovery_rsp, 1, true },
  11473. { 0x0025, "Confirm Name",
  11474. mgmt_confirm_name_cmd, 8, true,
  11475. mgmt_confirm_name_rsp, 7, true },
  11476. { 0x0026, "Block Device",
  11477. mgmt_block_device_cmd, 7, true,
  11478. mgmt_block_device_rsp, 7, true },
  11479. { 0x0027, "Unblock Device",
  11480. mgmt_unblock_device_cmd, 7, true,
  11481. mgmt_unblock_device_rsp, 7, true },
  11482. { 0x0028, "Set Device ID",
  11483. mgmt_set_device_id_cmd, 8, true,
  11484. mgmt_null_rsp, 0, true },
  11485. { 0x0029, "Set Advertising",
  11486. mgmt_set_advertising_cmd, 1, true,
  11487. mgmt_new_settings_rsp, 4, true },
  11488. { 0x002a, "Set BR/EDR",
  11489. mgmt_set_bredr_cmd, 1, true,
  11490. mgmt_new_settings_rsp, 4, true },
  11491. { 0x002b, "Set Static Address",
  11492. mgmt_set_static_address_cmd, 6, true,
  11493. mgmt_new_settings_rsp, 4, true },
  11494. { 0x002c, "Set Scan Parameters",
  11495. mgmt_set_scan_parameters_cmd, 4, true,
  11496. mgmt_null_rsp, 0, true },
  11497. { 0x002d, "Set Secure Connections",
  11498. mgmt_set_secure_connections_cmd, 1, true,
  11499. mgmt_new_settings_rsp, 4, true },
  11500. { 0x002e, "Set Debug Keys",
  11501. mgmt_set_debug_keys_cmd, 1, true,
  11502. mgmt_new_settings_rsp, 4, true },
  11503. { 0x002f, "Set Privacy",
  11504. mgmt_set_privacy_cmd, 17, true,
  11505. mgmt_new_settings_rsp, 4, true },
  11506. { 0x0030, "Load Identity Resolving Keys",
  11507. mgmt_load_identity_resolving_keys_cmd, 2, false,
  11508. mgmt_null_rsp, 0, true },
  11509. { 0x0031, "Get Connection Information",
  11510. mgmt_get_connection_information_cmd, 7, true,
  11511. mgmt_get_connection_information_rsp, 10, true },
  11512. { 0x0032, "Get Clock Information",
  11513. mgmt_get_clock_information_cmd, 7, true,
  11514. mgmt_get_clock_information_rsp, 17, true },
  11515. { 0x0033, "Add Device",
  11516. mgmt_add_device_cmd, 8, true,
  11517. mgmt_add_device_rsp, 7, true },
  11518. { 0x0034, "Remove Device",
  11519. mgmt_remove_device_cmd, 7, true,
  11520. mgmt_remove_device_rsp, 7, true },
  11521. { 0x0035, "Load Connection Parameters",
  11522. mgmt_load_connection_parameters_cmd, 2, false,
  11523. mgmt_null_rsp, 0, true },
  11524. { 0x0036, "Read Unconfigured Controller Index List",
  11525. mgmt_null_cmd, 0, true,
  11526. mgmt_read_unconf_index_list_rsp, 2, false },
  11527. { 0x0037, "Read Controller Configuration Information",
  11528. mgmt_null_cmd, 0, true,
  11529. mgmt_read_controller_conf_info_rsp, 10, true },
  11530. { 0x0038, "Set External Configuration",
  11531. mgmt_set_external_configuration_cmd, 1, true,
  11532. mgmt_new_options_rsp, 4, true },
  11533. { 0x0039, "Set Public Address",
  11534. mgmt_set_public_address_cmd, 6, true,
  11535. mgmt_new_options_rsp, 4, true },
  11536. { 0x003a, "Start Service Discovery",
  11537. mgmt_start_service_discovery_cmd, 3, false,
  11538. mgmt_start_service_discovery_rsp, 1, true },
  11539. { 0x003b, "Read Local Out Of Band Extended Data",
  11540. mgmt_read_local_oob_ext_data_cmd, 1, true,
  11541. mgmt_read_local_oob_ext_data_rsp, 3, false },
  11542. { 0x003c, "Read Extended Controller Index List",
  11543. mgmt_null_cmd, 0, true,
  11544. mgmt_read_ext_index_list_rsp, 2, false },
  11545. { 0x003d, "Read Advertising Features",
  11546. mgmt_null_cmd, 0, true,
  11547. mgmt_read_advertising_features_rsp, 8, false },
  11548. { 0x003e, "Add Advertising",
  11549. mgmt_add_advertising_cmd, 11, false,
  11550. mgmt_add_advertising_rsp, 1, true },
  11551. { 0x003f, "Remove Advertising",
  11552. mgmt_remove_advertising_cmd, 1, true,
  11553. mgmt_remove_advertising_rsp, 1, true },
  11554. { 0x0040, "Get Advertising Size Information",
  11555. mgmt_get_advertising_size_info_cmd, 5, true,
  11556. mgmt_get_advertising_size_info_rsp, 7, true },
  11557. { 0x0041, "Start Limited Discovery",
  11558. mgmt_start_limited_discovery_cmd, 1, true,
  11559. mgmt_start_limited_discovery_rsp, 1, true },
  11560. { 0x0042, "Read Extended Controller Information",
  11561. mgmt_null_cmd, 0, true,
  11562. mgmt_read_ext_controller_info_rsp, 19, false },
  11563. { 0x0043, "Set Appearance",
  11564. mgmt_set_apperance_cmd, 2, true,
  11565. mgmt_null_rsp, 0, true },
  11566. { 0x0044, "Get PHY Configuration",
  11567. mgmt_null_cmd, 0, true,
  11568. mgmt_get_phy_rsp, 12, true },
  11569. { 0x0045, "Set PHY Configuration",
  11570. mgmt_set_phy_cmd, 4, true,
  11571. mgmt_null_rsp, 0, true },
  11572. { 0x0046, "Load Blocked Keys" },
  11573. { 0x0047, "Set Wideband Speech" },
  11574. { 0x0048, "Read Controller Capabilities" },
  11575. { 0x0049, "Read Experimental Features Information",
  11576. mgmt_null_cmd, 0, true,
  11577. mgmt_read_exp_features_info_rsp, 2, false },
  11578. { 0x004a, "Set Experimental Feature",
  11579. mgmt_set_exp_feature_cmd, 17, true,
  11580. mgmt_set_exp_feature_rsp, 20, true },
  11581. { 0x004b, "Read Default System Configuration" },
  11582. { 0x004c, "Set Default System Configuration" },
  11583. { 0x004d, "Read Default Runtime Configuration" },
  11584. { 0x004e, "Set Default Runtime Configuration" },
  11585. { 0x004f, "Get Device Flags",
  11586. mgmt_get_device_flags_cmd, 7, true,
  11587. mgmt_get_device_flags_rsp, 15, true},
  11588. { 0x0050, "Set Device Flags",
  11589. mgmt_set_device_flags_cmd, 11, true,
  11590. mgmt_set_device_flags_rsp, 7, true},
  11591. { 0x0051, "Read Advertisement Monitor Features",
  11592. mgmt_null_cmd, 0, true,
  11593. mgmt_read_adv_monitor_features_rsp, 13, false},
  11594. { 0x0052, "Add Advertisement Patterns Monitor",
  11595. mgmt_add_adv_monitor_patterns_cmd, 1, false,
  11596. mgmt_add_adv_monitor_patterns_rsp, 2, true},
  11597. { 0x0053, "Remove Advertisement Monitor",
  11598. mgmt_remove_adv_monitor_patterns_cmd, 2, true,
  11599. mgmt_remove_adv_monitor_patterns_rsp, 2, true},
  11600. { 0x0054, "Add Extended Advertising Parameters",
  11601. mgmt_add_ext_adv_params_cmd, 18, false,
  11602. mgmt_add_ext_adv_params_rsp, 4, true },
  11603. { 0x0055, "Add Extended Advertising Data",
  11604. mgmt_add_ext_adv_data_cmd, 3, false,
  11605. mgmt_add_ext_adv_data_rsp, 1, true },
  11606. { 0x0056, "Add Advertisement Patterns Monitor With RSSI Threshold",
  11607. mgmt_add_adv_monitor_patterns_rssi_cmd, 8,
  11608. false,
  11609. mgmt_add_adv_monitor_patterns_rsp, 2, true},
  11610. { }
  11611. };
  11612. static void mgmt_null_evt(const void *data, uint16_t size)
  11613. {
  11614. }
  11615. static void mgmt_command_complete_evt(const void *data, uint16_t size)
  11616. {
  11617. uint16_t opcode;
  11618. uint8_t status;
  11619. const struct mgmt_data *mgmt_data = NULL;
  11620. const char *mgmt_color, *mgmt_str;
  11621. int i;
  11622. opcode = get_le16(data);
  11623. status = get_u8(data + 2);
  11624. data += 3;
  11625. size -= 3;
  11626. for (i = 0; mgmt_command_table[i].str; i++) {
  11627. if (mgmt_command_table[i].opcode == opcode) {
  11628. mgmt_data = &mgmt_command_table[i];
  11629. break;
  11630. }
  11631. }
  11632. if (mgmt_data) {
  11633. if (mgmt_data->rsp_func)
  11634. mgmt_color = COLOR_CTRL_COMMAND;
  11635. else
  11636. mgmt_color = COLOR_CTRL_COMMAND_UNKNOWN;
  11637. mgmt_str = mgmt_data->str;
  11638. } else {
  11639. mgmt_color = COLOR_CTRL_COMMAND_UNKNOWN;
  11640. mgmt_str = "Unknown";
  11641. }
  11642. print_indent(6, mgmt_color, "", mgmt_str, COLOR_OFF,
  11643. " (0x%4.4x) plen %u", opcode, size);
  11644. mgmt_print_status(status);
  11645. if (!mgmt_data || !mgmt_data->rsp_func) {
  11646. packet_hexdump(data, size);
  11647. return;
  11648. }
  11649. if (mgmt_data->rsp_fixed) {
  11650. if (size != mgmt_data->rsp_size) {
  11651. print_text(COLOR_ERROR, "invalid packet size");
  11652. packet_hexdump(data, size);
  11653. return;
  11654. }
  11655. } else {
  11656. if (size < mgmt_data->rsp_size) {
  11657. print_text(COLOR_ERROR, "too short packet");
  11658. packet_hexdump(data, size);
  11659. return;
  11660. }
  11661. }
  11662. mgmt_data->rsp_func(data, size);
  11663. }
  11664. static void mgmt_command_status_evt(const void *data, uint16_t size)
  11665. {
  11666. uint16_t opcode;
  11667. uint8_t status;
  11668. const struct mgmt_data *mgmt_data = NULL;
  11669. const char *mgmt_color, *mgmt_str;
  11670. int i;
  11671. opcode = get_le16(data);
  11672. status = get_u8(data + 2);
  11673. for (i = 0; mgmt_command_table[i].str; i++) {
  11674. if (mgmt_command_table[i].opcode == opcode) {
  11675. mgmt_data = &mgmt_command_table[i];
  11676. break;
  11677. }
  11678. }
  11679. if (mgmt_data) {
  11680. mgmt_color = COLOR_CTRL_COMMAND;
  11681. mgmt_str = mgmt_data->str;
  11682. } else {
  11683. mgmt_color = COLOR_CTRL_COMMAND_UNKNOWN;
  11684. mgmt_str = "Unknown";
  11685. }
  11686. print_indent(6, mgmt_color, "", mgmt_str, COLOR_OFF,
  11687. " (0x%4.4x)", opcode);
  11688. mgmt_print_status(status);
  11689. }
  11690. static void mgmt_controller_error_evt(const void *data, uint16_t size)
  11691. {
  11692. uint8_t error = get_u8(data);
  11693. print_field("Error: 0x%2.2x", error);
  11694. }
  11695. static void mgmt_new_settings_evt(const void *data, uint16_t size)
  11696. {
  11697. uint32_t settings = get_le32(data);
  11698. mgmt_print_settings("Current settings", settings);
  11699. }
  11700. static void mgmt_class_of_dev_changed_evt(const void *data, uint16_t size)
  11701. {
  11702. print_dev_class(data);
  11703. }
  11704. static void mgmt_local_name_changed_evt(const void *data, uint16_t size)
  11705. {
  11706. mgmt_print_name(data);
  11707. }
  11708. static void mgmt_new_link_key_evt(const void *data, uint16_t size)
  11709. {
  11710. uint8_t store_hint = get_u8(data);
  11711. mgmt_print_store_hint(store_hint);
  11712. mgmt_print_link_key(data + 1);
  11713. }
  11714. static void mgmt_new_long_term_key_evt(const void *data, uint16_t size)
  11715. {
  11716. uint8_t store_hint = get_u8(data);
  11717. mgmt_print_store_hint(store_hint);
  11718. mgmt_print_long_term_key(data + 1);
  11719. }
  11720. static void mgmt_device_connected_evt(const void *data, uint16_t size)
  11721. {
  11722. uint8_t address_type = get_u8(data + 6);
  11723. uint32_t flags = get_le32(data + 7);
  11724. uint16_t data_len = get_le16(data + 11);
  11725. mgmt_print_address(data, address_type);
  11726. mgmt_print_device_flags(flags);
  11727. print_field("Data length: %u", data_len);
  11728. print_eir(data + 13, size - 13, false);
  11729. }
  11730. static void mgmt_device_disconnected_evt(const void *data, uint16_t size)
  11731. {
  11732. uint8_t address_type = get_u8(data + 6);
  11733. uint8_t reason = get_u8(data + 7);
  11734. const char *str;
  11735. mgmt_print_address(data, address_type);
  11736. switch (reason) {
  11737. case 0x00:
  11738. str = "Unspecified";
  11739. break;
  11740. case 0x01:
  11741. str = "Connection timeout";
  11742. break;
  11743. case 0x02:
  11744. str = "Connection terminated by local host";
  11745. break;
  11746. case 0x03:
  11747. str = "Connection terminated by remote host";
  11748. break;
  11749. case 0x04:
  11750. str = "Connection terminated due to authentication failure";
  11751. break;
  11752. case 0x05:
  11753. str = "Connection terminated by local host for suspend";
  11754. break;
  11755. default:
  11756. str = "Reserved";
  11757. break;
  11758. }
  11759. print_field("Reason: %s (0x%2.2x)", str, reason);
  11760. }
  11761. static void mgmt_connect_failed_evt(const void *data, uint16_t size)
  11762. {
  11763. uint8_t address_type = get_u8(data + 6);
  11764. uint8_t status = get_u8(data + 7);
  11765. mgmt_print_address(data, address_type);
  11766. mgmt_print_status(status);
  11767. }
  11768. static void mgmt_pin_code_request_evt(const void *data, uint16_t size)
  11769. {
  11770. uint8_t address_type = get_u8(data + 6);
  11771. uint8_t secure_pin = get_u8(data + 7);
  11772. mgmt_print_address(data, address_type);
  11773. print_field("Secure PIN: 0x%2.2x", secure_pin);
  11774. }
  11775. static void mgmt_user_confirmation_request_evt(const void *data, uint16_t size)
  11776. {
  11777. uint8_t address_type = get_u8(data + 6);
  11778. uint8_t confirm_hint = get_u8(data + 7);
  11779. uint32_t value = get_le32(data + 8);
  11780. mgmt_print_address(data, address_type);
  11781. print_field("Confirm hint: 0x%2.2x", confirm_hint);
  11782. print_field("Value: 0x%8.8x", value);
  11783. }
  11784. static void mgmt_user_passkey_request_evt(const void *data, uint16_t size)
  11785. {
  11786. uint8_t address_type = get_u8(data + 6);
  11787. mgmt_print_address(data, address_type);
  11788. }
  11789. static void mgmt_authentication_failed_evt(const void *data, uint16_t size)
  11790. {
  11791. uint8_t address_type = get_u8(data + 6);
  11792. uint8_t status = get_u8(data + 7);
  11793. mgmt_print_address(data, address_type);
  11794. mgmt_print_status(status);
  11795. }
  11796. static void mgmt_device_found_evt(const void *data, uint16_t size)
  11797. {
  11798. uint8_t address_type = get_u8(data + 6);
  11799. int8_t rssi = get_s8(data + 7);
  11800. uint32_t flags = get_le32(data + 8);
  11801. uint16_t data_len = get_le16(data + 12);
  11802. mgmt_print_address(data, address_type);
  11803. print_rssi(rssi);
  11804. mgmt_print_device_flags(flags);
  11805. print_field("Data length: %u", data_len);
  11806. print_eir(data + 14, size - 14, false);
  11807. }
  11808. static void mgmt_discovering_evt(const void *data, uint16_t size)
  11809. {
  11810. uint8_t type = get_u8(data);
  11811. uint8_t enable = get_u8(data + 1);
  11812. mgmt_print_address_type(type);
  11813. print_enable("Discovery", enable);
  11814. }
  11815. static void mgmt_device_blocked_evt(const void *data, uint16_t size)
  11816. {
  11817. uint8_t address_type = get_u8(data + 6);
  11818. mgmt_print_address(data, address_type);
  11819. }
  11820. static void mgmt_device_unblocked_evt(const void *data, uint16_t size)
  11821. {
  11822. uint8_t address_type = get_u8(data + 6);
  11823. mgmt_print_address(data, address_type);
  11824. }
  11825. static void mgmt_device_unpaired_evt(const void *data, uint16_t size)
  11826. {
  11827. uint8_t address_type = get_u8(data + 6);
  11828. mgmt_print_address(data, address_type);
  11829. }
  11830. static void mgmt_passkey_notify_evt(const void *data, uint16_t size)
  11831. {
  11832. uint8_t address_type = get_u8(data + 6);
  11833. uint32_t passkey = get_le32(data + 7);
  11834. uint8_t entered = get_u8(data + 11);
  11835. mgmt_print_address(data, address_type);
  11836. print_field("Passkey: 0x%8.8x", passkey);
  11837. print_field("Entered: %u", entered);
  11838. }
  11839. static void mgmt_new_identity_resolving_key_evt(const void *data, uint16_t size)
  11840. {
  11841. uint8_t store_hint = get_u8(data);
  11842. mgmt_print_store_hint(store_hint);
  11843. print_addr_resolve("Random address", data + 1, 0x01, false);
  11844. mgmt_print_identity_resolving_key(data + 7);
  11845. }
  11846. static void mgmt_new_signature_resolving_key_evt(const void *data, uint16_t size)
  11847. {
  11848. uint8_t store_hint = get_u8(data);
  11849. mgmt_print_store_hint(store_hint);
  11850. mgmt_print_signature_resolving_key(data + 1);
  11851. }
  11852. static void mgmt_device_added_evt(const void *data, uint16_t size)
  11853. {
  11854. uint8_t address_type = get_u8(data + 6);
  11855. uint8_t action = get_u8(data + 7);
  11856. mgmt_print_address(data, address_type);
  11857. mgmt_print_device_action(action);
  11858. }
  11859. static void mgmt_device_removed_evt(const void *data, uint16_t size)
  11860. {
  11861. uint8_t address_type = get_u8(data + 6);
  11862. mgmt_print_address(data, address_type);
  11863. }
  11864. static void mgmt_new_connection_parameter_evt(const void *data, uint16_t size)
  11865. {
  11866. uint8_t store_hint = get_u8(data);
  11867. mgmt_print_store_hint(store_hint);
  11868. mgmt_print_connection_parameter(data + 1);
  11869. }
  11870. static void mgmt_new_conf_options_evt(const void *data, uint16_t size)
  11871. {
  11872. uint32_t missing_options = get_le32(data);
  11873. mgmt_print_options("Missing options", missing_options);
  11874. }
  11875. static void mgmt_ext_index_added_evt(const void *data, uint16_t size)
  11876. {
  11877. uint8_t type = get_u8(data);
  11878. uint8_t bus = get_u8(data + 1);
  11879. print_field("type 0x%2.2x - bus 0x%2.2x", type, bus);
  11880. }
  11881. static void mgmt_ext_index_removed_evt(const void *data, uint16_t size)
  11882. {
  11883. uint8_t type = get_u8(data);
  11884. uint8_t bus = get_u8(data + 1);
  11885. print_field("type 0x%2.2x - bus 0x%2.2x", type, bus);
  11886. }
  11887. static void mgmt_local_oob_ext_data_updated_evt(const void *data, uint16_t size)
  11888. {
  11889. uint8_t type = get_u8(data);
  11890. uint16_t data_len = get_le16(data + 1);
  11891. mgmt_print_address_type(type);
  11892. print_field("Data length: %u", data_len);
  11893. print_eir(data + 3, size - 3, true);
  11894. }
  11895. static void mgmt_advertising_added_evt(const void *data, uint16_t size)
  11896. {
  11897. uint8_t instance = get_u8(data);
  11898. print_field("Instance: %u", instance);
  11899. }
  11900. static void mgmt_advertising_removed_evt(const void *data, uint16_t size)
  11901. {
  11902. uint8_t instance = get_u8(data);
  11903. print_field("Instance: %u", instance);
  11904. }
  11905. static void mgmt_ext_controller_info_changed_evt(const void *data, uint16_t size)
  11906. {
  11907. uint16_t data_len = get_le16(data);
  11908. print_field("Data length: %u", data_len);
  11909. print_eir(data + 2, size - 2, false);
  11910. }
  11911. static void mgmt_phy_changed_evt(const void *data, uint16_t size)
  11912. {
  11913. uint32_t selected_phys = get_le32(data);
  11914. mgmt_print_phys("Selected PHYs", selected_phys);
  11915. }
  11916. static void mgmt_exp_feature_changed_evt(const void *data, uint16_t size)
  11917. {
  11918. mgmt_print_exp_feature(data);
  11919. }
  11920. static void mgmt_device_flags_changed_evt(const void *data, uint16_t size)
  11921. {
  11922. uint8_t type = get_u8(data + 6);
  11923. uint32_t supported_flags = get_le32(data + 7);
  11924. uint32_t current_flags = get_le32(data + 11);
  11925. mgmt_print_address(data, type);
  11926. mgmt_print_added_device_flags("Supported Flags", supported_flags);
  11927. mgmt_print_added_device_flags("Current Flags", current_flags);
  11928. }
  11929. static void mgmt_adv_monitor_added_evt(const void *data, uint16_t size)
  11930. {
  11931. uint16_t handle = get_le16(data);
  11932. print_field("Handle: %d", handle);
  11933. }
  11934. static void mgmt_adv_monitor_removed_evt(const void *data, uint16_t size)
  11935. {
  11936. uint16_t handle = get_le16(data);
  11937. print_field("Handle: %d", handle);
  11938. }
  11939. static void mgmt_controller_suspend_evt(const void *data, uint16_t size)
  11940. {
  11941. uint8_t state = get_u8(data);
  11942. char *str;
  11943. switch (state) {
  11944. case 0x0:
  11945. str = "Controller running (failed to suspend)";
  11946. break;
  11947. case 0x1:
  11948. str = "Disconnected and not scanning";
  11949. break;
  11950. case 0x2:
  11951. str = "Page scanning and/or passive scanning";
  11952. break;
  11953. default:
  11954. str = "Unknown suspend state";
  11955. break;
  11956. }
  11957. print_field("Suspend state: %s (%d)", str, state);
  11958. }
  11959. static void mgmt_controller_resume_evt(const void *data, uint16_t size)
  11960. {
  11961. uint8_t addr_type = get_u8(data + 6);
  11962. uint8_t wake_reason = get_u8(data + 7);
  11963. char *str;
  11964. switch (wake_reason) {
  11965. case 0x0:
  11966. str = "Resume from non-Bluetooth wake source";
  11967. break;
  11968. case 0x1:
  11969. str = "Wake due to unexpected event";
  11970. break;
  11971. case 0x2:
  11972. str = "Remote wake due to peer device connection";
  11973. break;
  11974. default:
  11975. str = "Unknown wake reason";
  11976. break;
  11977. }
  11978. print_field("Wake reason: %s (%d)", str, wake_reason);
  11979. mgmt_print_address(data, addr_type);
  11980. }
  11981. static const struct mgmt_data mgmt_event_table[] = {
  11982. { 0x0001, "Command Complete",
  11983. mgmt_command_complete_evt, 3, false },
  11984. { 0x0002, "Command Status",
  11985. mgmt_command_status_evt, 3, true },
  11986. { 0x0003, "Controller Error",
  11987. mgmt_controller_error_evt, 1, true },
  11988. { 0x0004, "Index Added",
  11989. mgmt_null_evt, 0, true },
  11990. { 0x0005, "Index Removed",
  11991. mgmt_null_evt, 0, true },
  11992. { 0x0006, "New Settings",
  11993. mgmt_new_settings_evt, 4, true },
  11994. { 0x0007, "Class Of Device Changed",
  11995. mgmt_class_of_dev_changed_evt, 3, true },
  11996. { 0x0008, "Local Name Changed",
  11997. mgmt_local_name_changed_evt, 260, true },
  11998. { 0x0009, "New Link Key",
  11999. mgmt_new_link_key_evt, 26, true },
  12000. { 0x000a, "New Long Term Key",
  12001. mgmt_new_long_term_key_evt, 37, true },
  12002. { 0x000b, "Device Connected",
  12003. mgmt_device_connected_evt, 13, false },
  12004. { 0x000c, "Device Disconnected",
  12005. mgmt_device_disconnected_evt, 8, true },
  12006. { 0x000d, "Connect Failed",
  12007. mgmt_connect_failed_evt, 8, true },
  12008. { 0x000e, "PIN Code Request",
  12009. mgmt_pin_code_request_evt, 8, true },
  12010. { 0x000f, "User Confirmation Request",
  12011. mgmt_user_confirmation_request_evt, 12, true },
  12012. { 0x0010, "User Passkey Request",
  12013. mgmt_user_passkey_request_evt, 7, true },
  12014. { 0x0011, "Authentication Failed",
  12015. mgmt_authentication_failed_evt, 8, true },
  12016. { 0x0012, "Device Found",
  12017. mgmt_device_found_evt, 14, false },
  12018. { 0x0013, "Discovering",
  12019. mgmt_discovering_evt, 2, true },
  12020. { 0x0014, "Device Blocked",
  12021. mgmt_device_blocked_evt, 7, true },
  12022. { 0x0015, "Device Unblocked",
  12023. mgmt_device_unblocked_evt, 7, true },
  12024. { 0x0016, "Device Unpaired",
  12025. mgmt_device_unpaired_evt, 7, true },
  12026. { 0x0017, "Passkey Notify",
  12027. mgmt_passkey_notify_evt, 12, true },
  12028. { 0x0018, "New Identity Resolving Key",
  12029. mgmt_new_identity_resolving_key_evt, 30, true },
  12030. { 0x0019, "New Signature Resolving Key",
  12031. mgmt_new_signature_resolving_key_evt, 25, true },
  12032. { 0x001a, "Device Added",
  12033. mgmt_device_added_evt, 8, true },
  12034. { 0x001b, "Device Removed",
  12035. mgmt_device_removed_evt, 7, true },
  12036. { 0x001c, "New Connection Parameter",
  12037. mgmt_new_connection_parameter_evt, 16, true },
  12038. { 0x001d, "Unconfigured Index Added",
  12039. mgmt_null_evt, 0, true },
  12040. { 0x001e, "Unconfigured Index Removed",
  12041. mgmt_null_evt, 0, true },
  12042. { 0x001f, "New Configuration Options",
  12043. mgmt_new_conf_options_evt, 4, true },
  12044. { 0x0020, "Extended Index Added",
  12045. mgmt_ext_index_added_evt, 2, true },
  12046. { 0x0021, "Extended Index Removed",
  12047. mgmt_ext_index_removed_evt, 2, true },
  12048. { 0x0022, "Local Out Of Band Extended Data Updated",
  12049. mgmt_local_oob_ext_data_updated_evt, 3, false },
  12050. { 0x0023, "Advertising Added",
  12051. mgmt_advertising_added_evt, 1, true },
  12052. { 0x0024, "Advertising Removed",
  12053. mgmt_advertising_removed_evt, 1, true },
  12054. { 0x0025, "Extended Controller Information Changed",
  12055. mgmt_ext_controller_info_changed_evt, 2, false },
  12056. { 0x0026, "PHY Configuration Changed",
  12057. mgmt_phy_changed_evt, 4, true },
  12058. { 0x0027, "Experimental Feature Changed",
  12059. mgmt_exp_feature_changed_evt, 20, true },
  12060. { 0x002a, "Device Flags Changed",
  12061. mgmt_device_flags_changed_evt, 15, true },
  12062. { 0x002b, "Advertisement Monitor Added",
  12063. mgmt_adv_monitor_added_evt, 2, true },
  12064. { 0x002c, "Advertisement Monitor Removed",
  12065. mgmt_adv_monitor_removed_evt, 2, true },
  12066. { 0x002d, "Controller Suspended",
  12067. mgmt_controller_suspend_evt, 1, true },
  12068. { 0x002e, "Controller Resumed",
  12069. mgmt_controller_resume_evt, 8, true },
  12070. { }
  12071. };
  12072. static void mgmt_print_commands(const void *data, uint16_t num)
  12073. {
  12074. int i;
  12075. print_field("Commands: %u", num);
  12076. for (i = 0; i < num; i++) {
  12077. uint16_t opcode = get_le16(data + (i * 2));
  12078. const char *str = NULL;
  12079. int n;
  12080. for (n = 0; mgmt_command_table[n].str; n++) {
  12081. if (mgmt_command_table[n].opcode == opcode) {
  12082. str = mgmt_command_table[n].str;
  12083. break;
  12084. }
  12085. }
  12086. print_field(" %s (0x%4.4x)", str ?: "Reserved", opcode);
  12087. }
  12088. }
  12089. static void mgmt_print_events(const void *data, uint16_t num)
  12090. {
  12091. int i;
  12092. print_field("Events: %u", num);
  12093. for (i = 0; i < num; i++) {
  12094. uint16_t opcode = get_le16(data + (i * 2));
  12095. const char *str = NULL;
  12096. int n;
  12097. for (n = 0; mgmt_event_table[n].str; n++) {
  12098. if (mgmt_event_table[n].opcode == opcode) {
  12099. str = mgmt_event_table[n].str;
  12100. break;
  12101. }
  12102. }
  12103. print_field(" %s (0x%4.4x)", str ?: "Reserved", opcode);
  12104. }
  12105. }
  12106. void packet_ctrl_command(struct timeval *tv, struct ucred *cred, uint16_t index,
  12107. const void *data, uint16_t size)
  12108. {
  12109. uint32_t cookie;
  12110. uint16_t format, opcode;
  12111. const struct mgmt_data *mgmt_data = NULL;
  12112. const char *mgmt_color, *mgmt_str;
  12113. char channel[11], extra_str[25];
  12114. int i;
  12115. if (size < 4) {
  12116. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  12117. "Malformed Control Command packet", NULL, NULL);
  12118. packet_hexdump(data, size);
  12119. return;
  12120. }
  12121. cookie = get_le32(data);
  12122. data += 4;
  12123. size -= 4;
  12124. sprintf(channel, "0x%4.4x", cookie);
  12125. format = get_format(cookie);
  12126. if (format != CTRL_MGMT) {
  12127. char label[7];
  12128. sprintf(label, "0x%4.4x", format);
  12129. print_packet(tv, cred, '@', index, channel, COLOR_CTRL_CLOSE,
  12130. "Control Command", label, NULL);
  12131. packet_hexdump(data, size);
  12132. return;
  12133. }
  12134. if (size < 2) {
  12135. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  12136. "Malformed MGMT Command packet", NULL, NULL);
  12137. packet_hexdump(data, size);
  12138. return;
  12139. }
  12140. opcode = get_le16(data);
  12141. data += 2;
  12142. size -= 2;
  12143. for (i = 0; mgmt_command_table[i].str; i++) {
  12144. if (mgmt_command_table[i].opcode == opcode) {
  12145. mgmt_data = &mgmt_command_table[i];
  12146. break;
  12147. }
  12148. }
  12149. if (mgmt_data) {
  12150. if (mgmt_data->func)
  12151. mgmt_color = COLOR_CTRL_COMMAND;
  12152. else
  12153. mgmt_color = COLOR_CTRL_COMMAND_UNKNOWN;
  12154. mgmt_str = mgmt_data->str;
  12155. } else {
  12156. mgmt_color = COLOR_CTRL_COMMAND_UNKNOWN;
  12157. mgmt_str = "Unknown";
  12158. }
  12159. sprintf(extra_str, "(0x%4.4x) plen %d", opcode, size);
  12160. print_packet(tv, cred, '@', index, channel, mgmt_color,
  12161. "MGMT Command", mgmt_str, extra_str);
  12162. if (!mgmt_data || !mgmt_data->func) {
  12163. packet_hexdump(data, size);
  12164. return;
  12165. }
  12166. if (mgmt_data->fixed) {
  12167. if (size != mgmt_data->size) {
  12168. print_text(COLOR_ERROR, "invalid packet size");
  12169. packet_hexdump(data, size);
  12170. return;
  12171. }
  12172. } else {
  12173. if (size < mgmt_data->size) {
  12174. print_text(COLOR_ERROR, "too short packet");
  12175. packet_hexdump(data, size);
  12176. return;
  12177. }
  12178. }
  12179. mgmt_data->func(data, size);
  12180. }
  12181. void packet_ctrl_event(struct timeval *tv, struct ucred *cred, uint16_t index,
  12182. const void *data, uint16_t size)
  12183. {
  12184. uint32_t cookie;
  12185. uint16_t format, opcode;
  12186. const struct mgmt_data *mgmt_data = NULL;
  12187. const char *mgmt_color, *mgmt_str;
  12188. char channel[11], extra_str[25];
  12189. int i;
  12190. if (size < 4) {
  12191. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  12192. "Malformed Control Event packet", NULL, NULL);
  12193. packet_hexdump(data, size);
  12194. return;
  12195. }
  12196. cookie = get_le32(data);
  12197. data += 4;
  12198. size -= 4;
  12199. sprintf(channel, "0x%4.4x", cookie);
  12200. format = get_format(cookie);
  12201. if (format != CTRL_MGMT) {
  12202. char label[7];
  12203. sprintf(label, "0x%4.4x", format);
  12204. print_packet(tv, cred, '@', index, channel, COLOR_CTRL_CLOSE,
  12205. "Control Event", label, NULL);
  12206. packet_hexdump(data, size);
  12207. return;
  12208. }
  12209. if (size < 2) {
  12210. print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
  12211. "Malformed MGMT Event packet", NULL, NULL);
  12212. packet_hexdump(data, size);
  12213. return;
  12214. }
  12215. opcode = get_le16(data);
  12216. data += 2;
  12217. size -= 2;
  12218. for (i = 0; mgmt_event_table[i].str; i++) {
  12219. if (mgmt_event_table[i].opcode == opcode) {
  12220. mgmt_data = &mgmt_event_table[i];
  12221. break;
  12222. }
  12223. }
  12224. if (mgmt_data) {
  12225. if (mgmt_data->func)
  12226. mgmt_color = COLOR_CTRL_EVENT;
  12227. else
  12228. mgmt_color = COLOR_CTRL_EVENT_UNKNOWN;
  12229. mgmt_str = mgmt_data->str;
  12230. } else {
  12231. mgmt_color = COLOR_CTRL_EVENT_UNKNOWN;
  12232. mgmt_str = "Unknown";
  12233. }
  12234. sprintf(extra_str, "(0x%4.4x) plen %d", opcode, size);
  12235. print_packet(tv, cred, '@', index, channel, mgmt_color,
  12236. "MGMT Event", mgmt_str, extra_str);
  12237. if (!mgmt_data || !mgmt_data->func) {
  12238. packet_hexdump(data, size);
  12239. return;
  12240. }
  12241. if (mgmt_data->fixed) {
  12242. if (size != mgmt_data->size) {
  12243. print_text(COLOR_ERROR, "invalid packet size");
  12244. packet_hexdump(data, size);
  12245. return;
  12246. }
  12247. } else {
  12248. if (size < mgmt_data->size) {
  12249. print_text(COLOR_ERROR, "too short packet");
  12250. packet_hexdump(data, size);
  12251. return;
  12252. }
  12253. }
  12254. mgmt_data->func(data, size);
  12255. }
  12256. void packet_todo(void)
  12257. {
  12258. int i;
  12259. printf("HCI commands with missing decodings:\n");
  12260. for (i = 0; opcode_table[i].str; i++) {
  12261. if (opcode_table[i].bit < 0)
  12262. continue;
  12263. if (opcode_table[i].cmd_func)
  12264. continue;
  12265. printf("\t%s\n", opcode_table[i].str);
  12266. }
  12267. printf("HCI events with missing decodings:\n");
  12268. for (i = 0; event_table[i].str; i++) {
  12269. if (event_table[i].func)
  12270. continue;
  12271. printf("\t%s\n", event_table[i].str);
  12272. }
  12273. for (i = 0; le_meta_event_table[i].str; i++) {
  12274. if (le_meta_event_table[i].func)
  12275. continue;
  12276. printf("\t%s\n", le_meta_event_table[i].str);
  12277. }
  12278. }