summaryrefslogtreecommitdiffstats
path: root/net/bluetooth/rfcomm
diff options
context:
space:
mode:
authorMarcel Holtmann2007-05-05 00:36:13 +0200
committerMarcel Holtmann2007-05-05 00:36:13 +0200
commit9cf5b0ea3a7f1432c61029f7aaf4b8b338628884 (patch)
treedf659b3fe371301a6dba33782451655a09e9c25b /net/bluetooth/rfcomm
parent[Bluetooth] Check that device is in rfcomm_dev_list before deleting (diff)
downloadkernel-qcow2-linux-9cf5b0ea3a7f1432c61029f7aaf4b8b338628884.tar.gz
kernel-qcow2-linux-9cf5b0ea3a7f1432c61029f7aaf4b8b338628884.tar.xz
kernel-qcow2-linux-9cf5b0ea3a7f1432c61029f7aaf4b8b338628884.zip
[Bluetooth] Disconnect L2CAP connection after last RFCOMM DLC
The RFCOMM specification says that the device closing the last DLC on a particular session is responsible for closing the multiplexer by closing the corresponding L2CAP channel. Signed-off-by: Ville Tervo <ville.tervo@nokia.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/bluetooth/rfcomm')
-rw-r--r--net/bluetooth/rfcomm/core.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c
index 71a72fcb2b54..52e04df323ea 100644
--- a/net/bluetooth/rfcomm/core.c
+++ b/net/bluetooth/rfcomm/core.c
@@ -1058,6 +1058,12 @@ static int rfcomm_recv_ua(struct rfcomm_session *s, u8 dlci)
case BT_DISCONN:
d->state = BT_CLOSED;
__rfcomm_dlc_close(d, 0);
+
+ if (list_empty(&s->dlcs)) {
+ s->state = BT_DISCONN;
+ rfcomm_send_disc(s, 0);
+ }
+
break;
}
} else {
@@ -1067,6 +1073,10 @@ static int rfcomm_recv_ua(struct rfcomm_session *s, u8 dlci)
s->state = BT_CONNECTED;
rfcomm_process_connect(s);
break;
+
+ case BT_DISCONN:
+ rfcomm_session_put(s);
+ break;
}
}
return 0;