diff options
Diffstat (limited to 'net/bluetooth/hci_conn.c')
-rw-r--r-- | net/bluetooth/hci_conn.c | 206 |
1 files changed, 138 insertions, 68 deletions
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index ba5366c320da..7c713c4675ba 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
@@ -225,13 +225,13 @@ void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max, | |||
225 | cp.conn_interval_max = cpu_to_le16(max); | 225 | cp.conn_interval_max = cpu_to_le16(max); |
226 | cp.conn_latency = cpu_to_le16(latency); | 226 | cp.conn_latency = cpu_to_le16(latency); |
227 | cp.supervision_timeout = cpu_to_le16(to_multiplier); | 227 | cp.supervision_timeout = cpu_to_le16(to_multiplier); |
228 | cp.min_ce_len = __constant_cpu_to_le16(0x0001); | 228 | cp.min_ce_len = __constant_cpu_to_le16(0x0000); |
229 | cp.max_ce_len = __constant_cpu_to_le16(0x0001); | 229 | cp.max_ce_len = __constant_cpu_to_le16(0x0000); |
230 | 230 | ||
231 | hci_send_cmd(hdev, HCI_OP_LE_CONN_UPDATE, sizeof(cp), &cp); | 231 | hci_send_cmd(hdev, HCI_OP_LE_CONN_UPDATE, sizeof(cp), &cp); |
232 | } | 232 | } |
233 | 233 | ||
234 | void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8], | 234 | void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __le64 rand, |
235 | __u8 ltk[16]) | 235 | __u8 ltk[16]) |
236 | { | 236 | { |
237 | struct hci_dev *hdev = conn->hdev; | 237 | struct hci_dev *hdev = conn->hdev; |
@@ -242,9 +242,9 @@ void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8], | |||
242 | memset(&cp, 0, sizeof(cp)); | 242 | memset(&cp, 0, sizeof(cp)); |
243 | 243 | ||
244 | cp.handle = cpu_to_le16(conn->handle); | 244 | cp.handle = cpu_to_le16(conn->handle); |
245 | memcpy(cp.ltk, ltk, sizeof(cp.ltk)); | 245 | cp.rand = rand; |
246 | cp.ediv = ediv; | 246 | cp.ediv = ediv; |
247 | memcpy(cp.rand, rand, sizeof(cp.rand)); | 247 | memcpy(cp.ltk, ltk, sizeof(cp.ltk)); |
248 | 248 | ||
249 | hci_send_cmd(hdev, HCI_OP_LE_START_ENC, sizeof(cp), &cp); | 249 | hci_send_cmd(hdev, HCI_OP_LE_START_ENC, sizeof(cp), &cp); |
250 | } | 250 | } |
@@ -363,6 +363,16 @@ static void hci_conn_auto_accept(struct work_struct *work) | |||
363 | &conn->dst); | 363 | &conn->dst); |
364 | } | 364 | } |
365 | 365 | ||
366 | static void le_conn_timeout(struct work_struct *work) | ||
367 | { | ||
368 | struct hci_conn *conn = container_of(work, struct hci_conn, | ||
369 | le_conn_timeout.work); | ||
370 | |||
371 | BT_DBG(""); | ||
372 | |||
373 | hci_le_create_connection_cancel(conn); | ||
374 | } | ||
375 | |||
366 | struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) | 376 | struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) |
367 | { | 377 | { |
368 | struct hci_conn *conn; | 378 | struct hci_conn *conn; |
@@ -410,6 +420,7 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) | |||
410 | INIT_DELAYED_WORK(&conn->disc_work, hci_conn_timeout); | 420 | INIT_DELAYED_WORK(&conn->disc_work, hci_conn_timeout); |
411 | INIT_DELAYED_WORK(&conn->auto_accept_work, hci_conn_auto_accept); | 421 | INIT_DELAYED_WORK(&conn->auto_accept_work, hci_conn_auto_accept); |
412 | INIT_DELAYED_WORK(&conn->idle_work, hci_conn_idle); | 422 | INIT_DELAYED_WORK(&conn->idle_work, hci_conn_idle); |
423 | INIT_DELAYED_WORK(&conn->le_conn_timeout, le_conn_timeout); | ||
413 | 424 | ||
414 | atomic_set(&conn->refcnt, 0); | 425 | atomic_set(&conn->refcnt, 0); |
415 | 426 | ||
@@ -442,6 +453,8 @@ int hci_conn_del(struct hci_conn *conn) | |||
442 | /* Unacked frames */ | 453 | /* Unacked frames */ |
443 | hdev->acl_cnt += conn->sent; | 454 | hdev->acl_cnt += conn->sent; |
444 | } else if (conn->type == LE_LINK) { | 455 | } else if (conn->type == LE_LINK) { |
456 | cancel_delayed_work_sync(&conn->le_conn_timeout); | ||
457 | |||
445 | if (hdev->le_pkts) | 458 | if (hdev->le_pkts) |
446 | hdev->le_cnt += conn->sent; | 459 | hdev->le_cnt += conn->sent; |
447 | else | 460 | else |
@@ -514,6 +527,26 @@ struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src) | |||
514 | } | 527 | } |
515 | EXPORT_SYMBOL(hci_get_route); | 528 | EXPORT_SYMBOL(hci_get_route); |
516 | 529 | ||
530 | /* This function requires the caller holds hdev->lock */ | ||
531 | void hci_le_conn_failed(struct hci_conn *conn, u8 status) | ||
532 | { | ||
533 | struct hci_dev *hdev = conn->hdev; | ||
534 | |||
535 | conn->state = BT_CLOSED; | ||
536 | |||
537 | mgmt_connect_failed(hdev, &conn->dst, conn->type, conn->dst_type, | ||
538 | status); | ||
539 | |||
540 | hci_proto_connect_cfm(conn, status); | ||
541 | |||
542 | hci_conn_del(conn); | ||
543 | |||
544 | /* Since we may have temporarily stopped the background scanning in | ||
545 | * favor of connection establishment, we should restart it. | ||
546 | */ | ||
547 | hci_update_background_scan(hdev); | ||
548 | } | ||
549 | |||
517 | static void create_le_conn_complete(struct hci_dev *hdev, u8 status) | 550 | static void create_le_conn_complete(struct hci_dev *hdev, u8 status) |
518 | { | 551 | { |
519 | struct hci_conn *conn; | 552 | struct hci_conn *conn; |
@@ -530,55 +563,55 @@ static void create_le_conn_complete(struct hci_dev *hdev, u8 status) | |||
530 | if (!conn) | 563 | if (!conn) |
531 | goto done; | 564 | goto done; |
532 | 565 | ||
533 | conn->state = BT_CLOSED; | 566 | hci_le_conn_failed(conn, status); |
534 | |||
535 | mgmt_connect_failed(hdev, &conn->dst, conn->type, conn->dst_type, | ||
536 | status); | ||
537 | |||
538 | hci_proto_connect_cfm(conn, status); | ||
539 | |||
540 | hci_conn_del(conn); | ||
541 | 567 | ||
542 | done: | 568 | done: |
543 | hci_dev_unlock(hdev); | 569 | hci_dev_unlock(hdev); |
544 | } | 570 | } |
545 | 571 | ||
546 | static int hci_create_le_conn(struct hci_conn *conn) | 572 | static void hci_req_add_le_create_conn(struct hci_request *req, |
573 | struct hci_conn *conn) | ||
547 | { | 574 | { |
548 | struct hci_dev *hdev = conn->hdev; | ||
549 | struct hci_cp_le_create_conn cp; | 575 | struct hci_cp_le_create_conn cp; |
550 | struct hci_request req; | 576 | struct hci_dev *hdev = conn->hdev; |
551 | int err; | 577 | u8 own_addr_type; |
552 | |||
553 | hci_req_init(&req, hdev); | ||
554 | 578 | ||
555 | memset(&cp, 0, sizeof(cp)); | 579 | memset(&cp, 0, sizeof(cp)); |
580 | |||
581 | /* Update random address, but set require_privacy to false so | ||
582 | * that we never connect with an unresolvable address. | ||
583 | */ | ||
584 | if (hci_update_random_address(req, false, &own_addr_type)) | ||
585 | return; | ||
586 | |||
587 | /* Save the address type used for this connnection attempt so we able | ||
588 | * to retrieve this information if we need it. | ||
589 | */ | ||
590 | conn->src_type = own_addr_type; | ||
591 | |||
556 | cp.scan_interval = cpu_to_le16(hdev->le_scan_interval); | 592 | cp.scan_interval = cpu_to_le16(hdev->le_scan_interval); |
557 | cp.scan_window = cpu_to_le16(hdev->le_scan_window); | 593 | cp.scan_window = cpu_to_le16(hdev->le_scan_window); |
558 | bacpy(&cp.peer_addr, &conn->dst); | 594 | bacpy(&cp.peer_addr, &conn->dst); |
559 | cp.peer_addr_type = conn->dst_type; | 595 | cp.peer_addr_type = conn->dst_type; |
560 | cp.own_address_type = conn->src_type; | 596 | cp.own_address_type = own_addr_type; |
561 | cp.conn_interval_min = cpu_to_le16(hdev->le_conn_min_interval); | 597 | cp.conn_interval_min = cpu_to_le16(conn->le_conn_min_interval); |
562 | cp.conn_interval_max = cpu_to_le16(hdev->le_conn_max_interval); | 598 | cp.conn_interval_max = cpu_to_le16(conn->le_conn_max_interval); |
563 | cp.supervision_timeout = __constant_cpu_to_le16(0x002a); | 599 | cp.supervision_timeout = __constant_cpu_to_le16(0x002a); |
564 | cp.min_ce_len = __constant_cpu_to_le16(0x0000); | 600 | cp.min_ce_len = __constant_cpu_to_le16(0x0000); |
565 | cp.max_ce_len = __constant_cpu_to_le16(0x0000); | 601 | cp.max_ce_len = __constant_cpu_to_le16(0x0000); |
566 | 602 | ||
567 | hci_req_add(&req, HCI_OP_LE_CREATE_CONN, sizeof(cp), &cp); | 603 | hci_req_add(req, HCI_OP_LE_CREATE_CONN, sizeof(cp), &cp); |
568 | |||
569 | err = hci_req_run(&req, create_le_conn_complete); | ||
570 | if (err) { | ||
571 | hci_conn_del(conn); | ||
572 | return err; | ||
573 | } | ||
574 | 604 | ||
575 | return 0; | 605 | conn->state = BT_CONNECT; |
576 | } | 606 | } |
577 | 607 | ||
578 | static struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, | 608 | struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, |
579 | u8 dst_type, u8 sec_level, u8 auth_type) | 609 | u8 dst_type, u8 sec_level, u8 auth_type) |
580 | { | 610 | { |
611 | struct hci_conn_params *params; | ||
581 | struct hci_conn *conn; | 612 | struct hci_conn *conn; |
613 | struct smp_irk *irk; | ||
614 | struct hci_request req; | ||
582 | int err; | 615 | int err; |
583 | 616 | ||
584 | if (test_bit(HCI_ADVERTISING, &hdev->flags)) | 617 | if (test_bit(HCI_ADVERTISING, &hdev->flags)) |
@@ -607,35 +640,74 @@ static struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, | |||
607 | if (conn) | 640 | if (conn) |
608 | return ERR_PTR(-EBUSY); | 641 | return ERR_PTR(-EBUSY); |
609 | 642 | ||
643 | /* When given an identity address with existing identity | ||
644 | * resolving key, the connection needs to be established | ||
645 | * to a resolvable random address. | ||
646 | * | ||
647 | * This uses the cached random resolvable address from | ||
648 | * a previous scan. When no cached address is available, | ||
649 | * try connecting to the identity address instead. | ||
650 | * | ||
651 | * Storing the resolvable random address is required here | ||
652 | * to handle connection failures. The address will later | ||
653 | * be resolved back into the original identity address | ||
654 | * from the connect request. | ||
655 | */ | ||
656 | irk = hci_find_irk_by_addr(hdev, dst, dst_type); | ||
657 | if (irk && bacmp(&irk->rpa, BDADDR_ANY)) { | ||
658 | dst = &irk->rpa; | ||
659 | dst_type = ADDR_LE_DEV_RANDOM; | ||
660 | } | ||
661 | |||
610 | conn = hci_conn_add(hdev, LE_LINK, dst); | 662 | conn = hci_conn_add(hdev, LE_LINK, dst); |
611 | if (!conn) | 663 | if (!conn) |
612 | return ERR_PTR(-ENOMEM); | 664 | return ERR_PTR(-ENOMEM); |
613 | 665 | ||
614 | if (dst_type == BDADDR_LE_PUBLIC) | 666 | conn->dst_type = dst_type; |
615 | conn->dst_type = ADDR_LE_DEV_PUBLIC; | ||
616 | else | ||
617 | conn->dst_type = ADDR_LE_DEV_RANDOM; | ||
618 | |||
619 | conn->src_type = hdev->own_addr_type; | ||
620 | 667 | ||
621 | conn->state = BT_CONNECT; | ||
622 | conn->out = true; | 668 | conn->out = true; |
623 | conn->link_mode |= HCI_LM_MASTER; | 669 | conn->link_mode |= HCI_LM_MASTER; |
624 | conn->sec_level = BT_SECURITY_LOW; | 670 | conn->sec_level = BT_SECURITY_LOW; |
625 | conn->pending_sec_level = sec_level; | 671 | conn->pending_sec_level = sec_level; |
626 | conn->auth_type = auth_type; | 672 | conn->auth_type = auth_type; |
627 | 673 | ||
628 | err = hci_create_le_conn(conn); | 674 | params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type); |
629 | if (err) | 675 | if (params) { |
676 | conn->le_conn_min_interval = params->conn_min_interval; | ||
677 | conn->le_conn_max_interval = params->conn_max_interval; | ||
678 | } else { | ||
679 | conn->le_conn_min_interval = hdev->le_conn_min_interval; | ||
680 | conn->le_conn_max_interval = hdev->le_conn_max_interval; | ||
681 | } | ||
682 | |||
683 | hci_req_init(&req, hdev); | ||
684 | |||
685 | /* If controller is scanning, we stop it since some controllers are | ||
686 | * not able to scan and connect at the same time. Also set the | ||
687 | * HCI_LE_SCAN_INTERRUPTED flag so that the command complete | ||
688 | * handler for scan disabling knows to set the correct discovery | ||
689 | * state. | ||
690 | */ | ||
691 | if (test_bit(HCI_LE_SCAN, &hdev->dev_flags)) { | ||
692 | hci_req_add_le_scan_disable(&req); | ||
693 | set_bit(HCI_LE_SCAN_INTERRUPTED, &hdev->dev_flags); | ||
694 | } | ||
695 | |||
696 | hci_req_add_le_create_conn(&req, conn); | ||
697 | |||
698 | err = hci_req_run(&req, create_le_conn_complete); | ||
699 | if (err) { | ||
700 | hci_conn_del(conn); | ||
630 | return ERR_PTR(err); | 701 | return ERR_PTR(err); |
702 | } | ||
631 | 703 | ||
632 | done: | 704 | done: |
633 | hci_conn_hold(conn); | 705 | hci_conn_hold(conn); |
634 | return conn; | 706 | return conn; |
635 | } | 707 | } |
636 | 708 | ||
637 | static struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst, | 709 | struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst, |
638 | u8 sec_level, u8 auth_type) | 710 | u8 sec_level, u8 auth_type) |
639 | { | 711 | { |
640 | struct hci_conn *acl; | 712 | struct hci_conn *acl; |
641 | 713 | ||
@@ -704,22 +776,6 @@ struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst, | |||
704 | return sco; | 776 | return sco; |
705 | } | 777 | } |
706 | 778 | ||
707 | /* Create SCO, ACL or LE connection. */ | ||
708 | struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, | ||
709 | __u8 dst_type, __u8 sec_level, __u8 auth_type) | ||
710 | { | ||
711 | BT_DBG("%s dst %pMR type 0x%x", hdev->name, dst, type); | ||
712 | |||
713 | switch (type) { | ||
714 | case LE_LINK: | ||
715 | return hci_connect_le(hdev, dst, dst_type, sec_level, auth_type); | ||
716 | case ACL_LINK: | ||
717 | return hci_connect_acl(hdev, dst, sec_level, auth_type); | ||
718 | } | ||
719 | |||
720 | return ERR_PTR(-EINVAL); | ||
721 | } | ||
722 | |||
723 | /* Check link security requirement */ | 779 | /* Check link security requirement */ |
724 | int hci_conn_check_link_mode(struct hci_conn *conn) | 780 | int hci_conn_check_link_mode(struct hci_conn *conn) |
725 | { | 781 | { |
@@ -800,14 +856,23 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) | |||
800 | if (!(conn->link_mode & HCI_LM_AUTH)) | 856 | if (!(conn->link_mode & HCI_LM_AUTH)) |
801 | goto auth; | 857 | goto auth; |
802 | 858 | ||
803 | /* An authenticated combination key has sufficient security for any | 859 | /* An authenticated FIPS approved combination key has sufficient |
804 | security level. */ | 860 | * security for security level 4. */ |
805 | if (conn->key_type == HCI_LK_AUTH_COMBINATION) | 861 | if (conn->key_type == HCI_LK_AUTH_COMBINATION_P256 && |
862 | sec_level == BT_SECURITY_FIPS) | ||
863 | goto encrypt; | ||
864 | |||
865 | /* An authenticated combination key has sufficient security for | ||
866 | security level 3. */ | ||
867 | if ((conn->key_type == HCI_LK_AUTH_COMBINATION_P192 || | ||
868 | conn->key_type == HCI_LK_AUTH_COMBINATION_P256) && | ||
869 | sec_level == BT_SECURITY_HIGH) | ||
806 | goto encrypt; | 870 | goto encrypt; |
807 | 871 | ||
808 | /* An unauthenticated combination key has sufficient security for | 872 | /* An unauthenticated combination key has sufficient security for |
809 | security level 1 and 2. */ | 873 | security level 1 and 2. */ |
810 | if (conn->key_type == HCI_LK_UNAUTH_COMBINATION && | 874 | if ((conn->key_type == HCI_LK_UNAUTH_COMBINATION_P192 || |
875 | conn->key_type == HCI_LK_UNAUTH_COMBINATION_P256) && | ||
811 | (sec_level == BT_SECURITY_MEDIUM || sec_level == BT_SECURITY_LOW)) | 876 | (sec_level == BT_SECURITY_MEDIUM || sec_level == BT_SECURITY_LOW)) |
812 | goto encrypt; | 877 | goto encrypt; |
813 | 878 | ||
@@ -816,7 +881,8 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) | |||
816 | is generated using maximum PIN code length (16). | 881 | is generated using maximum PIN code length (16). |
817 | For pre 2.1 units. */ | 882 | For pre 2.1 units. */ |
818 | if (conn->key_type == HCI_LK_COMBINATION && | 883 | if (conn->key_type == HCI_LK_COMBINATION && |
819 | (sec_level != BT_SECURITY_HIGH || conn->pin_length == 16)) | 884 | (sec_level == BT_SECURITY_MEDIUM || sec_level == BT_SECURITY_LOW || |
885 | conn->pin_length == 16)) | ||
820 | goto encrypt; | 886 | goto encrypt; |
821 | 887 | ||
822 | auth: | 888 | auth: |
@@ -840,13 +906,17 @@ int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level) | |||
840 | { | 906 | { |
841 | BT_DBG("hcon %p", conn); | 907 | BT_DBG("hcon %p", conn); |
842 | 908 | ||
843 | if (sec_level != BT_SECURITY_HIGH) | 909 | /* Accept if non-secure or higher security level is required */ |
844 | return 1; /* Accept if non-secure is required */ | 910 | if (sec_level != BT_SECURITY_HIGH && sec_level != BT_SECURITY_FIPS) |
911 | return 1; | ||
845 | 912 | ||
846 | if (conn->sec_level == BT_SECURITY_HIGH) | 913 | /* Accept if secure or higher security level is already present */ |
914 | if (conn->sec_level == BT_SECURITY_HIGH || | ||
915 | conn->sec_level == BT_SECURITY_FIPS) | ||
847 | return 1; | 916 | return 1; |
848 | 917 | ||
849 | return 0; /* Reject not secure link */ | 918 | /* Reject not secure link */ |
919 | return 0; | ||
850 | } | 920 | } |
851 | EXPORT_SYMBOL(hci_conn_check_secure); | 921 | EXPORT_SYMBOL(hci_conn_check_secure); |
852 | 922 | ||