Bluetooth: Add tracking of advertising address type
authorJohan Hedberg <johan.hedberg@intel.com>
Thu, 27 Feb 2014 12:05:40 +0000 (14:05 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 27 Feb 2014 16:50:21 +0000 (08:50 -0800)
To know the real source address for incoming connections (needed e.g.
for SMP) we should store the own_address_type parameter that was used
for the last HCI_LE_Write_Advertising_Parameters command. This patch
adds a proper command complete handler for the command and stores the
address type in a new adv_addr_type variable in the hci_dev struct.

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
include/net/bluetooth/hci_core.h
net/bluetooth/hci_event.c

index 79a75ed..853376d 100644 (file)
@@ -156,6 +156,7 @@ struct hci_dev {
        bdaddr_t        bdaddr;
        bdaddr_t        random_addr;
        bdaddr_t        static_addr;
+       __u8            adv_addr_type;
        __u8            dev_name[HCI_MAX_NAME_LENGTH];
        __u8            short_name[HCI_MAX_SHORT_NAME_LENGTH];
        __u8            eir[HCI_MAX_EIR_LENGTH];
index cda92db..f26e91f 100644 (file)
@@ -1078,6 +1078,25 @@ static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
        }
 }
 
+static void hci_cc_set_adv_param(struct hci_dev *hdev, struct sk_buff *skb)
+{
+       struct hci_cp_le_set_adv_param *cp;
+       u8 status = *((u8 *) skb->data);
+
+       BT_DBG("%s status 0x%2.2x", hdev->name, status);
+
+       if (status)
+               return;
+
+       cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_PARAM);
+       if (!cp)
+               return;
+
+       hci_dev_lock(hdev);
+       hdev->adv_addr_type = cp->own_address_type;
+       hci_dev_unlock(hdev);
+}
+
 static void hci_cc_write_remote_amp_assoc(struct hci_dev *hdev,
                                          struct sk_buff *skb)
 {
@@ -2367,6 +2386,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
                hci_cc_write_le_host_supported(hdev, skb);
                break;
 
+       case HCI_OP_LE_SET_ADV_PARAM:
+               hci_cc_set_adv_param(hdev, skb);
+               break;
+
        case HCI_OP_WRITE_REMOTE_AMP_ASSOC:
                hci_cc_write_remote_amp_assoc(hdev, skb);
                break;