1 /* 2 * 3 * BlueZ - Bluetooth protocol stack for Linux 4 * 5 * Copyright (C) 2006-2007 Nokia Corporation 6 * Copyright (C) 2004-2009 Marcel Holtmann <marcel (at) holtmann.org> 7 * 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 22 * 23 */ 24 25 #ifdef HAVE_CONFIG_H 26 #include <config.h> 27 #endif 28 29 #define _GNU_SOURCE 30 #include <stdio.h> 31 #include <errno.h> 32 #include <unistd.h> 33 #include <stdlib.h> 34 #include <string.h> 35 #include <sys/param.h> 36 #include <sys/ioctl.h> 37 #include <sys/socket.h> 38 39 #include <bluetooth/bluetooth.h> 40 #include <bluetooth/hci.h> 41 #include <bluetooth/hci_lib.h> 42 #include <bluetooth/sdp.h> 43 44 #include <glib.h> 45 #include <dbus/dbus.h> 46 #include <gdbus.h> 47 48 #include "logging.h" 49 #include "textfile.h" 50 51 #include "hcid.h" 52 #include "manager.h" 53 #include "adapter.h" 54 #include "device.h" 55 #include "error.h" 56 #include "glib-helper.h" 57 #include "dbus-common.h" 58 #include "agent.h" 59 #include "storage.h" 60 #include "dbus-hci.h" 61 62 static DBusConnection *connection = NULL; 63 64 static gboolean get_adapter_and_device(bdaddr_t *src, bdaddr_t *dst, 65 struct btd_adapter **adapter, 66 struct btd_device **device, 67 gboolean create) 68 { 69 char peer_addr[18]; 70 71 *adapter = manager_find_adapter(src); 72 if (!*adapter) { 73 error("Unable to find matching adapter"); 74 return FALSE; 75 } 76 77 ba2str(dst, peer_addr); 78 79 if (create) 80 *device = adapter_get_device(connection, *adapter, peer_addr); 81 else 82 *device = adapter_find_device(*adapter, peer_addr); 83 84 if (create && !*device) { 85 error("Unable to get device object!"); 86 return FALSE; 87 } 88 89 return TRUE; 90 } 91 92 const char *class_to_icon(uint32_t class) 93 { 94 switch ((class & 0x1f00) >> 8) { 95 case 0x01: 96 return "computer"; 97 case 0x02: 98 switch ((class & 0xfc) >> 2) { 99 case 0x01: 100 case 0x02: 101 case 0x03: 102 case 0x05: 103 return "phone"; 104 case 0x04: 105 return "modem"; 106 } 107 break; 108 case 0x03: 109 return "network-wireless"; 110 case 0x04: 111 switch ((class & 0xfc) >> 2) { 112 case 0x01: 113 case 0x02: 114 return "audio-card"; /* Headset */ 115 case 0x06: 116 return "audio-card"; /* Headphone */ 117 default: 118 return "audio-card"; /* Other audio device */ 119 } 120 break; 121 case 0x05: 122 switch ((class & 0xc0) >> 6) { 123 case 0x00: 124 switch ((class & 0x1e) >> 2) { 125 case 0x01: 126 case 0x02: 127 return "input-gaming"; 128 } 129 break; 130 case 0x01: 131 return "input-keyboard"; 132 case 0x02: 133 switch ((class & 0x1e) >> 2) { 134 case 0x05: 135 return "input-tablet"; 136 default: 137 return "input-mouse"; 138 } 139 } 140 break; 141 case 0x06: 142 if (class & 0x80) 143 return "printer"; 144 if (class & 0x20) 145 return "camera-photo"; 146 break; 147 } 148 149 return NULL; 150 } 151 152 /***************************************************************** 153 * 154 * Section reserved to HCI commands confirmation handling and low 155 * level events(eg: device attached/dettached. 156 * 157 *****************************************************************/ 158 159 static void pincode_cb(struct agent *agent, DBusError *err, const char *pincode, 160 struct btd_device *device) 161 { 162 struct btd_adapter *adapter = device_get_adapter(device); 163 pin_code_reply_cp pr; 164 bdaddr_t sba, dba; 165 size_t len; 166 int dev; 167 uint16_t dev_id = adapter_get_dev_id(adapter); 168 169 dev = hci_open_dev(dev_id); 170 if (dev < 0) { 171 error("hci_open_dev(%d): %s (%d)", dev_id, 172 strerror(errno), errno); 173 return; 174 } 175 176 adapter_get_address(adapter, &sba); 177 device_get_address(device, &dba); 178 179 if (err) { 180 hci_send_cmd(dev, OGF_LINK_CTL, 181 OCF_PIN_CODE_NEG_REPLY, 6, &dba); 182 goto done; 183 } 184 185 len = strlen(pincode); 186 187 set_pin_length(&sba, len); 188 189 memset(&pr, 0, sizeof(pr)); 190 bacpy(&pr.bdaddr, &dba); 191 memcpy(pr.pin_code, pincode, len); 192 pr.pin_len = len; 193 hci_send_cmd(dev, OGF_LINK_CTL, OCF_PIN_CODE_REPLY, 194 PIN_CODE_REPLY_CP_SIZE, &pr); 195 196 done: 197 hci_close_dev(dev); 198 } 199 200 int hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci) 201 { 202 struct btd_adapter *adapter; 203 struct btd_device *device; 204 205 if (!get_adapter_and_device(sba, &ci->bdaddr, &adapter, &device, TRUE)) 206 return -ENODEV; 207 208 /* Check if the adapter is not pairable and if there isn't a bonding in 209 * progress */ 210 if (!adapter_is_pairable(adapter) && !device_is_bonding(device, NULL)) 211 return -EPERM; 212 213 return device_request_authentication(device, AUTH_TYPE_PINCODE, 0, 214 pincode_cb); 215 } 216 217 static void confirm_cb(struct agent *agent, DBusError *err, void *user_data) 218 { 219 struct btd_device *device = user_data; 220 struct btd_adapter *adapter = device_get_adapter(device); 221 user_confirm_reply_cp cp; 222 int dd; 223 uint16_t dev_id = adapter_get_dev_id(adapter); 224 225 dd = hci_open_dev(dev_id); 226 if (dd < 0) { 227 error("Unable to open hci%d", dev_id); 228 return; 229 } 230 231 memset(&cp, 0, sizeof(cp)); 232 device_get_address(device, &cp.bdaddr); 233 234 if (err) 235 hci_send_cmd(dd, OGF_LINK_CTL, OCF_USER_CONFIRM_NEG_REPLY, 236 USER_CONFIRM_REPLY_CP_SIZE, &cp); 237 else 238 hci_send_cmd(dd, OGF_LINK_CTL, OCF_USER_CONFIRM_REPLY, 239 USER_CONFIRM_REPLY_CP_SIZE, &cp); 240 241 hci_close_dev(dd); 242 } 243 244 static void passkey_cb(struct agent *agent, DBusError *err, uint32_t passkey, 245 void *user_data) 246 { 247 struct btd_device *device = user_data; 248 struct btd_adapter *adapter = device_get_adapter(device); 249 user_passkey_reply_cp cp; 250 bdaddr_t dba; 251 int dd; 252 uint16_t dev_id = adapter_get_dev_id(adapter); 253 254 dd = hci_open_dev(dev_id); 255 if (dd < 0) { 256 error("Unable to open hci%d", dev_id); 257 return; 258 } 259 260 device_get_address(device, &dba); 261 262 memset(&cp, 0, sizeof(cp)); 263 bacpy(&cp.bdaddr, &dba); 264 cp.passkey = passkey; 265 266 if (err) 267 hci_send_cmd(dd, OGF_LINK_CTL, 268 OCF_USER_PASSKEY_NEG_REPLY, 6, &dba); 269 else 270 hci_send_cmd(dd, OGF_LINK_CTL, OCF_USER_PASSKEY_REPLY, 271 USER_PASSKEY_REPLY_CP_SIZE, &cp); 272 273 hci_close_dev(dd); 274 } 275 276 static void pairing_consent_cb(struct agent *agent, DBusError *err, 277 void *user_data) 278 { 279 struct btd_device *device = user_data; 280 struct btd_adapter *adapter = device_get_adapter(device); 281 user_confirm_reply_cp cp; 282 int dd; 283 uint16_t dev_id = adapter_get_dev_id(adapter); 284 285 dd = hci_open_dev(dev_id); 286 if (dd < 0) { 287 error("Unable to open hci%d", dev_id); 288 return; 289 } 290 291 memset(&cp, 0, sizeof(cp)); 292 device_get_address(device, &cp.bdaddr); 293 294 if (err) 295 hci_send_cmd(dd, OGF_LINK_CTL, OCF_USER_CONFIRM_NEG_REPLY, 296 USER_CONFIRM_REPLY_CP_SIZE, &cp); 297 else 298 hci_send_cmd(dd, OGF_LINK_CTL, OCF_USER_CONFIRM_REPLY, 299 USER_CONFIRM_REPLY_CP_SIZE, &cp); 300 301 hci_close_dev(dd); 302 } 303 304 static int get_auth_requirements(bdaddr_t *local, bdaddr_t *remote, 305 uint8_t *auth) 306 { 307 struct hci_auth_info_req req; 308 char addr[18]; 309 int err, dd, dev_id; 310 311 ba2str(local, addr); 312 313 dev_id = hci_devid(addr); 314 if (dev_id < 0) 315 return dev_id; 316 317 dd = hci_open_dev(dev_id); 318 if (dd < 0) 319 return dd; 320 321 memset(&req, 0, sizeof(req)); 322 bacpy(&req.bdaddr, remote); 323 324 err = ioctl(dd, HCIGETAUTHINFO, (unsigned long) &req); 325 if (err < 0) { 326 debug("HCIGETAUTHINFO failed: %s (%d)", 327 strerror(errno), errno); 328 hci_close_dev(dd); 329 return err; 330 } 331 332 hci_close_dev(dd); 333 334 if (auth) 335 *auth = req.type; 336 337 return 0; 338 } 339 340 int hcid_dbus_user_confirm(bdaddr_t *sba, bdaddr_t *dba, uint32_t passkey) 341 { 342 struct btd_adapter *adapter; 343 struct btd_device *device; 344 uint8_t remcap, remauth, type; 345 uint16_t dev_id; 346 347 if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE)) 348 return -ENODEV; 349 350 dev_id = adapter_get_dev_id(adapter); 351 352 if (get_auth_requirements(sba, dba, &type) < 0) { 353 int dd; 354 355 dd = hci_open_dev(dev_id); 356 if (dd < 0) { 357 error("Unable to open hci%d", dev_id); 358 return -1; 359 } 360 361 hci_send_cmd(dd, OGF_LINK_CTL, 362 OCF_USER_CONFIRM_NEG_REPLY, 6, dba); 363 364 hci_close_dev(dd); 365 366 return 0; 367 } 368 369 debug("confirm authentication requirement is 0x%02x", type); 370 371 remcap = device_get_cap(device); 372 remauth = device_get_auth(device); 373 374 debug("remote IO capabilities are 0x%02x", remcap); 375 debug("remote authentication requirement is 0x%02x", remauth); 376 377 /* If local IO capabilities are DisplayYesNo and remote IO 378 * capabiltiies are DisplayOnly or NoInputNoOutput; 379 * call PairingConsent callback for incoming requests. */ 380 struct agent *agent = NULL; 381 agent = device_get_agent(device); 382 if (!agent) { 383 agent = adapter_get_agent(adapter); 384 if ((agent_get_io_capability(agent) & 0x01) && 385 (remcap == 0x00 || remcap == 0x03)) 386 return device_request_authentication(device, 387 AUTH_TYPE_PAIRING_CONSENT, 0, 388 pairing_consent_cb); 389 } 390 391 /* If no side requires MITM protection; auto-accept */ 392 if (!(remauth & 0x01) && 393 (type == 0xff || !(type & 0x01) || remcap == 0x03)) { 394 int dd; 395 396 /* Wait 5 milliseconds before doing auto-accept */ 397 usleep(5000); 398 399 dd = hci_open_dev(dev_id); 400 if (dd < 0) { 401 error("Unable to open hci%d", dev_id); 402 return -1; 403 } 404 405 hci_send_cmd(dd, OGF_LINK_CTL, 406 OCF_USER_CONFIRM_REPLY, 6, dba); 407 408 hci_close_dev(dd); 409 410 debug("auto accept of confirmation"); 411 412 return device_request_authentication(device, 413 AUTH_TYPE_AUTO, 0, NULL); 414 } 415 416 return device_request_authentication(device, AUTH_TYPE_CONFIRM, 417 passkey, confirm_cb); 418 } 419 420 int hcid_dbus_user_passkey(bdaddr_t *sba, bdaddr_t *dba) 421 { 422 struct btd_adapter *adapter; 423 struct btd_device *device; 424 425 if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE)) 426 return -ENODEV; 427 428 return device_request_authentication(device, AUTH_TYPE_PASSKEY, 0, 429 passkey_cb); 430 } 431 432 int hcid_dbus_user_notify(bdaddr_t *sba, bdaddr_t *dba, uint32_t passkey) 433 { 434 struct btd_adapter *adapter; 435 struct btd_device *device; 436 437 if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE)) 438 return -ENODEV; 439 440 return device_request_authentication(device, AUTH_TYPE_NOTIFY, 441 passkey, NULL); 442 } 443 444 void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer, 445 uint8_t status) 446 { 447 struct btd_adapter *adapter; 448 struct btd_device *device; 449 450 debug("hcid_dbus_bonding_process_complete: status=%02x", status); 451 452 if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE)) 453 return; 454 455 if (!device_is_authenticating(device)) { 456 /* This means that there was no pending PIN or SSP token 457 * request from the controller, i.e. this is not a new 458 * pairing */ 459 debug("hcid_dbus_bonding_process_complete: no pending auth request"); 460 return; 461 } 462 463 /* If this is a new pairing send the appropriate reply and signal for 464 * it and proceed with service discovery */ 465 device_bonding_complete(device, status); 466 } 467 468 void hcid_dbus_simple_pairing_complete(bdaddr_t *local, bdaddr_t *peer, 469 uint8_t status) 470 { 471 struct btd_adapter *adapter; 472 struct btd_device *device; 473 474 debug("hcid_dbus_simple_pairing_complete: status=%02x", status); 475 476 if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE)) 477 return; 478 479 device_simple_pairing_complete(device, status); 480 } 481 482 static char *extract_eir_name(uint8_t *data, uint8_t *type) 483 { 484 if (!data || !type) 485 return NULL; 486 487 if (data[0] == 0) 488 return NULL; 489 490 *type = data[1]; 491 492 switch (*type) { 493 case 0x08: 494 case 0x09: 495 return strndup((char *) (data + 2), data[0] - 1); 496 } 497 498 return NULL; 499 } 500 501 void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, 502 int8_t rssi, uint8_t *data) 503 { 504 char filename[PATH_MAX + 1]; 505 struct btd_adapter *adapter; 506 struct btd_device *device; 507 char local_addr[18], peer_addr[18], *alias, *name, *tmp_name; 508 struct remote_dev_info *dev, match; 509 uint8_t name_type = 0x00; 510 name_status_t name_status; 511 int state; 512 dbus_bool_t legacy; 513 514 ba2str(local, local_addr); 515 ba2str(peer, peer_addr); 516 517 if (!get_adapter_and_device(local, peer, &adapter, &device, FALSE)) { 518 error("No matching adapter found"); 519 return; 520 } 521 522 write_remote_class(local, peer, class); 523 524 if (data) 525 write_remote_eir(local, peer, data); 526 527 /* 528 * workaround to identify situation when the daemon started and 529 * a standard inquiry or periodic inquiry was already running 530 */ 531 if (!(adapter_get_state(adapter) & STD_INQUIRY) && 532 !(adapter_get_state(adapter) & PERIODIC_INQUIRY)) { 533 state = adapter_get_state(adapter); 534 state |= PERIODIC_INQUIRY; 535 adapter_set_state(adapter, state); 536 } 537 538 legacy = (data == NULL); 539 540 memset(&match, 0, sizeof(struct remote_dev_info)); 541 bacpy(&match.bdaddr, peer); 542 match.name_status = NAME_SENT; 543 /* if found: don't send the name again */ 544 dev = adapter_search_found_devices(adapter, &match); 545 if (dev) { 546 adapter_update_found_devices(adapter, peer, rssi, class, 547 NULL, NULL, legacy, 548 NAME_NOT_REQUIRED); 549 return; 550 } 551 552 /* the inquiry result can be triggered by NON D-Bus client */ 553 if (adapter_get_state(adapter) & RESOLVE_NAME) 554 name_status = NAME_REQUIRED; 555 else 556 name_status = NAME_NOT_REQUIRED; 557 558 create_name(filename, PATH_MAX, STORAGEDIR, local_addr, "aliases"); 559 alias = textfile_get(filename, peer_addr); 560 561 create_name(filename, PATH_MAX, STORAGEDIR, local_addr, "names"); 562 name = textfile_get(filename, peer_addr); 563 564 tmp_name = extract_eir_name(data, &name_type); 565 if (tmp_name) { 566 if (name_type == 0x09) { 567 write_device_name(local, peer, tmp_name); 568 name_status = NAME_NOT_REQUIRED; 569 570 if (name) 571 g_free(name); 572 573 name = tmp_name; 574 } else { 575 if (name) 576 free(tmp_name); 577 else 578 name = tmp_name; 579 } 580 } 581 582 583 if (name && name_type != 0x08) 584 name_status = NAME_SENT; 585 586 /* add in the list to track name sent/pending */ 587 adapter_update_found_devices(adapter, peer, rssi, class, name, alias, 588 legacy, name_status); 589 590 g_free(name); 591 g_free(alias); 592 } 593 594 void hcid_dbus_remote_class(bdaddr_t *local, bdaddr_t *peer, uint32_t class) 595 { 596 uint32_t old_class = 0; 597 struct btd_adapter *adapter; 598 struct btd_device *device; 599 const gchar *dev_path; 600 601 read_remote_class(local, peer, &old_class); 602 603 if (old_class == class) 604 return; 605 606 if (!get_adapter_and_device(local, peer, &adapter, &device, FALSE)) 607 return; 608 609 if (!device) 610 return; 611 612 dev_path = device_get_path(device); 613 614 emit_property_changed(connection, dev_path, DEVICE_INTERFACE, "Class", 615 DBUS_TYPE_UINT32, &class); 616 } 617 618 void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status, 619 char *name) 620 { 621 struct btd_adapter *adapter; 622 char srcaddr[18], dstaddr[18]; 623 int state; 624 struct btd_device *device; 625 struct remote_dev_info match, *dev_info; 626 627 if (!get_adapter_and_device(local, peer, &adapter, &device, FALSE)) 628 return; 629 630 ba2str(local, srcaddr); 631 ba2str(peer, dstaddr); 632 633 if (status != 0) 634 goto proceed; 635 636 bacpy(&match.bdaddr, peer); 637 match.name_status = NAME_ANY; 638 639 dev_info = adapter_search_found_devices(adapter, &match); 640 if (dev_info) { 641 g_free(dev_info->name); 642 dev_info->name = g_strdup(name); 643 adapter_emit_device_found(adapter, dev_info); 644 } 645 646 if (device) 647 device_set_name(device, name); 648 649 proceed: 650 /* remove from remote name request list */ 651 adapter_remove_found_device(adapter, peer); 652 653 /* check if there is more devices to request names */ 654 if (adapter_resolve_names(adapter) == 0) 655 return; 656 657 state = adapter_get_state(adapter); 658 state &= ~PERIODIC_INQUIRY; 659 state &= ~STD_INQUIRY; 660 adapter_set_state(adapter, state); 661 } 662 663 int hcid_dbus_link_key_notify(bdaddr_t *local, bdaddr_t *peer, 664 uint8_t *key, uint8_t key_type, 665 int pin_length, uint8_t old_key_type) 666 { 667 struct btd_device *device; 668 struct btd_adapter *adapter; 669 uint8_t local_auth = 0xff, remote_auth, new_key_type; 670 gboolean bonding; 671 672 if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE)) 673 return -ENODEV; 674 675 if (key_type == 0x06 && old_key_type != 0xff) 676 new_key_type = old_key_type; 677 else 678 new_key_type = key_type; 679 680 get_auth_requirements(local, peer, &local_auth); 681 remote_auth = device_get_auth(device); 682 bonding = device_is_bonding(device, NULL); 683 684 debug("local auth 0x%02x and remote auth 0x%02x", 685 local_auth, remote_auth); 686 687 /* Only store the link key if one of the following is true: 688 * 1. this is a legacy link key 689 * 2. this is a changed combination key and there was a previously 690 * stored one 691 * 3. neither local nor remote side had no-bonding as a requirement 692 * 4. the local side had dedicated bonding as a requirement 693 * 5. the remote side is using dedicated bonding since in that case 694 * also the local requirements are set to dedicated bonding 695 */ 696 if (key_type < 0x03 || (key_type == 0x06 && old_key_type != 0xff) || 697 (local_auth > 0x01 && remote_auth > 0x01) || 698 (local_auth == 0x02 || local_auth == 0x03) || 699 (remote_auth == 0x02 || remote_auth == 0x03)) { 700 int err; 701 702 debug("storing link key of type 0x%02x", key_type); 703 704 err = write_link_key(local, peer, key, new_key_type, 705 pin_length); 706 if (err < 0) { 707 error("write_link_key: %s (%d)", strerror(-err), -err); 708 return err; 709 } 710 } 711 712 /* If this is not the first link key set a flag so a subsequent auth 713 * complete event doesn't trigger SDP */ 714 if (old_key_type != 0xff) 715 device_set_renewed_key(device, TRUE); 716 717 if (!device_is_connected(device)) 718 device_set_secmode3_conn(device, TRUE); 719 else if (!bonding && old_key_type == 0xff) 720 hcid_dbus_bonding_process_complete(local, peer, 0); 721 722 return 0; 723 } 724 725 void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle, 726 bdaddr_t *peer) 727 { 728 struct btd_adapter *adapter; 729 struct btd_device *device; 730 731 if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE)) 732 return; 733 734 if (status) { 735 device_set_secmode3_conn(device, FALSE); 736 if (device_is_bonding(device, NULL)) 737 device_bonding_complete(device, status); 738 if (device_is_temporary(device)) 739 adapter_remove_device(connection, adapter, device); 740 return; 741 } 742 743 /* add in the device connetions list */ 744 adapter_add_connection(adapter, device, handle); 745 } 746 747 void hcid_dbus_disconn_complete(bdaddr_t *local, uint8_t status, 748 uint16_t handle, uint8_t reason) 749 { 750 struct btd_adapter *adapter; 751 struct btd_device *device; 752 753 if (status) { 754 error("Disconnection failed: 0x%02x", status); 755 return; 756 } 757 758 adapter = manager_find_adapter(local); 759 if (!adapter) { 760 error("No matching adapter found"); 761 return; 762 } 763 764 device = adapter_find_connection(adapter, handle); 765 if (!device) { 766 error("No matching connection found for handle %u", handle); 767 return; 768 } 769 770 adapter_remove_connection(adapter, device, handle); 771 } 772 773 /* Section reserved to device HCI callbacks */ 774 775 void hcid_dbus_setscan_enable_complete(bdaddr_t *local) 776 { 777 struct btd_adapter *adapter; 778 read_scan_enable_rp rp; 779 struct hci_request rq; 780 int dd = -1; 781 uint16_t dev_id; 782 783 adapter = manager_find_adapter(local); 784 if (!adapter) { 785 error("No matching adapter found"); 786 return; 787 } 788 789 if (adapter_powering_down(adapter)) 790 return; 791 792 dev_id = adapter_get_dev_id(adapter); 793 794 dd = hci_open_dev(dev_id); 795 if (dd < 0) { 796 error("HCI device open failed: hci%d", dev_id); 797 return; 798 } 799 800 memset(&rq, 0, sizeof(rq)); 801 rq.ogf = OGF_HOST_CTL; 802 rq.ocf = OCF_READ_SCAN_ENABLE; 803 rq.rparam = &rp; 804 rq.rlen = READ_SCAN_ENABLE_RP_SIZE; 805 rq.event = EVT_CMD_COMPLETE; 806 807 if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) { 808 error("Sending read scan enable command failed: %s (%d)", 809 strerror(errno), errno); 810 goto failed; 811 } 812 813 if (rp.status) { 814 error("Getting scan enable failed with status 0x%02x", 815 rp.status); 816 goto failed; 817 } 818 819 adapter_mode_changed(adapter, rp.enable); 820 821 failed: 822 if (dd >= 0) 823 hci_close_dev(dd); 824 } 825 826 void hcid_dbus_write_class_complete(bdaddr_t *local) 827 { 828 struct btd_adapter *adapter; 829 int dd; 830 uint8_t cls[3]; 831 uint16_t dev_id; 832 833 adapter = manager_find_adapter(local); 834 if (!adapter) { 835 error("No matching adapter found"); 836 return; 837 } 838 839 dev_id = adapter_get_dev_id(adapter); 840 841 dd = hci_open_dev(dev_id); 842 if (dd < 0) { 843 error("HCI device open failed: hci%d", dev_id); 844 return; 845 } 846 847 if (hci_read_class_of_dev(dd, cls, HCI_REQ_TIMEOUT) < 0) { 848 error("Can't read class of device on hci%d: %s (%d)", 849 dev_id, strerror(errno), errno); 850 hci_close_dev(dd); 851 return; 852 } 853 854 hci_close_dev(dd); 855 856 adapter_set_class(adapter, cls); 857 } 858 859 void hcid_dbus_write_simple_pairing_mode_complete(bdaddr_t *local) 860 { 861 struct btd_adapter *adapter; 862 int dd; 863 uint8_t mode; 864 uint16_t dev_id; 865 const gchar *path; 866 867 adapter = manager_find_adapter(local); 868 if (!adapter) { 869 error("No matching adapter found"); 870 return; 871 } 872 873 dev_id = adapter_get_dev_id(adapter); 874 path = adapter_get_path(adapter); 875 876 dd = hci_open_dev(dev_id); 877 if (dd < 0) { 878 error("HCI adapter open failed: %s", path); 879 return; 880 } 881 882 if (hci_read_simple_pairing_mode(dd, &mode, 883 HCI_REQ_TIMEOUT) < 0) { 884 error("Can't read simple pairing mode for %s: %s(%d)", 885 path, strerror(errno), errno); 886 hci_close_dev(dd); 887 return; 888 } 889 890 hci_close_dev(dd); 891 892 adapter_update_ssp_mode(adapter, mode); 893 } 894 895 int hcid_dbus_get_io_cap(bdaddr_t *local, bdaddr_t *remote, 896 uint8_t *cap, uint8_t *auth) 897 { 898 struct btd_adapter *adapter; 899 struct btd_device *device; 900 struct agent *agent = NULL; 901 902 if (!get_adapter_and_device(local, remote, &adapter, &device, TRUE)) 903 return -ENODEV; 904 905 if (get_auth_requirements(local, remote, auth) < 0) 906 return -1; 907 908 debug("initial authentication requirement is 0x%02x", *auth); 909 910 if (*auth == 0xff) 911 *auth = device_get_auth(device); 912 913 /* Check if the adapter is not pairable and if there isn't a bonding 914 * in progress */ 915 if (!adapter_is_pairable(adapter) && 916 !device_is_bonding(device, NULL)) { 917 if (*auth < 0x02 && device_get_auth(device) < 0x02) { 918 debug("Allowing no bonding in non-bondable mode"); 919 /* No input, no output */ 920 *cap = 0x03; 921 goto done; 922 } 923 return -EPERM; 924 } 925 926 /* For CreatePairedDevice use dedicated bonding */ 927 agent = device_get_agent(device); 928 if (!agent) 929 agent = adapter_get_agent(adapter); 930 931 if (!agent) { 932 /* This is the non bondable mode case */ 933 if (device_get_auth(device) > 0x01) { 934 debug("Bonding request, but no agent present"); 935 return -1; 936 } 937 938 /* No agent available, and no bonding case */ 939 if (*auth == 0x00) { 940 debug("Allowing no bonding without agent"); 941 /* No input, no output */ 942 *cap = 0x03; 943 goto done; 944 } 945 946 error("No agent available for IO capability"); 947 return -1; 948 } 949 950 if (*auth == 0x00) { 951 /* If remote requests dedicated bonding follow that lead */ 952 if (device_get_auth(device) == 0x02 || 953 device_get_auth(device) == 0x03) { 954 uint8_t agent_cap = agent_get_io_capability(agent); 955 956 /* If both remote and local IO capabilities allow MITM 957 * then require it, otherwise don't */ 958 if (device_get_cap(device) == 0x03 || 959 agent_cap == 0x03) 960 *auth = 0x02; 961 else 962 *auth = 0x03; 963 } 964 965 /* If remote requires MITM then also require it */ 966 if (device_get_auth(device) != 0xff && 967 (device_get_auth(device) & 0x01)) 968 *auth |= 0x01; 969 } 970 971 *cap = agent_get_io_capability(agent); 972 973 done: 974 debug("final authentication requirement is 0x%02x", *auth); 975 976 return 0; 977 } 978 979 int hcid_dbus_set_io_cap(bdaddr_t *local, bdaddr_t *remote, 980 uint8_t cap, uint8_t auth) 981 { 982 struct btd_adapter *adapter; 983 struct btd_device *device; 984 985 if (!get_adapter_and_device(local, remote, &adapter, &device, TRUE)) 986 return -ENODEV; 987 988 device_set_cap(device, cap); 989 device_set_auth(device, auth); 990 991 return 0; 992 } 993 994 /* Most of the functions in this module require easy access to a connection so 995 * we keep it global here and provide these access functions the other (few) 996 * modules that require access to it */ 997 998 void set_dbus_connection(DBusConnection *conn) 999 { 1000 connection = conn; 1001 } 1002 1003 DBusConnection *get_dbus_connection(void) 1004 { 1005 return connection; 1006 } 1007