Bluetooth: mgmt: multi adv for read_adv_features()
The read_adv_features() method had a single instance identifier hard coded. Refer to the advertising instance list instead to return a dynamically generated list of instance identifiers. Signed-off-by: Florian Grandel <fgrandel@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
efae002c2c
commit
286e0c83df
1 changed files with 12 additions and 10 deletions
|
@ -6763,8 +6763,9 @@ static int read_adv_features(struct sock *sk, struct hci_dev *hdev,
|
||||||
{
|
{
|
||||||
struct mgmt_rp_read_adv_features *rp;
|
struct mgmt_rp_read_adv_features *rp;
|
||||||
size_t rp_len;
|
size_t rp_len;
|
||||||
int err;
|
int err, i;
|
||||||
bool instance;
|
bool instance;
|
||||||
|
struct adv_info *adv_instance;
|
||||||
u32 supported_flags;
|
u32 supported_flags;
|
||||||
|
|
||||||
BT_DBG("%s", hdev->name);
|
BT_DBG("%s", hdev->name);
|
||||||
|
@ -6777,12 +6778,9 @@ static int read_adv_features(struct sock *sk, struct hci_dev *hdev,
|
||||||
|
|
||||||
rp_len = sizeof(*rp);
|
rp_len = sizeof(*rp);
|
||||||
|
|
||||||
/* Currently only one instance is supported, so just add 1 to the
|
|
||||||
* response length.
|
|
||||||
*/
|
|
||||||
instance = hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE);
|
instance = hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE);
|
||||||
if (instance)
|
if (instance)
|
||||||
rp_len++;
|
rp_len += hdev->adv_instance_cnt;
|
||||||
|
|
||||||
rp = kmalloc(rp_len, GFP_ATOMIC);
|
rp = kmalloc(rp_len, GFP_ATOMIC);
|
||||||
if (!rp) {
|
if (!rp) {
|
||||||
|
@ -6797,12 +6795,16 @@ static int read_adv_features(struct sock *sk, struct hci_dev *hdev,
|
||||||
rp->max_scan_rsp_len = HCI_MAX_AD_LENGTH;
|
rp->max_scan_rsp_len = HCI_MAX_AD_LENGTH;
|
||||||
rp->max_instances = HCI_MAX_ADV_INSTANCES;
|
rp->max_instances = HCI_MAX_ADV_INSTANCES;
|
||||||
|
|
||||||
/* Currently only one instance is supported, so simply return the
|
|
||||||
* current instance number.
|
|
||||||
*/
|
|
||||||
if (instance) {
|
if (instance) {
|
||||||
rp->num_instances = 1;
|
i = 0;
|
||||||
rp->instance[0] = 1;
|
list_for_each_entry(adv_instance, &hdev->adv_instances, list) {
|
||||||
|
if (i >= hdev->adv_instance_cnt)
|
||||||
|
break;
|
||||||
|
|
||||||
|
rp->instance[i] = adv_instance->instance;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
rp->num_instances = hdev->adv_instance_cnt;
|
||||||
} else {
|
} else {
|
||||||
rp->num_instances = 0;
|
rp->num_instances = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue