aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth/hci_event.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2014-02-28 05:54:16 -0500
committerMarcel Holtmann <marcel@holtmann.org>2014-02-28 10:53:07 -0500
commitcb1d68f7a337142e283ef7fc78793a57ffb4cdc3 (patch)
treea49539f51e83e6e75742b4250f7a3daf065953ac /net/bluetooth/hci_event.c
parentb46e00308929cc0317a021a7ac050790f023b1ca (diff)
Bluetooth: Track LE initiator and responder address information
For SMP we need the local and remote addresses (and their types) that were used to establish the connection. These may be different from the Identity Addresses or even the current RPA. To guarantee that we have this information available and it is correct track these values separately from the very beginning of the connection. For outgoing connections we set the values as soon as we get a successful command status for HCI_LE_Create_Connection (for which the patch adds a command status handler function) and for incoming connections as soon as we get a LE Connection Complete HCI event. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/bluetooth/hci_event.c')
-rw-r--r--net/bluetooth/hci_event.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index e3d7151e808e..3ae8ae1a029c 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -1641,6 +1641,47 @@ static void hci_cs_accept_phylink(struct hci_dev *hdev, u8 status)
1641 amp_write_remote_assoc(hdev, cp->phy_handle); 1641 amp_write_remote_assoc(hdev, cp->phy_handle);
1642} 1642}
1643 1643
1644static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
1645{
1646 struct hci_cp_le_create_conn *cp;
1647 struct hci_conn *conn;
1648
1649 BT_DBG("%s status 0x%2.2x", hdev->name, status);
1650
1651 /* All connection failure handling is taken care of by the
1652 * hci_le_conn_failed function which is triggered by the HCI
1653 * request completion callbacks used for connecting.
1654 */
1655 if (status)
1656 return;
1657
1658 cp = hci_sent_cmd_data(hdev, HCI_OP_LE_CREATE_CONN);
1659 if (!cp)
1660 return;
1661
1662 hci_dev_lock(hdev);
1663
1664 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->peer_addr);
1665 if (!conn)
1666 goto unlock;
1667
1668 /* Store the initiator and responder address information which
1669 * is needed for SMP. These values will not change during the
1670 * lifetime of the connection.
1671 */
1672 conn->init_addr_type = cp->own_address_type;
1673 if (cp->own_address_type == ADDR_LE_DEV_RANDOM)
1674 bacpy(&conn->init_addr, &hdev->random_addr);
1675 else
1676 bacpy(&conn->init_addr, &hdev->bdaddr);
1677
1678 conn->resp_addr_type = cp->peer_addr_type;
1679 bacpy(&conn->resp_addr, &cp->peer_addr);
1680
1681unlock:
1682 hci_dev_unlock(hdev);
1683}
1684
1644static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) 1685static void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
1645{ 1686{
1646 __u8 status = *((__u8 *) skb->data); 1687 __u8 status = *((__u8 *) skb->data);
@@ -2532,6 +2573,10 @@ static void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
2532 hci_cs_accept_phylink(hdev, ev->status); 2573 hci_cs_accept_phylink(hdev, ev->status);
2533 break; 2574 break;
2534 2575
2576 case HCI_OP_LE_CREATE_CONN:
2577 hci_cs_le_create_conn(hdev, ev->status);
2578 break;
2579
2535 default: 2580 default:
2536 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode); 2581 BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
2537 break; 2582 break;
@@ -3716,6 +3761,39 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
3716 conn->out = true; 3761 conn->out = true;
3717 conn->link_mode |= HCI_LM_MASTER; 3762 conn->link_mode |= HCI_LM_MASTER;
3718 } 3763 }
3764
3765 /* If we didn't have a hci_conn object previously
3766 * but we're in master role this must be something
3767 * initiated using a white list. Since white list based
3768 * connections are not "first class citizens" we don't
3769 * have full tracking of them. Therefore, we go ahead
3770 * with a "best effort" approach of determining the
3771 * initiator address based on the HCI_PRIVACY flag.
3772 */
3773 if (conn->out) {
3774 conn->resp_addr_type = ev->bdaddr_type;
3775 bacpy(&conn->resp_addr, &ev->bdaddr);
3776 if (test_bit(HCI_PRIVACY, &hdev->dev_flags)) {
3777 conn->init_addr_type = ADDR_LE_DEV_RANDOM;
3778 bacpy(&conn->init_addr, &hdev->rpa);
3779 } else {
3780 hci_copy_identity_address(hdev,
3781 &conn->init_addr,
3782 &conn->init_addr_type);
3783 }
3784 } else {
3785 /* Set the responder (our side) address type based on
3786 * the advertising address type.
3787 */
3788 conn->resp_addr_type = hdev->adv_addr_type;
3789 if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM)
3790 bacpy(&conn->resp_addr, &hdev->random_addr);
3791 else
3792 bacpy(&conn->resp_addr, &hdev->bdaddr);
3793
3794 conn->init_addr_type = ev->bdaddr_type;
3795 bacpy(&conn->init_addr, &ev->bdaddr);
3796 }
3719 } 3797 }
3720 3798
3721 /* Ensure that the hci_conn contains the identity address type 3799 /* Ensure that the hci_conn contains the identity address type