Bluetooth: mgmt: Fix device_connected sending order
The mgmt_ev_device_connected signal must be sent before any event indications happen for sockets associated with the connection. Otherwise e.g. device authorization for the sockets will fail with ENOTCONN as user space things that there is no baseband link. This patch fixes the issue by ensuring that the device_connected event if sent (if it hasn't been so already) as soon as the first ACL data packet arrives from the remote device. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
a7d7723ae7
commit
671267bf3a
@ -2784,6 +2784,14 @@ static inline void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)
|
|||||||
if (conn) {
|
if (conn) {
|
||||||
hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF);
|
hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF);
|
||||||
|
|
||||||
|
hci_dev_lock(hdev);
|
||||||
|
if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
|
||||||
|
!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
|
||||||
|
mgmt_device_connected(hdev, &conn->dst, conn->type,
|
||||||
|
conn->dst_type, 0, NULL, 0,
|
||||||
|
conn->dev_class);
|
||||||
|
hci_dev_unlock(hdev);
|
||||||
|
|
||||||
/* Send to upper protocol */
|
/* Send to upper protocol */
|
||||||
l2cap_recv_acldata(conn, skb, flags);
|
l2cap_recv_acldata(conn, skb, flags);
|
||||||
return;
|
return;
|
||||||
|
@ -2109,7 +2109,7 @@ static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff
|
|||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ev->status) {
|
if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
|
||||||
struct hci_cp_remote_name_req cp;
|
struct hci_cp_remote_name_req cp;
|
||||||
memset(&cp, 0, sizeof(cp));
|
memset(&cp, 0, sizeof(cp));
|
||||||
bacpy(&cp.bdaddr, &conn->dst);
|
bacpy(&cp.bdaddr, &conn->dst);
|
||||||
@ -2878,7 +2878,7 @@ static inline void hci_remote_ext_features_evt(struct hci_dev *hdev, struct sk_b
|
|||||||
if (conn->state != BT_CONFIG)
|
if (conn->state != BT_CONFIG)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
if (!ev->status) {
|
if (!ev->status && !test_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) {
|
||||||
struct hci_cp_remote_name_req cp;
|
struct hci_cp_remote_name_req cp;
|
||||||
memset(&cp, 0, sizeof(cp));
|
memset(&cp, 0, sizeof(cp));
|
||||||
bacpy(&cp.bdaddr, &conn->dst);
|
bacpy(&cp.bdaddr, &conn->dst);
|
||||||
|
Loading…
Reference in New Issue
Block a user