]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
Bluetooth: mgmt: Fix Experimental Feature Changed event
authorTedd Ho-Jeong An <tedd.an@intel.com>
Wed, 6 Oct 2021 16:32:28 +0000 (09:32 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 7 Oct 2021 15:57:23 +0000 (17:57 +0200)
This patch fixes the controller index in the Experimental Features
Changed event for the offload_codec and the quality_report features to
use the actual hdev index instead of non-controller index(0xffff) so the
client can receive the event and know which controller the event is for.

Fixes: ad93315183285 ("Bluetooth: Add offload feature under experimental flag")
Fixes: ae7d925b5c043 ("Bluetooth: Support the quality report events")
Signed-off-by: Tedd Ho-Jeong An <tedd.an@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/mgmt.c

index 3e5283607b97c140d15be6127ee4b0a00f758192..44683443300ce543a39c4580b93f93b0ccc69b1e 100644 (file)
@@ -3927,7 +3927,9 @@ static int exp_debug_feature_changed(bool enabled, struct sock *skip)
 }
 #endif
 
-static int exp_quality_report_feature_changed(bool enabled, struct sock *skip)
+static int exp_quality_report_feature_changed(bool enabled,
+                                             struct hci_dev *hdev,
+                                             struct sock *skip)
 {
        struct mgmt_ev_exp_feature_changed ev;
 
@@ -3935,7 +3937,7 @@ static int exp_quality_report_feature_changed(bool enabled, struct sock *skip)
        memcpy(ev.uuid, quality_report_uuid, 16);
        ev.flags = cpu_to_le32(enabled ? BIT(0) : 0);
 
-       return mgmt_limited_event(MGMT_EV_EXP_FEATURE_CHANGED, NULL,
+       return mgmt_limited_event(MGMT_EV_EXP_FEATURE_CHANGED, hdev,
                                  &ev, sizeof(ev),
                                  HCI_MGMT_EXP_FEATURE_EVENTS, skip);
 }
@@ -4156,14 +4158,15 @@ static int set_quality_report_func(struct sock *sk, struct hci_dev *hdev,
                                &rp, sizeof(rp));
 
        if (changed)
-               exp_quality_report_feature_changed(val, sk);
+               exp_quality_report_feature_changed(val, hdev, sk);
 
 unlock_quality_report:
        hci_req_sync_unlock(hdev);
        return err;
 }
 
-static int exp_offload_codec_feature_changed(bool enabled, struct sock *skip)
+static int exp_offload_codec_feature_changed(bool enabled, struct hci_dev *hdev,
+                                            struct sock *skip)
 {
        struct mgmt_ev_exp_feature_changed ev;
 
@@ -4171,7 +4174,7 @@ static int exp_offload_codec_feature_changed(bool enabled, struct sock *skip)
        memcpy(ev.uuid, offload_codecs_uuid, 16);
        ev.flags = cpu_to_le32(enabled ? BIT(0) : 0);
 
-       return mgmt_limited_event(MGMT_EV_EXP_FEATURE_CHANGED, NULL,
+       return mgmt_limited_event(MGMT_EV_EXP_FEATURE_CHANGED, hdev,
                                  &ev, sizeof(ev),
                                  HCI_MGMT_EXP_FEATURE_EVENTS, skip);
 }
@@ -4229,7 +4232,7 @@ static int set_offload_codec_func(struct sock *sk, struct hci_dev *hdev,
                                &rp, sizeof(rp));
 
        if (changed)
-               exp_offload_codec_feature_changed(val, sk);
+               exp_offload_codec_feature_changed(val, hdev, sk);
 
        return err;
 }