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