Bluetooth: Add set LE scan parameter feature
authorSudha Bheemanna <b.sudha@samsung.com>
Thu, 25 Aug 2016 07:16:07 +0000 (12:46 +0530)
committerHoegeun Kwon <hoegeun.kwon@samsung.com>
Thu, 3 Aug 2023 08:43:14 +0000 (17:43 +0900)
Added new MGMT command to set LE scan parameters

Change-Id: I5ea660f97e93dfcc72273971ad0250e7f582f718
Signed-off-by: Sudha Bheemanna <b.sudha@samsung.com>
Signed-off-by: Amit Purwar <amit.purwar@samsung.com>
include/net/bluetooth/mgmt_tizen.h
net/bluetooth/mgmt.c

index 4f24c42..4c2e9d0 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 f35a578..2b32ded 100644 (file)
@@ -7818,6 +7818,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)
@@ -10185,6 +10243,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