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