diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2006-09-26 09:43:48 +0200 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-09-28 18:01:33 -0700 |
commit | 6ac59344ef25d5f0ebadb5663cf700d25d2a3886 (patch) | |
tree | b4dbdf1589e0a7b6d3ed04d38fb7615a54f0d7af /net/bluetooth/hci_event.c | |
parent | 1143e5a6d4d69cd36d44e0184769aa2b17041a10 (diff) | |
download | linux-6ac59344ef25d5f0ebadb5663cf700d25d2a3886.tar.gz linux-6ac59344ef25d5f0ebadb5663cf700d25d2a3886.tar.bz2 linux-6ac59344ef25d5f0ebadb5663cf700d25d2a3886.zip |
[Bluetooth] Support create connection cancel command
In case of non-blocking connects it is possible that the last user
of an ACL link quits before the connection has been fully established.
This will lead to a race condition where the internal state of a
connection is closed, but the actual link has been established and is
active. In case of Bluetooth 1.2 and later devices it is possible to
call create connection cancel to abort the connect. For older devices
the disconnect timer will be used to trigger the needed disconnect.
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/bluetooth/hci_event.c')
-rw-r--r-- | net/bluetooth/hci_event.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 7518bdbf34cd..bb25484b8747 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -750,6 +750,8 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s if (test_bit(HCI_ENCRYPT, &hdev->flags)) conn->link_mode |= HCI_LM_ENCRYPT; + hci_conn_hold(conn); + /* Get remote features */ if (conn->type == ACL_LINK) { struct hci_cp_read_remote_features cp; @@ -778,6 +780,8 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s hci_send_cmd(hdev, OGF_LINK_CTL, OCF_CHANGE_CONN_PTYPE, sizeof(cp), &cp); } + + hci_conn_put(conn); } else conn->state = BT_CLOSED; |