|
@@ -767,10 +767,30 @@ static bool scan_use_rpa(struct hci_dev *hdev)
|
|
|
return hci_dev_test_flag(hdev, HCI_PRIVACY);
|
|
|
}
|
|
|
|
|
|
-void hci_req_add_le_passive_scan(struct hci_request *req)
|
|
|
+static void hci_req_start_scan(struct hci_request *req, u8 type, u16 interval,
|
|
|
+ u16 window, u8 own_addr_type, u8 filter_policy)
|
|
|
{
|
|
|
struct hci_cp_le_set_scan_param param_cp;
|
|
|
struct hci_cp_le_set_scan_enable enable_cp;
|
|
|
+
|
|
|
+ memset(¶m_cp, 0, sizeof(param_cp));
|
|
|
+ param_cp.type = type;
|
|
|
+ param_cp.interval = cpu_to_le16(interval);
|
|
|
+ param_cp.window = cpu_to_le16(window);
|
|
|
+ param_cp.own_address_type = own_addr_type;
|
|
|
+ param_cp.filter_policy = filter_policy;
|
|
|
+ hci_req_add(req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
|
|
|
+ ¶m_cp);
|
|
|
+
|
|
|
+ memset(&enable_cp, 0, sizeof(enable_cp));
|
|
|
+ enable_cp.enable = LE_SCAN_ENABLE;
|
|
|
+ enable_cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE;
|
|
|
+ hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(enable_cp),
|
|
|
+ &enable_cp);
|
|
|
+}
|
|
|
+
|
|
|
+void hci_req_add_le_passive_scan(struct hci_request *req)
|
|
|
+{
|
|
|
struct hci_dev *hdev = req->hdev;
|
|
|
u8 own_addr_type;
|
|
|
u8 filter_policy;
|
|
@@ -804,20 +824,8 @@ void hci_req_add_le_passive_scan(struct hci_request *req)
|
|
|
(hdev->le_features[0] & HCI_LE_EXT_SCAN_POLICY))
|
|
|
filter_policy |= 0x02;
|
|
|
|
|
|
- memset(¶m_cp, 0, sizeof(param_cp));
|
|
|
- param_cp.type = LE_SCAN_PASSIVE;
|
|
|
- param_cp.interval = cpu_to_le16(hdev->le_scan_interval);
|
|
|
- param_cp.window = cpu_to_le16(hdev->le_scan_window);
|
|
|
- param_cp.own_address_type = own_addr_type;
|
|
|
- param_cp.filter_policy = filter_policy;
|
|
|
- hci_req_add(req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
|
|
|
- ¶m_cp);
|
|
|
-
|
|
|
- memset(&enable_cp, 0, sizeof(enable_cp));
|
|
|
- enable_cp.enable = LE_SCAN_ENABLE;
|
|
|
- enable_cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE;
|
|
|
- hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(enable_cp),
|
|
|
- &enable_cp);
|
|
|
+ hci_req_start_scan(req, LE_SCAN_PASSIVE, hdev->le_scan_interval,
|
|
|
+ hdev->le_scan_window, own_addr_type, filter_policy);
|
|
|
}
|
|
|
|
|
|
static u8 get_cur_adv_instance_scan_rsp_len(struct hci_dev *hdev)
|
|
@@ -2010,8 +2018,6 @@ static int active_scan(struct hci_request *req, unsigned long opt)
|
|
|
{
|
|
|
uint16_t interval = opt;
|
|
|
struct hci_dev *hdev = req->hdev;
|
|
|
- struct hci_cp_le_set_scan_param param_cp;
|
|
|
- struct hci_cp_le_set_scan_enable enable_cp;
|
|
|
u8 own_addr_type;
|
|
|
int err;
|
|
|
|
|
@@ -2050,22 +2056,8 @@ static int active_scan(struct hci_request *req, unsigned long opt)
|
|
|
if (err < 0)
|
|
|
own_addr_type = ADDR_LE_DEV_PUBLIC;
|
|
|
|
|
|
- memset(¶m_cp, 0, sizeof(param_cp));
|
|
|
- param_cp.type = LE_SCAN_ACTIVE;
|
|
|
- param_cp.interval = cpu_to_le16(interval);
|
|
|
- param_cp.window = cpu_to_le16(DISCOV_LE_SCAN_WIN);
|
|
|
- param_cp.own_address_type = own_addr_type;
|
|
|
-
|
|
|
- hci_req_add(req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
|
|
|
- ¶m_cp);
|
|
|
-
|
|
|
- memset(&enable_cp, 0, sizeof(enable_cp));
|
|
|
- enable_cp.enable = LE_SCAN_ENABLE;
|
|
|
- enable_cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE;
|
|
|
-
|
|
|
- hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(enable_cp),
|
|
|
- &enable_cp);
|
|
|
-
|
|
|
+ hci_req_start_scan(req, LE_SCAN_ACTIVE, interval, DISCOV_LE_SCAN_WIN,
|
|
|
+ own_addr_type, 0);
|
|
|
return 0;
|
|
|
}
|
|
|
|