Bluetooth: Add set LE scan parameter feature 18/317418/1
authorSudha Bheemanna <b.sudha@samsung.com>
Thu, 25 Aug 2016 07:16:07 +0000 (12:46 +0530)
committerJaehoon Chung <jh80.chung@samsung.com>
Thu, 2 Jan 2025 03:13:54 +0000 (12:13 +0900)
Added new MGMT command to set LE scan parameters

Change-Id: Id9f5a52e20cbad27eeeddf6ccb9189b49626af2a
Signed-off-by: Sudha Bheemanna <b.sudha@samsung.com>
Signed-off-by: Amit Purwar <amit.purwar@samsung.com>
Signed-off-by: Wootak Jung <wootak.jung@samsung.com>
Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
include/net/bluetooth/mgmt_tizen.h
net/bluetooth/mgmt.c

index 4f24c42132b28b18c7dc54ea54262638e03269ea..4c2e9d0c54d6820beb7626be0a6088a9b4764592 100644 (file)
@@ -143,6 +143,14 @@ struct mgmt_cp_set_manufacturer_data {
 #define MGMT_SET_MANUFACTURER_DATA_SIZE                100
 /* Set Manufacturer Data */
 
+#define MGMT_OP_LE_SET_SCAN_PARAMS             (TIZEN_OP_CODE_BASE + 0x0f)
+struct mgmt_cp_le_set_scan_params {
+       __u8    type;   /* le scan type */
+       __le16  interval;
+       __le16  window;
+} __packed;
+#define MGMT_LE_SET_SCAN_PARAMS_SIZE           5
+
 /* EVENTS */
 
 /* For device name update changes */
index e5cd82b5799bf1bdcc4fa92b78b75ff0e0d4a505..ce768d42bf4d49d4972213961589203e09ba5043 100644 (file)
@@ -8701,6 +8701,64 @@ failed:
        hci_dev_unlock(hdev);
        return err;
 }
+
+static int le_set_scan_params(struct sock *sk, struct hci_dev *hdev,
+               void *data, u16 len)
+{
+       struct mgmt_cp_le_set_scan_params *cp = data;
+       __u16 interval, window;
+       int err;
+
+       BT_DBG("%s", hdev->name);
+
+       if (!lmp_le_capable(hdev))
+               return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LE_SET_SCAN_PARAMS,
+                               MGMT_STATUS_NOT_SUPPORTED);
+
+       interval = __le16_to_cpu(cp->interval);
+
+       if (interval < 0x0004 || interval > 0x4000)
+               return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LE_SET_SCAN_PARAMS,
+                               MGMT_STATUS_INVALID_PARAMS);
+
+       window = __le16_to_cpu(cp->window);
+
+       if (window < 0x0004 || window > 0x4000)
+               return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LE_SET_SCAN_PARAMS,
+                               MGMT_STATUS_INVALID_PARAMS);
+
+       if (window > interval)
+               return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LE_SET_SCAN_PARAMS,
+                               MGMT_STATUS_INVALID_PARAMS);
+
+       hci_dev_lock(hdev);
+
+       hdev->le_scan_type = cp->type;
+       hdev->le_scan_interval = interval;
+       hdev->le_scan_window = window;
+
+       err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LE_SET_SCAN_PARAMS, 0,
+                               NULL, 0);
+
+       /* If background scan is running, restart it so new parameters are
+        * loaded.
+        */
+       if (hci_dev_test_flag(hdev, HCI_LE_SCAN) &&
+           hdev->discovery.state == DISCOVERY_STOPPED) {
+               struct hci_request req;
+
+               hci_req_init(&req, hdev);
+
+               hci_req_add_le_scan_disable(&req, false);
+               hci_req_add_le_passive_scan(&req);
+
+               hci_req_run(&req, NULL);
+       }
+
+       hci_dev_unlock(hdev);
+
+       return err;
+}
 #endif /* TIZEN_BT */
 
 static bool ltk_is_valid(struct mgmt_ltk_info *key)
@@ -10991,6 +11049,7 @@ static const struct hci_mgmt_handler tizen_mgmt_handlers[] = {
        { disable_le_auto_connect, MGMT_DISABLE_LE_AUTO_CONNECT_SIZE },
        { le_conn_update,          MGMT_LE_CONN_UPDATE_SIZE },
        { set_manufacturer_data,   MGMT_SET_MANUFACTURER_DATA_SIZE },
+       { le_set_scan_params,      MGMT_LE_SET_SCAN_PARAMS_SIZE },
 };
 #endif