Bluetooth: MGMT: Fix always using HCI_MAX_AD_LENGTH
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 6 Jul 2023 19:06:32 +0000 (12:06 -0700)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 11 Aug 2023 18:45:26 +0000 (11:45 -0700)
HCI_MAX_AD_LENGTH shall only be used if the controller doesn't support
extended advertising, otherwise HCI_MAX_EXT_AD_LENGTH shall be used
instead.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
include/net/bluetooth/hci_core.h
net/bluetooth/hci_event.c
net/bluetooth/mgmt.c

index 105c1c3..8200a66 100644 (file)
@@ -1801,6 +1801,10 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
 /* Extended advertising support */
 #define ext_adv_capable(dev) (((dev)->le_features[1] & HCI_LE_EXT_ADV))
 
+/* Maximum advertising length */
+#define max_adv_len(dev) \
+       (ext_adv_capable(dev) ? HCI_MAX_EXT_AD_LENGTH : HCI_MAX_AD_LENGTH)
+
 /* BLUETOOTH CORE SPECIFICATION Version 5.3 | Vol 4, Part E page 1789:
  *
  * C24: Mandatory if the LE Controller supports Connection State and either
index c29eece..f1fcece 100644 (file)
@@ -1747,7 +1747,7 @@ static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
 {
        struct discovery_state *d = &hdev->discovery;
 
-       if (len > HCI_MAX_AD_LENGTH)
+       if (len > max_adv_len(hdev))
                return;
 
        bacpy(&d->last_adv_addr, bdaddr);
@@ -6249,8 +6249,9 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
                return;
        }
 
-       if (!ext_adv && len > HCI_MAX_AD_LENGTH) {
-               bt_dev_err_ratelimited(hdev, "legacy adv larger than 31 bytes");
+       if (len > max_adv_len(hdev)) {
+               bt_dev_err_ratelimited(hdev,
+                                      "adv larger than maximum supported");
                return;
        }
 
@@ -6315,7 +6316,8 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
         */
        conn = check_pending_le_conn(hdev, bdaddr, bdaddr_type, bdaddr_resolved,
                                     type);
-       if (!ext_adv && conn && type == LE_ADV_IND && len <= HCI_MAX_AD_LENGTH) {
+       if (!ext_adv && conn && type == LE_ADV_IND &&
+           len <= max_adv_len(hdev)) {
                /* Store report for later inclusion by
                 * mgmt_device_connected
                 */
@@ -6456,7 +6458,7 @@ static void hci_le_adv_report_evt(struct hci_dev *hdev, void *data,
                                        info->length + 1))
                        break;
 
-               if (info->length <= HCI_MAX_AD_LENGTH) {
+               if (info->length <= max_adv_len(hdev)) {
                        rssi = info->data[info->length];
                        process_adv_report(hdev, info->type, &info->bdaddr,
                                           info->bdaddr_type, NULL, 0, rssi,
index 5707ff4..d6c9b7b 100644 (file)
@@ -8428,8 +8428,8 @@ static int read_adv_features(struct sock *sk, struct hci_dev *hdev,
        supported_flags = get_supported_adv_flags(hdev);
 
        rp->supported_flags = cpu_to_le32(supported_flags);
-       rp->max_adv_data_len = HCI_MAX_AD_LENGTH;
-       rp->max_scan_rsp_len = HCI_MAX_AD_LENGTH;
+       rp->max_adv_data_len = max_adv_len(hdev);
+       rp->max_scan_rsp_len = max_adv_len(hdev);
        rp->max_instances = hdev->le_num_of_adv_sets;
        rp->num_instances = hdev->adv_instance_cnt;
 
@@ -8465,7 +8465,7 @@ static u8 calculate_name_len(struct hci_dev *hdev)
 static u8 tlv_data_max_len(struct hci_dev *hdev, u32 adv_flags,
                           bool is_adv_data)
 {
-       u8 max_len = HCI_MAX_AD_LENGTH;
+       u8 max_len = max_adv_len(hdev);
 
        if (is_adv_data) {
                if (adv_flags & (MGMT_ADV_FLAG_DISCOV |