Bluetooth: Fix LE reconnection logic
We can't use hci_explicit_connect_lookup() since that would only cover explicit connections, leaving normal reconnections completely untouched. Not using it in turn means leaving out entries in pend_le_reports. To fix this and simplify the logic move conn params from the reports list to the pend_le_conns list for the duration of an explicit connect. Once the connect is complete move the params back to the pend_le_reports list. This also means that the explicit connect lookup function only needs to look into the pend_le_conns list. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
Родитель
b958f9a3e8
Коммит
49c509220d
|
@ -1000,8 +1000,8 @@ static int hci_explicit_conn_params_set(struct hci_request *req,
|
|||
/* If we created new params, or existing params were marked as disabled,
|
||||
* mark them to be used just once to connect.
|
||||
*/
|
||||
if (params->auto_connect == HCI_AUTO_CONN_DISABLED) {
|
||||
params->auto_connect = HCI_AUTO_CONN_EXPLICIT;
|
||||
if (params->auto_connect == HCI_AUTO_CONN_DISABLED ||
|
||||
params->auto_connect == HCI_AUTO_CONN_REPORT) {
|
||||
list_del_init(¶ms->action);
|
||||
list_add(¶ms->action, &hdev->pend_le_conns);
|
||||
}
|
||||
|
|
|
@ -2861,13 +2861,6 @@ struct hci_conn_params *hci_explicit_connect_lookup(struct hci_dev *hdev,
|
|||
return param;
|
||||
}
|
||||
|
||||
list_for_each_entry(param, &hdev->pend_le_reports, action) {
|
||||
if (bacmp(¶m->addr, addr) == 0 &&
|
||||
param->addr_type == addr_type &&
|
||||
param->explicit_connect)
|
||||
return param;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -4653,8 +4653,8 @@ static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev,
|
|||
/* If we're not connectable only connect devices that we have in
|
||||
* our pend_le_conns list.
|
||||
*/
|
||||
params = hci_explicit_connect_lookup(hdev, addr, addr_type);
|
||||
|
||||
params = hci_pend_le_action_lookup(&hdev->pend_le_conns, addr,
|
||||
addr_type);
|
||||
if (!params)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -6117,7 +6117,10 @@ static int hci_conn_params_set(struct hci_request *req, bdaddr_t *addr,
|
|||
__hci_update_background_scan(req);
|
||||
break;
|
||||
case HCI_AUTO_CONN_REPORT:
|
||||
list_add(¶ms->action, &hdev->pend_le_reports);
|
||||
if (params->explicit_connect)
|
||||
list_add(¶ms->action, &hdev->pend_le_conns);
|
||||
else
|
||||
list_add(¶ms->action, &hdev->pend_le_reports);
|
||||
__hci_update_background_scan(req);
|
||||
break;
|
||||
case HCI_AUTO_CONN_DIRECT:
|
||||
|
|
Загрузка…
Ссылка в новой задаче