hci.c 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2000-2001 Qualcomm Incorporated
  7. * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
  8. * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
  9. *
  10. *
  11. */
  12. #ifdef HAVE_CONFIG_H
  13. #include <config.h>
  14. #endif
  15. #define _GNU_SOURCE
  16. #include <stdio.h>
  17. #include <errno.h>
  18. #include <fcntl.h>
  19. #include <unistd.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <poll.h>
  23. #include <sys/param.h>
  24. #include <sys/uio.h>
  25. #include <sys/types.h>
  26. #include <sys/ioctl.h>
  27. #include <sys/socket.h>
  28. #include "bluetooth.h"
  29. #include "hci.h"
  30. #include "hci_lib.h"
  31. #ifndef MIN
  32. #define MIN(x, y) ((x) < (y) ? (x) : (y))
  33. #endif
  34. typedef struct {
  35. char *str;
  36. unsigned int val;
  37. } hci_map;
  38. static char *hci_bit2str(hci_map *m, unsigned int val)
  39. {
  40. char *str = malloc(120);
  41. char *ptr = str;
  42. if (!str)
  43. return NULL;
  44. *ptr = 0;
  45. while (m->str) {
  46. if ((unsigned int) m->val & val)
  47. ptr += sprintf(ptr, "%s ", m->str);
  48. m++;
  49. }
  50. return str;
  51. }
  52. static int hci_str2bit(hci_map *map, char *str, unsigned int *val)
  53. {
  54. char *t, *ptr;
  55. hci_map *m;
  56. int set;
  57. if (!str || !(str = ptr = strdup(str)))
  58. return 0;
  59. *val = set = 0;
  60. while ((t = strsep(&ptr, ","))) {
  61. for (m = map; m->str; m++) {
  62. if (!strcasecmp(m->str, t)) {
  63. *val |= (unsigned int) m->val;
  64. set = 1;
  65. }
  66. }
  67. }
  68. free(str);
  69. return set;
  70. }
  71. static char *hci_uint2str(hci_map *m, unsigned int val)
  72. {
  73. char *str = malloc(50);
  74. char *ptr = str;
  75. if (!str)
  76. return NULL;
  77. *ptr = 0;
  78. while (m->str) {
  79. if ((unsigned int) m->val == val) {
  80. ptr += sprintf(ptr, "%s", m->str);
  81. break;
  82. }
  83. m++;
  84. }
  85. return str;
  86. }
  87. static int hci_str2uint(hci_map *map, char *str, unsigned int *val)
  88. {
  89. char *t, *ptr;
  90. hci_map *m;
  91. int set = 0;
  92. if (!str)
  93. return 0;
  94. str = ptr = strdup(str);
  95. while ((t = strsep(&ptr, ","))) {
  96. for (m = map; m->str; m++) {
  97. if (!strcasecmp(m->str,t)) {
  98. *val = (unsigned int) m->val;
  99. set = 1;
  100. break;
  101. }
  102. }
  103. }
  104. free(str);
  105. return set;
  106. }
  107. char *hci_bustostr(int bus)
  108. {
  109. switch (bus) {
  110. case HCI_VIRTUAL:
  111. return "Virtual";
  112. case HCI_USB:
  113. return "USB";
  114. case HCI_PCCARD:
  115. return "PCCARD";
  116. case HCI_UART:
  117. return "UART";
  118. case HCI_RS232:
  119. return "RS232";
  120. case HCI_PCI:
  121. return "PCI";
  122. case HCI_SDIO:
  123. return "SDIO";
  124. case HCI_SPI:
  125. return "SPI";
  126. case HCI_I2C:
  127. return "I2C";
  128. case HCI_SMD:
  129. return "SMD";
  130. case HCI_VIRTIO:
  131. return "VIRTIO";
  132. default:
  133. return "Unknown";
  134. }
  135. }
  136. char *hci_dtypetostr(int type)
  137. {
  138. return hci_bustostr(type & 0x0f);
  139. }
  140. char *hci_typetostr(int type)
  141. {
  142. switch (type) {
  143. case HCI_PRIMARY:
  144. return "Primary";
  145. case HCI_AMP:
  146. return "AMP";
  147. default:
  148. return "Unknown";
  149. }
  150. }
  151. /* HCI dev flags mapping */
  152. static hci_map dev_flags_map[] = {
  153. { "UP", HCI_UP },
  154. { "INIT", HCI_INIT },
  155. { "RUNNING", HCI_RUNNING },
  156. { "RAW", HCI_RAW },
  157. { "PSCAN", HCI_PSCAN },
  158. { "ISCAN", HCI_ISCAN },
  159. { "INQUIRY", HCI_INQUIRY },
  160. { "AUTH", HCI_AUTH },
  161. { "ENCRYPT", HCI_ENCRYPT },
  162. { NULL }
  163. };
  164. char *hci_dflagstostr(uint32_t flags)
  165. {
  166. char *str = bt_malloc(50);
  167. char *ptr = str;
  168. hci_map *m = dev_flags_map;
  169. if (!str)
  170. return NULL;
  171. *ptr = 0;
  172. if (!hci_test_bit(HCI_UP, &flags))
  173. ptr += sprintf(ptr, "DOWN ");
  174. while (m->str) {
  175. if (hci_test_bit(m->val, &flags))
  176. ptr += sprintf(ptr, "%s ", m->str);
  177. m++;
  178. }
  179. return str;
  180. }
  181. /* HCI packet type mapping */
  182. static hci_map pkt_type_map[] = {
  183. { "DM1", HCI_DM1 },
  184. { "DM3", HCI_DM3 },
  185. { "DM5", HCI_DM5 },
  186. { "DH1", HCI_DH1 },
  187. { "DH3", HCI_DH3 },
  188. { "DH5", HCI_DH5 },
  189. { "HV1", HCI_HV1 },
  190. { "HV2", HCI_HV2 },
  191. { "HV3", HCI_HV3 },
  192. { "2-DH1", HCI_2DH1 },
  193. { "2-DH3", HCI_2DH3 },
  194. { "2-DH5", HCI_2DH5 },
  195. { "3-DH1", HCI_3DH1 },
  196. { "3-DH3", HCI_3DH3 },
  197. { "3-DH5", HCI_3DH5 },
  198. { NULL }
  199. };
  200. static hci_map sco_ptype_map[] = {
  201. { "HV1", 0x0001 },
  202. { "HV2", 0x0002 },
  203. { "HV3", 0x0004 },
  204. { "EV3", HCI_EV3 },
  205. { "EV4", HCI_EV4 },
  206. { "EV5", HCI_EV5 },
  207. { "2-EV3", HCI_2EV3 },
  208. { "2-EV5", HCI_2EV5 },
  209. { "3-EV3", HCI_3EV3 },
  210. { "3-EV5", HCI_3EV5 },
  211. { NULL }
  212. };
  213. char *hci_ptypetostr(unsigned int ptype)
  214. {
  215. return hci_bit2str(pkt_type_map, ptype);
  216. }
  217. int hci_strtoptype(char *str, unsigned int *val)
  218. {
  219. return hci_str2bit(pkt_type_map, str, val);
  220. }
  221. char *hci_scoptypetostr(unsigned int ptype)
  222. {
  223. return hci_bit2str(sco_ptype_map, ptype);
  224. }
  225. int hci_strtoscoptype(char *str, unsigned int *val)
  226. {
  227. return hci_str2bit(sco_ptype_map, str, val);
  228. }
  229. /* Link policy mapping */
  230. static hci_map link_policy_map[] = {
  231. { "NONE", 0 },
  232. { "RSWITCH", HCI_LP_RSWITCH },
  233. { "HOLD", HCI_LP_HOLD },
  234. { "SNIFF", HCI_LP_SNIFF },
  235. { "PARK", HCI_LP_PARK },
  236. { NULL }
  237. };
  238. char *hci_lptostr(unsigned int lp)
  239. {
  240. return hci_bit2str(link_policy_map, lp);
  241. }
  242. int hci_strtolp(char *str, unsigned int *val)
  243. {
  244. return hci_str2bit(link_policy_map, str, val);
  245. }
  246. /* Link mode mapping */
  247. static hci_map link_mode_map[] = {
  248. { "NONE", 0 },
  249. { "ACCEPT", HCI_LM_ACCEPT },
  250. { "CENTRAL", HCI_LM_MASTER },
  251. { "AUTH", HCI_LM_AUTH },
  252. { "ENCRYPT", HCI_LM_ENCRYPT },
  253. { "TRUSTED", HCI_LM_TRUSTED },
  254. { "RELIABLE", HCI_LM_RELIABLE },
  255. { "SECURE", HCI_LM_SECURE },
  256. { NULL }
  257. };
  258. char *hci_lmtostr(unsigned int lm)
  259. {
  260. char *s, *str = bt_malloc(50);
  261. if (!str)
  262. return NULL;
  263. *str = 0;
  264. if (!(lm & HCI_LM_MASTER))
  265. strcpy(str, "PERIPHERAL ");
  266. s = hci_bit2str(link_mode_map, lm);
  267. if (!s) {
  268. bt_free(str);
  269. return NULL;
  270. }
  271. strcat(str, s);
  272. free(s);
  273. return str;
  274. }
  275. int hci_strtolm(char *str, unsigned int *val)
  276. {
  277. int ret = hci_str2bit(link_mode_map, str, val);
  278. /* Deprecated name. Kept for compatibility. */
  279. if (strcasestr(str, "MASTER")) {
  280. ret = 1;
  281. *val |= HCI_LM_MASTER;
  282. }
  283. return ret;
  284. }
  285. /* Command mapping */
  286. static hci_map commands_map[] = {
  287. { "Inquiry", 0 },
  288. { "Inquiry Cancel", 1 },
  289. { "Periodic Inquiry Mode", 2 },
  290. { "Exit Periodic Inquiry Mode", 3 },
  291. { "Create Connection", 4 },
  292. { "Disconnect", 5 },
  293. { "Add SCO Connection", 6 },
  294. { "Cancel Create Connection", 7 },
  295. { "Accept Connection Request", 8 },
  296. { "Reject Connection Request", 9 },
  297. { "Link Key Request Reply", 10 },
  298. { "Link Key Request Negative Reply", 11 },
  299. { "PIN Code Request Reply", 12 },
  300. { "PIN Code Request Negative Reply", 13 },
  301. { "Change Connection Packet Type", 14 },
  302. { "Authentication Requested", 15 },
  303. { "Set Connection Encryption", 16 },
  304. { "Change Connection Link Key", 17 },
  305. { "Temporary Link Key", 18 },
  306. { "Remote Name Request", 19 },
  307. { "Cancel Remote Name Request", 20 },
  308. { "Read Remote Supported Features", 21 },
  309. { "Read Remote Extended Features", 22 },
  310. { "Read Remote Version Information", 23 },
  311. { "Read Clock Offset", 24 },
  312. { "Read LMP Handle", 25 },
  313. { "Reserved", 26 },
  314. { "Reserved", 27 },
  315. { "Reserved", 28 },
  316. { "Reserved", 29 },
  317. { "Reserved", 30 },
  318. { "Reserved", 31 },
  319. { "Reserved", 32 },
  320. { "Hold Mode", 33 },
  321. { "Sniff Mode", 34 },
  322. { "Exit Sniff Mode", 35 },
  323. { "Park State", 36 },
  324. { "Exit Park State", 37 },
  325. { "QoS Setup", 38 },
  326. { "Role Discovery", 39 },
  327. { "Switch Role", 40 },
  328. { "Read Link Policy Settings", 41 },
  329. { "Write Link Policy Settings", 42 },
  330. { "Read Default Link Policy Settings", 43 },
  331. { "Write Default Link Policy Settings", 44 },
  332. { "Flow Specification", 45 },
  333. { "Set Event Mask", 46 },
  334. { "Reset", 47 },
  335. { "Set Event Filter", 48 },
  336. { "Flush", 49 },
  337. { "Read PIN Type", 50 },
  338. { "Write PIN Type", 51 },
  339. { "Create New Unit Key", 52 },
  340. { "Read Stored Link Key", 53 },
  341. { "Write Stored Link Key", 54 },
  342. { "Delete Stored Link Key", 55 },
  343. { "Write Local Name", 56 },
  344. { "Read Local Name", 57 },
  345. { "Read Connection Accept Timeout", 58 },
  346. { "Write Connection Accept Timeout", 59 },
  347. { "Read Page Timeout", 60 },
  348. { "Write Page Timeout", 61 },
  349. { "Read Scan Enable", 62 },
  350. { "Write Scan Enable", 63 },
  351. { "Read Page Scan Activity", 64 },
  352. { "Write Page Scan Activity", 65 },
  353. { "Read Inquiry Scan Activity", 66 },
  354. { "Write Inquiry Scan Activity", 67 },
  355. { "Read Authentication Enable", 68 },
  356. { "Write Authentication Enable", 69 },
  357. { "Read Encryption Mode", 70 },
  358. { "Write Encryption Mode", 71 },
  359. { "Read Class Of Device", 72 },
  360. { "Write Class Of Device", 73 },
  361. { "Read Voice Setting", 74 },
  362. { "Write Voice Setting", 75 },
  363. { "Read Automatic Flush Timeout", 76 },
  364. { "Write Automatic Flush Timeout", 77 },
  365. { "Read Num Broadcast Retransmissions", 78 },
  366. { "Write Num Broadcast Retransmissions", 79 },
  367. { "Read Hold Mode Activity", 80 },
  368. { "Write Hold Mode Activity", 81 },
  369. { "Read Transmit Power Level", 82 },
  370. { "Read Synchronous Flow Control Enable", 83 },
  371. { "Write Synchronous Flow Control Enable", 84 },
  372. { "Set Host Controller To Host Flow Control", 85 },
  373. { "Host Buffer Size", 86 },
  374. { "Host Number Of Completed Packets", 87 },
  375. { "Read Link Supervision Timeout", 88 },
  376. { "Write Link Supervision Timeout", 89 },
  377. { "Read Number of Supported IAC", 90 },
  378. { "Read Current IAC LAP", 91 },
  379. { "Write Current IAC LAP", 92 },
  380. { "Read Page Scan Period Mode", 93 },
  381. { "Write Page Scan Period Mode", 94 },
  382. { "Read Page Scan Mode", 95 },
  383. { "Write Page Scan Mode", 96 },
  384. { "Set AFH Channel Classification", 97 },
  385. { "Reserved", 98 },
  386. { "Reserved", 99 },
  387. { "Read Inquiry Scan Type", 100 },
  388. { "Write Inquiry Scan Type", 101 },
  389. { "Read Inquiry Mode", 102 },
  390. { "Write Inquiry Mode", 103 },
  391. { "Read Page Scan Type", 104 },
  392. { "Write Page Scan Type", 105 },
  393. { "Read AFH Channel Assessment Mode", 106 },
  394. { "Write AFH Channel Assessment Mode", 107 },
  395. { "Reserved", 108 },
  396. { "Reserved", 109 },
  397. { "Reserved", 110 },
  398. { "Reserved", 111 },
  399. { "Reserved", 112 },
  400. { "Reserved", 113 },
  401. { "Reserved", 114 },
  402. { "Read Local Version Information", 115 },
  403. { "Read Local Supported Commands", 116 },
  404. { "Read Local Supported Features", 117 },
  405. { "Read Local Extended Features", 118 },
  406. { "Read Buffer Size", 119 },
  407. { "Read Country Code", 120 },
  408. { "Read BD ADDR", 121 },
  409. { "Read Failed Contact Counter", 122 },
  410. { "Reset Failed Contact Counter", 123 },
  411. { "Get Link Quality", 124 },
  412. { "Read RSSI", 125 },
  413. { "Read AFH Channel Map", 126 },
  414. { "Read BD Clock", 127 },
  415. { "Read Loopback Mode", 128 },
  416. { "Write Loopback Mode", 129 },
  417. { "Enable Device Under Test Mode", 130 },
  418. { "Setup Synchronous Connection", 131 },
  419. { "Accept Synchronous Connection", 132 },
  420. { "Reject Synchronous Connection", 133 },
  421. { "Reserved", 134 },
  422. { "Reserved", 135 },
  423. { "Read Extended Inquiry Response", 136 },
  424. { "Write Extended Inquiry Response", 137 },
  425. { "Refresh Encryption Key", 138 },
  426. { "Reserved", 139 },
  427. { "Sniff Subrating", 140 },
  428. { "Read Simple Pairing Mode", 141 },
  429. { "Write Simple Pairing Mode", 142 },
  430. { "Read Local OOB Data", 143 },
  431. { "Read Inquiry Response Transmit Power Level", 144 },
  432. { "Write Inquiry Transmit Power Level", 145 },
  433. { "Read Default Erroneous Data Reporting", 146 },
  434. { "Write Default Erroneous Data Reporting", 147 },
  435. { "Reserved", 148 },
  436. { "Reserved", 149 },
  437. { "Reserved", 150 },
  438. { "IO Capability Request Reply", 151 },
  439. { "User Confirmation Request Reply", 152 },
  440. { "User Confirmation Request Negative Reply", 153 },
  441. { "User Passkey Request Reply", 154 },
  442. { "User Passkey Request Negative Reply", 155 },
  443. { "Remote OOB Data Request Reply", 156 },
  444. { "Write Simple Pairing Debug Mode", 157 },
  445. { "Enhanced Flush", 158 },
  446. { "Remote OOB Data Request Negative Reply", 159 },
  447. { "Reserved", 160 },
  448. { "Reserved", 161 },
  449. { "Send Keypress Notification", 162 },
  450. { "IO Capability Request Negative Reply", 163 },
  451. { "Read Encryption Key Size", 164 },
  452. { "Reserved", 165 },
  453. { "Reserved", 166 },
  454. { "Reserved", 167 },
  455. { "Create Physical Link", 168 },
  456. { "Accept Physical Link", 169 },
  457. { "Disconnect Physical Link", 170 },
  458. { "Create Logical Link", 171 },
  459. { "Accept Logical Link", 172 },
  460. { "Disconnect Logical Link", 173 },
  461. { "Logical Link Cancel", 174 },
  462. { "Flow Specification Modify", 175 },
  463. { "Read Logical Link Accept Timeout", 176 },
  464. { "Write Logical Link Accept Timeout", 177 },
  465. { "Set Event Mask Page 2", 178 },
  466. { "Read Location Data", 179 },
  467. { "Write Location Data", 180 },
  468. { "Read Local AMP Info", 181 },
  469. { "Read Local AMP_ASSOC", 182 },
  470. { "Write Remote AMP_ASSOC", 183 },
  471. { "Read Flow Control Mode", 184 },
  472. { "Write Flow Control Mode", 185 },
  473. { "Read Data Block Size", 186 },
  474. { "Reserved", 187 },
  475. { "Reserved", 188 },
  476. { "Enable AMP Receiver Reports", 189 },
  477. { "AMP Test End", 190 },
  478. { "AMP Test Command", 191 },
  479. { "Read Enhanced Transmit Power Level", 192 },
  480. { "Reserved", 193 },
  481. { "Read Best Effort Flush Timeout", 194 },
  482. { "Write Best Effort Flush Timeout", 195 },
  483. { "Short Range Mode", 196 },
  484. { "Read LE Host Support", 197 },
  485. { "Write LE Host Support", 198 },
  486. { "Reserved", 199 },
  487. { "LE Set Event Mask", 200 },
  488. { "LE Read Buffer Size", 201 },
  489. { "LE Read Local Supported Features", 202 },
  490. { "Reserved", 203 },
  491. { "LE Set Random Address", 204 },
  492. { "LE Set Advertising Parameters", 205 },
  493. { "LE Read Advertising Channel TX Power", 206 },
  494. { "LE Set Advertising Data", 207 },
  495. { "LE Set Scan Response Data", 208 },
  496. { "LE Set Advertise Enable", 209 },
  497. { "LE Set Scan Parameters", 210 },
  498. { "LE Set Scan Enable", 211 },
  499. { "LE Create Connection", 212 },
  500. { "LE Create Connection Cancel", 213 },
  501. { "LE Read Accept List Size", 214 },
  502. { "LE Clear Accept List", 215 },
  503. { "LE Add Device To Accept List", 216 },
  504. { "LE Remove Device From Accept List", 217 },
  505. { "LE Connection Update", 218 },
  506. { "LE Set Host Channel Classification", 219 },
  507. { "LE Read Channel Map", 220 },
  508. { "LE Read Remote Used Features", 221 },
  509. { "LE Encrypt", 222 },
  510. { "LE Rand", 223 },
  511. { "LE Start Encryption", 224 },
  512. { "LE Long Term Key Request Reply", 225 },
  513. { "LE Long Term Key Request Negative Reply", 226 },
  514. { "LE Read Supported States", 227 },
  515. { "LE Receiver Test", 228 },
  516. { "LE Transmitter Test", 229 },
  517. { "LE Test End", 230 },
  518. { "Reserved", 231 },
  519. { NULL }
  520. };
  521. char *hci_cmdtostr(unsigned int cmd)
  522. {
  523. return hci_uint2str(commands_map, cmd);
  524. }
  525. char *hci_commandstostr(uint8_t *commands, char *pref, int width)
  526. {
  527. unsigned int maxwidth = width - 3;
  528. hci_map *m;
  529. char *off, *ptr, *str;
  530. int size = 10;
  531. m = commands_map;
  532. while (m->str) {
  533. if (commands[m->val / 8] & (1 << (m->val % 8)))
  534. size += strlen(m->str) + (pref ? strlen(pref) : 0) + 3;
  535. m++;
  536. }
  537. str = bt_malloc(size);
  538. if (!str)
  539. return NULL;
  540. ptr = str; *ptr = '\0';
  541. if (pref)
  542. ptr += sprintf(ptr, "%s", pref);
  543. off = ptr;
  544. m = commands_map;
  545. while (m->str) {
  546. if (commands[m->val / 8] & (1 << (m->val % 8))) {
  547. if (strlen(off) + strlen(m->str) > maxwidth) {
  548. ptr += sprintf(ptr, "\n%s", pref ? pref : "");
  549. off = ptr;
  550. }
  551. ptr += sprintf(ptr, "'%s' ", m->str);
  552. }
  553. m++;
  554. }
  555. return str;
  556. }
  557. /* Version mapping */
  558. static hci_map ver_map[] = {
  559. { "1.0b", 0x00 },
  560. { "1.1", 0x01 },
  561. { "1.2", 0x02 },
  562. { "2.0", 0x03 },
  563. { "2.1", 0x04 },
  564. { "3.0", 0x05 },
  565. { "4.0", 0x06 },
  566. { "4.1", 0x07 },
  567. { "4.2", 0x08 },
  568. { "5.0", 0x09 },
  569. { "5.1", 0x0a },
  570. { "5.2", 0x0b },
  571. { NULL }
  572. };
  573. char *hci_vertostr(unsigned int ver)
  574. {
  575. return hci_uint2str(ver_map, ver);
  576. }
  577. int hci_strtover(char *str, unsigned int *ver)
  578. {
  579. return hci_str2uint(ver_map, str, ver);
  580. }
  581. char *lmp_vertostr(unsigned int ver)
  582. {
  583. return hci_uint2str(ver_map, ver);
  584. }
  585. int lmp_strtover(char *str, unsigned int *ver)
  586. {
  587. return hci_str2uint(ver_map, str, ver);
  588. }
  589. static hci_map pal_map[] = {
  590. { "3.0", 0x01 },
  591. { NULL }
  592. };
  593. char *pal_vertostr(unsigned int ver)
  594. {
  595. return hci_uint2str(pal_map, ver);
  596. }
  597. int pal_strtover(char *str, unsigned int *ver)
  598. {
  599. return hci_str2uint(pal_map, str, ver);
  600. }
  601. /* LMP features mapping */
  602. static hci_map lmp_features_map[8][9] = {
  603. { /* Byte 0 */
  604. { "<3-slot packets>", LMP_3SLOT }, /* Bit 0 */
  605. { "<5-slot packets>", LMP_5SLOT }, /* Bit 1 */
  606. { "<encryption>", LMP_ENCRYPT }, /* Bit 2 */
  607. { "<slot offset>", LMP_SOFFSET }, /* Bit 3 */
  608. { "<timing accuracy>", LMP_TACCURACY }, /* Bit 4 */
  609. { "<role switch>", LMP_RSWITCH }, /* Bit 5 */
  610. { "<hold mode>", LMP_HOLD }, /* Bit 6 */
  611. { "<sniff mode>", LMP_SNIFF }, /* Bit 7 */
  612. { NULL }
  613. },
  614. { /* Byte 1 */
  615. { "<park state>", LMP_PARK }, /* Bit 0 */
  616. { "<RSSI>", LMP_RSSI }, /* Bit 1 */
  617. { "<channel quality>", LMP_QUALITY }, /* Bit 2 */
  618. { "<SCO link>", LMP_SCO }, /* Bit 3 */
  619. { "<HV2 packets>", LMP_HV2 }, /* Bit 4 */
  620. { "<HV3 packets>", LMP_HV3 }, /* Bit 5 */
  621. { "<u-law log>", LMP_ULAW }, /* Bit 6 */
  622. { "<A-law log>", LMP_ALAW }, /* Bit 7 */
  623. { NULL }
  624. },
  625. { /* Byte 2 */
  626. { "<CVSD>", LMP_CVSD }, /* Bit 0 */
  627. { "<paging scheme>", LMP_PSCHEME }, /* Bit 1 */
  628. { "<power control>", LMP_PCONTROL }, /* Bit 2 */
  629. { "<transparent SCO>", LMP_TRSP_SCO }, /* Bit 3 */
  630. { "<broadcast encrypt>",LMP_BCAST_ENC }, /* Bit 7 */
  631. { NULL }
  632. },
  633. { /* Byte 3 */
  634. { "<no. 24>", 0x01 }, /* Bit 0 */
  635. { "<EDR ACL 2 Mbps>", LMP_EDR_ACL_2M }, /* Bit 1 */
  636. { "<EDR ACL 3 Mbps>", LMP_EDR_ACL_3M }, /* Bit 2 */
  637. { "<enhanced iscan>", LMP_ENH_ISCAN }, /* Bit 3 */
  638. { "<interlaced iscan>", LMP_ILACE_ISCAN }, /* Bit 4 */
  639. { "<interlaced pscan>", LMP_ILACE_PSCAN }, /* Bit 5 */
  640. { "<inquiry with RSSI>",LMP_RSSI_INQ }, /* Bit 6 */
  641. { "<extended SCO>", LMP_ESCO }, /* Bit 7 */
  642. { NULL }
  643. },
  644. { /* Byte 4 */
  645. { "<EV4 packets>", LMP_EV4 }, /* Bit 0 */
  646. { "<EV5 packets>", LMP_EV5 }, /* Bit 1 */
  647. { "<no. 34>", 0x04 }, /* Bit 2 */
  648. { "<AFH cap. perip.>", LMP_AFH_CAP_SLV }, /* Bit 3 */
  649. { "<AFH cls. perip.>", LMP_AFH_CLS_SLV }, /* Bit 4 */
  650. { "<BR/EDR not supp.>", LMP_NO_BREDR }, /* Bit 5 */
  651. { "<LE support>", LMP_LE }, /* Bit 6 */
  652. { "<3-slot EDR ACL>", LMP_EDR_3SLOT }, /* Bit 7 */
  653. { NULL }
  654. },
  655. { /* Byte 5 */
  656. { "<5-slot EDR ACL>", LMP_EDR_5SLOT }, /* Bit 0 */
  657. { "<sniff subrating>", LMP_SNIFF_SUBR }, /* Bit 1 */
  658. { "<pause encryption>", LMP_PAUSE_ENC }, /* Bit 2 */
  659. { "<AFH cap. central>", LMP_AFH_CAP_MST }, /* Bit 3 */
  660. { "<AFH cls. central>", LMP_AFH_CLS_MST }, /* Bit 4 */
  661. { "<EDR eSCO 2 Mbps>", LMP_EDR_ESCO_2M }, /* Bit 5 */
  662. { "<EDR eSCO 3 Mbps>", LMP_EDR_ESCO_3M }, /* Bit 6 */
  663. { "<3-slot EDR eSCO>", LMP_EDR_3S_ESCO }, /* Bit 7 */
  664. { NULL }
  665. },
  666. { /* Byte 6 */
  667. { "<extended inquiry>", LMP_EXT_INQ }, /* Bit 0 */
  668. { "<LE and BR/EDR>", LMP_LE_BREDR }, /* Bit 1 */
  669. { "<no. 50>", 0x04 }, /* Bit 2 */
  670. { "<simple pairing>", LMP_SIMPLE_PAIR }, /* Bit 3 */
  671. { "<encapsulated PDU>", LMP_ENCAPS_PDU }, /* Bit 4 */
  672. { "<err. data report>", LMP_ERR_DAT_REP }, /* Bit 5 */
  673. { "<non-flush flag>", LMP_NFLUSH_PKTS }, /* Bit 6 */
  674. { "<no. 55>", 0x80 }, /* Bit 7 */
  675. { NULL }
  676. },
  677. { /* Byte 7 */
  678. { "<LSTO>", LMP_LSTO }, /* Bit 1 */
  679. { "<inquiry TX power>", LMP_INQ_TX_PWR }, /* Bit 1 */
  680. { "<EPC>", LMP_EPC }, /* Bit 2 */
  681. { "<no. 59>", 0x08 }, /* Bit 3 */
  682. { "<no. 60>", 0x10 }, /* Bit 4 */
  683. { "<no. 61>", 0x20 }, /* Bit 5 */
  684. { "<no. 62>", 0x40 }, /* Bit 6 */
  685. { "<extended features>",LMP_EXT_FEAT }, /* Bit 7 */
  686. { NULL }
  687. },
  688. };
  689. char *lmp_featurestostr(uint8_t *features, char *pref, int width)
  690. {
  691. unsigned int maxwidth = width - 1;
  692. char *off, *ptr, *str;
  693. int i, size = 10;
  694. for (i = 0; i < 8; i++) {
  695. hci_map *m = lmp_features_map[i];
  696. while (m->str) {
  697. if (m->val & features[i])
  698. size += strlen(m->str) +
  699. (pref ? strlen(pref) : 0) + 1;
  700. m++;
  701. }
  702. }
  703. str = bt_malloc(size);
  704. if (!str)
  705. return NULL;
  706. ptr = str; *ptr = '\0';
  707. if (pref)
  708. ptr += sprintf(ptr, "%s", pref);
  709. off = ptr;
  710. for (i = 0; i < 8; i++) {
  711. hci_map *m = lmp_features_map[i];
  712. while (m->str) {
  713. if (m->val & features[i]) {
  714. if (strlen(off) + strlen(m->str) > maxwidth) {
  715. ptr += sprintf(ptr, "\n%s",
  716. pref ? pref : "");
  717. off = ptr;
  718. }
  719. ptr += sprintf(ptr, "%s ", m->str);
  720. }
  721. m++;
  722. }
  723. }
  724. return str;
  725. }
  726. /* HCI functions that do not require open device */
  727. int hci_for_each_dev(int flag, int (*func)(int dd, int dev_id, long arg),
  728. long arg)
  729. {
  730. struct hci_dev_list_req *dl;
  731. struct hci_dev_req *dr;
  732. int dev_id = -1;
  733. int i, sk, err = 0;
  734. sk = socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI);
  735. if (sk < 0)
  736. return -1;
  737. dl = malloc(HCI_MAX_DEV * sizeof(*dr) + sizeof(*dl));
  738. if (!dl) {
  739. err = errno;
  740. goto done;
  741. }
  742. memset(dl, 0, HCI_MAX_DEV * sizeof(*dr) + sizeof(*dl));
  743. dl->dev_num = HCI_MAX_DEV;
  744. dr = dl->dev_req;
  745. if (ioctl(sk, HCIGETDEVLIST, (void *) dl) < 0) {
  746. err = errno;
  747. goto free;
  748. }
  749. for (i = 0; i < dl->dev_num; i++, dr++) {
  750. if (hci_test_bit(flag, &dr->dev_opt))
  751. if (!func || func(sk, dr->dev_id, arg)) {
  752. dev_id = dr->dev_id;
  753. break;
  754. }
  755. }
  756. if (dev_id < 0)
  757. err = ENODEV;
  758. free:
  759. free(dl);
  760. done:
  761. close(sk);
  762. errno = err;
  763. return dev_id;
  764. }
  765. static int __other_bdaddr(int dd, int dev_id, long arg)
  766. {
  767. struct hci_dev_info di = { .dev_id = dev_id };
  768. if (ioctl(dd, HCIGETDEVINFO, (void *) &di))
  769. return 0;
  770. if (hci_test_bit(HCI_RAW, &di.flags))
  771. return 0;
  772. return bacmp((bdaddr_t *) arg, &di.bdaddr);
  773. }
  774. static int __same_bdaddr(int dd, int dev_id, long arg)
  775. {
  776. struct hci_dev_info di = { .dev_id = dev_id };
  777. if (ioctl(dd, HCIGETDEVINFO, (void *) &di))
  778. return 0;
  779. return !bacmp((bdaddr_t *) arg, &di.bdaddr);
  780. }
  781. int hci_get_route(bdaddr_t *bdaddr)
  782. {
  783. int dev_id;
  784. dev_id = hci_for_each_dev(HCI_UP, __other_bdaddr,
  785. (long) (bdaddr ? bdaddr : BDADDR_ANY));
  786. if (dev_id < 0)
  787. dev_id = hci_for_each_dev(HCI_UP, __same_bdaddr,
  788. (long) (bdaddr ? bdaddr : BDADDR_ANY));
  789. return dev_id;
  790. }
  791. int hci_devid(const char *str)
  792. {
  793. bdaddr_t ba;
  794. int id = -1;
  795. if (!strncmp(str, "hci", 3) && strlen(str) >= 4) {
  796. id = atoi(str + 3);
  797. if (hci_devba(id, &ba) < 0)
  798. return -1;
  799. } else {
  800. errno = ENODEV;
  801. str2ba(str, &ba);
  802. id = hci_for_each_dev(HCI_UP, __same_bdaddr, (long) &ba);
  803. }
  804. return id;
  805. }
  806. int hci_devinfo(int dev_id, struct hci_dev_info *di)
  807. {
  808. int dd, err, ret;
  809. dd = socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI);
  810. if (dd < 0)
  811. return dd;
  812. memset(di, 0, sizeof(struct hci_dev_info));
  813. di->dev_id = dev_id;
  814. ret = ioctl(dd, HCIGETDEVINFO, (void *) di);
  815. err = errno;
  816. close(dd);
  817. errno = err;
  818. return ret;
  819. }
  820. int hci_devba(int dev_id, bdaddr_t *bdaddr)
  821. {
  822. struct hci_dev_info di;
  823. memset(&di, 0, sizeof(di));
  824. if (hci_devinfo(dev_id, &di))
  825. return -1;
  826. if (!hci_test_bit(HCI_UP, &di.flags)) {
  827. errno = ENETDOWN;
  828. return -1;
  829. }
  830. bacpy(bdaddr, &di.bdaddr);
  831. return 0;
  832. }
  833. int hci_inquiry(int dev_id, int len, int nrsp, const uint8_t *lap,
  834. inquiry_info **ii, long flags)
  835. {
  836. struct hci_inquiry_req *ir;
  837. uint8_t num_rsp = nrsp;
  838. void *buf;
  839. int dd, size, err, ret = -1;
  840. if (nrsp <= 0) {
  841. num_rsp = 0;
  842. nrsp = 255;
  843. }
  844. if (dev_id < 0) {
  845. dev_id = hci_get_route(NULL);
  846. if (dev_id < 0) {
  847. errno = ENODEV;
  848. return -1;
  849. }
  850. }
  851. dd = socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI);
  852. if (dd < 0)
  853. return dd;
  854. buf = malloc(sizeof(*ir) + (sizeof(inquiry_info) * (nrsp)));
  855. if (!buf)
  856. goto done;
  857. ir = buf;
  858. ir->dev_id = dev_id;
  859. ir->num_rsp = num_rsp;
  860. ir->length = len;
  861. ir->flags = flags;
  862. if (lap) {
  863. memcpy(ir->lap, lap, 3);
  864. } else {
  865. ir->lap[0] = 0x33;
  866. ir->lap[1] = 0x8b;
  867. ir->lap[2] = 0x9e;
  868. }
  869. ret = ioctl(dd, HCIINQUIRY, (unsigned long) buf);
  870. if (ret < 0)
  871. goto free;
  872. size = sizeof(inquiry_info) * ir->num_rsp;
  873. if (!*ii)
  874. *ii = malloc(size);
  875. if (*ii) {
  876. memcpy((void *) *ii, buf + sizeof(*ir), size);
  877. ret = ir->num_rsp;
  878. } else
  879. ret = -1;
  880. free:
  881. free(buf);
  882. done:
  883. err = errno;
  884. close(dd);
  885. errno = err;
  886. return ret;
  887. }
  888. /* Open HCI device.
  889. * Returns device descriptor (dd). */
  890. int hci_open_dev(int dev_id)
  891. {
  892. struct sockaddr_hci a;
  893. int dd, err;
  894. /* Check for valid device id */
  895. if (dev_id < 0) {
  896. errno = ENODEV;
  897. return -1;
  898. }
  899. /* Create HCI socket */
  900. dd = socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI);
  901. if (dd < 0)
  902. return dd;
  903. /* Bind socket to the HCI device */
  904. memset(&a, 0, sizeof(a));
  905. a.hci_family = AF_BLUETOOTH;
  906. a.hci_dev = dev_id;
  907. if (bind(dd, (struct sockaddr *) &a, sizeof(a)) < 0)
  908. goto failed;
  909. return dd;
  910. failed:
  911. err = errno;
  912. close(dd);
  913. errno = err;
  914. return -1;
  915. }
  916. int hci_close_dev(int dd)
  917. {
  918. return close(dd);
  919. }
  920. /* HCI functions that require open device
  921. * dd - Device descriptor returned by hci_open_dev. */
  922. int hci_send_cmd(int dd, uint16_t ogf, uint16_t ocf, uint8_t plen, void *param)
  923. {
  924. uint8_t type = HCI_COMMAND_PKT;
  925. hci_command_hdr hc;
  926. struct iovec iv[3];
  927. int ivn;
  928. hc.opcode = htobs(cmd_opcode_pack(ogf, ocf));
  929. hc.plen= plen;
  930. iv[0].iov_base = &type;
  931. iv[0].iov_len = 1;
  932. iv[1].iov_base = &hc;
  933. iv[1].iov_len = HCI_COMMAND_HDR_SIZE;
  934. ivn = 2;
  935. if (plen) {
  936. iv[2].iov_base = param;
  937. iv[2].iov_len = plen;
  938. ivn = 3;
  939. }
  940. while (writev(dd, iv, ivn) < 0) {
  941. if (errno == EAGAIN || errno == EINTR)
  942. continue;
  943. return -1;
  944. }
  945. return 0;
  946. }
  947. int hci_send_req(int dd, struct hci_request *r, int to)
  948. {
  949. unsigned char buf[HCI_MAX_EVENT_SIZE], *ptr;
  950. uint16_t opcode = htobs(cmd_opcode_pack(r->ogf, r->ocf));
  951. struct hci_filter nf, of;
  952. socklen_t olen;
  953. hci_event_hdr *hdr;
  954. int err, try;
  955. olen = sizeof(of);
  956. if (getsockopt(dd, SOL_HCI, HCI_FILTER, &of, &olen) < 0)
  957. return -1;
  958. hci_filter_clear(&nf);
  959. hci_filter_set_ptype(HCI_EVENT_PKT, &nf);
  960. hci_filter_set_event(EVT_CMD_STATUS, &nf);
  961. hci_filter_set_event(EVT_CMD_COMPLETE, &nf);
  962. hci_filter_set_event(EVT_LE_META_EVENT, &nf);
  963. hci_filter_set_event(r->event, &nf);
  964. hci_filter_set_opcode(opcode, &nf);
  965. if (setsockopt(dd, SOL_HCI, HCI_FILTER, &nf, sizeof(nf)) < 0)
  966. return -1;
  967. if (hci_send_cmd(dd, r->ogf, r->ocf, r->clen, r->cparam) < 0)
  968. goto failed;
  969. try = 10;
  970. while (try--) {
  971. evt_cmd_complete *cc;
  972. evt_cmd_status *cs;
  973. evt_remote_name_req_complete *rn;
  974. evt_le_meta_event *me;
  975. remote_name_req_cp *cp;
  976. int len;
  977. if (to) {
  978. struct pollfd p;
  979. int n;
  980. p.fd = dd; p.events = POLLIN;
  981. while ((n = poll(&p, 1, to)) < 0) {
  982. if (errno == EAGAIN || errno == EINTR)
  983. continue;
  984. goto failed;
  985. }
  986. if (!n) {
  987. errno = ETIMEDOUT;
  988. goto failed;
  989. }
  990. to -= 10;
  991. if (to < 0)
  992. to = 0;
  993. }
  994. while ((len = read(dd, buf, sizeof(buf))) < 0) {
  995. if (errno == EAGAIN || errno == EINTR)
  996. continue;
  997. goto failed;
  998. }
  999. hdr = (void *) (buf + 1);
  1000. ptr = buf + (1 + HCI_EVENT_HDR_SIZE);
  1001. len -= (1 + HCI_EVENT_HDR_SIZE);
  1002. switch (hdr->evt) {
  1003. case EVT_CMD_STATUS:
  1004. cs = (void *) ptr;
  1005. if (cs->opcode != opcode)
  1006. continue;
  1007. if (r->event != EVT_CMD_STATUS) {
  1008. if (cs->status) {
  1009. errno = EIO;
  1010. goto failed;
  1011. }
  1012. break;
  1013. }
  1014. r->rlen = MIN(len, r->rlen);
  1015. memcpy(r->rparam, ptr, r->rlen);
  1016. goto done;
  1017. case EVT_CMD_COMPLETE:
  1018. cc = (void *) ptr;
  1019. if (cc->opcode != opcode)
  1020. continue;
  1021. ptr += EVT_CMD_COMPLETE_SIZE;
  1022. len -= EVT_CMD_COMPLETE_SIZE;
  1023. r->rlen = MIN(len, r->rlen);
  1024. memcpy(r->rparam, ptr, r->rlen);
  1025. goto done;
  1026. case EVT_REMOTE_NAME_REQ_COMPLETE:
  1027. if (hdr->evt != r->event)
  1028. break;
  1029. rn = (void *) ptr;
  1030. cp = r->cparam;
  1031. if (bacmp(&rn->bdaddr, &cp->bdaddr))
  1032. continue;
  1033. r->rlen = MIN(len, r->rlen);
  1034. memcpy(r->rparam, ptr, r->rlen);
  1035. goto done;
  1036. case EVT_LE_META_EVENT:
  1037. me = (void *) ptr;
  1038. if (me->subevent != r->event)
  1039. continue;
  1040. len -= 1;
  1041. r->rlen = MIN(len, r->rlen);
  1042. memcpy(r->rparam, me->data, r->rlen);
  1043. goto done;
  1044. default:
  1045. if (hdr->evt != r->event)
  1046. break;
  1047. r->rlen = MIN(len, r->rlen);
  1048. memcpy(r->rparam, ptr, r->rlen);
  1049. goto done;
  1050. }
  1051. }
  1052. errno = ETIMEDOUT;
  1053. failed:
  1054. err = errno;
  1055. if (setsockopt(dd, SOL_HCI, HCI_FILTER, &of, sizeof(of)) < 0)
  1056. err = errno;
  1057. errno = err;
  1058. return -1;
  1059. done:
  1060. if (setsockopt(dd, SOL_HCI, HCI_FILTER, &of, sizeof(of)) < 0)
  1061. return -1;
  1062. return 0;
  1063. }
  1064. int hci_create_connection(int dd, const bdaddr_t *bdaddr, uint16_t ptype,
  1065. uint16_t clkoffset, uint8_t rswitch,
  1066. uint16_t *handle, int to)
  1067. {
  1068. evt_conn_complete rp;
  1069. create_conn_cp cp;
  1070. struct hci_request rq;
  1071. memset(&cp, 0, sizeof(cp));
  1072. bacpy(&cp.bdaddr, bdaddr);
  1073. cp.pkt_type = ptype;
  1074. cp.pscan_rep_mode = 0x02;
  1075. cp.clock_offset = clkoffset;
  1076. cp.role_switch = rswitch;
  1077. memset(&rq, 0, sizeof(rq));
  1078. rq.ogf = OGF_LINK_CTL;
  1079. rq.ocf = OCF_CREATE_CONN;
  1080. rq.event = EVT_CONN_COMPLETE;
  1081. rq.cparam = &cp;
  1082. rq.clen = CREATE_CONN_CP_SIZE;
  1083. rq.rparam = &rp;
  1084. rq.rlen = EVT_CONN_COMPLETE_SIZE;
  1085. if (hci_send_req(dd, &rq, to) < 0)
  1086. return -1;
  1087. if (rp.status) {
  1088. errno = EIO;
  1089. return -1;
  1090. }
  1091. *handle = rp.handle;
  1092. return 0;
  1093. }
  1094. int hci_disconnect(int dd, uint16_t handle, uint8_t reason, int to)
  1095. {
  1096. evt_disconn_complete rp;
  1097. disconnect_cp cp;
  1098. struct hci_request rq;
  1099. memset(&cp, 0, sizeof(cp));
  1100. cp.handle = handle;
  1101. cp.reason = reason;
  1102. memset(&rq, 0, sizeof(rq));
  1103. rq.ogf = OGF_LINK_CTL;
  1104. rq.ocf = OCF_DISCONNECT;
  1105. rq.event = EVT_DISCONN_COMPLETE;
  1106. rq.cparam = &cp;
  1107. rq.clen = DISCONNECT_CP_SIZE;
  1108. rq.rparam = &rp;
  1109. rq.rlen = EVT_DISCONN_COMPLETE_SIZE;
  1110. if (hci_send_req(dd, &rq, to) < 0)
  1111. return -1;
  1112. if (rp.status) {
  1113. errno = EIO;
  1114. return -1;
  1115. }
  1116. return 0;
  1117. }
  1118. int hci_le_add_white_list(int dd, const bdaddr_t *bdaddr, uint8_t type, int to)
  1119. {
  1120. struct hci_request rq;
  1121. le_add_device_to_white_list_cp cp;
  1122. uint8_t status;
  1123. memset(&cp, 0, sizeof(cp));
  1124. cp.bdaddr_type = type;
  1125. bacpy(&cp.bdaddr, bdaddr);
  1126. memset(&rq, 0, sizeof(rq));
  1127. rq.ogf = OGF_LE_CTL;
  1128. rq.ocf = OCF_LE_ADD_DEVICE_TO_WHITE_LIST;
  1129. rq.cparam = &cp;
  1130. rq.clen = LE_ADD_DEVICE_TO_WHITE_LIST_CP_SIZE;
  1131. rq.rparam = &status;
  1132. rq.rlen = 1;
  1133. if (hci_send_req(dd, &rq, to) < 0)
  1134. return -1;
  1135. if (status) {
  1136. errno = EIO;
  1137. return -1;
  1138. }
  1139. return 0;
  1140. }
  1141. int hci_le_rm_white_list(int dd, const bdaddr_t *bdaddr, uint8_t type, int to)
  1142. {
  1143. struct hci_request rq;
  1144. le_remove_device_from_white_list_cp cp;
  1145. uint8_t status;
  1146. memset(&cp, 0, sizeof(cp));
  1147. cp.bdaddr_type = type;
  1148. bacpy(&cp.bdaddr, bdaddr);
  1149. memset(&rq, 0, sizeof(rq));
  1150. rq.ogf = OGF_LE_CTL;
  1151. rq.ocf = OCF_LE_REMOVE_DEVICE_FROM_WHITE_LIST;
  1152. rq.cparam = &cp;
  1153. rq.clen = LE_REMOVE_DEVICE_FROM_WHITE_LIST_CP_SIZE;
  1154. rq.rparam = &status;
  1155. rq.rlen = 1;
  1156. if (hci_send_req(dd, &rq, to) < 0)
  1157. return -1;
  1158. if (status) {
  1159. errno = EIO;
  1160. return -1;
  1161. }
  1162. return 0;
  1163. }
  1164. int hci_le_read_white_list_size(int dd, uint8_t *size, int to)
  1165. {
  1166. struct hci_request rq;
  1167. le_read_white_list_size_rp rp;
  1168. memset(&rp, 0, sizeof(rp));
  1169. memset(&rq, 0, sizeof(rq));
  1170. rq.ogf = OGF_LE_CTL;
  1171. rq.ocf = OCF_LE_READ_WHITE_LIST_SIZE;
  1172. rq.rparam = &rp;
  1173. rq.rlen = LE_READ_WHITE_LIST_SIZE_RP_SIZE;
  1174. if (hci_send_req(dd, &rq, to) < 0)
  1175. return -1;
  1176. if (rp.status) {
  1177. errno = EIO;
  1178. return -1;
  1179. }
  1180. if (size)
  1181. *size = rp.size;
  1182. return 0;
  1183. }
  1184. int hci_le_clear_white_list(int dd, int to)
  1185. {
  1186. struct hci_request rq;
  1187. uint8_t status;
  1188. memset(&rq, 0, sizeof(rq));
  1189. rq.ogf = OGF_LE_CTL;
  1190. rq.ocf = OCF_LE_CLEAR_WHITE_LIST;
  1191. rq.rparam = &status;
  1192. rq.rlen = 1;
  1193. if (hci_send_req(dd, &rq, to) < 0)
  1194. return -1;
  1195. if (status) {
  1196. errno = EIO;
  1197. return -1;
  1198. }
  1199. return 0;
  1200. }
  1201. int hci_le_add_resolving_list(int dd, const bdaddr_t *bdaddr, uint8_t type,
  1202. uint8_t *peer_irk, uint8_t *local_irk, int to)
  1203. {
  1204. struct hci_request rq;
  1205. le_add_device_to_resolv_list_cp cp;
  1206. uint8_t status;
  1207. memset(&cp, 0, sizeof(cp));
  1208. cp.bdaddr_type = type;
  1209. bacpy(&cp.bdaddr, bdaddr);
  1210. if (peer_irk)
  1211. memcpy(cp.peer_irk, peer_irk, 16);
  1212. if (local_irk)
  1213. memcpy(cp.local_irk, local_irk, 16);
  1214. memset(&rq, 0, sizeof(rq));
  1215. rq.ogf = OGF_LE_CTL;
  1216. rq.ocf = OCF_LE_ADD_DEVICE_TO_RESOLV_LIST;
  1217. rq.cparam = &cp;
  1218. rq.clen = LE_ADD_DEVICE_TO_RESOLV_LIST_CP_SIZE;
  1219. rq.rparam = &status;
  1220. rq.rlen = 1;
  1221. if (hci_send_req(dd, &rq, to) < 0)
  1222. return -1;
  1223. if (status) {
  1224. errno = EIO;
  1225. return -1;
  1226. }
  1227. return 0;
  1228. }
  1229. int hci_le_rm_resolving_list(int dd, const bdaddr_t *bdaddr, uint8_t type, int to)
  1230. {
  1231. struct hci_request rq;
  1232. le_remove_device_from_resolv_list_cp cp;
  1233. uint8_t status;
  1234. memset(&cp, 0, sizeof(cp));
  1235. cp.bdaddr_type = type;
  1236. bacpy(&cp.bdaddr, bdaddr);
  1237. memset(&rq, 0, sizeof(rq));
  1238. rq.ogf = OGF_LE_CTL;
  1239. rq.ocf = OCF_LE_REMOVE_DEVICE_FROM_RESOLV_LIST;
  1240. rq.cparam = &cp;
  1241. rq.clen = LE_REMOVE_DEVICE_FROM_RESOLV_LIST_CP_SIZE;
  1242. rq.rparam = &status;
  1243. rq.rlen = 1;
  1244. if (hci_send_req(dd, &rq, to) < 0)
  1245. return -1;
  1246. if (status) {
  1247. errno = EIO;
  1248. return -1;
  1249. }
  1250. return 0;
  1251. }
  1252. int hci_le_clear_resolving_list(int dd, int to)
  1253. {
  1254. struct hci_request rq;
  1255. uint8_t status;
  1256. memset(&rq, 0, sizeof(rq));
  1257. rq.ogf = OGF_LE_CTL;
  1258. rq.ocf = OCF_LE_CLEAR_RESOLV_LIST;
  1259. rq.rparam = &status;
  1260. rq.rlen = 1;
  1261. if (hci_send_req(dd, &rq, to) < 0)
  1262. return -1;
  1263. if (status) {
  1264. errno = EIO;
  1265. return -1;
  1266. }
  1267. return 0;
  1268. }
  1269. int hci_le_read_resolving_list_size(int dd, uint8_t *size, int to)
  1270. {
  1271. struct hci_request rq;
  1272. le_read_resolv_list_size_rp rp;
  1273. memset(&rp, 0, sizeof(rp));
  1274. memset(&rq, 0, sizeof(rq));
  1275. rq.ogf = OGF_LE_CTL;
  1276. rq.ocf = OCF_LE_READ_RESOLV_LIST_SIZE;
  1277. rq.rparam = &rp;
  1278. rq.rlen = LE_READ_RESOLV_LIST_SIZE_RP_SIZE;
  1279. if (hci_send_req(dd, &rq, to) < 0)
  1280. return -1;
  1281. if (rp.status) {
  1282. errno = EIO;
  1283. return -1;
  1284. }
  1285. if (size)
  1286. *size = rp.size;
  1287. return 0;
  1288. }
  1289. int hci_le_set_address_resolution_enable(int dd, uint8_t enable, int to)
  1290. {
  1291. struct hci_request rq;
  1292. le_set_address_resolution_enable_cp cp;
  1293. uint8_t status;
  1294. memset(&cp, 0, sizeof(cp));
  1295. cp.enable = enable;
  1296. memset(&rq, 0, sizeof(rq));
  1297. rq.ogf = OGF_LE_CTL;
  1298. rq.ocf = OCF_LE_SET_ADDRESS_RESOLUTION_ENABLE;
  1299. rq.cparam = &cp;
  1300. rq.clen = LE_SET_ADDRESS_RESOLUTION_ENABLE_CP_SIZE;
  1301. rq.rparam = &status;
  1302. rq.rlen = 1;
  1303. if (hci_send_req(dd, &rq, to) < 0)
  1304. return -1;
  1305. if (status) {
  1306. errno = EIO;
  1307. return -1;
  1308. }
  1309. return 0;
  1310. }
  1311. int hci_read_local_name(int dd, int len, char *name, int to)
  1312. {
  1313. read_local_name_rp rp;
  1314. struct hci_request rq;
  1315. memset(&rq, 0, sizeof(rq));
  1316. rq.ogf = OGF_HOST_CTL;
  1317. rq.ocf = OCF_READ_LOCAL_NAME;
  1318. rq.rparam = &rp;
  1319. rq.rlen = READ_LOCAL_NAME_RP_SIZE;
  1320. if (hci_send_req(dd, &rq, to) < 0)
  1321. return -1;
  1322. if (rp.status) {
  1323. errno = EIO;
  1324. return -1;
  1325. }
  1326. rp.name[247] = '\0';
  1327. strncpy(name, (char *) rp.name, len);
  1328. return 0;
  1329. }
  1330. int hci_write_local_name(int dd, const char *name, int to)
  1331. {
  1332. change_local_name_cp cp;
  1333. struct hci_request rq;
  1334. memset(&cp, 0, sizeof(cp));
  1335. strncpy((char *) cp.name, name, sizeof(cp.name) - 1);
  1336. memset(&rq, 0, sizeof(rq));
  1337. rq.ogf = OGF_HOST_CTL;
  1338. rq.ocf = OCF_CHANGE_LOCAL_NAME;
  1339. rq.cparam = &cp;
  1340. rq.clen = CHANGE_LOCAL_NAME_CP_SIZE;
  1341. if (hci_send_req(dd, &rq, to) < 0)
  1342. return -1;
  1343. return 0;
  1344. }
  1345. int hci_read_remote_name_with_clock_offset(int dd, const bdaddr_t *bdaddr,
  1346. uint8_t pscan_rep_mode,
  1347. uint16_t clkoffset,
  1348. int len, char *name, int to)
  1349. {
  1350. evt_remote_name_req_complete rn;
  1351. remote_name_req_cp cp;
  1352. struct hci_request rq;
  1353. memset(&cp, 0, sizeof(cp));
  1354. bacpy(&cp.bdaddr, bdaddr);
  1355. cp.pscan_rep_mode = pscan_rep_mode;
  1356. cp.clock_offset = clkoffset;
  1357. memset(&rq, 0, sizeof(rq));
  1358. rq.ogf = OGF_LINK_CTL;
  1359. rq.ocf = OCF_REMOTE_NAME_REQ;
  1360. rq.cparam = &cp;
  1361. rq.clen = REMOTE_NAME_REQ_CP_SIZE;
  1362. rq.event = EVT_REMOTE_NAME_REQ_COMPLETE;
  1363. rq.rparam = &rn;
  1364. rq.rlen = EVT_REMOTE_NAME_REQ_COMPLETE_SIZE;
  1365. if (hci_send_req(dd, &rq, to) < 0)
  1366. return -1;
  1367. if (rn.status) {
  1368. errno = EIO;
  1369. return -1;
  1370. }
  1371. rn.name[247] = '\0';
  1372. strncpy(name, (char *) rn.name, len);
  1373. return 0;
  1374. }
  1375. int hci_read_remote_name(int dd, const bdaddr_t *bdaddr, int len, char *name,
  1376. int to)
  1377. {
  1378. return hci_read_remote_name_with_clock_offset(dd, bdaddr, 0x02, 0x0000,
  1379. len, name, to);
  1380. }
  1381. int hci_read_remote_name_cancel(int dd, const bdaddr_t *bdaddr, int to)
  1382. {
  1383. remote_name_req_cancel_cp cp;
  1384. struct hci_request rq;
  1385. memset(&cp, 0, sizeof(cp));
  1386. bacpy(&cp.bdaddr, bdaddr);
  1387. memset(&rq, 0, sizeof(rq));
  1388. rq.ogf = OGF_LINK_CTL;
  1389. rq.ocf = OCF_REMOTE_NAME_REQ_CANCEL;
  1390. rq.cparam = &cp;
  1391. rq.clen = REMOTE_NAME_REQ_CANCEL_CP_SIZE;
  1392. if (hci_send_req(dd, &rq, to) < 0)
  1393. return -1;
  1394. return 0;
  1395. }
  1396. int hci_read_remote_version(int dd, uint16_t handle, struct hci_version *ver,
  1397. int to)
  1398. {
  1399. evt_read_remote_version_complete rp;
  1400. read_remote_version_cp cp;
  1401. struct hci_request rq;
  1402. memset(&cp, 0, sizeof(cp));
  1403. cp.handle = handle;
  1404. memset(&rq, 0, sizeof(rq));
  1405. rq.ogf = OGF_LINK_CTL;
  1406. rq.ocf = OCF_READ_REMOTE_VERSION;
  1407. rq.event = EVT_READ_REMOTE_VERSION_COMPLETE;
  1408. rq.cparam = &cp;
  1409. rq.clen = READ_REMOTE_VERSION_CP_SIZE;
  1410. rq.rparam = &rp;
  1411. rq.rlen = EVT_READ_REMOTE_VERSION_COMPLETE_SIZE;
  1412. if (hci_send_req(dd, &rq, to) < 0)
  1413. return -1;
  1414. if (rp.status) {
  1415. errno = EIO;
  1416. return -1;
  1417. }
  1418. ver->manufacturer = btohs(rp.manufacturer);
  1419. ver->lmp_ver = rp.lmp_ver;
  1420. ver->lmp_subver = btohs(rp.lmp_subver);
  1421. return 0;
  1422. }
  1423. int hci_read_remote_features(int dd, uint16_t handle, uint8_t *features, int to)
  1424. {
  1425. evt_read_remote_features_complete rp;
  1426. read_remote_features_cp cp;
  1427. struct hci_request rq;
  1428. memset(&cp, 0, sizeof(cp));
  1429. cp.handle = handle;
  1430. memset(&rq, 0, sizeof(rq));
  1431. rq.ogf = OGF_LINK_CTL;
  1432. rq.ocf = OCF_READ_REMOTE_FEATURES;
  1433. rq.event = EVT_READ_REMOTE_FEATURES_COMPLETE;
  1434. rq.cparam = &cp;
  1435. rq.clen = READ_REMOTE_FEATURES_CP_SIZE;
  1436. rq.rparam = &rp;
  1437. rq.rlen = EVT_READ_REMOTE_FEATURES_COMPLETE_SIZE;
  1438. if (hci_send_req(dd, &rq, to) < 0)
  1439. return -1;
  1440. if (rp.status) {
  1441. errno = EIO;
  1442. return -1;
  1443. }
  1444. if (features)
  1445. memcpy(features, rp.features, 8);
  1446. return 0;
  1447. }
  1448. int hci_read_remote_ext_features(int dd, uint16_t handle, uint8_t page,
  1449. uint8_t *max_page, uint8_t *features,
  1450. int to)
  1451. {
  1452. evt_read_remote_ext_features_complete rp;
  1453. read_remote_ext_features_cp cp;
  1454. struct hci_request rq;
  1455. memset(&cp, 0, sizeof(cp));
  1456. cp.handle = handle;
  1457. cp.page_num = page;
  1458. memset(&rq, 0, sizeof(rq));
  1459. rq.ogf = OGF_LINK_CTL;
  1460. rq.ocf = OCF_READ_REMOTE_EXT_FEATURES;
  1461. rq.event = EVT_READ_REMOTE_EXT_FEATURES_COMPLETE;
  1462. rq.cparam = &cp;
  1463. rq.clen = READ_REMOTE_EXT_FEATURES_CP_SIZE;
  1464. rq.rparam = &rp;
  1465. rq.rlen = EVT_READ_REMOTE_EXT_FEATURES_COMPLETE_SIZE;
  1466. if (hci_send_req(dd, &rq, to) < 0)
  1467. return -1;
  1468. if (rp.status) {
  1469. errno = EIO;
  1470. return -1;
  1471. }
  1472. if (max_page)
  1473. *max_page = rp.max_page_num;
  1474. if (features)
  1475. memcpy(features, rp.features, 8);
  1476. return 0;
  1477. }
  1478. int hci_read_clock_offset(int dd, uint16_t handle, uint16_t *clkoffset, int to)
  1479. {
  1480. evt_read_clock_offset_complete rp;
  1481. read_clock_offset_cp cp;
  1482. struct hci_request rq;
  1483. memset(&cp, 0, sizeof(cp));
  1484. cp.handle = handle;
  1485. memset(&rq, 0, sizeof(rq));
  1486. rq.ogf = OGF_LINK_CTL;
  1487. rq.ocf = OCF_READ_CLOCK_OFFSET;
  1488. rq.event = EVT_READ_CLOCK_OFFSET_COMPLETE;
  1489. rq.cparam = &cp;
  1490. rq.clen = READ_CLOCK_OFFSET_CP_SIZE;
  1491. rq.rparam = &rp;
  1492. rq.rlen = EVT_READ_CLOCK_OFFSET_COMPLETE_SIZE;
  1493. if (hci_send_req(dd, &rq, to) < 0)
  1494. return -1;
  1495. if (rp.status) {
  1496. errno = EIO;
  1497. return -1;
  1498. }
  1499. *clkoffset = rp.clock_offset;
  1500. return 0;
  1501. }
  1502. int hci_read_local_version(int dd, struct hci_version *ver, int to)
  1503. {
  1504. read_local_version_rp rp;
  1505. struct hci_request rq;
  1506. memset(&rq, 0, sizeof(rq));
  1507. rq.ogf = OGF_INFO_PARAM;
  1508. rq.ocf = OCF_READ_LOCAL_VERSION;
  1509. rq.rparam = &rp;
  1510. rq.rlen = READ_LOCAL_VERSION_RP_SIZE;
  1511. if (hci_send_req(dd, &rq, to) < 0)
  1512. return -1;
  1513. if (rp.status) {
  1514. errno = EIO;
  1515. return -1;
  1516. }
  1517. ver->manufacturer = btohs(rp.manufacturer);
  1518. ver->hci_ver = rp.hci_ver;
  1519. ver->hci_rev = btohs(rp.hci_rev);
  1520. ver->lmp_ver = rp.lmp_ver;
  1521. ver->lmp_subver = btohs(rp.lmp_subver);
  1522. return 0;
  1523. }
  1524. int hci_read_local_commands(int dd, uint8_t *commands, int to)
  1525. {
  1526. read_local_commands_rp rp;
  1527. struct hci_request rq;
  1528. memset(&rq, 0, sizeof(rq));
  1529. rq.ogf = OGF_INFO_PARAM;
  1530. rq.ocf = OCF_READ_LOCAL_COMMANDS;
  1531. rq.rparam = &rp;
  1532. rq.rlen = READ_LOCAL_COMMANDS_RP_SIZE;
  1533. if (hci_send_req(dd, &rq, to) < 0)
  1534. return -1;
  1535. if (rp.status) {
  1536. errno = EIO;
  1537. return -1;
  1538. }
  1539. if (commands)
  1540. memcpy(commands, rp.commands, 64);
  1541. return 0;
  1542. }
  1543. int hci_read_local_features(int dd, uint8_t *features, int to)
  1544. {
  1545. read_local_features_rp rp;
  1546. struct hci_request rq;
  1547. memset(&rq, 0, sizeof(rq));
  1548. rq.ogf = OGF_INFO_PARAM;
  1549. rq.ocf = OCF_READ_LOCAL_FEATURES;
  1550. rq.rparam = &rp;
  1551. rq.rlen = READ_LOCAL_FEATURES_RP_SIZE;
  1552. if (hci_send_req(dd, &rq, to) < 0)
  1553. return -1;
  1554. if (rp.status) {
  1555. errno = EIO;
  1556. return -1;
  1557. }
  1558. if (features)
  1559. memcpy(features, rp.features, 8);
  1560. return 0;
  1561. }
  1562. int hci_read_local_ext_features(int dd, uint8_t page, uint8_t *max_page,
  1563. uint8_t *features, int to)
  1564. {
  1565. read_local_ext_features_cp cp;
  1566. read_local_ext_features_rp rp;
  1567. struct hci_request rq;
  1568. cp.page_num = page;
  1569. memset(&rq, 0, sizeof(rq));
  1570. rq.ogf = OGF_INFO_PARAM;
  1571. rq.ocf = OCF_READ_LOCAL_EXT_FEATURES;
  1572. rq.cparam = &cp;
  1573. rq.clen = READ_LOCAL_EXT_FEATURES_CP_SIZE;
  1574. rq.rparam = &rp;
  1575. rq.rlen = READ_LOCAL_EXT_FEATURES_RP_SIZE;
  1576. if (hci_send_req(dd, &rq, to) < 0)
  1577. return -1;
  1578. if (rp.status) {
  1579. errno = EIO;
  1580. return -1;
  1581. }
  1582. if (max_page)
  1583. *max_page = rp.max_page_num;
  1584. if (features)
  1585. memcpy(features, rp.features, 8);
  1586. return 0;
  1587. }
  1588. int hci_read_bd_addr(int dd, bdaddr_t *bdaddr, int to)
  1589. {
  1590. read_bd_addr_rp rp;
  1591. struct hci_request rq;
  1592. memset(&rq, 0, sizeof(rq));
  1593. rq.ogf = OGF_INFO_PARAM;
  1594. rq.ocf = OCF_READ_BD_ADDR;
  1595. rq.rparam = &rp;
  1596. rq.rlen = READ_BD_ADDR_RP_SIZE;
  1597. if (hci_send_req(dd, &rq, to) < 0)
  1598. return -1;
  1599. if (rp.status) {
  1600. errno = EIO;
  1601. return -1;
  1602. }
  1603. if (bdaddr)
  1604. bacpy(bdaddr, &rp.bdaddr);
  1605. return 0;
  1606. }
  1607. int hci_read_class_of_dev(int dd, uint8_t *cls, int to)
  1608. {
  1609. read_class_of_dev_rp rp;
  1610. struct hci_request rq;
  1611. memset(&rq, 0, sizeof(rq));
  1612. rq.ogf = OGF_HOST_CTL;
  1613. rq.ocf = OCF_READ_CLASS_OF_DEV;
  1614. rq.rparam = &rp;
  1615. rq.rlen = READ_CLASS_OF_DEV_RP_SIZE;
  1616. if (hci_send_req(dd, &rq, to) < 0)
  1617. return -1;
  1618. if (rp.status) {
  1619. errno = EIO;
  1620. return -1;
  1621. }
  1622. memcpy(cls, rp.dev_class, 3);
  1623. return 0;
  1624. }
  1625. int hci_write_class_of_dev(int dd, uint32_t cls, int to)
  1626. {
  1627. write_class_of_dev_cp cp;
  1628. struct hci_request rq;
  1629. memset(&rq, 0, sizeof(rq));
  1630. cp.dev_class[0] = cls & 0xff;
  1631. cp.dev_class[1] = (cls >> 8) & 0xff;
  1632. cp.dev_class[2] = (cls >> 16) & 0xff;
  1633. rq.ogf = OGF_HOST_CTL;
  1634. rq.ocf = OCF_WRITE_CLASS_OF_DEV;
  1635. rq.cparam = &cp;
  1636. rq.clen = WRITE_CLASS_OF_DEV_CP_SIZE;
  1637. return hci_send_req(dd, &rq, to);
  1638. }
  1639. int hci_read_voice_setting(int dd, uint16_t *vs, int to)
  1640. {
  1641. read_voice_setting_rp rp;
  1642. struct hci_request rq;
  1643. memset(&rq, 0, sizeof(rq));
  1644. rq.ogf = OGF_HOST_CTL;
  1645. rq.ocf = OCF_READ_VOICE_SETTING;
  1646. rq.rparam = &rp;
  1647. rq.rlen = READ_VOICE_SETTING_RP_SIZE;
  1648. if (hci_send_req(dd, &rq, to) < 0)
  1649. return -1;
  1650. if (rp.status) {
  1651. errno = EIO;
  1652. return -1;
  1653. }
  1654. *vs = rp.voice_setting;
  1655. return 0;
  1656. }
  1657. int hci_write_voice_setting(int dd, uint16_t vs, int to)
  1658. {
  1659. write_voice_setting_cp cp;
  1660. struct hci_request rq;
  1661. memset(&rq, 0, sizeof(rq));
  1662. cp.voice_setting = vs;
  1663. rq.ogf = OGF_HOST_CTL;
  1664. rq.ocf = OCF_WRITE_VOICE_SETTING;
  1665. rq.cparam = &cp;
  1666. rq.clen = WRITE_VOICE_SETTING_CP_SIZE;
  1667. return hci_send_req(dd, &rq, to);
  1668. }
  1669. int hci_read_current_iac_lap(int dd, uint8_t *num_iac, uint8_t *lap, int to)
  1670. {
  1671. read_current_iac_lap_rp rp;
  1672. struct hci_request rq;
  1673. memset(&rq, 0, sizeof(rq));
  1674. rq.ogf = OGF_HOST_CTL;
  1675. rq.ocf = OCF_READ_CURRENT_IAC_LAP;
  1676. rq.rparam = &rp;
  1677. rq.rlen = READ_CURRENT_IAC_LAP_RP_SIZE;
  1678. if (hci_send_req(dd, &rq, to) < 0)
  1679. return -1;
  1680. if (rp.status) {
  1681. errno = EIO;
  1682. return -1;
  1683. }
  1684. *num_iac = rp.num_current_iac;
  1685. memcpy(lap, rp.lap, rp.num_current_iac * 3);
  1686. return 0;
  1687. }
  1688. int hci_write_current_iac_lap(int dd, uint8_t num_iac, uint8_t *lap, int to)
  1689. {
  1690. write_current_iac_lap_cp cp;
  1691. struct hci_request rq;
  1692. memset(&cp, 0, sizeof(cp));
  1693. cp.num_current_iac = num_iac;
  1694. memcpy(&cp.lap, lap, num_iac * 3);
  1695. memset(&rq, 0, sizeof(rq));
  1696. rq.ogf = OGF_HOST_CTL;
  1697. rq.ocf = OCF_WRITE_CURRENT_IAC_LAP;
  1698. rq.cparam = &cp;
  1699. rq.clen = num_iac * 3 + 1;
  1700. return hci_send_req(dd, &rq, to);
  1701. }
  1702. int hci_read_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t all, int to)
  1703. {
  1704. read_stored_link_key_cp cp;
  1705. struct hci_request rq;
  1706. memset(&cp, 0, sizeof(cp));
  1707. bacpy(&cp.bdaddr, bdaddr);
  1708. cp.read_all = all;
  1709. memset(&rq, 0, sizeof(rq));
  1710. rq.ogf = OGF_HOST_CTL;
  1711. rq.ocf = OCF_READ_STORED_LINK_KEY;
  1712. rq.cparam = &cp;
  1713. rq.clen = READ_STORED_LINK_KEY_CP_SIZE;
  1714. return hci_send_req(dd, &rq, to);
  1715. }
  1716. int hci_write_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t *key, int to)
  1717. {
  1718. unsigned char cp[WRITE_STORED_LINK_KEY_CP_SIZE + 6 + 16];
  1719. struct hci_request rq;
  1720. memset(&cp, 0, sizeof(cp));
  1721. cp[0] = 1;
  1722. bacpy((bdaddr_t *) (cp + 1), bdaddr);
  1723. memcpy(cp + 7, key, 16);
  1724. memset(&rq, 0, sizeof(rq));
  1725. rq.ogf = OGF_HOST_CTL;
  1726. rq.ocf = OCF_WRITE_STORED_LINK_KEY;
  1727. rq.cparam = &cp;
  1728. rq.clen = WRITE_STORED_LINK_KEY_CP_SIZE + 6 + 16;
  1729. return hci_send_req(dd, &rq, to);
  1730. }
  1731. int hci_delete_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t all, int to)
  1732. {
  1733. delete_stored_link_key_cp cp;
  1734. struct hci_request rq;
  1735. memset(&cp, 0, sizeof(cp));
  1736. bacpy(&cp.bdaddr, bdaddr);
  1737. cp.delete_all = all;
  1738. memset(&rq, 0, sizeof(rq));
  1739. rq.ogf = OGF_HOST_CTL;
  1740. rq.ocf = OCF_DELETE_STORED_LINK_KEY;
  1741. rq.cparam = &cp;
  1742. rq.clen = DELETE_STORED_LINK_KEY_CP_SIZE;
  1743. return hci_send_req(dd, &rq, to);
  1744. }
  1745. int hci_authenticate_link(int dd, uint16_t handle, int to)
  1746. {
  1747. auth_requested_cp cp;
  1748. evt_auth_complete rp;
  1749. struct hci_request rq;
  1750. cp.handle = handle;
  1751. rq.ogf = OGF_LINK_CTL;
  1752. rq.ocf = OCF_AUTH_REQUESTED;
  1753. rq.event = EVT_AUTH_COMPLETE;
  1754. rq.cparam = &cp;
  1755. rq.clen = AUTH_REQUESTED_CP_SIZE;
  1756. rq.rparam = &rp;
  1757. rq.rlen = EVT_AUTH_COMPLETE_SIZE;
  1758. if (hci_send_req(dd, &rq, to) < 0)
  1759. return -1;
  1760. if (rp.status) {
  1761. errno = EIO;
  1762. return -1;
  1763. }
  1764. return 0;
  1765. }
  1766. int hci_encrypt_link(int dd, uint16_t handle, uint8_t encrypt, int to)
  1767. {
  1768. set_conn_encrypt_cp cp;
  1769. evt_encrypt_change rp;
  1770. struct hci_request rq;
  1771. cp.handle = handle;
  1772. cp.encrypt = encrypt;
  1773. rq.ogf = OGF_LINK_CTL;
  1774. rq.ocf = OCF_SET_CONN_ENCRYPT;
  1775. rq.event = EVT_ENCRYPT_CHANGE;
  1776. rq.cparam = &cp;
  1777. rq.clen = SET_CONN_ENCRYPT_CP_SIZE;
  1778. rq.rparam = &rp;
  1779. rq.rlen = EVT_ENCRYPT_CHANGE_SIZE;
  1780. if (hci_send_req(dd, &rq, to) < 0)
  1781. return -1;
  1782. if (rp.status) {
  1783. errno = EIO;
  1784. return -1;
  1785. }
  1786. return 0;
  1787. }
  1788. int hci_change_link_key(int dd, uint16_t handle, int to)
  1789. {
  1790. change_conn_link_key_cp cp;
  1791. evt_change_conn_link_key_complete rp;
  1792. struct hci_request rq;
  1793. cp.handle = handle;
  1794. rq.ogf = OGF_LINK_CTL;
  1795. rq.ocf = OCF_CHANGE_CONN_LINK_KEY;
  1796. rq.event = EVT_CHANGE_CONN_LINK_KEY_COMPLETE;
  1797. rq.cparam = &cp;
  1798. rq.clen = CHANGE_CONN_LINK_KEY_CP_SIZE;
  1799. rq.rparam = &rp;
  1800. rq.rlen = EVT_CHANGE_CONN_LINK_KEY_COMPLETE_SIZE;
  1801. if (hci_send_req(dd, &rq, to) < 0)
  1802. return -1;
  1803. if (rp.status) {
  1804. errno = EIO;
  1805. return -1;
  1806. }
  1807. return 0;
  1808. }
  1809. int hci_switch_role(int dd, bdaddr_t *bdaddr, uint8_t role, int to)
  1810. {
  1811. switch_role_cp cp;
  1812. evt_role_change rp;
  1813. struct hci_request rq;
  1814. bacpy(&cp.bdaddr, bdaddr);
  1815. cp.role = role;
  1816. rq.ogf = OGF_LINK_POLICY;
  1817. rq.ocf = OCF_SWITCH_ROLE;
  1818. rq.cparam = &cp;
  1819. rq.clen = SWITCH_ROLE_CP_SIZE;
  1820. rq.rparam = &rp;
  1821. rq.rlen = EVT_ROLE_CHANGE_SIZE;
  1822. rq.event = EVT_ROLE_CHANGE;
  1823. if (hci_send_req(dd, &rq, to) < 0)
  1824. return -1;
  1825. if (rp.status) {
  1826. errno = EIO;
  1827. return -1;
  1828. }
  1829. return 0;
  1830. }
  1831. int hci_park_mode(int dd, uint16_t handle, uint16_t max_interval,
  1832. uint16_t min_interval, int to)
  1833. {
  1834. park_mode_cp cp;
  1835. evt_mode_change rp;
  1836. struct hci_request rq;
  1837. memset(&cp, 0, sizeof (cp));
  1838. cp.handle = handle;
  1839. cp.max_interval = max_interval;
  1840. cp.min_interval = min_interval;
  1841. memset(&rq, 0, sizeof (rq));
  1842. rq.ogf = OGF_LINK_POLICY;
  1843. rq.ocf = OCF_PARK_MODE;
  1844. rq.event = EVT_MODE_CHANGE;
  1845. rq.cparam = &cp;
  1846. rq.clen = PARK_MODE_CP_SIZE;
  1847. rq.rparam = &rp;
  1848. rq.rlen = EVT_MODE_CHANGE_SIZE;
  1849. if (hci_send_req(dd, &rq, to) < 0)
  1850. return -1;
  1851. if (rp.status) {
  1852. errno = EIO;
  1853. return -1;
  1854. }
  1855. return 0;
  1856. }
  1857. int hci_exit_park_mode(int dd, uint16_t handle, int to)
  1858. {
  1859. exit_park_mode_cp cp;
  1860. evt_mode_change rp;
  1861. struct hci_request rq;
  1862. memset(&cp, 0, sizeof (cp));
  1863. cp.handle = handle;
  1864. memset (&rq, 0, sizeof (rq));
  1865. rq.ogf = OGF_LINK_POLICY;
  1866. rq.ocf = OCF_EXIT_PARK_MODE;
  1867. rq.event = EVT_MODE_CHANGE;
  1868. rq.cparam = &cp;
  1869. rq.clen = EXIT_PARK_MODE_CP_SIZE;
  1870. rq.rparam = &rp;
  1871. rq.rlen = EVT_MODE_CHANGE_SIZE;
  1872. if (hci_send_req(dd, &rq, to) < 0)
  1873. return -1;
  1874. if (rp.status) {
  1875. errno = EIO;
  1876. return -1;
  1877. }
  1878. return 0;
  1879. }
  1880. int hci_read_inquiry_scan_type(int dd, uint8_t *type, int to)
  1881. {
  1882. read_inquiry_scan_type_rp rp;
  1883. struct hci_request rq;
  1884. memset(&rq, 0, sizeof(rq));
  1885. rq.ogf = OGF_HOST_CTL;
  1886. rq.ocf = OCF_READ_INQUIRY_SCAN_TYPE;
  1887. rq.rparam = &rp;
  1888. rq.rlen = READ_INQUIRY_SCAN_TYPE_RP_SIZE;
  1889. if (hci_send_req(dd, &rq, to) < 0)
  1890. return -1;
  1891. if (rp.status) {
  1892. errno = EIO;
  1893. return -1;
  1894. }
  1895. *type = rp.type;
  1896. return 0;
  1897. }
  1898. int hci_write_inquiry_scan_type(int dd, uint8_t type, int to)
  1899. {
  1900. write_inquiry_scan_type_cp cp;
  1901. write_inquiry_scan_type_rp rp;
  1902. struct hci_request rq;
  1903. memset(&cp, 0, sizeof(cp));
  1904. cp.type = type;
  1905. memset(&rq, 0, sizeof(rq));
  1906. rq.ogf = OGF_HOST_CTL;
  1907. rq.ocf = OCF_WRITE_INQUIRY_SCAN_TYPE;
  1908. rq.cparam = &cp;
  1909. rq.clen = WRITE_INQUIRY_SCAN_TYPE_CP_SIZE;
  1910. rq.rparam = &rp;
  1911. rq.rlen = WRITE_INQUIRY_SCAN_TYPE_RP_SIZE;
  1912. if (hci_send_req(dd, &rq, to) < 0)
  1913. return -1;
  1914. if (rp.status) {
  1915. errno = EIO;
  1916. return -1;
  1917. }
  1918. return 0;
  1919. }
  1920. int hci_read_inquiry_mode(int dd, uint8_t *mode, int to)
  1921. {
  1922. read_inquiry_mode_rp rp;
  1923. struct hci_request rq;
  1924. memset(&rq, 0, sizeof(rq));
  1925. rq.ogf = OGF_HOST_CTL;
  1926. rq.ocf = OCF_READ_INQUIRY_MODE;
  1927. rq.rparam = &rp;
  1928. rq.rlen = READ_INQUIRY_MODE_RP_SIZE;
  1929. if (hci_send_req(dd, &rq, to) < 0)
  1930. return -1;
  1931. if (rp.status) {
  1932. errno = EIO;
  1933. return -1;
  1934. }
  1935. *mode = rp.mode;
  1936. return 0;
  1937. }
  1938. int hci_write_inquiry_mode(int dd, uint8_t mode, int to)
  1939. {
  1940. write_inquiry_mode_cp cp;
  1941. write_inquiry_mode_rp rp;
  1942. struct hci_request rq;
  1943. memset(&cp, 0, sizeof(cp));
  1944. cp.mode = mode;
  1945. memset(&rq, 0, sizeof(rq));
  1946. rq.ogf = OGF_HOST_CTL;
  1947. rq.ocf = OCF_WRITE_INQUIRY_MODE;
  1948. rq.cparam = &cp;
  1949. rq.clen = WRITE_INQUIRY_MODE_CP_SIZE;
  1950. rq.rparam = &rp;
  1951. rq.rlen = WRITE_INQUIRY_MODE_RP_SIZE;
  1952. if (hci_send_req(dd, &rq, to) < 0)
  1953. return -1;
  1954. if (rp.status) {
  1955. errno = EIO;
  1956. return -1;
  1957. }
  1958. return 0;
  1959. }
  1960. int hci_read_afh_mode(int dd, uint8_t *mode, int to)
  1961. {
  1962. read_afh_mode_rp rp;
  1963. struct hci_request rq;
  1964. memset(&rq, 0, sizeof(rq));
  1965. rq.ogf = OGF_HOST_CTL;
  1966. rq.ocf = OCF_READ_AFH_MODE;
  1967. rq.rparam = &rp;
  1968. rq.rlen = READ_AFH_MODE_RP_SIZE;
  1969. if (hci_send_req(dd, &rq, to) < 0)
  1970. return -1;
  1971. if (rp.status) {
  1972. errno = EIO;
  1973. return -1;
  1974. }
  1975. *mode = rp.mode;
  1976. return 0;
  1977. }
  1978. int hci_write_afh_mode(int dd, uint8_t mode, int to)
  1979. {
  1980. write_afh_mode_cp cp;
  1981. write_afh_mode_rp rp;
  1982. struct hci_request rq;
  1983. memset(&cp, 0, sizeof(cp));
  1984. cp.mode = mode;
  1985. memset(&rq, 0, sizeof(rq));
  1986. rq.ogf = OGF_HOST_CTL;
  1987. rq.ocf = OCF_WRITE_AFH_MODE;
  1988. rq.cparam = &cp;
  1989. rq.clen = WRITE_AFH_MODE_CP_SIZE;
  1990. rq.rparam = &rp;
  1991. rq.rlen = WRITE_AFH_MODE_RP_SIZE;
  1992. if (hci_send_req(dd, &rq, to) < 0)
  1993. return -1;
  1994. if (rp.status) {
  1995. errno = EIO;
  1996. return -1;
  1997. }
  1998. return 0;
  1999. }
  2000. int hci_read_ext_inquiry_response(int dd, uint8_t *fec, uint8_t *data, int to)
  2001. {
  2002. read_ext_inquiry_response_rp rp;
  2003. struct hci_request rq;
  2004. memset(&rq, 0, sizeof(rq));
  2005. rq.ogf = OGF_HOST_CTL;
  2006. rq.ocf = OCF_READ_EXT_INQUIRY_RESPONSE;
  2007. rq.rparam = &rp;
  2008. rq.rlen = READ_EXT_INQUIRY_RESPONSE_RP_SIZE;
  2009. if (hci_send_req(dd, &rq, to) < 0)
  2010. return -1;
  2011. if (rp.status) {
  2012. errno = EIO;
  2013. return -1;
  2014. }
  2015. *fec = rp.fec;
  2016. memcpy(data, rp.data, HCI_MAX_EIR_LENGTH);
  2017. return 0;
  2018. }
  2019. int hci_write_ext_inquiry_response(int dd, uint8_t fec, uint8_t *data, int to)
  2020. {
  2021. write_ext_inquiry_response_cp cp;
  2022. write_ext_inquiry_response_rp rp;
  2023. struct hci_request rq;
  2024. memset(&cp, 0, sizeof(cp));
  2025. cp.fec = fec;
  2026. memcpy(cp.data, data, HCI_MAX_EIR_LENGTH);
  2027. memset(&rq, 0, sizeof(rq));
  2028. rq.ogf = OGF_HOST_CTL;
  2029. rq.ocf = OCF_WRITE_EXT_INQUIRY_RESPONSE;
  2030. rq.cparam = &cp;
  2031. rq.clen = WRITE_EXT_INQUIRY_RESPONSE_CP_SIZE;
  2032. rq.rparam = &rp;
  2033. rq.rlen = WRITE_EXT_INQUIRY_RESPONSE_RP_SIZE;
  2034. if (hci_send_req(dd, &rq, to) < 0)
  2035. return -1;
  2036. if (rp.status) {
  2037. errno = EIO;
  2038. return -1;
  2039. }
  2040. return 0;
  2041. }
  2042. int hci_read_simple_pairing_mode(int dd, uint8_t *mode, int to)
  2043. {
  2044. read_simple_pairing_mode_rp rp;
  2045. struct hci_request rq;
  2046. memset(&rq, 0, sizeof(rq));
  2047. rq.ogf = OGF_HOST_CTL;
  2048. rq.ocf = OCF_READ_SIMPLE_PAIRING_MODE;
  2049. rq.rparam = &rp;
  2050. rq.rlen = READ_SIMPLE_PAIRING_MODE_RP_SIZE;
  2051. if (hci_send_req(dd, &rq, to) < 0)
  2052. return -1;
  2053. if (rp.status) {
  2054. errno = EIO;
  2055. return -1;
  2056. }
  2057. *mode = rp.mode;
  2058. return 0;
  2059. }
  2060. int hci_write_simple_pairing_mode(int dd, uint8_t mode, int to)
  2061. {
  2062. write_simple_pairing_mode_cp cp;
  2063. write_simple_pairing_mode_rp rp;
  2064. struct hci_request rq;
  2065. memset(&cp, 0, sizeof(cp));
  2066. cp.mode = mode;
  2067. memset(&rq, 0, sizeof(rq));
  2068. rq.ogf = OGF_HOST_CTL;
  2069. rq.ocf = OCF_WRITE_SIMPLE_PAIRING_MODE;
  2070. rq.cparam = &cp;
  2071. rq.clen = WRITE_SIMPLE_PAIRING_MODE_CP_SIZE;
  2072. rq.rparam = &rp;
  2073. rq.rlen = WRITE_SIMPLE_PAIRING_MODE_RP_SIZE;
  2074. if (hci_send_req(dd, &rq, to) < 0)
  2075. return -1;
  2076. if (rp.status) {
  2077. errno = EIO;
  2078. return -1;
  2079. }
  2080. return 0;
  2081. }
  2082. int hci_read_local_oob_data(int dd, uint8_t *hash, uint8_t *randomizer, int to)
  2083. {
  2084. read_local_oob_data_rp rp;
  2085. struct hci_request rq;
  2086. memset(&rq, 0, sizeof(rq));
  2087. rq.ogf = OGF_HOST_CTL;
  2088. rq.ocf = OCF_READ_LOCAL_OOB_DATA;
  2089. rq.rparam = &rp;
  2090. rq.rlen = READ_LOCAL_OOB_DATA_RP_SIZE;
  2091. if (hci_send_req(dd, &rq, to) < 0)
  2092. return -1;
  2093. if (rp.status) {
  2094. errno = EIO;
  2095. return -1;
  2096. }
  2097. memcpy(hash, rp.hash, 16);
  2098. memcpy(randomizer, rp.randomizer, 16);
  2099. return 0;
  2100. }
  2101. int hci_read_inq_response_tx_power_level(int dd, int8_t *level, int to)
  2102. {
  2103. read_inq_response_tx_power_level_rp rp;
  2104. struct hci_request rq;
  2105. memset(&rq, 0, sizeof(rq));
  2106. rq.ogf = OGF_HOST_CTL;
  2107. rq.ocf = OCF_READ_INQ_RESPONSE_TX_POWER_LEVEL;
  2108. rq.rparam = &rp;
  2109. rq.rlen = READ_INQ_RESPONSE_TX_POWER_LEVEL_RP_SIZE;
  2110. if (hci_send_req(dd, &rq, to) < 0)
  2111. return -1;
  2112. if (rp.status) {
  2113. errno = EIO;
  2114. return -1;
  2115. }
  2116. *level = rp.level;
  2117. return 0;
  2118. }
  2119. int hci_read_inquiry_transmit_power_level(int dd, int8_t *level, int to)
  2120. {
  2121. return hci_read_inq_response_tx_power_level(dd, level, to);
  2122. }
  2123. int hci_write_inquiry_transmit_power_level(int dd, int8_t level, int to)
  2124. {
  2125. write_inquiry_transmit_power_level_cp cp;
  2126. write_inquiry_transmit_power_level_rp rp;
  2127. struct hci_request rq;
  2128. memset(&cp, 0, sizeof(cp));
  2129. cp.level = level;
  2130. memset(&rq, 0, sizeof(rq));
  2131. rq.ogf = OGF_HOST_CTL;
  2132. rq.ocf = OCF_WRITE_INQUIRY_TRANSMIT_POWER_LEVEL;
  2133. rq.cparam = &cp;
  2134. rq.clen = WRITE_INQUIRY_TRANSMIT_POWER_LEVEL_CP_SIZE;
  2135. rq.rparam = &rp;
  2136. rq.rlen = WRITE_INQUIRY_TRANSMIT_POWER_LEVEL_RP_SIZE;
  2137. if (hci_send_req(dd, &rq, to) < 0)
  2138. return -1;
  2139. if (rp.status) {
  2140. errno = EIO;
  2141. return -1;
  2142. }
  2143. return 0;
  2144. }
  2145. int hci_read_transmit_power_level(int dd, uint16_t handle, uint8_t type,
  2146. int8_t *level, int to)
  2147. {
  2148. read_transmit_power_level_cp cp;
  2149. read_transmit_power_level_rp rp;
  2150. struct hci_request rq;
  2151. memset(&cp, 0, sizeof(cp));
  2152. cp.handle = handle;
  2153. cp.type = type;
  2154. memset(&rq, 0, sizeof(rq));
  2155. rq.ogf = OGF_HOST_CTL;
  2156. rq.ocf = OCF_READ_TRANSMIT_POWER_LEVEL;
  2157. rq.cparam = &cp;
  2158. rq.clen = READ_TRANSMIT_POWER_LEVEL_CP_SIZE;
  2159. rq.rparam = &rp;
  2160. rq.rlen = READ_TRANSMIT_POWER_LEVEL_RP_SIZE;
  2161. if (hci_send_req(dd, &rq, to) < 0)
  2162. return -1;
  2163. if (rp.status) {
  2164. errno = EIO;
  2165. return -1;
  2166. }
  2167. *level = rp.level;
  2168. return 0;
  2169. }
  2170. int hci_read_link_policy(int dd, uint16_t handle, uint16_t *policy, int to)
  2171. {
  2172. read_link_policy_rp rp;
  2173. struct hci_request rq;
  2174. memset(&rq, 0, sizeof(rq));
  2175. rq.ogf = OGF_LINK_POLICY;
  2176. rq.ocf = OCF_READ_LINK_POLICY;
  2177. rq.cparam = &handle;
  2178. rq.clen = 2;
  2179. rq.rparam = &rp;
  2180. rq.rlen = READ_LINK_POLICY_RP_SIZE;
  2181. if (hci_send_req(dd, &rq, to) < 0)
  2182. return -1;
  2183. if (rp.status) {
  2184. errno = EIO;
  2185. return -1;
  2186. }
  2187. *policy = rp.policy;
  2188. return 0;
  2189. }
  2190. int hci_write_link_policy(int dd, uint16_t handle, uint16_t policy, int to)
  2191. {
  2192. write_link_policy_cp cp;
  2193. write_link_policy_rp rp;
  2194. struct hci_request rq;
  2195. memset(&cp, 0, sizeof(cp));
  2196. cp.handle = handle;
  2197. cp.policy = policy;
  2198. memset(&rq, 0, sizeof(rq));
  2199. rq.ogf = OGF_LINK_POLICY;
  2200. rq.ocf = OCF_WRITE_LINK_POLICY;
  2201. rq.cparam = &cp;
  2202. rq.clen = WRITE_LINK_POLICY_CP_SIZE;
  2203. rq.rparam = &rp;
  2204. rq.rlen = WRITE_LINK_POLICY_RP_SIZE;
  2205. if (hci_send_req(dd, &rq, to) < 0)
  2206. return -1;
  2207. if (rp.status) {
  2208. errno = EIO;
  2209. return -1;
  2210. }
  2211. return 0;
  2212. }
  2213. int hci_read_link_supervision_timeout(int dd, uint16_t handle,
  2214. uint16_t *timeout, int to)
  2215. {
  2216. read_link_supervision_timeout_rp rp;
  2217. struct hci_request rq;
  2218. memset(&rq, 0, sizeof(rq));
  2219. rq.ogf = OGF_HOST_CTL;
  2220. rq.ocf = OCF_READ_LINK_SUPERVISION_TIMEOUT;
  2221. rq.cparam = &handle;
  2222. rq.clen = 2;
  2223. rq.rparam = &rp;
  2224. rq.rlen = READ_LINK_SUPERVISION_TIMEOUT_RP_SIZE;
  2225. if (hci_send_req(dd, &rq, to) < 0)
  2226. return -1;
  2227. if (rp.status) {
  2228. errno = EIO;
  2229. return -1;
  2230. }
  2231. *timeout = rp.timeout;
  2232. return 0;
  2233. }
  2234. int hci_write_link_supervision_timeout(int dd, uint16_t handle,
  2235. uint16_t timeout, int to)
  2236. {
  2237. write_link_supervision_timeout_cp cp;
  2238. write_link_supervision_timeout_rp rp;
  2239. struct hci_request rq;
  2240. memset(&cp, 0, sizeof(cp));
  2241. cp.handle = handle;
  2242. cp.timeout = timeout;
  2243. memset(&rq, 0, sizeof(rq));
  2244. rq.ogf = OGF_HOST_CTL;
  2245. rq.ocf = OCF_WRITE_LINK_SUPERVISION_TIMEOUT;
  2246. rq.cparam = &cp;
  2247. rq.clen = WRITE_LINK_SUPERVISION_TIMEOUT_CP_SIZE;
  2248. rq.rparam = &rp;
  2249. rq.rlen = WRITE_LINK_SUPERVISION_TIMEOUT_RP_SIZE;
  2250. if (hci_send_req(dd, &rq, to) < 0)
  2251. return -1;
  2252. if (rp.status) {
  2253. errno = EIO;
  2254. return -1;
  2255. }
  2256. return 0;
  2257. }
  2258. int hci_set_afh_classification(int dd, uint8_t *map, int to)
  2259. {
  2260. set_afh_classification_cp cp;
  2261. set_afh_classification_rp rp;
  2262. struct hci_request rq;
  2263. memset(&cp, 0, sizeof(cp));
  2264. memcpy(cp.map, map, 10);
  2265. memset(&rq, 0, sizeof(rq));
  2266. rq.ogf = OGF_HOST_CTL;
  2267. rq.ocf = OCF_SET_AFH_CLASSIFICATION;
  2268. rq.cparam = &cp;
  2269. rq.clen = SET_AFH_CLASSIFICATION_CP_SIZE;
  2270. rq.rparam = &rp;
  2271. rq.rlen = SET_AFH_CLASSIFICATION_RP_SIZE;
  2272. if (hci_send_req(dd, &rq, to) < 0)
  2273. return -1;
  2274. if (rp.status) {
  2275. errno = EIO;
  2276. return -1;
  2277. }
  2278. return 0;
  2279. }
  2280. int hci_read_link_quality(int dd, uint16_t handle, uint8_t *link_quality,
  2281. int to)
  2282. {
  2283. read_link_quality_rp rp;
  2284. struct hci_request rq;
  2285. memset(&rq, 0, sizeof(rq));
  2286. rq.ogf = OGF_STATUS_PARAM;
  2287. rq.ocf = OCF_READ_LINK_QUALITY;
  2288. rq.cparam = &handle;
  2289. rq.clen = 2;
  2290. rq.rparam = &rp;
  2291. rq.rlen = READ_LINK_QUALITY_RP_SIZE;
  2292. if (hci_send_req(dd, &rq, to) < 0)
  2293. return -1;
  2294. if (rp.status) {
  2295. errno = EIO;
  2296. return -1;
  2297. }
  2298. *link_quality = rp.link_quality;
  2299. return 0;
  2300. }
  2301. int hci_read_rssi(int dd, uint16_t handle, int8_t *rssi, int to)
  2302. {
  2303. read_rssi_rp rp;
  2304. struct hci_request rq;
  2305. memset(&rq, 0, sizeof(rq));
  2306. rq.ogf = OGF_STATUS_PARAM;
  2307. rq.ocf = OCF_READ_RSSI;
  2308. rq.cparam = &handle;
  2309. rq.clen = 2;
  2310. rq.rparam = &rp;
  2311. rq.rlen = READ_RSSI_RP_SIZE;
  2312. if (hci_send_req(dd, &rq, to) < 0)
  2313. return -1;
  2314. if (rp.status) {
  2315. errno = EIO;
  2316. return -1;
  2317. }
  2318. *rssi = rp.rssi;
  2319. return 0;
  2320. }
  2321. int hci_read_afh_map(int dd, uint16_t handle, uint8_t *mode, uint8_t *map,
  2322. int to)
  2323. {
  2324. read_afh_map_rp rp;
  2325. struct hci_request rq;
  2326. memset(&rq, 0, sizeof(rq));
  2327. rq.ogf = OGF_STATUS_PARAM;
  2328. rq.ocf = OCF_READ_AFH_MAP;
  2329. rq.cparam = &handle;
  2330. rq.clen = 2;
  2331. rq.rparam = &rp;
  2332. rq.rlen = READ_AFH_MAP_RP_SIZE;
  2333. if (hci_send_req(dd, &rq, to) < 0)
  2334. return -1;
  2335. if (rp.status) {
  2336. errno = EIO;
  2337. return -1;
  2338. }
  2339. *mode = rp.mode;
  2340. memcpy(map, rp.map, 10);
  2341. return 0;
  2342. }
  2343. int hci_read_clock(int dd, uint16_t handle, uint8_t which, uint32_t *clock,
  2344. uint16_t *accuracy, int to)
  2345. {
  2346. read_clock_cp cp;
  2347. read_clock_rp rp;
  2348. struct hci_request rq;
  2349. memset(&cp, 0, sizeof(cp));
  2350. cp.handle = handle;
  2351. cp.which_clock = which;
  2352. memset(&rq, 0, sizeof(rq));
  2353. rq.ogf = OGF_STATUS_PARAM;
  2354. rq.ocf = OCF_READ_CLOCK;
  2355. rq.cparam = &cp;
  2356. rq.clen = READ_CLOCK_CP_SIZE;
  2357. rq.rparam = &rp;
  2358. rq.rlen = READ_CLOCK_RP_SIZE;
  2359. if (hci_send_req(dd, &rq, to) < 0)
  2360. return -1;
  2361. if (rp.status) {
  2362. errno = EIO;
  2363. return -1;
  2364. }
  2365. *clock = rp.clock;
  2366. *accuracy = rp.accuracy;
  2367. return 0;
  2368. }
  2369. int hci_le_set_scan_enable(int dd, uint8_t enable, uint8_t filter_dup, int to)
  2370. {
  2371. struct hci_request rq;
  2372. le_set_scan_enable_cp scan_cp;
  2373. uint8_t status;
  2374. memset(&scan_cp, 0, sizeof(scan_cp));
  2375. scan_cp.enable = enable;
  2376. scan_cp.filter_dup = filter_dup;
  2377. memset(&rq, 0, sizeof(rq));
  2378. rq.ogf = OGF_LE_CTL;
  2379. rq.ocf = OCF_LE_SET_SCAN_ENABLE;
  2380. rq.cparam = &scan_cp;
  2381. rq.clen = LE_SET_SCAN_ENABLE_CP_SIZE;
  2382. rq.rparam = &status;
  2383. rq.rlen = 1;
  2384. if (hci_send_req(dd, &rq, to) < 0)
  2385. return -1;
  2386. if (status) {
  2387. errno = EIO;
  2388. return -1;
  2389. }
  2390. return 0;
  2391. }
  2392. int hci_le_set_scan_parameters(int dd, uint8_t type,
  2393. uint16_t interval, uint16_t window,
  2394. uint8_t own_type, uint8_t filter, int to)
  2395. {
  2396. struct hci_request rq;
  2397. le_set_scan_parameters_cp param_cp;
  2398. uint8_t status;
  2399. memset(&param_cp, 0, sizeof(param_cp));
  2400. param_cp.type = type;
  2401. param_cp.interval = interval;
  2402. param_cp.window = window;
  2403. param_cp.own_bdaddr_type = own_type;
  2404. param_cp.filter = filter;
  2405. memset(&rq, 0, sizeof(rq));
  2406. rq.ogf = OGF_LE_CTL;
  2407. rq.ocf = OCF_LE_SET_SCAN_PARAMETERS;
  2408. rq.cparam = &param_cp;
  2409. rq.clen = LE_SET_SCAN_PARAMETERS_CP_SIZE;
  2410. rq.rparam = &status;
  2411. rq.rlen = 1;
  2412. if (hci_send_req(dd, &rq, to) < 0)
  2413. return -1;
  2414. if (status) {
  2415. errno = EIO;
  2416. return -1;
  2417. }
  2418. return 0;
  2419. }
  2420. int hci_le_set_advertise_enable(int dd, uint8_t enable, int to)
  2421. {
  2422. struct hci_request rq;
  2423. le_set_advertise_enable_cp adv_cp;
  2424. uint8_t status;
  2425. memset(&adv_cp, 0, sizeof(adv_cp));
  2426. adv_cp.enable = enable;
  2427. memset(&rq, 0, sizeof(rq));
  2428. rq.ogf = OGF_LE_CTL;
  2429. rq.ocf = OCF_LE_SET_ADVERTISE_ENABLE;
  2430. rq.cparam = &adv_cp;
  2431. rq.clen = LE_SET_ADVERTISE_ENABLE_CP_SIZE;
  2432. rq.rparam = &status;
  2433. rq.rlen = 1;
  2434. if (hci_send_req(dd, &rq, to) < 0)
  2435. return -1;
  2436. if (status) {
  2437. errno = EIO;
  2438. return -1;
  2439. }
  2440. return 0;
  2441. }
  2442. int hci_le_create_conn(int dd, uint16_t interval, uint16_t window,
  2443. uint8_t initiator_filter, uint8_t peer_bdaddr_type,
  2444. bdaddr_t peer_bdaddr, uint8_t own_bdaddr_type,
  2445. uint16_t min_interval, uint16_t max_interval,
  2446. uint16_t latency, uint16_t supervision_timeout,
  2447. uint16_t min_ce_length, uint16_t max_ce_length,
  2448. uint16_t *handle, int to)
  2449. {
  2450. struct hci_request rq;
  2451. le_create_connection_cp create_conn_cp;
  2452. evt_le_connection_complete conn_complete_rp;
  2453. memset(&create_conn_cp, 0, sizeof(create_conn_cp));
  2454. create_conn_cp.interval = interval;
  2455. create_conn_cp.window = window;
  2456. create_conn_cp.initiator_filter = initiator_filter;
  2457. create_conn_cp.peer_bdaddr_type = peer_bdaddr_type;
  2458. create_conn_cp.peer_bdaddr = peer_bdaddr;
  2459. create_conn_cp.own_bdaddr_type = own_bdaddr_type;
  2460. create_conn_cp.min_interval = min_interval;
  2461. create_conn_cp.max_interval = max_interval;
  2462. create_conn_cp.latency = latency;
  2463. create_conn_cp.supervision_timeout = supervision_timeout;
  2464. create_conn_cp.min_ce_length = min_ce_length;
  2465. create_conn_cp.max_ce_length = max_ce_length;
  2466. memset(&rq, 0, sizeof(rq));
  2467. rq.ogf = OGF_LE_CTL;
  2468. rq.ocf = OCF_LE_CREATE_CONN;
  2469. rq.event = EVT_LE_CONN_COMPLETE;
  2470. rq.cparam = &create_conn_cp;
  2471. rq.clen = LE_CREATE_CONN_CP_SIZE;
  2472. rq.rparam = &conn_complete_rp;
  2473. rq.rlen = EVT_CONN_COMPLETE_SIZE;
  2474. if (hci_send_req(dd, &rq, to) < 0)
  2475. return -1;
  2476. if (conn_complete_rp.status) {
  2477. errno = EIO;
  2478. return -1;
  2479. }
  2480. if (handle)
  2481. *handle = conn_complete_rp.handle;
  2482. return 0;
  2483. }
  2484. int hci_le_conn_update(int dd, uint16_t handle, uint16_t min_interval,
  2485. uint16_t max_interval, uint16_t latency,
  2486. uint16_t supervision_timeout, int to)
  2487. {
  2488. evt_le_connection_update_complete evt;
  2489. le_connection_update_cp cp;
  2490. struct hci_request rq;
  2491. memset(&cp, 0, sizeof(cp));
  2492. cp.handle = handle;
  2493. cp.min_interval = min_interval;
  2494. cp.max_interval = max_interval;
  2495. cp.latency = latency;
  2496. cp.supervision_timeout = supervision_timeout;
  2497. cp.min_ce_length = htobs(0x0001);
  2498. cp.max_ce_length = htobs(0x0001);
  2499. memset(&rq, 0, sizeof(rq));
  2500. rq.ogf = OGF_LE_CTL;
  2501. rq.ocf = OCF_LE_CONN_UPDATE;
  2502. rq.cparam = &cp;
  2503. rq.clen = LE_CONN_UPDATE_CP_SIZE;
  2504. rq.event = EVT_LE_CONN_UPDATE_COMPLETE;
  2505. rq.rparam = &evt;
  2506. rq.rlen = sizeof(evt);
  2507. if (hci_send_req(dd, &rq, to) < 0)
  2508. return -1;
  2509. if (evt.status) {
  2510. errno = EIO;
  2511. return -1;
  2512. }
  2513. return 0;
  2514. }
  2515. int hci_le_read_remote_features(int dd, uint16_t handle, uint8_t *features, int to)
  2516. {
  2517. evt_le_read_remote_used_features_complete rp;
  2518. le_read_remote_used_features_cp cp;
  2519. struct hci_request rq;
  2520. memset(&cp, 0, sizeof(cp));
  2521. cp.handle = handle;
  2522. memset(&rq, 0, sizeof(rq));
  2523. rq.ogf = OGF_LE_CTL;
  2524. rq.ocf = OCF_LE_READ_REMOTE_USED_FEATURES;
  2525. rq.event = EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE;
  2526. rq.cparam = &cp;
  2527. rq.clen = LE_READ_REMOTE_USED_FEATURES_CP_SIZE;
  2528. rq.rparam = &rp;
  2529. rq.rlen = EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE_SIZE;
  2530. if (hci_send_req(dd, &rq, to) < 0)
  2531. return -1;
  2532. if (rp.status) {
  2533. errno = EIO;
  2534. return -1;
  2535. }
  2536. if (features)
  2537. memcpy(features, rp.features, 8);
  2538. return 0;
  2539. }