diff options
author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2009-07-15 12:50:58 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-08-22 18:05:58 -0400 |
commit | 9e726b17422bade75fba94e625cd35fd1353e682 (patch) | |
tree | af8cf616d9cbda12f51682dbb96e696f135be436 /include/net/bluetooth | |
parent | ef54fd937fbd5ebaeb023818524565bd526a5f36 (diff) |
Bluetooth: Fix rejected connection not disconnecting ACL link
When using DEFER_SETUP on a RFCOMM socket, a SABM frame triggers
authorization which when rejected send a DM response. This is fine
according to the RFCOMM spec:
the responding implementation may replace the "proper" response
on the Multiplexer Control channel with a DM frame, sent on the
referenced DLCI to indicate that the DLCI is not open, and that
the responder would not grant a request to open it later either.
But some stacks doesn't seems to cope with this leaving DLCI 0 open after
receiving DM frame.
To fix it properly a timer was introduced to rfcomm_session which is used
to set a timeout when the last active DLC of a session is unlinked, this
will give the remote stack some time to reply with a proper DISC frame on
DLCI 0 avoiding both sides sending DISC to each other on stacks that
follow the specification and taking care of those who don't by taking
down DLCI 0.
Signed-off-by: Luiz Augusto von Dentz <luiz.dentz@openbossa.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'include/net/bluetooth')
-rw-r--r-- | include/net/bluetooth/rfcomm.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/include/net/bluetooth/rfcomm.h b/include/net/bluetooth/rfcomm.h index c274993234e3..921d7b3c7f8d 100644 --- a/include/net/bluetooth/rfcomm.h +++ b/include/net/bluetooth/rfcomm.h | |||
@@ -29,6 +29,7 @@ | |||
29 | #define RFCOMM_CONN_TIMEOUT (HZ * 30) | 29 | #define RFCOMM_CONN_TIMEOUT (HZ * 30) |
30 | #define RFCOMM_DISC_TIMEOUT (HZ * 20) | 30 | #define RFCOMM_DISC_TIMEOUT (HZ * 20) |
31 | #define RFCOMM_AUTH_TIMEOUT (HZ * 25) | 31 | #define RFCOMM_AUTH_TIMEOUT (HZ * 25) |
32 | #define RFCOMM_IDLE_TIMEOUT (HZ * 2) | ||
32 | 33 | ||
33 | #define RFCOMM_DEFAULT_MTU 127 | 34 | #define RFCOMM_DEFAULT_MTU 127 |
34 | #define RFCOMM_DEFAULT_CREDITS 7 | 35 | #define RFCOMM_DEFAULT_CREDITS 7 |
@@ -154,6 +155,7 @@ struct rfcomm_msc { | |||
154 | struct rfcomm_session { | 155 | struct rfcomm_session { |
155 | struct list_head list; | 156 | struct list_head list; |
156 | struct socket *sock; | 157 | struct socket *sock; |
158 | struct timer_list timer; | ||
157 | unsigned long state; | 159 | unsigned long state; |
158 | unsigned long flags; | 160 | unsigned long flags; |
159 | atomic_t refcnt; | 161 | atomic_t refcnt; |