Bluetooth: mgmt: multi adv for create_instance_adv_data()
authorFlorian Grandel <fgrandel@gmail.com>
Thu, 18 Jun 2015 01:16:44 +0000 (03:16 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 18 Jun 2015 16:11:52 +0000 (18:11 +0200)
The create_instance_adv_data() function could not deal with
multiple advertising instances previously. This is being fixed by
retrieving advertising instances from the newly introduced dynamic
advertising instance list.

Signed-off-by: Florian Grandel <fgrandel@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/mgmt.c

index fc807dcc253370de589a75038ecfa2307b873207..04efc56d164158de513a5b5ca70c8df153edef33 100644 (file)
@@ -1014,8 +1014,18 @@ static u8 get_cur_adv_instance_scan_rsp_len(struct hci_dev *hdev)
 
 static u8 create_instance_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr)
 {
+       struct adv_info *adv_instance = NULL;
        u8 ad_len = 0, flags = 0;
-       u32 instance_flags = get_adv_instance_flags(hdev, instance);
+       u32 instance_flags;
+
+       /* Return 0 when the current instance identifier is invalid. */
+       if (instance) {
+               adv_instance = hci_find_adv_instance(hdev, instance);
+               if (!adv_instance)
+                       return 0;
+       }
+
+       instance_flags = get_adv_instance_flags(hdev, instance);
 
        /* The Add Advertising command allows userspace to set both the general
         * and limited discoverable flags.
@@ -1049,12 +1059,11 @@ static u8 create_instance_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr)
                }
        }
 
-       if (instance) {
-               memcpy(ptr, hdev->adv_instance.adv_data,
-                      hdev->adv_instance.adv_data_len);
-
-               ad_len += hdev->adv_instance.adv_data_len;
-               ptr += hdev->adv_instance.adv_data_len;
+       if (adv_instance) {
+               memcpy(ptr, adv_instance->adv_data,
+                      adv_instance->adv_data_len);
+               ad_len += adv_instance->adv_data_len;
+               ptr += adv_instance->adv_data_len;
        }
 
        /* Provide Tx Power only if we can provide a valid value for it */