|
@@ -1365,6 +1365,9 @@ static bool hci_resolve_next_name(struct hci_dev *hdev)
|
|
|
return false;
|
|
|
|
|
|
e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_NEEDED);
|
|
|
+ if (!e)
|
|
|
+ return false;
|
|
|
+
|
|
|
if (hci_resolve_name(hdev, e) == 0) {
|
|
|
e->name_state = NAME_PENDING;
|
|
|
return true;
|
|
@@ -1393,12 +1396,20 @@ static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
|
|
|
return;
|
|
|
|
|
|
e = hci_inquiry_cache_lookup_resolve(hdev, bdaddr, NAME_PENDING);
|
|
|
- if (e) {
|
|
|
+ /* If the device was not found in a list of found devices names of which
|
|
|
+ * are pending. there is no need to continue resolving a next name as it
|
|
|
+ * will be done upon receiving another Remote Name Request Complete
|
|
|
+ * Event */
|
|
|
+ if (!e)
|
|
|
+ return;
|
|
|
+
|
|
|
+ list_del(&e->list);
|
|
|
+ if (name) {
|
|
|
e->name_state = NAME_KNOWN;
|
|
|
- list_del(&e->list);
|
|
|
- if (name)
|
|
|
- mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
|
|
|
- e->data.rssi, name, name_len);
|
|
|
+ mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
|
|
|
+ e->data.rssi, name, name_len);
|
|
|
+ } else {
|
|
|
+ e->name_state = NAME_NOT_KNOWN;
|
|
|
}
|
|
|
|
|
|
if (hci_resolve_next_name(hdev))
|
|
@@ -1762,7 +1773,12 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
|
|
if (conn->type == ACL_LINK) {
|
|
|
conn->state = BT_CONFIG;
|
|
|
hci_conn_hold(conn);
|
|
|
- conn->disc_timeout = HCI_DISCONN_TIMEOUT;
|
|
|
+
|
|
|
+ if (!conn->out && !hci_conn_ssp_enabled(conn) &&
|
|
|
+ !hci_find_link_key(hdev, &ev->bdaddr))
|
|
|
+ conn->disc_timeout = HCI_PAIRING_TIMEOUT;
|
|
|
+ else
|
|
|
+ conn->disc_timeout = HCI_DISCONN_TIMEOUT;
|
|
|
} else
|
|
|
conn->state = BT_CONNECTED;
|
|
|
|