| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133 |
- // SPDX-License-Identifier: GPL-2.0-or-later
- /*
- *
- * BlueZ - Bluetooth protocol stack for Linux
- *
- * Copyright (C) 2000-2002 Maxim Krasnyansky <maxk@qualcomm.com>
- * Copyright (C) 2003-2011 Marcel Holtmann <marcel@holtmann.org>
- *
- *
- */
- #ifdef HAVE_CONFIG_H
- #include <config.h>
- #endif
- #define _GNU_SOURCE
- #include <stdio.h>
- #include <errno.h>
- #include <ctype.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <string.h>
- #include "parser.h"
- #include "lib/hci.h"
- #include "lib/hci_lib.h"
- #include "lib/amp.h"
- static uint16_t manufacturer = DEFAULT_COMPID;
- static inline uint16_t get_manufacturer(void)
- {
- return (manufacturer == DEFAULT_COMPID ? parser.defcompid : manufacturer);
- }
- #define EVENT_NUM 77
- static char *event_str[EVENT_NUM + 1] = {
- "Unknown",
- "Inquiry Complete",
- "Inquiry Result",
- "Connect Complete",
- "Connect Request",
- "Disconn Complete",
- "Auth Complete",
- "Remote Name Req Complete",
- "Encrypt Change",
- "Change Connection Link Key Complete",
- "Temporary Link Key Complete",
- "Read Remote Supported Features",
- "Read Remote Ver Info Complete",
- "QoS Setup Complete",
- "Command Complete",
- "Command Status",
- "Hardware Error",
- "Flush Occurred",
- "Role Change",
- "Number of Completed Packets",
- "Mode Change",
- "Return Link Keys",
- "PIN Code Request",
- "Link Key Request",
- "Link Key Notification",
- "Loopback Command",
- "Data Buffer Overflow",
- "Max Slots Change",
- "Read Clock Offset Complete",
- "Connection Packet Type Changed",
- "QoS Violation",
- "Page Scan Mode Change",
- "Page Scan Repetition Mode Change",
- "Flow Specification Complete",
- "Inquiry Result with RSSI",
- "Read Remote Extended Features",
- "Unknown",
- "Unknown",
- "Unknown",
- "Unknown",
- "Unknown",
- "Unknown",
- "Unknown",
- "Unknown",
- "Synchronous Connect Complete",
- "Synchronous Connect Changed",
- "Sniff Subrate",
- "Extended Inquiry Result",
- "Encryption Key Refresh Complete",
- "IO Capability Request",
- "IO Capability Response",
- "User Confirmation Request",
- "User Passkey Request",
- "Remote OOB Data Request",
- "Simple Pairing Complete",
- "Unknown",
- "Link Supervision Timeout Change",
- "Enhanced Flush Complete",
- "Unknown",
- "User Passkey Notification",
- "Keypress Notification",
- "Remote Host Supported Features Notification",
- "LE Meta Event",
- "Unknown",
- "Physical Link Complete",
- "Channel Selected",
- "Disconnection Physical Link Complete",
- "Physical Link Loss Early Warning",
- "Physical Link Recovery",
- "Logical Link Complete",
- "Disconnection Logical Link Complete",
- "Flow Spec Modify Complete",
- "Number Of Completed Data Blocks",
- "AMP Start Test",
- "AMP Test End",
- "AMP Receiver Report",
- "Short Range Mode Change Complete",
- "AMP Status Change",
- };
- #define LE_EV_NUM 5
- static char *ev_le_meta_str[LE_EV_NUM + 1] = {
- "Unknown",
- "LE Connection Complete",
- "LE Advertising Report",
- "LE Connection Update Complete",
- "LE Read Remote Used Features Complete",
- "LE Long Term Key Request",
- };
- #define CMD_LINKCTL_NUM 60
- static char *cmd_linkctl_str[CMD_LINKCTL_NUM + 1] = {
- "Unknown",
- "Inquiry",
- "Inquiry Cancel",
- "Periodic Inquiry Mode",
- "Exit Periodic Inquiry Mode",
- "Create Connection",
- "Disconnect",
- "Add SCO Connection",
- "Create Connection Cancel",
- "Accept Connection Request",
- "Reject Connection Request",
- "Link Key Request Reply",
- "Link Key Request Negative Reply",
- "PIN Code Request Reply",
- "PIN Code Request Negative Reply",
- "Change Connection Packet Type",
- "Unknown",
- "Authentication Requested",
- "Unknown",
- "Set Connection Encryption",
- "Unknown",
- "Change Connection Link Key",
- "Unknown",
- "Temporary Link Key",
- "Unknown",
- "Remote Name Request",
- "Remote Name Request Cancel",
- "Read Remote Supported Features",
- "Read Remote Extended Features",
- "Read Remote Version Information",
- "Unknown",
- "Read Clock Offset",
- "Read LMP Handle",
- "Unknown",
- "Unknown",
- "Unknown",
- "Unknown",
- "Unknown",
- "Unknown",
- "Unknown",
- "Setup Synchronous Connection",
- "Accept Synchronous Connection",
- "Reject Synchronous Connection",
- "IO Capability Request Reply",
- "User Confirmation Request Reply",
- "User Confirmation Request Negative Reply",
- "User Passkey Request Reply",
- "User Passkey Request Negative Reply",
- "Remote OOB Data Request Reply",
- "Unknown",
- "Unknown",
- "Remote OOB Data Request Negative Reply",
- "IO Capability Request Negative Reply",
- "Create Physical Link",
- "Accept Physical Link",
- "Disconnect Physical Link",
- "Create Logical Link",
- "Accept Logical Link",
- "Disconnect Logical Link",
- "Logical Link Cancel",
- "Flow Spec Modify",
- };
- #define CMD_LINKPOL_NUM 17
- static char *cmd_linkpol_str[CMD_LINKPOL_NUM + 1] = {
- "Unknown",
- "Hold Mode",
- "Unknown",
- "Sniff Mode",
- "Exit Sniff Mode",
- "Park State",
- "Exit Park State",
- "QoS Setup",
- "Unknown",
- "Role Discovery",
- "Unknown",
- "Switch Role",
- "Read Link Policy Settings",
- "Write Link Policy Settings",
- "Read Default Link Policy Settings",
- "Write Default Link Policy Settings",
- "Flow Specification",
- "Sniff Subrating",
- };
- #define CMD_HOSTCTL_NUM 109
- static char *cmd_hostctl_str[CMD_HOSTCTL_NUM + 1] = {
- "Unknown",
- "Set Event Mask",
- "Unknown",
- "Reset",
- "Unknown",
- "Set Event Filter",
- "Unknown",
- "Unknown",
- "Flush",
- "Read PIN Type ",
- "Write PIN Type",
- "Create New Unit Key",
- "Unknown",
- "Read Stored Link Key",
- "Unknown",
- "Unknown",
- "Unknown",
- "Write Stored Link Key",
- "Delete Stored Link Key",
- "Write Local Name",
- "Read Local Name",
- "Read Connection Accept Timeout",
- "Write Connection Accept Timeout",
- "Read Page Timeout",
- "Write Page Timeout",
- "Read Scan Enable",
- "Write Scan Enable",
- "Read Page Scan Activity",
- "Write Page Scan Activity",
- "Read Inquiry Scan Activity",
- "Write Inquiry Scan Activity",
- "Read Authentication Enable",
- "Write Authentication Enable",
- "Read Encryption Mode",
- "Write Encryption Mode",
- "Read Class of Device",
- "Write Class of Device",
- "Read Voice Setting",
- "Write Voice Setting",
- "Read Automatic Flush Timeout",
- "Write Automatic Flush Timeout",
- "Read Num Broadcast Retransmissions",
- "Write Num Broadcast Retransmissions",
- "Read Hold Mode Activity ",
- "Write Hold Mode Activity",
- "Read Transmit Power Level",
- "Read Synchronous Flow Control Enable",
- "Write Synchronous Flow Control Enable",
- "Unknown",
- "Set Host Controller To Host Flow Control",
- "Unknown",
- "Host Buffer Size",
- "Unknown",
- "Host Number of Completed Packets",
- "Read Link Supervision Timeout",
- "Write Link Supervision Timeout",
- "Read Number of Supported IAC",
- "Read Current IAC LAP",
- "Write Current IAC LAP",
- "Read Page Scan Period Mode",
- "Write Page Scan Period Mode",
- "Read Page Scan Mode",
- "Write Page Scan Mode",
- "Set AFH Host Channel Classification",
- "Unknown",
- "Unknown",
- "Read Inquiry Scan Type",
- "Write Inquiry Scan Type",
- "Read Inquiry Mode",
- "Write Inquiry Mode",
- "Read Page Scan Type",
- "Write Page Scan Type",
- "Read AFH Channel Assessment Mode",
- "Write AFH Channel Assessment Mode",
- "Unknown",
- "Unknown",
- "Unknown",
- "Unknown",
- "Unknown",
- "Unknown",
- "Unknown",
- "Read Extended Inquiry Response",
- "Write Extended Inquiry Response",
- "Refresh Encryption Key",
- "Unknown",
- "Read Simple Pairing Mode",
- "Write Simple Pairing Mode",
- "Read Local OOB Data",
- "Read Inquiry Response Transmit Power Level",
- "Write Inquiry Transmit Power Level",
- "Read Default Erroneous Data Reporting",
- "Write Default Erroneous Data Reporting",
- "Unknown",
- "Unknown",
- "Unknown",
- "Enhanced Flush",
- "Unknown",
- "Read Logical Link Accept Timeout",
- "Write Logical Link Accept Timeout",
- "Set Event Mask Page 2",
- "Read Location Data",
- "Write Location Data",
- "Read Flow Control Mode",
- "Write Flow Control Mode",
- "Read Enhanced Transmit Power Level",
- "Read Best Effort Flush Timeout",
- "Write Best Effort Flush Timeout",
- "Short Range Mode",
- "Read LE Host Supported",
- "Write LE Host Supported",
- };
- #define CMD_INFO_NUM 10
- static char *cmd_info_str[CMD_INFO_NUM + 1] = {
- "Unknown",
- "Read Local Version Information",
- "Read Local Supported Commands",
- "Read Local Supported Features",
- "Read Local Extended Features",
- "Read Buffer Size",
- "Unknown",
- "Read Country Code",
- "Unknown",
- "Read BD ADDR",
- "Read Data Block Size",
- };
- #define CMD_STATUS_NUM 11
- static char *cmd_status_str[CMD_STATUS_NUM + 1] = {
- "Unknown",
- "Read Failed Contact Counter",
- "Reset Failed Contact Counter",
- "Read Link Quality",
- "Unknown",
- "Read RSSI",
- "Read AFH Channel Map",
- "Read Clock",
- "Read Encryption Key Size",
- "Read Local AMP Info",
- "Read Local AMP ASSOC",
- "Write Remote AMP ASSOC"
- };
- #define CMD_TESTING_NUM 4
- static char *cmd_testing_str[CMD_TESTING_NUM + 1] = {
- "Unknown",
- "Read Loopback Mode",
- "Write Loopback Mode",
- "Enable Device Under Test mode",
- "Unknown",
- };
- #define CMD_LE_NUM 31
- static char *cmd_le_str[CMD_LE_NUM + 1] = {
- "Unknown",
- "LE Set Event Mask",
- "LE Read Buffer Size",
- "LE Read Local Supported Features",
- "Unknown",
- "LE Set Random Address",
- "LE Set Advertising Parameters",
- "LE Read Advertising Channel Tx Power",
- "LE Set Advertising Data",
- "LE Set Scan Response Data",
- "LE Set Advertise Enable",
- "LE Set Scan Parameters",
- "LE Set Scan Enable",
- "LE Create Connection",
- "LE Create Connection Cancel",
- "LE Read Accept List Size",
- "LE Clear Accept List",
- "LE Add Device To Accept List",
- "LE Remove Device From Accept List",
- "LE Connection Update",
- "LE Set Host Channel Classification",
- "LE Read Channel Map",
- "LE Read Remote Used Features",
- "LE Encrypt",
- "LE Rand",
- "LE Start Encryption",
- "LE Long Term Key Request Reply",
- "LE Long Term Key Request Negative Reply",
- "LE Read Supported States",
- "LE Receiver Test",
- "LE Transmitter Test",
- "LE Test End",
- };
- #define ERROR_CODE_NUM 63
- static char *error_code_str[ERROR_CODE_NUM + 1] = {
- "Success",
- "Unknown HCI Command",
- "Unknown Connection Identifier",
- "Hardware Failure",
- "Page Timeout",
- "Authentication Failure",
- "PIN or Key Missing",
- "Memory Capacity Exceeded",
- "Connection Timeout",
- "Connection Limit Exceeded",
- "Synchronous Connection to a Device Exceeded",
- "ACL Connection Already Exists",
- "Command Disallowed",
- "Connection Rejected due to Limited Resources",
- "Connection Rejected due to Security Reasons",
- "Connection Rejected due to Unacceptable BD_ADDR",
- "Connection Accept Timeout Exceeded",
- "Unsupported Feature or Parameter Value",
- "Invalid HCI Command Parameters",
- "Remote User Terminated Connection",
- "Remote Device Terminated Connection due to Low Resources",
- "Remote Device Terminated Connection due to Power Off",
- "Connection Terminated by Local Host",
- "Repeated Attempts",
- "Pairing Not Allowed",
- "Unknown LMP PDU",
- "Unsupported Remote Feature / Unsupported LMP Feature",
- "SCO Offset Rejected",
- "SCO Interval Rejected",
- "SCO Air Mode Rejected",
- "Invalid LMP Parameters / Invalid LL Parameters",
- "Unspecified Error",
- "Unsupported LMP Parameter Value / Unsupported LL Parameter Value",
- "Role Change Not Allowed",
- "LMP Response Timeout",
- "LMP Error Transaction Collision",
- "LMP PDU Not Allowed",
- "Encryption Mode Not Acceptable",
- "Link Key Can Not be Changed",
- "Requested QoS Not Supported",
- "Instant Passed",
- "Pairing with Unit Key Not Supported",
- "Different Transaction Collision",
- "Reserved",
- "QoS Unacceptable Parameter",
- "QoS Rejected",
- "Channel Classification Not Supported",
- "Insufficient Security",
- "Parameter out of Mandatory Range",
- "Reserved",
- "Role Switch Pending",
- "Reserved",
- "Reserved Slot Violation",
- "Role Switch Failed",
- "Extended Inquiry Response Too Large",
- "Simple Pairing Not Supported by Host",
- "Host Busy - Pairing",
- "Connection Rejected due to No Suitable Channel Found",
- "Controller Busy",
- "Unacceptable Connection Parameters",
- "Directed Advertising Timeout",
- "Connection Terminated Due to MIC Failure",
- "Connection Failed to be Established",
- "MAC Connection Failed",
- };
- static char *status2str(uint8_t status)
- {
- char *str;
- if (status <= ERROR_CODE_NUM)
- str = error_code_str[status];
- else
- str = "Unknown";
- return str;
- }
- static char *opcode2str(uint16_t opcode)
- {
- uint16_t ogf = cmd_opcode_ogf(opcode);
- uint16_t ocf = cmd_opcode_ocf(opcode);
- char *cmd;
- switch (ogf) {
- case OGF_INFO_PARAM:
- if (ocf <= CMD_INFO_NUM)
- cmd = cmd_info_str[ocf];
- else
- cmd = "Unknown";
- break;
- case OGF_HOST_CTL:
- if (ocf <= CMD_HOSTCTL_NUM)
- cmd = cmd_hostctl_str[ocf];
- else
- cmd = "Unknown";
- break;
- case OGF_LINK_CTL:
- if (ocf <= CMD_LINKCTL_NUM)
- cmd = cmd_linkctl_str[ocf];
- else
- cmd = "Unknown";
- break;
- case OGF_LINK_POLICY:
- if (ocf <= CMD_LINKPOL_NUM)
- cmd = cmd_linkpol_str[ocf];
- else
- cmd = "Unknown";
- break;
- case OGF_STATUS_PARAM:
- if (ocf <= CMD_STATUS_NUM)
- cmd = cmd_status_str[ocf];
- else
- cmd = "Unknown";
- break;
- case OGF_TESTING_CMD:
- if (ocf <= CMD_TESTING_NUM)
- cmd = cmd_testing_str[ocf];
- else
- cmd = "Unknown";
- break;
- case OGF_LE_CTL:
- if (ocf <= CMD_LE_NUM)
- cmd = cmd_le_str[ocf];
- else
- cmd = "Unknown";
- break;
- case OGF_VENDOR_CMD:
- cmd = "Vendor";
- break;
- default:
- cmd = "Unknown";
- break;
- }
- return cmd;
- }
- static char *linktype2str(uint8_t type)
- {
- switch (type) {
- case 0x00:
- return "SCO";
- case 0x01:
- return "ACL";
- case 0x02:
- return "eSCO";
- default:
- return "Unknown";
- }
- }
- static char *role2str(uint8_t role)
- {
- switch (role) {
- case 0x00:
- return "Central";
- case 0x01:
- return "Peripheral";
- default:
- return "Unknown";
- }
- }
- static char *mode2str(uint8_t mode)
- {
- switch (mode) {
- case 0x00:
- return "Active";
- case 0x01:
- return "Hold";
- case 0x02:
- return "Sniff";
- case 0x03:
- return "Park";
- default:
- return "Unknown";
- }
- }
- static char *airmode2str(uint8_t mode)
- {
- switch (mode) {
- case 0x00:
- return "u-law log";
- case 0x01:
- return "A-law log";
- case 0x02:
- return "CVSD";
- case 0x04:
- return "Transparent data";
- default:
- return "Reserved";
- }
- }
- static const char *bdaddrtype2str(uint8_t type)
- {
- switch (type) {
- case 0x00:
- return "Public";
- case 0x01:
- return "Random";
- default:
- return "Reserved";
- }
- }
- static const char *evttype2str(uint8_t type)
- {
- switch (type) {
- case 0x00:
- return "ADV_IND - Connectable undirected advertising";
- case 0x01:
- return "ADV_DIRECT_IND - Connectable directed advertising";
- case 0x02:
- return "ADV_SCAN_IND - Scannable undirected advertising";
- case 0x03:
- return "ADV_NONCONN_IND - Non connectable undirected advertising";
- case 0x04:
- return "SCAN_RSP - Scan Response";
- default:
- return "Reserved";
- }
- }
- static char *keytype2str(uint8_t type)
- {
- switch (type) {
- case 0x00:
- return "Combination Key";
- case 0x01:
- return "Local Unit Key";
- case 0x02:
- return "Remote Unit Key";
- case 0x03:
- return "Debug Combination Key";
- case 0x04:
- return "Unauthenticated Combination Key";
- case 0x05:
- return "Authenticated Combination Key";
- case 0x06:
- return "Changed Combination Key";
- default:
- return "Reserved";
- }
- }
- static char *capability2str(uint8_t capability)
- {
- switch (capability) {
- case 0x00:
- return "DisplayOnly";
- case 0x01:
- return "DisplayYesNo";
- case 0x02:
- return "KeyboardOnly";
- case 0x03:
- return "NoInputNoOutput";
- default:
- return "Reserved";
- }
- }
- static char *authentication2str(uint8_t authentication)
- {
- switch (authentication) {
- case 0x00:
- return "No Bonding (No MITM Protection)";
- case 0x01:
- return "No Bonding (MITM Protection)";
- case 0x02:
- return "Dedicated Bonding (No MITM Protection)";
- case 0x03:
- return "Dedicated Bonding (MITM Protection)";
- case 0x04:
- return "General Bonding (No MITM Protection)";
- case 0x05:
- return "General Bonding (MITM Protection)";
- default:
- return "Reserved";
- }
- }
- static char *eventmask2str(const uint8_t mask[8])
- {
- int i;
- for (i = 0; i < 7; i++) {
- if (mask[i] != 0x00)
- return "Reserved";
- }
- switch (mask[7]) {
- case 0x00:
- return "No LE events specified";
- case 0x01:
- return "LE Connection Complete Event";
- case 0x02:
- return "LE Advertising Report Event";
- case 0x04:
- return "LE Connection Update Complete Event";
- case 0x08:
- return "LE Read Remote Used Features Complete Event";
- case 0x10:
- return "LE Long Term Key Request Event";
- case 0x1F:
- return "Default";
- default:
- return "Reserved";
- }
- }
- static char *lefeatures2str(const uint8_t features[8])
- {
- if (features[0] & 0x01)
- return "Link Layer supports LE Encryption";
- return "RFU";
- }
- static char *filterpolicy2str(uint8_t policy)
- {
- switch (policy) {
- case 0x00:
- return "Allow scan from any, connection from any";
- case 0x01:
- return "Allow scan from accept list, connection from any";
- case 0x02:
- return "Allow scan from any, connection from accept list";
- case 0x03:
- return "Allow scan and connection from accept list";
- default:
- return "Reserved";
- }
- }
- static inline void ext_inquiry_data_dump(int level, struct frame *frm,
- uint8_t *data)
- {
- uint8_t len = data[0];
- uint8_t type;
- char *str;
- int i;
- if (len == 0)
- return;
- type = data[1];
- data += 2;
- len -= 1;
- switch (type) {
- case 0x01:
- p_indent(level, frm);
- printf("Flags:");
- for (i = 0; i < len; i++)
- printf(" 0x%2.2x", data[i]);
- printf("\n");
- break;
- case 0x02:
- case 0x03:
- p_indent(level, frm);
- printf("%s service classes:",
- type == 0x02 ? "Shortened" : "Complete");
- for (i = 0; i < len / 2; i++)
- printf(" 0x%4.4x", get_le16(data + i * 2));
- printf("\n");
- break;
- case 0x08:
- case 0x09:
- str = malloc(len + 1);
- if (str) {
- snprintf(str, len + 1, "%s", (char *) data);
- for (i = 0; i < len; i++)
- if (!isprint(str[i]))
- str[i] = '.';
- p_indent(level, frm);
- printf("%s local name: \'%s\'\n",
- type == 0x08 ? "Shortened" : "Complete", str);
- free(str);
- }
- break;
- case 0x0a:
- p_indent(level, frm);
- printf("TX power level: %d\n", *((uint8_t *) data));
- break;
- default:
- p_indent(level, frm);
- printf("Unknown type 0x%02x with %d bytes data\n",
- type, len);
- break;
- }
- }
- static inline void ext_inquiry_response_dump(int level, struct frame *frm)
- {
- void *ptr = frm->ptr;
- uint32_t len = frm->len;
- uint8_t *data;
- uint8_t length;
- data = frm->ptr;
- length = p_get_u8(frm);
- while (length > 0) {
- ext_inquiry_data_dump(level, frm, data);
- frm->ptr += length;
- frm->len -= length;
- data = frm->ptr;
- length = p_get_u8(frm);
- }
- frm->ptr = ptr +
- (EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE);
- frm->len = len +
- (EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE);
- }
- static inline void bdaddr_command_dump(int level, struct frame *frm)
- {
- bdaddr_t *bdaddr = frm->ptr;
- char addr[18];
- frm->ptr += sizeof(bdaddr_t);
- frm->len -= sizeof(bdaddr_t);
- p_indent(level, frm);
- p_ba2str(bdaddr, addr);
- printf("bdaddr %s\n", addr);
- raw_dump(level, frm);
- }
- static inline void generic_command_dump(int level, struct frame *frm)
- {
- uint16_t handle = btohs(htons(p_get_u16(frm)));
- p_indent(level, frm);
- printf("handle %d\n", handle);
- raw_dump(level, frm);
- }
- static inline void generic_write_mode_dump(int level, struct frame *frm)
- {
- uint8_t mode = p_get_u8(frm);
- p_indent(level, frm);
- printf("mode 0x%2.2x\n", mode);
- }
- static inline void inquiry_dump(int level, struct frame *frm)
- {
- inquiry_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
- cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
- }
- static inline void periodic_inquiry_dump(int level, struct frame *frm)
- {
- periodic_inquiry_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("max %d min %d lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
- btohs(cp->max_period), btohs(cp->min_period),
- cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
- }
- static inline void create_conn_dump(int level, struct frame *frm)
- {
- create_conn_cp *cp = frm->ptr;
- uint16_t ptype = btohs(cp->pkt_type);
- uint16_t clkoffset = btohs(cp->clock_offset);
- char addr[18], *str;
- p_indent(level, frm);
- p_ba2str(&cp->bdaddr, addr);
- printf("bdaddr %s ptype 0x%4.4x rswitch 0x%2.2x clkoffset 0x%4.4x%s\n",
- addr, ptype, cp->role_switch,
- clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
- str = hci_ptypetostr(ptype);
- if (str) {
- p_indent(level, frm);
- printf("Packet type: %s\n", str);
- free(str);
- }
- }
- static inline void disconnect_dump(int level, struct frame *frm)
- {
- disconnect_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("handle %d reason 0x%2.2x\n", btohs(cp->handle), cp->reason);
- p_indent(level, frm);
- printf("Reason: %s\n", status2str(cp->reason));
- }
- static inline void add_sco_dump(int level, struct frame *frm)
- {
- add_sco_cp *cp = frm->ptr;
- uint16_t ptype = btohs(cp->pkt_type);
- char *str;
- p_indent(level, frm);
- printf("handle %d ptype 0x%4.4x\n", btohs(cp->handle), ptype);
- str = hci_ptypetostr(ptype);
- if (str) {
- p_indent(level, frm);
- printf("Packet type: %s\n", str);
- free(str);
- }
- }
- static inline void accept_conn_req_dump(int level, struct frame *frm)
- {
- accept_conn_req_cp *cp = frm->ptr;
- char addr[18];
- p_indent(level, frm);
- p_ba2str(&cp->bdaddr, addr);
- printf("bdaddr %s role 0x%2.2x\n", addr, cp->role);
- p_indent(level, frm);
- printf("Role: %s\n", role2str(cp->role));
- }
- static inline void reject_conn_req_dump(int level, struct frame *frm)
- {
- reject_conn_req_cp *cp = frm->ptr;
- char addr[18];
- p_indent(level, frm);
- p_ba2str(&cp->bdaddr, addr);
- printf("bdaddr %s reason 0x%2.2x\n", addr, cp->reason);
- p_indent(level, frm);
- printf("Reason: %s\n", status2str(cp->reason));
- }
- static inline void pin_code_reply_dump(int level, struct frame *frm)
- {
- pin_code_reply_cp *cp = frm->ptr;
- char addr[18], pin[17];
- p_indent(level, frm);
- p_ba2str(&cp->bdaddr, addr);
- memset(pin, 0, sizeof(pin));
- if (parser.flags & DUMP_NOVENDOR)
- memset(pin, '*', cp->pin_len);
- else
- memcpy(pin, cp->pin_code, cp->pin_len);
- printf("bdaddr %s len %d pin \'%s\'\n", addr, cp->pin_len, pin);
- }
- static inline void link_key_reply_dump(int level, struct frame *frm)
- {
- link_key_reply_cp *cp = frm->ptr;
- char addr[18];
- int i;
- p_indent(level, frm);
- p_ba2str(&cp->bdaddr, addr);
- printf("bdaddr %s key ", addr);
- for (i = 0; i < 16; i++)
- if (parser.flags & DUMP_NOVENDOR)
- printf("**");
- else
- printf("%2.2X", cp->link_key[i]);
- printf("\n");
- }
- static inline void pin_code_neg_reply_dump(int level, struct frame *frm)
- {
- bdaddr_t *bdaddr = frm->ptr;
- char addr[18];
- p_indent(level, frm);
- p_ba2str(bdaddr, addr);
- printf("bdaddr %s\n", addr);
- }
- static inline void user_passkey_reply_dump(int level, struct frame *frm)
- {
- user_passkey_reply_cp *cp = frm->ptr;
- char addr[18];
- p_indent(level, frm);
- p_ba2str(&cp->bdaddr, addr);
- printf("bdaddr %s passkey %d\n", addr, btohl(cp->passkey));
- }
- static inline void remote_oob_data_reply_dump(int level, struct frame *frm)
- {
- remote_oob_data_reply_cp *cp = frm->ptr;
- char addr[18];
- int i;
- p_indent(level, frm);
- p_ba2str(&cp->bdaddr, addr);
- printf("bdaddr %s\n", addr);
- p_indent(level, frm);
- printf("hash 0x");
- for (i = 0; i < 16; i++)
- printf("%02x", cp->hash[i]);
- printf("\n");
- p_indent(level, frm);
- printf("randomizer 0x");
- for (i = 0; i < 16; i++)
- printf("%02x", cp->randomizer[i]);
- printf("\n");
- }
- static inline void io_capability_reply_dump(int level, struct frame *frm)
- {
- io_capability_reply_cp *cp = frm->ptr;
- char addr[18];
- p_indent(level, frm);
- p_ba2str(&cp->bdaddr, addr);
- printf("bdaddr %s capability 0x%2.2x oob 0x%2.2x auth 0x%2.2x\n",
- addr, cp->capability, cp->oob_data,
- cp->authentication);
- p_indent(level, frm);
- printf("Capability: %s (OOB data %s)\n",
- capability2str(cp->capability),
- cp->oob_data == 0x00 ? "not present" : "available");
- p_indent(level, frm);
- printf("Authentication: %s\n", authentication2str(cp->authentication));
- }
- static inline void set_conn_encrypt_dump(int level, struct frame *frm)
- {
- set_conn_encrypt_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("handle %d encrypt 0x%2.2x\n", btohs(cp->handle), cp->encrypt);
- }
- static inline void remote_name_req_dump(int level, struct frame *frm)
- {
- remote_name_req_cp *cp = frm->ptr;
- uint16_t clkoffset = btohs(cp->clock_offset);
- char addr[18];
- p_indent(level, frm);
- p_ba2str(&cp->bdaddr, addr);
- printf("bdaddr %s mode %d clkoffset 0x%4.4x%s\n",
- addr, cp->pscan_rep_mode,
- clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
- }
- static inline void temporary_link_key_dump(int level, struct frame *frm)
- {
- master_link_key_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("flag %d\n", cp->key_flag);
- }
- static inline void read_remote_ext_features_dump(int level, struct frame *frm)
- {
- read_remote_ext_features_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("handle %d page %d\n", btohs(cp->handle), cp->page_num);
- }
- static inline void setup_sync_conn_dump(int level, struct frame *frm)
- {
- setup_sync_conn_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("handle %d voice setting 0x%4.4x ptype 0x%4.4x\n",
- btohs(cp->handle), btohs(cp->voice_setting),
- btohs(cp->pkt_type));
- }
- static inline void create_physical_link_dump(int level, struct frame *frm)
- {
- create_physical_link_cp *cp = frm->ptr;
- int i;
- p_indent(level, frm);
- printf("phy handle 0x%2.2x key length %d key type %d\n",
- cp->handle, cp->key_length, cp->key_type);
- p_indent(level, frm);
- printf("key ");
- for (i = 0; i < cp->key_length && cp->key_length <= 32; i++)
- printf("%2.2x", cp->key[i]);
- printf("\n");
- }
- static inline void create_logical_link_dump(int level, struct frame *frm)
- {
- create_logical_link_cp *cp = frm->ptr;
- int i;
- p_indent(level, frm);
- printf("phy handle 0x%2.2x\n", cp->handle);
- p_indent(level, frm);
- printf("tx_flow ");
- for (i = 0; i < 16; i++)
- printf("%2.2x", cp->tx_flow[i]);
- printf("\n");
- p_indent(level, frm);
- printf("rx_flow ");
- for (i = 0; i < 16; i++)
- printf("%2.2x", cp->rx_flow[i]);
- printf("\n");
- }
- static inline void hold_mode_dump(int level, struct frame *frm)
- {
- hold_mode_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("handle %d max %d min %d\n", btohs(cp->handle),
- btohs(cp->max_interval), btohs(cp->min_interval));
- }
- static inline void sniff_mode_dump(int level, struct frame *frm)
- {
- sniff_mode_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("handle %d max %d min %d attempt %d timeout %d\n",
- btohs(cp->handle), btohs(cp->max_interval),
- btohs(cp->min_interval), btohs(cp->attempt), btohs(cp->timeout));
- }
- static inline void qos_setup_dump(int level, struct frame *frm)
- {
- qos_setup_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("handle %d flags 0x%2.2x\n", btohs(cp->handle), cp->flags);
- p_indent(level, frm);
- printf("Service type: %d\n", cp->qos.service_type);
- p_indent(level, frm);
- printf("Token rate: %d\n", btohl(cp->qos.token_rate));
- p_indent(level, frm);
- printf("Peak bandwith: %d\n", btohl(cp->qos.peak_bandwidth));
- p_indent(level, frm);
- printf("Latency: %d\n", btohl(cp->qos.latency));
- p_indent(level, frm);
- printf("Delay variation: %d\n", btohl(cp->qos.delay_variation));
- }
- static inline void write_link_policy_dump(int level, struct frame *frm)
- {
- write_link_policy_cp *cp = frm->ptr;
- uint16_t policy = btohs(cp->policy);
- char *str;
- p_indent(level, frm);
- printf("handle %d policy 0x%2.2x\n", btohs(cp->handle), policy);
- str = hci_lptostr(policy);
- if (str) {
- p_indent(level, frm);
- printf("Link policy: %s\n", str);
- free(str);
- }
- }
- static inline void write_default_link_policy_dump(int level, struct frame *frm)
- {
- uint16_t policy = btohs(htons(p_get_u16(frm)));
- char *str;
- p_indent(level, frm);
- printf("policy 0x%2.2x\n", policy);
- str = hci_lptostr(policy);
- if (str) {
- p_indent(level, frm);
- printf("Link policy: %s\n", str);
- free(str);
- }
- }
- static inline void sniff_subrating_dump(int level, struct frame *frm)
- {
- sniff_subrating_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("handle %d\n", btohs(cp->handle));
- p_indent(level, frm);
- printf("max latency %d\n", btohs(cp->max_latency));
- p_indent(level, frm);
- printf("min timeout remote %d local %d\n",
- btohs(cp->min_remote_timeout), btohs(cp->min_local_timeout));
- }
- static inline void set_event_mask_dump(int level, struct frame *frm)
- {
- set_event_mask_cp *cp = frm->ptr;
- int i;
- p_indent(level, frm);
- printf("Mask: 0x");
- for (i = 0; i < 8; i++)
- printf("%2.2x", cp->mask[i]);
- printf("\n");
- }
- static inline void set_event_flt_dump(int level, struct frame *frm)
- {
- set_event_flt_cp *cp = frm->ptr;
- uint8_t dev_class[3], dev_mask[3];
- char addr[18];
- p_indent(level, frm);
- printf("type %d condition %d\n", cp->flt_type,
- (cp->flt_type == 0) ? 0 : cp->cond_type);
- switch (cp->flt_type) {
- case FLT_CLEAR_ALL:
- p_indent(level, frm);
- printf("Clear all filters\n");
- break;
- case FLT_INQ_RESULT:
- p_indent(level, frm);
- printf("Inquiry result");
- switch (cp->cond_type) {
- case INQ_RESULT_RETURN_ALL:
- printf(" for all devices\n");
- break;
- case INQ_RESULT_RETURN_CLASS:
- memcpy(dev_class, cp->condition, 3);
- memcpy(dev_mask, cp->condition + 3, 3);
- printf(" with class 0x%2.2x%2.2x%2.2x mask 0x%2.2x%2.2x%2.2x\n",
- dev_class[2], dev_class[1], dev_class[0],
- dev_mask[2], dev_mask[1], dev_mask[0]);
- break;
- case INQ_RESULT_RETURN_BDADDR:
- p_ba2str((bdaddr_t *) cp->condition, addr);
- printf(" with bdaddr %s\n", addr);
- break;
- default:
- printf("\n");
- break;
- }
- break;
- case FLT_CONN_SETUP:
- p_indent(level, frm);
- printf("Connection setup");
- switch (cp->cond_type) {
- case CONN_SETUP_ALLOW_ALL:
- case CONN_SETUP_ALLOW_CLASS:
- case CONN_SETUP_ALLOW_BDADDR:
- default:
- printf("\n");
- break;
- }
- break;
- }
- }
- static inline void write_pin_type_dump(int level, struct frame *frm)
- {
- write_pin_type_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("type %d\n", cp->pin_type);
- }
- static inline void request_stored_link_key_dump(int level, struct frame *frm)
- {
- read_stored_link_key_cp *cp = frm->ptr;
- char addr[18];
- p_indent(level, frm);
- p_ba2str(&cp->bdaddr, addr);
- printf("bdaddr %s all %d\n", addr, cp->read_all);
- }
- static inline void return_link_keys_dump(int level, struct frame *frm)
- {
- uint8_t num = p_get_u8(frm);
- uint8_t key[16];
- char addr[18];
- int i, n;
- for (n = 0; n < num; n++) {
- p_ba2str(frm->ptr, addr);
- memcpy(key, frm->ptr + 6, 16);
- p_indent(level, frm);
- printf("bdaddr %s key ", addr);
- for (i = 0; i < 16; i++)
- if (parser.flags & DUMP_NOVENDOR)
- printf("**");
- else
- printf("%2.2X", key[i]);
- printf("\n");
- frm->ptr += 2;
- frm->len -= 2;
- }
- }
- static inline void change_local_name_dump(int level, struct frame *frm)
- {
- change_local_name_cp *cp = frm->ptr;
- char name[249];
- int i;
- memset(name, 0, sizeof(name));
- for (i = 0; i < 248 && cp->name[i]; i++)
- if (isprint(cp->name[i]))
- name[i] = cp->name[i];
- else
- name[i] = '.';
- p_indent(level, frm);
- printf("name \'%s\'\n", name);
- }
- static inline void write_class_of_dev_dump(int level, struct frame *frm)
- {
- write_class_of_dev_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("class 0x%2.2x%2.2x%2.2x\n",
- cp->dev_class[2], cp->dev_class[1], cp->dev_class[0]);
- }
- static inline void write_voice_setting_dump(int level, struct frame *frm)
- {
- write_voice_setting_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("voice setting 0x%4.4x\n", btohs(cp->voice_setting));
- }
- static inline void write_current_iac_lap_dump(int level, struct frame *frm)
- {
- write_current_iac_lap_cp *cp = frm->ptr;
- int i;
- for (i = 0; i < cp->num_current_iac; i++) {
- p_indent(level, frm);
- printf("IAC 0x%2.2x%2.2x%2.2x", cp->lap[i][2], cp->lap[i][1], cp->lap[i][0]);
- if (cp->lap[i][2] == 0x9e && cp->lap[i][1] == 0x8b) {
- switch (cp->lap[i][0]) {
- case 0x00:
- printf(" (Limited Inquiry Access Code)");
- break;
- case 0x33:
- printf(" (General Inquiry Access Code)");
- break;
- }
- }
- printf("\n");
- }
- }
- static inline void write_scan_enable_dump(int level, struct frame *frm)
- {
- uint8_t enable = p_get_u8(frm);
- p_indent(level, frm);
- printf("enable %d\n", enable);
- }
- static inline void write_page_timeout_dump(int level, struct frame *frm)
- {
- write_page_timeout_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("timeout %d\n", btohs(cp->timeout));
- }
- static inline void write_page_activity_dump(int level, struct frame *frm)
- {
- write_page_activity_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("interval %d window %d\n", btohs(cp->interval), btohs(cp->window));
- }
- static inline void write_inquiry_scan_type_dump(int level, struct frame *frm)
- {
- write_inquiry_scan_type_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("type %d\n", cp->type);
- }
- static inline void write_inquiry_mode_dump(int level, struct frame *frm)
- {
- write_inquiry_mode_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("mode %d\n", cp->mode);
- }
- static inline void set_afh_classification_dump(int level, struct frame *frm)
- {
- set_afh_classification_cp *cp = frm->ptr;
- int i;
- p_indent(level, frm);
- printf("map 0x");
- for (i = 0; i < 10; i++)
- printf("%02x", cp->map[i]);
- printf("\n");
- }
- static inline void write_link_supervision_timeout_dump(int level, struct frame *frm)
- {
- write_link_supervision_timeout_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("handle %d timeout %d\n",
- btohs(cp->handle), btohs(cp->timeout));
- }
- static inline void write_ext_inquiry_response_dump(int level, struct frame *frm)
- {
- write_ext_inquiry_response_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("fec 0x%2.2x\n", cp->fec);
- frm->ptr++;
- frm->len--;
- ext_inquiry_response_dump(level, frm);
- }
- static inline void write_inquiry_transmit_power_level_dump(int level, struct frame *frm)
- {
- write_inquiry_transmit_power_level_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("level %d\n", cp->level);
- }
- static inline void write_default_error_data_reporting_dump(int level, struct frame *frm)
- {
- write_default_error_data_reporting_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("reporting %d\n", cp->reporting);
- }
- static inline void enhanced_flush_dump(int level, struct frame *frm)
- {
- enhanced_flush_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("handle %d type %d\n", btohs(cp->handle), cp->type);
- }
- static inline void send_keypress_notify_dump(int level, struct frame *frm)
- {
- send_keypress_notify_cp *cp = frm->ptr;
- char addr[18];
- p_indent(level, frm);
- p_ba2str(&cp->bdaddr, addr);
- printf("bdaddr %s type %d\n", addr, cp->type);
- }
- static inline void request_transmit_power_level_dump(int level, struct frame *frm)
- {
- read_transmit_power_level_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("handle %d type %d (%s)\n",
- btohs(cp->handle), cp->type,
- cp->type ? "maximum" : "current");
- }
- static inline void request_local_ext_features_dump(int level, struct frame *frm)
- {
- read_local_ext_features_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("page %d\n", cp->page_num);
- }
- static inline void request_clock_dump(int level, struct frame *frm)
- {
- read_clock_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("handle %d which %d (%s)\n",
- btohs(cp->handle), cp->which_clock,
- cp->which_clock ? "piconet" : "local");
- }
- static inline void host_buffer_size_dump(int level, struct frame *frm)
- {
- host_buffer_size_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("ACL MTU %d:%d SCO MTU %d:%d\n",
- btohs(cp->acl_mtu), btohs(cp->acl_max_pkt),
- cp->sco_mtu, btohs(cp->sco_max_pkt));
- }
- static inline void num_comp_pkts_dump(int level, struct frame *frm)
- {
- uint8_t num = p_get_u8(frm);
- uint16_t handle, packets;
- int i;
- for (i = 0; i < num; i++) {
- handle = btohs(htons(p_get_u16(frm)));
- packets = btohs(htons(p_get_u16(frm)));
- p_indent(level, frm);
- printf("handle %d packets %d\n", handle, packets);
- }
- }
- static inline void le_create_connection_dump(int level, struct frame *frm)
- {
- char addr[18];
- le_create_connection_cp *cp = frm->ptr;
- p_indent(level, frm);
- p_ba2str(&cp->peer_bdaddr, addr);
- printf("bdaddr %s type %d\n", addr, cp->peer_bdaddr_type);
- p_indent(level, frm);
- printf("interval %u window %u initiator_filter %u\n",
- btohs(cp->interval), btohs(cp->window), cp->initiator_filter);
- p_indent(level, frm);
- printf("own_bdaddr_type %u min_interval %u max_interval %u\n",
- cp->own_bdaddr_type, btohs(cp->min_interval),
- btohs(cp->max_interval));
- p_indent(level, frm);
- printf("latency %u supervision_to %u min_ce %u max_ce %u\n",
- btohs(cp->latency), btohs(cp->supervision_timeout),
- btohs(cp->min_ce_length), btohs(cp->max_ce_length));
- }
- static inline void le_set_event_mask_dump(int level, struct frame *frm)
- {
- int i;
- le_set_event_mask_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("mask 0x");
- for (i = 0; i < 8; i++)
- printf("%.2x", cp->mask[i]);
- printf(" (%s)\n", eventmask2str(cp->mask));
- }
- static inline void le_set_random_address_dump(int level, struct frame *frm)
- {
- char addr[18];
- le_set_random_address_cp *cp = frm->ptr;
- p_indent(level, frm);
- p_ba2str(&cp->bdaddr, addr);
- printf("bdaddr %s\n", addr);
- }
- static inline void le_set_advertising_parameters_dump(int level, struct frame *frm)
- {
- char addr[18];
- le_set_advertising_parameters_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("min %.3fms, max %.3fms\n", btohs(cp->min_interval) * 0.625,
- btohs(cp->max_interval) * 0.625);
- p_indent(level, frm);
- printf("type 0x%02x (%s) ownbdaddr 0x%02x (%s)\n", cp->advtype,
- evttype2str(cp->advtype), cp->own_bdaddr_type,
- bdaddrtype2str(cp->own_bdaddr_type));
- p_indent(level, frm);
- p_ba2str(&cp->direct_bdaddr, addr);
- printf("directbdaddr 0x%02x (%s) %s\n", cp->direct_bdaddr_type,
- bdaddrtype2str(cp->direct_bdaddr_type), addr);
- p_indent(level, frm);
- printf("channelmap 0x%02x filterpolicy 0x%02x (%s)\n",
- cp->chan_map, cp->filter, filterpolicy2str(cp->filter));
- }
- static inline void le_set_scan_parameters_dump(int level, struct frame *frm)
- {
- le_set_scan_parameters_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("type 0x%02x (%s)\n", cp->type,
- cp->type == 0x00 ? "passive" : "active");
- p_indent(level, frm);
- printf("interval %.3fms window %.3fms\n", btohs(cp->interval) * 0.625,
- btohs(cp->window) * 0.625);
- p_indent(level, frm);
- printf("own address: 0x%02x (%s) policy: %s\n", cp->own_bdaddr_type,
- bdaddrtype2str(cp->own_bdaddr_type),
- (cp->filter == 0x00 ? "All" :
- (cp->filter == 0x01 ? "accept list only" :
- "reserved")));
- }
- static inline void le_set_scan_enable_dump(int level, struct frame *frm)
- {
- le_set_scan_enable_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("value 0x%02x (%s)\n", cp->enable,
- (cp->enable == 0x00 ? "scanning disabled" :
- "scanning enabled"));
- p_indent(level, frm);
- printf("filter duplicates 0x%02x (%s)\n", cp->filter_dup,
- (cp->filter_dup == 0x00 ? "disabled" : "enabled"));
- }
- static inline void write_remote_amp_assoc_cmd_dump(int level,
- struct frame *frm)
- {
- write_remote_amp_assoc_cp *cp = frm->ptr;
- p_indent(level, frm);
- printf("handle 0x%2.2x len_so_far %d remaining_len %d\n", cp->handle,
- cp->length_so_far, cp->remaining_length);
- amp_assoc_dump(level + 1, cp->fragment, frm->len - 5);
- }
- static inline void command_dump(int level, struct frame *frm)
- {
- hci_command_hdr *hdr = frm->ptr;
- uint16_t opcode = btohs(hdr->opcode);
- uint16_t ogf = cmd_opcode_ogf(opcode);
- uint16_t ocf = cmd_opcode_ocf(opcode);
- if (p_filter(FILT_HCI))
- return;
- if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR))
- return;
- p_indent(level, frm);
- printf("HCI Command: %s (0x%2.2x|0x%4.4x) plen %d\n",
- opcode2str(opcode), ogf, ocf, hdr->plen);
- frm->ptr += HCI_COMMAND_HDR_SIZE;
- frm->len -= HCI_COMMAND_HDR_SIZE;
- if (ogf == OGF_VENDOR_CMD) {
- if (ocf == 0 && get_manufacturer() == 10) {
- csr_dump(level + 1, frm);
- return;
- }
- }
- if (!(parser.flags & DUMP_VERBOSE)) {
- raw_dump(level, frm);
- return;
- }
- switch (ogf) {
- case OGF_LINK_CTL:
- switch (ocf) {
- case OCF_INQUIRY:
- inquiry_dump(level + 1, frm);
- return;
- case OCF_PERIODIC_INQUIRY:
- periodic_inquiry_dump(level + 1, frm);
- return;
- case OCF_INQUIRY_CANCEL:
- case OCF_EXIT_PERIODIC_INQUIRY:
- return;
- case OCF_CREATE_CONN:
- create_conn_dump(level + 1, frm);
- return;
- case OCF_DISCONNECT:
- disconnect_dump(level + 1, frm);
- return;
- case OCF_CREATE_CONN_CANCEL:
- case OCF_REMOTE_NAME_REQ_CANCEL:
- case OCF_ACCEPT_SYNC_CONN_REQ:
- bdaddr_command_dump(level + 1, frm);
- return;
- case OCF_ADD_SCO:
- case OCF_SET_CONN_PTYPE:
- add_sco_dump(level + 1, frm);
- return;
- case OCF_ACCEPT_CONN_REQ:
- accept_conn_req_dump(level + 1, frm);
- return;
- case OCF_REJECT_CONN_REQ:
- case OCF_REJECT_SYNC_CONN_REQ:
- case OCF_IO_CAPABILITY_NEG_REPLY:
- reject_conn_req_dump(level + 1, frm);
- return;
- case OCF_PIN_CODE_REPLY:
- pin_code_reply_dump(level + 1, frm);
- return;
- case OCF_LINK_KEY_REPLY:
- link_key_reply_dump(level + 1, frm);
- return;
- case OCF_PIN_CODE_NEG_REPLY:
- case OCF_LINK_KEY_NEG_REPLY:
- case OCF_USER_CONFIRM_REPLY:
- case OCF_USER_CONFIRM_NEG_REPLY:
- case OCF_USER_PASSKEY_NEG_REPLY:
- case OCF_REMOTE_OOB_DATA_NEG_REPLY:
- pin_code_neg_reply_dump(level + 1, frm);
- return;
- case OCF_USER_PASSKEY_REPLY:
- user_passkey_reply_dump(level + 1, frm);
- return;
- case OCF_REMOTE_OOB_DATA_REPLY:
- remote_oob_data_reply_dump(level + 1, frm);
- return;
- case OCF_IO_CAPABILITY_REPLY:
- io_capability_reply_dump(level + 1, frm);
- return;
- case OCF_SET_CONN_ENCRYPT:
- set_conn_encrypt_dump(level + 1, frm);
- return;
- case OCF_AUTH_REQUESTED:
- case OCF_CHANGE_CONN_LINK_KEY:
- case OCF_READ_REMOTE_FEATURES:
- case OCF_READ_REMOTE_VERSION:
- case OCF_READ_CLOCK_OFFSET:
- case OCF_READ_LMP_HANDLE:
- case OCF_DISCONNECT_LOGICAL_LINK:
- generic_command_dump(level + 1, frm);
- return;
- case OCF_MASTER_LINK_KEY:
- temporary_link_key_dump(level + 1, frm);
- return;
- case OCF_READ_REMOTE_EXT_FEATURES:
- read_remote_ext_features_dump(level + 1, frm);
- return;
- case OCF_REMOTE_NAME_REQ:
- remote_name_req_dump(level + 1, frm);
- return;
- case OCF_SETUP_SYNC_CONN:
- setup_sync_conn_dump(level + 1, frm);
- return;
- case OCF_CREATE_PHYSICAL_LINK:
- case OCF_ACCEPT_PHYSICAL_LINK:
- create_physical_link_dump(level + 1, frm);
- return;
- case OCF_CREATE_LOGICAL_LINK:
- case OCF_ACCEPT_LOGICAL_LINK:
- create_logical_link_dump(level + 1, frm);
- return;
- }
- break;
- case OGF_LINK_POLICY:
- switch (ocf) {
- case OCF_HOLD_MODE:
- case OCF_PARK_MODE:
- hold_mode_dump(level + 1, frm);
- return;
- case OCF_SNIFF_MODE:
- sniff_mode_dump(level + 1, frm);
- return;
- case OCF_EXIT_SNIFF_MODE:
- case OCF_EXIT_PARK_MODE:
- case OCF_ROLE_DISCOVERY:
- case OCF_READ_LINK_POLICY:
- generic_command_dump(level + 1, frm);
- return;
- case OCF_READ_DEFAULT_LINK_POLICY:
- return;
- case OCF_SWITCH_ROLE:
- accept_conn_req_dump(level + 1, frm);
- return;
- case OCF_QOS_SETUP:
- qos_setup_dump(level + 1, frm);
- return;
- case OCF_WRITE_LINK_POLICY:
- write_link_policy_dump(level + 1, frm);
- return;
- case OCF_WRITE_DEFAULT_LINK_POLICY:
- write_default_link_policy_dump(level + 1, frm);
- return;
- case OCF_SNIFF_SUBRATING:
- sniff_subrating_dump(level + 1, frm);
- return;
- }
- break;
- case OGF_HOST_CTL:
- switch (ocf) {
- case OCF_RESET:
- case OCF_CREATE_NEW_UNIT_KEY:
- return;
- case OCF_SET_EVENT_MASK:
- case OCF_SET_EVENT_MASK_PAGE_2:
- set_event_mask_dump(level + 1, frm);
- return;
- case OCF_SET_EVENT_FLT:
- set_event_flt_dump(level + 1, frm);
- return;
- case OCF_WRITE_PIN_TYPE:
- write_pin_type_dump(level + 1, frm);
- return;
- case OCF_READ_STORED_LINK_KEY:
- case OCF_DELETE_STORED_LINK_KEY:
- request_stored_link_key_dump(level + 1, frm);
- return;
- case OCF_WRITE_STORED_LINK_KEY:
- return_link_keys_dump(level + 1, frm);
- return;
- case OCF_CHANGE_LOCAL_NAME:
- change_local_name_dump(level + 1, frm);
- return;
- case OCF_WRITE_CLASS_OF_DEV:
- write_class_of_dev_dump(level + 1, frm);
- return;
- case OCF_WRITE_VOICE_SETTING:
- write_voice_setting_dump(level + 1, frm);
- return;
- case OCF_WRITE_CURRENT_IAC_LAP:
- write_current_iac_lap_dump(level + 1, frm);
- return;
- case OCF_WRITE_SCAN_ENABLE:
- case OCF_WRITE_AUTH_ENABLE:
- case OCF_SET_CONTROLLER_TO_HOST_FC:
- write_scan_enable_dump(level + 1, frm);
- return;
- case OCF_WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT:
- case OCF_WRITE_CONN_ACCEPT_TIMEOUT:
- case OCF_WRITE_PAGE_TIMEOUT:
- write_page_timeout_dump(level + 1, frm);
- return;
- case OCF_WRITE_PAGE_ACTIVITY:
- case OCF_WRITE_INQ_ACTIVITY:
- write_page_activity_dump(level + 1, frm);
- return;
- case OCF_WRITE_INQUIRY_SCAN_TYPE:
- write_inquiry_scan_type_dump(level + 1, frm);
- return;
- case OCF_WRITE_ENCRYPT_MODE:
- case OCF_WRITE_INQUIRY_MODE:
- case OCF_WRITE_AFH_MODE:
- write_inquiry_mode_dump(level + 1, frm);
- return;
- case OCF_SET_AFH_CLASSIFICATION:
- set_afh_classification_dump(level + 1, frm);
- return;
- case OCF_READ_TRANSMIT_POWER_LEVEL:
- request_transmit_power_level_dump(level + 1, frm);
- return;
- case OCF_HOST_BUFFER_SIZE:
- host_buffer_size_dump(level + 1, frm);
- return;
- case OCF_HOST_NUM_COMP_PKTS:
- num_comp_pkts_dump(level + 1, frm);
- return;
- case OCF_FLUSH:
- case OCF_READ_LINK_SUPERVISION_TIMEOUT:
- case OCF_REFRESH_ENCRYPTION_KEY:
- case OCF_READ_BEST_EFFORT_FLUSH_TIMEOUT:
- generic_command_dump(level + 1, frm);
- return;
- case OCF_WRITE_LINK_SUPERVISION_TIMEOUT:
- write_link_supervision_timeout_dump(level + 1, frm);
- return;
- case OCF_WRITE_EXT_INQUIRY_RESPONSE:
- write_ext_inquiry_response_dump(level + 1, frm);
- return;
- case OCF_WRITE_SIMPLE_PAIRING_MODE:
- case OCF_WRITE_FLOW_CONTROL_MODE:
- generic_write_mode_dump(level + 1, frm);
- return;
- case OCF_WRITE_INQUIRY_TRANSMIT_POWER_LEVEL:
- write_inquiry_transmit_power_level_dump(level + 1, frm);
- return;
- case OCF_WRITE_DEFAULT_ERROR_DATA_REPORTING:
- write_default_error_data_reporting_dump(level + 1, frm);
- return;
- case OCF_ENHANCED_FLUSH:
- enhanced_flush_dump(level + 1, frm);
- return;
- case OCF_SEND_KEYPRESS_NOTIFY:
- send_keypress_notify_dump(level + 1, frm);
- return;
- }
- break;
- case OGF_INFO_PARAM:
- switch (ocf) {
- case OCF_READ_LOCAL_EXT_FEATURES:
- request_local_ext_features_dump(level + 1, frm);
- return;
- }
- break;
- case OGF_STATUS_PARAM:
- switch (ocf) {
- case OCF_READ_LINK_QUALITY:
- case OCF_READ_RSSI:
- case OCF_READ_AFH_MAP:
- generic_command_dump(level + 1, frm);
- return;
- case OCF_READ_CLOCK:
- request_clock_dump(level + 1, frm);
- return;
- case OCF_WRITE_REMOTE_AMP_ASSOC:
- write_remote_amp_assoc_cmd_dump(level + 1, frm);
- return;
- }
- break;
- case OGF_TESTING_CMD:
- switch (ocf) {
- case OCF_WRITE_LOOPBACK_MODE:
- case OCF_WRITE_SIMPLE_PAIRING_DEBUG_MODE:
- generic_write_mode_dump(level + 1, frm);
- return;
- }
- break;
- case OGF_LE_CTL:
- switch (ocf) {
- case OCF_LE_SET_EVENT_MASK:
- le_set_event_mask_dump(level + 1, frm);
- return;
- case OCF_LE_READ_BUFFER_SIZE:
- case OCF_LE_READ_LOCAL_SUPPORTED_FEATURES:
- case OCF_LE_READ_ADVERTISING_CHANNEL_TX_POWER:
- return;
- case OCF_LE_SET_RANDOM_ADDRESS:
- le_set_random_address_dump(level + 1, frm);
- return;
- case OCF_LE_SET_ADVERTISING_PARAMETERS:
- le_set_advertising_parameters_dump(level + 1, frm);
- return;
- case OCF_LE_SET_SCAN_PARAMETERS:
- le_set_scan_parameters_dump(level + 1, frm);
- return;
- case OCF_LE_SET_SCAN_ENABLE:
- le_set_scan_enable_dump(level + 1, frm);
- return;
- case OCF_LE_CREATE_CONN:
- le_create_connection_dump(level + 1, frm);
- return;
- }
- break;
- }
- raw_dump(level, frm);
- }
- static inline void status_response_dump(int level, struct frame *frm)
- {
- uint8_t status = p_get_u8(frm);
- p_indent(level, frm);
- printf("status 0x%2.2x\n", status);
- if (status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(status));
- }
- raw_dump(level, frm);
- }
- static inline void handle_response_dump(int level, struct frame *frm)
- {
- uint16_t handle = btohs(htons(p_get_u16(frm)));
- p_indent(level, frm);
- printf("handle %d\n", handle);
- raw_dump(level, frm);
- }
- static inline void bdaddr_response_dump(int level, struct frame *frm)
- {
- uint8_t status = p_get_u8(frm);
- bdaddr_t *bdaddr = frm->ptr;
- char addr[18];
- frm->ptr += sizeof(bdaddr_t);
- frm->len -= sizeof(bdaddr_t);
- p_indent(level, frm);
- p_ba2str(bdaddr, addr);
- printf("status 0x%2.2x bdaddr %s\n", status, addr);
- if (status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(status));
- }
- raw_dump(level, frm);
- }
- static inline void read_data_block_size_dump(int level, struct frame *frm)
- {
- read_data_block_size_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x\n", rp->status);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- } else {
- p_indent(level, frm);
- printf("Max ACL %d Block len %d Num blocks %d\n",
- btohs(rp->max_acl_len), btohs(rp->data_block_len),
- btohs(rp->num_blocks));
- }
- }
- static inline void generic_response_dump(int level, struct frame *frm)
- {
- uint8_t status = p_get_u8(frm);
- uint16_t handle = btohs(htons(p_get_u16(frm)));
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d\n", status, handle);
- if (status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(status));
- }
- raw_dump(level, frm);
- }
- static inline void status_mode_dump(int level, struct frame *frm)
- {
- uint8_t status = p_get_u8(frm);
- uint8_t mode = p_get_u8(frm);
- p_indent(level, frm);
- printf("status 0x%2.2x mode 0x%2.2x\n", status, mode);
- if (status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(status));
- }
- }
- static inline void read_link_policy_dump(int level, struct frame *frm)
- {
- read_link_policy_rp *rp = frm->ptr;
- uint16_t policy = btohs(rp->policy);
- char *str;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d policy 0x%2.2x\n",
- rp->status, btohs(rp->handle), policy);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- } else {
- str = hci_lptostr(policy);
- if (str) {
- p_indent(level, frm);
- printf("Link policy: %s\n", str);
- free(str);
- }
- }
- }
- static inline void read_default_link_policy_dump(int level, struct frame *frm)
- {
- uint8_t status = p_get_u8(frm);
- uint16_t policy = btohs(htons(p_get_u16(frm)));
- char *str;
- p_indent(level, frm);
- printf("status 0x%2.2x policy 0x%2.2x\n", status, policy);
- if (status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(status));
- } else {
- str = hci_lptostr(policy);
- if (str) {
- p_indent(level, frm);
- printf("Link policy: %s\n", str);
- free(str);
- }
- }
- }
- static inline void read_pin_type_dump(int level, struct frame *frm)
- {
- read_pin_type_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x type %d\n", rp->status, rp->pin_type);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_stored_link_key_dump(int level, struct frame *frm)
- {
- read_stored_link_key_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x max %d num %d\n",
- rp->status, rp->max_keys, rp->num_keys);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void write_stored_link_key_dump(int level, struct frame *frm)
- {
- write_stored_link_key_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x written %d\n", rp->status, rp->num_keys);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void delete_stored_link_key_dump(int level, struct frame *frm)
- {
- delete_stored_link_key_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x deleted %d\n", rp->status, btohs(rp->num_keys));
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_local_name_dump(int level, struct frame *frm)
- {
- read_local_name_rp *rp = frm->ptr;
- char name[249];
- int i;
- memset(name, 0, sizeof(name));
- for (i = 0; i < 248 && rp->name[i]; i++)
- if (isprint(rp->name[i]))
- name[i] = rp->name[i];
- else
- name[i] = '.';
- p_indent(level, frm);
- printf("status 0x%2.2x name \'%s\'\n", rp->status, name);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_class_of_dev_dump(int level, struct frame *frm)
- {
- read_class_of_dev_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x class 0x%2.2x%2.2x%2.2x\n", rp->status,
- rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_voice_setting_dump(int level, struct frame *frm)
- {
- read_voice_setting_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x voice setting 0x%4.4x\n",
- rp->status, btohs(rp->voice_setting));
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_current_iac_lap_dump(int level, struct frame *frm)
- {
- read_current_iac_lap_rp *rp = frm->ptr;
- int i;
- for (i = 0; i < rp->num_current_iac; i++) {
- p_indent(level, frm);
- printf("IAC 0x%2.2x%2.2x%2.2x", rp->lap[i][2], rp->lap[i][1], rp->lap[i][0]);
- if (rp->lap[i][2] == 0x9e && rp->lap[i][1] == 0x8b) {
- switch (rp->lap[i][0]) {
- case 0x00:
- printf(" (Limited Inquiry Access Code)");
- break;
- case 0x33:
- printf(" (General Inquiry Access Code)");
- break;
- }
- }
- printf("\n");
- }
- }
- static inline void read_scan_enable_dump(int level, struct frame *frm)
- {
- uint8_t status = p_get_u8(frm);
- uint8_t enable = p_get_u8(frm);
- p_indent(level, frm);
- printf("status 0x%2.2x enable %d\n", status, enable);
- if (status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(status));
- }
- }
- static inline void read_page_timeout_dump(int level, struct frame *frm)
- {
- read_page_timeout_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x timeout %d\n", rp->status, btohs(rp->timeout));
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_page_activity_dump(int level, struct frame *frm)
- {
- read_page_activity_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x interval %d window %d\n",
- rp->status, btohs(rp->interval), btohs(rp->window));
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_inquiry_scan_type_dump(int level, struct frame *frm)
- {
- read_inquiry_scan_type_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x type %d\n", rp->status, rp->type);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_inquiry_mode_dump(int level, struct frame *frm)
- {
- read_inquiry_mode_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x mode %d\n", rp->status, rp->mode);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_link_supervision_timeout_dump(int level, struct frame *frm)
- {
- read_link_supervision_timeout_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d timeout %d\n",
- rp->status, btohs(rp->handle), btohs(rp->timeout));
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_transmit_power_level_dump(int level, struct frame *frm)
- {
- read_transmit_power_level_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d level %d\n",
- rp->status, btohs(rp->handle), rp->level);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_ext_inquiry_response_dump(int level, struct frame *frm)
- {
- read_ext_inquiry_response_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x fec 0x%2.2x\n", rp->status, rp->fec);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- } else {
- frm->ptr += 2;
- frm->len -= 2;
- ext_inquiry_response_dump(level, frm);
- }
- }
- static inline void read_inquiry_transmit_power_level_dump(int level, struct frame *frm)
- {
- read_inquiry_transmit_power_level_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x level %d\n", rp->status, rp->level);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_default_error_data_reporting_dump(int level, struct frame *frm)
- {
- read_default_error_data_reporting_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x reporting %d\n", rp->status, rp->reporting);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_local_oob_data_dump(int level, struct frame *frm)
- {
- read_local_oob_data_rp *rp = frm->ptr;
- int i;
- p_indent(level, frm);
- printf("status 0x%2.2x\n", rp->status);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- } else {
- p_indent(level, frm);
- printf("hash 0x");
- for (i = 0; i < 16; i++)
- printf("%02x", rp->hash[i]);
- printf("\n");
- p_indent(level, frm);
- printf("randomizer 0x");
- for (i = 0; i < 16; i++)
- printf("%02x", rp->randomizer[i]);
- printf("\n");
- }
- }
- static inline void read_local_version_dump(int level, struct frame *frm)
- {
- read_local_version_rp *rp = frm->ptr;
- uint16_t manufacturer = btohs(rp->manufacturer);
- p_indent(level, frm);
- printf("status 0x%2.2x\n", rp->status);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- } else {
- char *lmpver = lmp_vertostr(rp->lmp_ver);
- char *hciver = hci_vertostr(rp->hci_ver);
- p_indent(level, frm);
- printf("HCI Version: %s (0x%x) HCI Revision: 0x%x\n",
- hciver ? hciver : "n/a",
- rp->hci_ver, btohs(rp->hci_rev));
- p_indent(level, frm);
- printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
- lmpver ? lmpver : "n/a",
- rp->lmp_ver, btohs(rp->lmp_subver));
- p_indent(level, frm);
- printf("Manufacturer: %s (%d)\n",
- bt_compidtostr(manufacturer), manufacturer);
- if (lmpver)
- free(lmpver);
- if (hciver)
- free(hciver);
- }
- }
- static inline void read_local_commands_dump(int level, struct frame *frm)
- {
- read_local_commands_rp *rp = frm->ptr;
- int i, max = 0;
- p_indent(level, frm);
- printf("status 0x%2.2x\n", rp->status);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- } else {
- for (i = 0; i < 64; i++)
- if (rp->commands[i])
- max = i + 1;
- p_indent(level, frm);
- printf("Commands: ");
- for (i = 0; i < (max > 32 ? 32 : max); i++)
- printf("%2.2x", rp->commands[i]);
- printf("\n");
- if (max > 32) {
- p_indent(level, frm);
- printf(" ");
- for (i = 32; i < max; i++)
- printf("%2.2x", rp->commands[i]);
- printf("\n");
- }
- }
- }
- static inline void read_local_features_dump(int level, struct frame *frm)
- {
- read_local_features_rp *rp = frm->ptr;
- int i;
- p_indent(level, frm);
- printf("status 0x%2.2x\n", rp->status);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- } else {
- p_indent(level, frm);
- printf("Features:");
- for (i = 0; i < 8; i++)
- printf(" 0x%2.2x", rp->features[i]);
- printf("\n");
- }
- }
- static inline void read_local_ext_features_dump(int level, struct frame *frm)
- {
- read_local_ext_features_rp *rp = frm->ptr;
- int i;
- p_indent(level, frm);
- printf("status 0x%2.2x page %d max %d\n",
- rp->status, rp->page_num, rp->max_page_num);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- } else {
- p_indent(level, frm);
- printf("Features:");
- for (i = 0; i < 8; i++)
- printf(" 0x%2.2x", rp->features[i]);
- printf("\n");
- }
- }
- static inline void read_buffer_size_dump(int level, struct frame *frm)
- {
- read_buffer_size_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x\n", rp->status);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- } else {
- p_indent(level, frm);
- printf("ACL MTU %d:%d SCO MTU %d:%d\n",
- btohs(rp->acl_mtu), btohs(rp->acl_max_pkt),
- rp->sco_mtu, btohs(rp->sco_max_pkt));
- }
- }
- static inline void read_link_quality_dump(int level, struct frame *frm)
- {
- read_link_quality_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d lq %d\n",
- rp->status, btohs(rp->handle), rp->link_quality);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_rssi_dump(int level, struct frame *frm)
- {
- read_rssi_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d rssi %d\n",
- rp->status, btohs(rp->handle), rp->rssi);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_afh_map_dump(int level, struct frame *frm)
- {
- read_afh_map_rp *rp = frm->ptr;
- int i;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d mode %d\n",
- rp->status, btohs(rp->handle), rp->mode);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- } else {
- p_indent(level, frm);
- printf("AFH map: 0x");
- for (i = 0; i < 10; i++)
- printf("%2.2x", rp->map[i]);
- printf("\n");
- }
- }
- static inline void read_clock_dump(int level, struct frame *frm)
- {
- read_clock_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d clock 0x%4.4x accuracy %d\n",
- rp->status, btohs(rp->handle),
- btohl(rp->clock), btohs(rp->accuracy));
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void read_local_amp_info_dump(int level, struct frame *frm)
- {
- read_local_amp_info_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x amp status 0x%2.2x\n",
- rp->status, rp->amp_status);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- } else {
- p_indent(level, frm);
- printf("total bandwidth %d, max guaranteed bandwidth %d\n",
- btohl(rp->total_bandwidth),
- btohl(rp->max_guaranteed_bandwidth));
- p_indent(level, frm);
- printf("min latency %d, max PDU %d, controller type 0x%2.2x\n",
- btohl(rp->min_latency), btohl(rp->max_pdu_size),
- rp->controller_type);
- p_indent(level, frm);
- printf("pal caps 0x%4.4x, max assoc len %d\n",
- btohs(rp->pal_caps), btohs(rp->max_amp_assoc_length));
- p_indent(level, frm);
- printf("max flush timeout %d, best effort flush timeout %d\n",
- btohl(rp->max_flush_timeout),
- btohl(rp->best_effort_flush_timeout));
- }
- }
- static inline void read_local_amp_assoc_dump(int level, struct frame *frm)
- {
- read_local_amp_assoc_rp *rp = frm->ptr;
- uint16_t len = btohs(rp->length);
- p_indent(level, frm);
- printf("status 0x%2.2x handle 0x%2.2x remaining len %d\n",
- rp->status, rp->handle, len);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- } else {
- amp_assoc_dump(level + 1, rp->fragment, len);
- }
- }
- static inline void write_remote_amp_assoc_dump(int level, struct frame *frm)
- {
- write_remote_amp_assoc_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle 0x%2.2x\n", rp->status, rp->handle);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void le_read_buffer_size_response_dump(int level, struct frame *frm)
- {
- le_read_buffer_size_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x pktlen 0x%4.4x maxpkt 0x%2.2x\n", rp->status,
- rp->pkt_len, rp->max_pkt);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void le_read_local_supported_features_dump(int level, struct frame *frm)
- {
- int i;
- le_read_local_supported_features_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x features 0x", rp->status);
- for (i = 0; i < 8; i++)
- printf("%2.2x", rp->features[i]);
- printf(" (%s)\n", lefeatures2str(rp->features));
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void le_read_advertising_channel_tx_power_dump(int level, struct frame *frm)
- {
- le_read_advertising_channel_tx_power_rp *rp = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x level 0x%x (dBm)\n", rp->status, rp->level);
- if (rp->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(rp->status));
- }
- }
- static inline void cmd_complete_dump(int level, struct frame *frm)
- {
- evt_cmd_complete *evt = frm->ptr;
- uint16_t opcode = btohs(evt->opcode);
- uint16_t ogf = cmd_opcode_ogf(opcode);
- uint16_t ocf = cmd_opcode_ocf(opcode);
- if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR))
- return;
- p_indent(level, frm);
- printf("%s (0x%2.2x|0x%4.4x) ncmd %d\n",
- opcode2str(opcode), ogf, ocf, evt->ncmd);
- frm->ptr += EVT_CMD_COMPLETE_SIZE;
- frm->len -= EVT_CMD_COMPLETE_SIZE;
- if (!(parser.flags & DUMP_VERBOSE)) {
- raw_dump(level, frm);
- return;
- }
- switch (ogf) {
- case OGF_LINK_CTL:
- switch (ocf) {
- case OCF_INQUIRY_CANCEL:
- case OCF_PERIODIC_INQUIRY:
- case OCF_EXIT_PERIODIC_INQUIRY:
- case OCF_READ_REMOTE_EXT_FEATURES:
- status_response_dump(level, frm);
- return;
- case OCF_CREATE_CONN_CANCEL:
- case OCF_REMOTE_NAME_REQ_CANCEL:
- case OCF_PIN_CODE_REPLY:
- case OCF_LINK_KEY_REPLY:
- case OCF_PIN_CODE_NEG_REPLY:
- case OCF_LINK_KEY_NEG_REPLY:
- case OCF_USER_CONFIRM_REPLY:
- case OCF_USER_CONFIRM_NEG_REPLY:
- case OCF_USER_PASSKEY_REPLY:
- case OCF_USER_PASSKEY_NEG_REPLY:
- case OCF_REMOTE_OOB_DATA_REPLY:
- case OCF_REMOTE_OOB_DATA_NEG_REPLY:
- case OCF_IO_CAPABILITY_REPLY:
- case OCF_IO_CAPABILITY_NEG_REPLY:
- bdaddr_response_dump(level, frm);
- return;
- }
- break;
- case OGF_LINK_POLICY:
- switch (ocf) {
- case OCF_READ_LINK_POLICY:
- read_link_policy_dump(level, frm);
- return;
- case OCF_WRITE_LINK_POLICY:
- case OCF_SNIFF_SUBRATING:
- generic_response_dump(level, frm);
- return;
- case OCF_READ_DEFAULT_LINK_POLICY:
- read_default_link_policy_dump(level, frm);
- return;
- case OCF_WRITE_DEFAULT_LINK_POLICY:
- status_response_dump(level, frm);
- return;
- }
- break;
- case OGF_HOST_CTL:
- switch (ocf) {
- case OCF_READ_PIN_TYPE:
- read_pin_type_dump(level, frm);
- return;
- case OCF_READ_STORED_LINK_KEY:
- read_stored_link_key_dump(level, frm);
- return;
- case OCF_WRITE_STORED_LINK_KEY:
- write_stored_link_key_dump(level, frm);
- return;
- case OCF_DELETE_STORED_LINK_KEY:
- delete_stored_link_key_dump(level, frm);
- return;
- case OCF_READ_LOCAL_NAME:
- read_local_name_dump(level, frm);
- return;
- case OCF_READ_CLASS_OF_DEV:
- read_class_of_dev_dump(level, frm);
- return;
- case OCF_READ_VOICE_SETTING:
- read_voice_setting_dump(level, frm);
- return;
- case OCF_READ_CURRENT_IAC_LAP:
- read_current_iac_lap_dump(level, frm);
- return;
- case OCF_READ_SCAN_ENABLE:
- case OCF_READ_AUTH_ENABLE:
- read_scan_enable_dump(level, frm);
- return;
- case OCF_READ_CONN_ACCEPT_TIMEOUT:
- case OCF_READ_PAGE_TIMEOUT:
- case OCF_READ_LOGICAL_LINK_ACCEPT_TIMEOUT:
- read_page_timeout_dump(level, frm);
- return;
- case OCF_READ_PAGE_ACTIVITY:
- case OCF_READ_INQ_ACTIVITY:
- read_page_activity_dump(level, frm);
- return;
- case OCF_READ_INQUIRY_SCAN_TYPE:
- read_inquiry_scan_type_dump(level, frm);
- return;
- case OCF_READ_ENCRYPT_MODE:
- case OCF_READ_INQUIRY_MODE:
- case OCF_READ_AFH_MODE:
- read_inquiry_mode_dump(level, frm);
- return;
- case OCF_READ_LINK_SUPERVISION_TIMEOUT:
- read_link_supervision_timeout_dump(level, frm);
- return;
- case OCF_READ_TRANSMIT_POWER_LEVEL:
- read_transmit_power_level_dump(level, frm);
- return;
- case OCF_READ_EXT_INQUIRY_RESPONSE:
- read_ext_inquiry_response_dump(level, frm);
- return;
- case OCF_READ_INQUIRY_TRANSMIT_POWER_LEVEL:
- read_inquiry_transmit_power_level_dump(level, frm);
- return;
- case OCF_READ_DEFAULT_ERROR_DATA_REPORTING:
- read_default_error_data_reporting_dump(level, frm);
- return;
- case OCF_READ_LOCAL_OOB_DATA:
- read_local_oob_data_dump(level, frm);
- return;
- case OCF_READ_SIMPLE_PAIRING_MODE:
- case OCF_READ_FLOW_CONTROL_MODE:
- status_mode_dump(level, frm);
- return;
- case OCF_FLUSH:
- case OCF_WRITE_LINK_SUPERVISION_TIMEOUT:
- generic_response_dump(level, frm);
- return;
- case OCF_RESET:
- case OCF_SET_EVENT_MASK:
- case OCF_SET_EVENT_FLT:
- case OCF_WRITE_PIN_TYPE:
- case OCF_CREATE_NEW_UNIT_KEY:
- case OCF_CHANGE_LOCAL_NAME:
- case OCF_WRITE_CLASS_OF_DEV:
- case OCF_WRITE_VOICE_SETTING:
- case OCF_WRITE_CURRENT_IAC_LAP:
- case OCF_WRITE_SCAN_ENABLE:
- case OCF_WRITE_AUTH_ENABLE:
- case OCF_WRITE_ENCRYPT_MODE:
- case OCF_WRITE_CONN_ACCEPT_TIMEOUT:
- case OCF_WRITE_PAGE_TIMEOUT:
- case OCF_WRITE_PAGE_ACTIVITY:
- case OCF_WRITE_INQ_ACTIVITY:
- case OCF_WRITE_INQUIRY_SCAN_TYPE:
- case OCF_WRITE_INQUIRY_MODE:
- case OCF_WRITE_AFH_MODE:
- case OCF_SET_AFH_CLASSIFICATION:
- case OCF_WRITE_EXT_INQUIRY_RESPONSE:
- case OCF_WRITE_SIMPLE_PAIRING_MODE:
- case OCF_WRITE_INQUIRY_TRANSMIT_POWER_LEVEL:
- case OCF_WRITE_DEFAULT_ERROR_DATA_REPORTING:
- case OCF_SET_CONTROLLER_TO_HOST_FC:
- case OCF_HOST_BUFFER_SIZE:
- case OCF_REFRESH_ENCRYPTION_KEY:
- case OCF_SEND_KEYPRESS_NOTIFY:
- case OCF_WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT:
- case OCF_SET_EVENT_MASK_PAGE_2:
- case OCF_WRITE_LOCATION_DATA:
- case OCF_WRITE_FLOW_CONTROL_MODE:
- case OCF_READ_BEST_EFFORT_FLUSH_TIMEOUT:
- case OCF_WRITE_BEST_EFFORT_FLUSH_TIMEOUT:
- status_response_dump(level, frm);
- return;
- }
- break;
- case OGF_INFO_PARAM:
- switch (ocf) {
- case OCF_READ_LOCAL_VERSION:
- read_local_version_dump(level, frm);
- return;
- case OCF_READ_LOCAL_COMMANDS:
- read_local_commands_dump(level, frm);
- return;
- case OCF_READ_LOCAL_FEATURES:
- read_local_features_dump(level, frm);
- return;
- case OCF_READ_LOCAL_EXT_FEATURES:
- read_local_ext_features_dump(level, frm);
- return;
- case OCF_READ_BUFFER_SIZE:
- read_buffer_size_dump(level, frm);
- return;
- case OCF_READ_BD_ADDR:
- bdaddr_response_dump(level, frm);
- return;
- case OCF_READ_DATA_BLOCK_SIZE:
- read_data_block_size_dump(level, frm);
- return;
- }
- break;
- case OGF_STATUS_PARAM:
- switch (ocf) {
- case OCF_READ_FAILED_CONTACT_COUNTER:
- case OCF_RESET_FAILED_CONTACT_COUNTER:
- status_response_dump(level, frm);
- return;
- case OCF_READ_LINK_QUALITY:
- read_link_quality_dump(level, frm);
- return;
- case OCF_READ_RSSI:
- read_rssi_dump(level, frm);
- return;
- case OCF_READ_AFH_MAP:
- read_afh_map_dump(level, frm);
- return;
- case OCF_READ_CLOCK:
- read_clock_dump(level, frm);
- return;
- case OCF_READ_LOCAL_AMP_INFO:
- read_local_amp_info_dump(level, frm);
- return;
- case OCF_READ_LOCAL_AMP_ASSOC:
- read_local_amp_assoc_dump(level, frm);
- return;
- case OCF_WRITE_REMOTE_AMP_ASSOC:
- write_remote_amp_assoc_dump(level, frm);
- return;
- }
- break;
- case OGF_TESTING_CMD:
- switch (ocf) {
- case OCF_READ_LOOPBACK_MODE:
- status_mode_dump(level, frm);
- return;
- case OCF_WRITE_LOOPBACK_MODE:
- case OCF_ENABLE_DEVICE_UNDER_TEST_MODE:
- case OCF_WRITE_SIMPLE_PAIRING_DEBUG_MODE:
- status_response_dump(level, frm);
- return;
- }
- break;
- case OGF_LE_CTL:
- switch (ocf) {
- case OCF_LE_SET_EVENT_MASK:
- case OCF_LE_SET_RANDOM_ADDRESS:
- case OCF_LE_SET_ADVERTISING_PARAMETERS:
- case OCF_LE_SET_ADVERTISING_DATA:
- case OCF_LE_SET_SCAN_RESPONSE_DATA:
- case OCF_LE_SET_ADVERTISE_ENABLE:
- case OCF_LE_SET_SCAN_PARAMETERS:
- case OCF_LE_SET_SCAN_ENABLE:
- case OCF_LE_CREATE_CONN:
- case OCF_LE_CLEAR_WHITE_LIST:
- case OCF_LE_ADD_DEVICE_TO_WHITE_LIST:
- case OCF_LE_REMOVE_DEVICE_FROM_WHITE_LIST:
- case OCF_LE_SET_HOST_CHANNEL_CLASSIFICATION:
- case OCF_LE_RECEIVER_TEST:
- case OCF_LE_TRANSMITTER_TEST:
- status_response_dump(level, frm);
- return;
- case OCF_LE_READ_BUFFER_SIZE:
- le_read_buffer_size_response_dump(level, frm);
- return;
- case OCF_LE_READ_LOCAL_SUPPORTED_FEATURES:
- le_read_local_supported_features_dump(level, frm);
- return;
- case OCF_LE_READ_ADVERTISING_CHANNEL_TX_POWER:
- le_read_advertising_channel_tx_power_dump(level, frm);
- return;
- }
- break;
- }
- raw_dump(level, frm);
- }
- static inline void cmd_status_dump(int level, struct frame *frm)
- {
- evt_cmd_status *evt = frm->ptr;
- uint16_t opcode = btohs(evt->opcode);
- uint16_t ogf = cmd_opcode_ogf(opcode);
- uint16_t ocf = cmd_opcode_ocf(opcode);
- if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR))
- return;
- p_indent(level, frm);
- printf("%s (0x%2.2x|0x%4.4x) status 0x%2.2x ncmd %d\n",
- opcode2str(opcode), ogf, ocf, evt->status, evt->ncmd);
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- }
- }
- static inline void hardware_error_dump(int level, struct frame *frm)
- {
- evt_hardware_error *evt = frm->ptr;
- p_indent(level, frm);
- printf("code %d\n", evt->code);
- }
- static inline void inq_result_dump(int level, struct frame *frm)
- {
- uint8_t num = p_get_u8(frm);
- char addr[18];
- int i;
- for (i = 0; i < num; i++) {
- inquiry_info *info = frm->ptr;
- p_ba2str(&info->bdaddr, addr);
- p_indent(level, frm);
- printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x\n",
- addr, info->pscan_rep_mode, btohs(info->clock_offset),
- info->dev_class[2], info->dev_class[1], info->dev_class[0]);
- frm->ptr += INQUIRY_INFO_SIZE;
- frm->len -= INQUIRY_INFO_SIZE;
- }
- }
- static inline void conn_complete_dump(int level, struct frame *frm)
- {
- evt_conn_complete *evt = frm->ptr;
- char addr[18];
- p_ba2str(&evt->bdaddr, addr);
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d bdaddr %s type %s encrypt 0x%2.2x\n",
- evt->status, btohs(evt->handle), addr,
- linktype2str(evt->link_type), evt->encr_mode);
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- }
- }
- static inline void conn_request_dump(int level, struct frame *frm)
- {
- evt_conn_request *evt = frm->ptr;
- char addr[18];
- p_ba2str(&evt->bdaddr, addr);
- p_indent(level, frm);
- printf("bdaddr %s class 0x%2.2x%2.2x%2.2x type %s\n",
- addr, evt->dev_class[2], evt->dev_class[1],
- evt->dev_class[0], linktype2str(evt->link_type));
- }
- static inline void disconn_complete_dump(int level, struct frame *frm)
- {
- evt_disconn_complete *evt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d reason 0x%2.2x\n",
- evt->status, btohs(evt->handle), evt->reason);
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- } else if (evt->reason > 0) {
- p_indent(level, frm);
- printf("Reason: %s\n", status2str(evt->reason));
- }
- }
- static inline void remote_name_req_complete_dump(int level, struct frame *frm)
- {
- evt_remote_name_req_complete *evt = frm->ptr;
- char addr[18], name[249];
- int i;
- p_ba2str(&evt->bdaddr, addr);
- memset(name, 0, sizeof(name));
- for (i = 0; i < 248 && evt->name[i]; i++)
- if (isprint(evt->name[i]))
- name[i] = evt->name[i];
- else
- name[i] = '.';
- p_indent(level, frm);
- printf("status 0x%2.2x bdaddr %s name '%s'\n", evt->status, addr, name);
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- }
- }
- static inline void temporary_link_key_complete_dump(int level,
- struct frame *frm)
- {
- evt_master_link_key_complete *evt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d flag %d\n",
- evt->status, btohs(evt->handle), evt->key_flag);
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- }
- }
- static inline void encrypt_change_dump(int level, struct frame *frm)
- {
- evt_encrypt_change *evt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d encrypt 0x%2.2x\n",
- evt->status, btohs(evt->handle), evt->encrypt);
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- }
- }
- static inline void read_remote_features_complete_dump(int level, struct frame *frm)
- {
- evt_read_remote_features_complete *evt = frm->ptr;
- int i;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- } else {
- p_indent(level, frm);
- printf("Features:");
- for (i = 0; i < 8; i++)
- printf(" 0x%2.2x", evt->features[i]);
- printf("\n");
- }
- }
- static inline void read_remote_version_complete_dump(int level, struct frame *frm)
- {
- evt_read_remote_version_complete *evt = frm->ptr;
- uint16_t manufacturer = btohs(evt->manufacturer);
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- } else {
- char *lmpver = lmp_vertostr(evt->lmp_ver);
- p_indent(level, frm);
- printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
- lmpver ? lmpver : "n/a", evt->lmp_ver,
- btohs(evt->lmp_subver));
- p_indent(level, frm);
- printf("Manufacturer: %s (%d)\n",
- bt_compidtostr(manufacturer), manufacturer);
- if (lmpver)
- free(lmpver);
- }
- }
- static inline void qos_setup_complete_dump(int level, struct frame *frm)
- {
- evt_qos_setup_complete *evt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d flags %d\n",
- evt->status, btohs(evt->handle), evt->flags);
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- } else {
- p_indent(level, frm);
- printf("Service type: %d\n", evt->qos.service_type);
- p_indent(level, frm);
- printf("Token rate: %d\n", btohl(evt->qos.token_rate));
- p_indent(level, frm);
- printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));
- p_indent(level, frm);
- printf("Latency: %d\n", btohl(evt->qos.latency));
- p_indent(level, frm);
- printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));
- }
- }
- static inline void role_change_dump(int level, struct frame *frm)
- {
- evt_role_change *evt = frm->ptr;
- char addr[18];
- p_indent(level, frm);
- p_ba2str(&evt->bdaddr, addr);
- printf("status 0x%2.2x bdaddr %s role 0x%2.2x\n",
- evt->status, addr, evt->role);
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- } else {
- p_indent(level, frm);
- printf("Role: %s\n", role2str(evt->role));
- }
- }
- static inline void mode_change_dump(int level, struct frame *frm)
- {
- evt_mode_change *evt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d mode 0x%2.2x interval %d\n",
- evt->status, btohs(evt->handle), evt->mode, btohs(evt->interval));
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- } else {
- p_indent(level, frm);
- printf("Mode: %s\n", mode2str(evt->mode));
- }
- }
- static inline void pin_code_req_dump(int level, struct frame *frm)
- {
- evt_pin_code_req *evt = frm->ptr;
- char addr[18];
- p_indent(level, frm);
- p_ba2str(&evt->bdaddr, addr);
- printf("bdaddr %s\n", addr);
- }
- static inline void link_key_notify_dump(int level, struct frame *frm)
- {
- evt_link_key_notify *evt = frm->ptr;
- char addr[18];
- int i;
- p_indent(level, frm);
- p_ba2str(&evt->bdaddr, addr);
- printf("bdaddr %s key ", addr);
- for (i = 0; i < 16; i++)
- if (parser.flags & DUMP_NOVENDOR)
- printf("**");
- else
- printf("%2.2X", evt->link_key[i]);
- printf(" type %d\n", evt->key_type);
- p_indent(level, frm);
- printf("Type: %s\n", keytype2str(evt->key_type));
- }
- static inline void max_slots_change_dump(int level, struct frame *frm)
- {
- evt_max_slots_change *evt = frm->ptr;
- p_indent(level, frm);
- printf("handle %d slots %d\n", btohs(evt->handle), evt->max_slots);
- }
- static inline void data_buffer_overflow_dump(int level, struct frame *frm)
- {
- evt_data_buffer_overflow *evt = frm->ptr;
- p_indent(level, frm);
- printf("type %s\n", linktype2str(evt->link_type));
- }
- static inline void read_clock_offset_complete_dump(int level, struct frame *frm)
- {
- evt_read_clock_offset_complete *evt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d clkoffset 0x%4.4x\n",
- evt->status, btohs(evt->handle), btohs(evt->clock_offset));
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- }
- }
- static inline void conn_ptype_changed_dump(int level, struct frame *frm)
- {
- evt_conn_ptype_changed *evt = frm->ptr;
- uint16_t ptype = btohs(evt->ptype);
- char *str;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d ptype 0x%4.4x\n",
- evt->status, btohs(evt->handle), ptype);
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- } else {
- str = hci_ptypetostr(ptype);
- if (str) {
- p_indent(level, frm);
- printf("Packet type: %s\n", str);
- free(str);
- }
- }
- }
- static inline void pscan_rep_mode_change_dump(int level, struct frame *frm)
- {
- evt_pscan_rep_mode_change *evt = frm->ptr;
- char addr[18];
- p_indent(level, frm);
- p_ba2str(&evt->bdaddr, addr);
- printf("bdaddr %s mode %d\n", addr, evt->pscan_rep_mode);
- }
- static inline void flow_spec_complete_dump(int level, struct frame *frm)
- {
- evt_flow_spec_complete *evt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle 0x%4.4x flags %d %s\n",
- evt->status, btohs(evt->handle), evt->flags,
- evt->direction == 0 ? "outgoing" : "incoming");
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- } else {
- p_indent(level, frm);
- printf("Service type: %d\n", evt->qos.service_type);
- p_indent(level, frm);
- printf("Token rate: %d\n", btohl(evt->qos.token_rate));
- p_indent(level, frm);
- printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));
- p_indent(level, frm);
- printf("Latency: %d\n", btohl(evt->qos.latency));
- p_indent(level, frm);
- printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));
- }
- }
- static inline void inq_result_with_rssi_dump(int level, struct frame *frm)
- {
- uint8_t num = p_get_u8(frm);
- char addr[18];
- int i;
- if (!num)
- return;
- if (frm->len / num == INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE) {
- for (i = 0; i < num; i++) {
- inquiry_info_with_rssi_and_pscan_mode *info = frm->ptr;
- p_indent(level, frm);
- p_ba2str(&info->bdaddr, addr);
- printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
- addr, info->pscan_rep_mode, btohs(info->clock_offset),
- info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
- frm->ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
- frm->len -= INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
- }
- } else {
- for (i = 0; i < num; i++) {
- inquiry_info_with_rssi *info = frm->ptr;
- p_indent(level, frm);
- p_ba2str(&info->bdaddr, addr);
- printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
- addr, info->pscan_rep_mode, btohs(info->clock_offset),
- info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
- frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
- frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;
- }
- }
- }
- static inline void read_remote_ext_features_complete_dump(int level, struct frame *frm)
- {
- evt_read_remote_ext_features_complete *evt = frm->ptr;
- int i;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d page %d max %d\n",
- evt->status, btohs(evt->handle),
- evt->page_num, evt->max_page_num);
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- } else {
- p_indent(level, frm);
- printf("Features:");
- for (i = 0; i < 8; i++)
- printf(" 0x%2.2x", evt->features[i]);
- printf("\n");
- }
- }
- static inline void sync_conn_complete_dump(int level, struct frame *frm)
- {
- evt_sync_conn_complete *evt = frm->ptr;
- char addr[18];
- p_ba2str(&evt->bdaddr, addr);
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d bdaddr %s type %s\n",
- evt->status, btohs(evt->handle), addr,
- evt->link_type == 0 ? "SCO" : "eSCO");
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- } else {
- p_indent(level, frm);
- printf("Air mode: %s\n", airmode2str(evt->air_mode));
- }
- }
- static inline void sync_conn_changed_dump(int level, struct frame *frm)
- {
- evt_sync_conn_changed *evt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- }
- }
- static inline void sniff_subrating_event_dump(int level, struct frame *frm)
- {
- evt_sniff_subrating *evt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- } else {
- p_indent(level, frm);
- printf("max latency transmit %d receive %d\n",
- btohs(evt->max_tx_latency),
- btohs(evt->max_rx_latency));
- p_indent(level, frm);
- printf("min timeout remote %d local %d\n",
- btohs(evt->min_remote_timeout),
- btohs(evt->min_local_timeout));
- }
- }
- static inline void extended_inq_result_dump(int level, struct frame *frm)
- {
- uint8_t num = p_get_u8(frm);
- char addr[18];
- int i;
- for (i = 0; i < num; i++) {
- extended_inquiry_info *info = frm->ptr;
- p_ba2str(&info->bdaddr, addr);
- p_indent(level, frm);
- printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
- addr, info->pscan_rep_mode, btohs(info->clock_offset),
- info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
- frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
- frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;
- ext_inquiry_response_dump(level, frm);
- }
- }
- static inline void link_supervision_timeout_changed_dump(int level, struct frame *frm)
- {
- evt_link_supervision_timeout_changed *evt = frm->ptr;
- p_indent(level, frm);
- printf("handle %d timeout %d\n",
- btohs(evt->handle), btohs(evt->timeout));
- }
- static inline void user_passkey_notify_dump(int level, struct frame *frm)
- {
- evt_user_passkey_notify *evt = frm->ptr;
- char addr[18];
- p_indent(level, frm);
- p_ba2str(&evt->bdaddr, addr);
- printf("bdaddr %s passkey %d\n", addr, btohl(evt->passkey));
- }
- static inline void keypress_notify_dump(int level, struct frame *frm)
- {
- evt_keypress_notify *evt = frm->ptr;
- char addr[18];
- p_indent(level, frm);
- p_ba2str(&evt->bdaddr, addr);
- printf("bdaddr %s type %d\n", addr, evt->type);
- }
- static inline void remote_host_features_notify_dump(int level, struct frame *frm)
- {
- evt_remote_host_features_notify *evt = frm->ptr;
- char addr[18];
- int i;
- p_indent(level, frm);
- p_ba2str(&evt->bdaddr, addr);
- printf("bdaddr %s\n", addr);
- p_indent(level, frm);
- printf("Features:");
- for (i = 0; i < 8; i++)
- printf(" 0x%2.2x", evt->features[i]);
- printf("\n");
- }
- static inline void evt_le_conn_complete_dump(int level, struct frame *frm)
- {
- evt_le_connection_complete *evt = frm->ptr;
- char addr[18];
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d, role %s\n",
- evt->status, btohs(evt->handle),
- evt->role ? "peripheral" : "central");
- p_indent(level, frm);
- p_ba2str(&evt->peer_bdaddr, addr);
- printf("bdaddr %s (%s)\n", addr, bdaddrtype2str(evt->peer_bdaddr_type));
- }
- static inline void evt_le_advertising_report_dump(int level, struct frame *frm)
- {
- uint8_t num_reports = p_get_u8(frm);
- const uint8_t RSSI_SIZE = 1;
- while (num_reports--) {
- char addr[18];
- le_advertising_info *info = frm->ptr;
- int offset = 0;
- p_ba2str(&info->bdaddr, addr);
- p_indent(level, frm);
- printf("%s (%d)\n", evttype2str(info->evt_type), info->evt_type);
- p_indent(level, frm);
- printf("bdaddr %s (%s)\n", addr,
- bdaddrtype2str(info->bdaddr_type));
- while (offset < info->length) {
- int eir_data_len = info->data[offset];
- ext_inquiry_data_dump(level, frm, &info->data[offset]);
- offset += eir_data_len + 1;
- }
- frm->ptr += LE_ADVERTISING_INFO_SIZE + info->length;
- frm->len -= LE_ADVERTISING_INFO_SIZE + info->length;
- p_indent(level, frm);
- printf("RSSI: %d\n", ((int8_t *) frm->ptr)[frm->len - 1]);
- frm->ptr += RSSI_SIZE;
- frm->len -= RSSI_SIZE;
- }
- }
- static inline void evt_le_conn_update_complete_dump(int level,
- struct frame *frm)
- {
- evt_le_connection_update_complete *uevt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d\n", uevt->status, btohs(uevt->handle));
- p_indent(level, frm);
- printf("interval %.2fms, latency %.2fms, superv. timeout %.2fms\n",
- btohs(uevt->interval) * 1.25, btohs(uevt->latency) * 1.25,
- btohs(uevt->supervision_timeout) * 10.0);
- }
- static inline void evt_le_read_remote_used_features_complete_dump(int level, struct frame *frm)
- {
- int i;
- evt_le_read_remote_used_features_complete *revt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle %d\n", revt->status, btohs(revt->handle));
- if (revt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(revt->status));
- } else {
- p_indent(level, frm);
- printf("Features:");
- for (i = 0; i < 8; i++)
- printf(" 0x%2.2x", revt->features[i]);
- printf("\n");
- }
- }
- static inline void le_meta_ev_dump(int level, struct frame *frm)
- {
- evt_le_meta_event *mevt = frm->ptr;
- uint8_t subevent;
- subevent = mevt->subevent;
- frm->ptr += EVT_LE_META_EVENT_SIZE;
- frm->len -= EVT_LE_META_EVENT_SIZE;
- p_indent(level, frm);
- printf("%s\n", ev_le_meta_str[subevent]);
- switch (mevt->subevent) {
- case EVT_LE_CONN_COMPLETE:
- evt_le_conn_complete_dump(level + 1, frm);
- break;
- case EVT_LE_ADVERTISING_REPORT:
- evt_le_advertising_report_dump(level + 1, frm);
- break;
- case EVT_LE_CONN_UPDATE_COMPLETE:
- evt_le_conn_update_complete_dump(level + 1, frm);
- break;
- case EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE:
- evt_le_read_remote_used_features_complete_dump(level + 1, frm);
- break;
- default:
- raw_dump(level, frm);
- break;
- }
- }
- static inline void phys_link_complete_dump(int level, struct frame *frm)
- {
- evt_physical_link_complete *evt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x phy handle 0x%2.2x\n", evt->status, evt->handle);
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- }
- }
- static inline void disconn_phys_link_complete_dump(int level, struct frame *frm)
- {
- evt_disconn_physical_link_complete *evt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle 0x%2.2x reason 0x%2.2x\n",
- evt->status, evt->handle, evt->reason);
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- } else if (evt->reason > 0) {
- p_indent(level, frm);
- printf("Reason: %s\n", status2str(evt->reason));
- }
- }
- static inline void phys_link_loss_warning_dump(int level, struct frame *frm)
- {
- evt_physical_link_loss_warning *evt = frm->ptr;
- p_indent(level, frm);
- printf("phy handle 0x%2.2x reason 0x%2.2x\n", evt->handle, evt->reason);
- }
- static inline void phys_link_handle_dump(int level, struct frame *frm)
- {
- evt_physical_link_recovery *evt = frm->ptr;
- p_indent(level, frm);
- printf("phy handle 0x%2.2x\n", evt->handle);
- }
- static inline void logical_link_complete_dump(int level, struct frame *frm)
- {
- evt_logical_link_complete *evt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x log handle 0x%4.4x phy handle 0x%2.2x"
- " tx_flow_id %d\n",
- evt->status, btohs(evt->log_handle), evt->handle,
- evt->tx_flow_id);
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- }
- }
- static inline void flow_spec_modify_dump(int level, struct frame *frm)
- {
- evt_flow_spec_modify_complete *evt = frm->ptr;
- p_indent(level, frm);
- printf("status 0x%2.2x handle 0x%4.4x\n",
- evt->status, btohs(evt->handle));
- if (evt->status > 0) {
- p_indent(level, frm);
- printf("Error: %s\n", status2str(evt->status));
- }
- }
- static inline void num_completed_blocks_dump(int level, struct frame *frm)
- {
- evt_num_completed_blocks *evt = frm->ptr;
- int i;
- p_indent(level, frm);
- printf("Total num blocks %d Num handles %d\n",
- btohs(evt->total_num_blocks), evt->num_handles);
- for (i = 0; i < evt->num_handles; i++) {
- cmplt_handle *h = &evt->handles[i];
- p_indent(level + 1, frm);
- printf("Handle 0x%4.4x: Num complt pkts %d Num complt blks %d\n",
- btohs(h->handle), btohs(h->num_cmplt_pkts),
- btohs(h->num_cmplt_blks));
- }
- }
- static inline void event_dump(int level, struct frame *frm)
- {
- hci_event_hdr *hdr = frm->ptr;
- uint8_t event = hdr->evt;
- if (p_filter(FILT_HCI))
- return;
- if (event <= EVENT_NUM) {
- p_indent(level, frm);
- printf("HCI Event: %s (0x%2.2x) plen %d\n",
- event_str[hdr->evt], hdr->evt, hdr->plen);
- } else if (hdr->evt == EVT_TESTING) {
- p_indent(level, frm);
- printf("HCI Event: Testing (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
- } else if (hdr->evt == EVT_VENDOR) {
- uint16_t manufacturer;
- if (parser.flags & DUMP_NOVENDOR)
- return;
- p_indent(level, frm);
- printf("HCI Event: Vendor (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
- manufacturer = get_manufacturer();
- switch (manufacturer) {
- case 0:
- case 37:
- case 48:
- frm->ptr += HCI_EVENT_HDR_SIZE;
- frm->len -= HCI_EVENT_HDR_SIZE;
- ericsson_dump(level + 1, frm);
- return;
- case 10:
- frm->ptr += HCI_EVENT_HDR_SIZE;
- frm->len -= HCI_EVENT_HDR_SIZE;
- csr_dump(level + 1, frm);
- return;
- }
- } else {
- p_indent(level, frm);
- printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen);
- }
- frm->ptr += HCI_EVENT_HDR_SIZE;
- frm->len -= HCI_EVENT_HDR_SIZE;
- if (event == EVT_CMD_COMPLETE) {
- evt_cmd_complete *cc = frm->ptr;
- if (cc->opcode == cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION)) {
- read_local_version_rp *rp = frm->ptr + EVT_CMD_COMPLETE_SIZE;
- manufacturer = rp->manufacturer;
- }
- }
- if (event == EVT_DISCONN_COMPLETE) {
- evt_disconn_complete *evt = frm->ptr;
- l2cap_clear(btohs(evt->handle));
- }
- if (!(parser.flags & DUMP_VERBOSE)) {
- raw_dump(level, frm);
- return;
- }
- switch (event) {
- case EVT_LOOPBACK_COMMAND:
- command_dump(level + 1, frm);
- break;
- case EVT_CMD_COMPLETE:
- cmd_complete_dump(level + 1, frm);
- break;
- case EVT_CMD_STATUS:
- cmd_status_dump(level + 1, frm);
- break;
- case EVT_HARDWARE_ERROR:
- hardware_error_dump(level + 1, frm);
- break;
- case EVT_FLUSH_OCCURRED:
- case EVT_QOS_VIOLATION:
- handle_response_dump(level + 1, frm);
- break;
- case EVT_INQUIRY_COMPLETE:
- status_response_dump(level + 1, frm);
- break;
- case EVT_INQUIRY_RESULT:
- inq_result_dump(level + 1, frm);
- break;
- case EVT_CONN_COMPLETE:
- conn_complete_dump(level + 1, frm);
- break;
- case EVT_CONN_REQUEST:
- conn_request_dump(level + 1, frm);
- break;
- case EVT_DISCONN_COMPLETE:
- case EVT_DISCONNECT_LOGICAL_LINK_COMPLETE:
- disconn_complete_dump(level + 1, frm);
- break;
- case EVT_AUTH_COMPLETE:
- case EVT_CHANGE_CONN_LINK_KEY_COMPLETE:
- generic_response_dump(level + 1, frm);
- break;
- case EVT_MASTER_LINK_KEY_COMPLETE:
- temporary_link_key_complete_dump(level + 1, frm);
- break;
- case EVT_REMOTE_NAME_REQ_COMPLETE:
- remote_name_req_complete_dump(level + 1, frm);
- break;
- case EVT_ENCRYPT_CHANGE:
- encrypt_change_dump(level + 1, frm);
- break;
- case EVT_READ_REMOTE_FEATURES_COMPLETE:
- read_remote_features_complete_dump(level + 1, frm);
- break;
- case EVT_READ_REMOTE_VERSION_COMPLETE:
- read_remote_version_complete_dump(level + 1, frm);
- break;
- case EVT_QOS_SETUP_COMPLETE:
- qos_setup_complete_dump(level + 1, frm);
- break;
- case EVT_ROLE_CHANGE:
- role_change_dump(level + 1, frm);
- break;
- case EVT_NUM_COMP_PKTS:
- num_comp_pkts_dump(level + 1, frm);
- break;
- case EVT_MODE_CHANGE:
- mode_change_dump(level + 1, frm);
- break;
- case EVT_RETURN_LINK_KEYS:
- return_link_keys_dump(level + 1, frm);
- break;
- case EVT_PIN_CODE_REQ:
- case EVT_LINK_KEY_REQ:
- case EVT_IO_CAPABILITY_REQUEST:
- case EVT_USER_PASSKEY_REQUEST:
- case EVT_REMOTE_OOB_DATA_REQUEST:
- pin_code_req_dump(level + 1, frm);
- break;
- case EVT_LINK_KEY_NOTIFY:
- link_key_notify_dump(level + 1, frm);
- break;
- case EVT_DATA_BUFFER_OVERFLOW:
- data_buffer_overflow_dump(level + 1, frm);
- break;
- case EVT_MAX_SLOTS_CHANGE:
- max_slots_change_dump(level + 1, frm);
- break;
- case EVT_READ_CLOCK_OFFSET_COMPLETE:
- read_clock_offset_complete_dump(level + 1, frm);
- break;
- case EVT_CONN_PTYPE_CHANGED:
- conn_ptype_changed_dump(level + 1, frm);
- break;
- case EVT_PSCAN_REP_MODE_CHANGE:
- pscan_rep_mode_change_dump(level + 1, frm);
- break;
- case EVT_FLOW_SPEC_COMPLETE:
- flow_spec_complete_dump(level + 1, frm);
- break;
- case EVT_INQUIRY_RESULT_WITH_RSSI:
- inq_result_with_rssi_dump(level + 1, frm);
- break;
- case EVT_READ_REMOTE_EXT_FEATURES_COMPLETE:
- read_remote_ext_features_complete_dump(level + 1, frm);
- break;
- case EVT_SYNC_CONN_COMPLETE:
- sync_conn_complete_dump(level + 1, frm);
- break;
- case EVT_SYNC_CONN_CHANGED:
- sync_conn_changed_dump(level + 1, frm);
- break;
- case EVT_SNIFF_SUBRATING:
- sniff_subrating_event_dump(level + 1, frm);
- break;
- case EVT_EXTENDED_INQUIRY_RESULT:
- extended_inq_result_dump(level + 1, frm);
- break;
- case EVT_ENCRYPTION_KEY_REFRESH_COMPLETE:
- generic_response_dump(level + 1, frm);
- break;
- case EVT_SIMPLE_PAIRING_COMPLETE:
- bdaddr_response_dump(level + 1, frm);
- break;
- case EVT_LINK_SUPERVISION_TIMEOUT_CHANGED:
- link_supervision_timeout_changed_dump(level + 1, frm);
- break;
- case EVT_ENHANCED_FLUSH_COMPLETE:
- generic_command_dump(level + 1, frm);
- break;
- case EVT_IO_CAPABILITY_RESPONSE:
- io_capability_reply_dump(level + 1, frm);
- break;
- case EVT_USER_CONFIRM_REQUEST:
- case EVT_USER_PASSKEY_NOTIFY:
- user_passkey_notify_dump(level + 1, frm);
- break;
- case EVT_KEYPRESS_NOTIFY:
- keypress_notify_dump(level + 1, frm);
- break;
- case EVT_REMOTE_HOST_FEATURES_NOTIFY:
- remote_host_features_notify_dump(level + 1, frm);
- break;
- case EVT_LE_META_EVENT:
- le_meta_ev_dump(level + 1, frm);
- break;
- case EVT_PHYSICAL_LINK_COMPLETE:
- phys_link_complete_dump(level + 1, frm);
- break;
- case EVT_DISCONNECT_PHYSICAL_LINK_COMPLETE:
- disconn_phys_link_complete_dump(level + 1, frm);
- break;
- case EVT_PHYSICAL_LINK_LOSS_EARLY_WARNING:
- phys_link_loss_warning_dump(level + 1, frm);
- break;
- case EVT_PHYSICAL_LINK_RECOVERY:
- case EVT_CHANNEL_SELECTED:
- phys_link_handle_dump(level + 1, frm);
- break;
- case EVT_LOGICAL_LINK_COMPLETE:
- logical_link_complete_dump(level + 1, frm);
- break;
- case EVT_FLOW_SPEC_MODIFY_COMPLETE:
- flow_spec_modify_dump(level + 1, frm);
- break;
- case EVT_NUMBER_COMPLETED_BLOCKS:
- num_completed_blocks_dump(level + 1, frm);
- break;
- default:
- raw_dump(level, frm);
- break;
- }
- }
- static inline void acl_dump(int level, struct frame *frm)
- {
- hci_acl_hdr *hdr = (void *) frm->ptr;
- uint16_t handle = btohs(hdr->handle);
- uint16_t dlen = btohs(hdr->dlen);
- uint8_t flags = acl_flags(handle);
- if (!p_filter(FILT_HCI)) {
- p_indent(level, frm);
- printf("ACL data: handle %d flags 0x%2.2x dlen %d\n",
- acl_handle(handle), flags, dlen);
- level++;
- }
- frm->ptr += HCI_ACL_HDR_SIZE;
- frm->len -= HCI_ACL_HDR_SIZE;
- frm->flags = flags;
- frm->handle = acl_handle(handle);
- if (parser.filter & ~FILT_HCI)
- l2cap_dump(level, frm);
- else
- raw_dump(level, frm);
- }
- static inline void sco_dump(int level, struct frame *frm)
- {
- hci_sco_hdr *hdr = (void *) frm->ptr;
- uint16_t handle = btohs(hdr->handle);
- uint8_t flags = acl_flags(handle);
- int len;
- if (frm->audio_fd > fileno(stderr)) {
- len = write(frm->audio_fd, frm->ptr + HCI_SCO_HDR_SIZE, hdr->dlen);
- if (len < 0)
- return;
- }
- if (!p_filter(FILT_SCO)) {
- p_indent(level, frm);
- printf("SCO data: handle %d flags 0x%2.2x dlen %d\n",
- acl_handle(handle), flags, hdr->dlen);
- level++;
- frm->ptr += HCI_SCO_HDR_SIZE;
- frm->len -= HCI_SCO_HDR_SIZE;
- raw_dump(level, frm);
- }
- }
- static inline void vendor_dump(int level, struct frame *frm)
- {
- if (p_filter(FILT_HCI))
- return;
- if (frm->dev_id == HCI_DEV_NONE) {
- uint16_t device = btohs(htons(p_get_u16(frm)));
- uint16_t proto = btohs(htons(p_get_u16(frm)));
- uint16_t type = btohs(htons(p_get_u16(frm)));
- uint16_t plen = btohs(htons(p_get_u16(frm)));
- p_indent(level, frm);
- printf("System %s: device hci%d proto 0x%2.2x type 0x%2.2x plen %d\n",
- frm->in ? "event" : "command", device, proto, type, plen);
- raw_dump(level, frm);
- return;
- }
- if (parser.flags & DUMP_NOVENDOR)
- return;
- if (get_manufacturer() == 12) {
- bpa_dump(level, frm);
- return;
- }
- p_indent(level, frm);
- printf("Vendor data: len %d\n", frm->len);
- raw_dump(level, frm);
- }
- void hci_dump(int level, struct frame *frm)
- {
- uint8_t type = *(uint8_t *)frm->ptr;
- frm->ptr++; frm->len--;
- if (frm->len == 0)
- return;
- switch (type) {
- case HCI_COMMAND_PKT:
- command_dump(level, frm);
- break;
- case HCI_EVENT_PKT:
- event_dump(level, frm);
- break;
- case HCI_ACLDATA_PKT:
- acl_dump(level, frm);
- break;
- case HCI_SCODATA_PKT:
- sco_dump(level, frm);
- break;
- case HCI_VENDOR_PKT:
- vendor_dump(level, frm);
- break;
- default:
- if (p_filter(FILT_HCI))
- break;
- p_indent(level, frm);
- printf("Unknown: type 0x%2.2x len %d\n", type, frm->len);
- raw_dump(level, frm);
- break;
- }
- }
|