aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth
diff options
context:
space:
mode:
authorAndrei Emeltchenko <andrei.emeltchenko@intel.com>2012-05-29 06:59:16 -0400
committerJohan Hedberg <johan.hedberg@intel.com>2012-06-04 23:34:13 -0400
commit416fa7527d6bf658e5517ea36d2de9270be2c11e (patch)
tree60f3f131884ff8aa5e0d02c9a098e612138aa5a2 /net/bluetooth
parentf6410a849b76f56c78d989786eb427b85a559b9f (diff)
Bluetooth: A2MP: Handling fixed channels
A2MP fixed channel do not have sk Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Diffstat (limited to 'net/bluetooth')
-rw-r--r--net/bluetooth/a2mp.c3
-rw-r--r--net/bluetooth/l2cap_core.c17
2 files changed, 18 insertions, 2 deletions
diff --git a/net/bluetooth/a2mp.c b/net/bluetooth/a2mp.c
index 6a933dab1b7f..f1ec1b1d308f 100644
--- a/net/bluetooth/a2mp.c
+++ b/net/bluetooth/a2mp.c
@@ -483,8 +483,7 @@ static struct l2cap_chan *a2mp_chan_open(struct l2cap_conn *conn)
483 483
484 hci_conn_hold(conn->hcon); 484 hci_conn_hold(conn->hcon);
485 485
486 chan->omtu = L2CAP_A2MP_DEFAULT_MTU; 486 chan->chan_type = L2CAP_CHAN_CONN_FIX_A2MP;
487 chan->imtu = L2CAP_A2MP_DEFAULT_MTU;
488 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO; 487 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
489 488
490 chan->ops = &a2mp_chan_ops; 489 chan->ops = &a2mp_chan_ops;
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 2c616cf24c71..fc572795497a 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -465,6 +465,13 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
465 chan->omtu = L2CAP_DEFAULT_MTU; 465 chan->omtu = L2CAP_DEFAULT_MTU;
466 break; 466 break;
467 467
468 case L2CAP_CHAN_CONN_FIX_A2MP:
469 chan->scid = L2CAP_CID_A2MP;
470 chan->dcid = L2CAP_CID_A2MP;
471 chan->omtu = L2CAP_A2MP_DEFAULT_MTU;
472 chan->imtu = L2CAP_A2MP_DEFAULT_MTU;
473 break;
474
468 default: 475 default:
469 /* Raw socket can send/recv signalling messages only */ 476 /* Raw socket can send/recv signalling messages only */
470 chan->scid = L2CAP_CID_SIGNALING; 477 chan->scid = L2CAP_CID_SIGNALING;
@@ -1001,6 +1008,11 @@ static void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *c
1001 __clear_ack_timer(chan); 1008 __clear_ack_timer(chan);
1002 } 1009 }
1003 1010
1011 if (chan->chan_type == L2CAP_CHAN_CONN_FIX_A2MP) {
1012 __l2cap_state_change(chan, BT_DISCONN);
1013 return;
1014 }
1015
1004 req.dcid = cpu_to_le16(chan->dcid); 1016 req.dcid = cpu_to_le16(chan->dcid);
1005 req.scid = cpu_to_le16(chan->scid); 1017 req.scid = cpu_to_le16(chan->scid);
1006 l2cap_send_cmd(conn, l2cap_get_ident(conn), 1018 l2cap_send_cmd(conn, l2cap_get_ident(conn),
@@ -1195,6 +1207,11 @@ static void l2cap_conn_ready(struct l2cap_conn *conn)
1195 1207
1196 l2cap_chan_lock(chan); 1208 l2cap_chan_lock(chan);
1197 1209
1210 if (chan->chan_type == L2CAP_CHAN_CONN_FIX_A2MP) {
1211 l2cap_chan_unlock(chan);
1212 continue;
1213 }
1214
1198 if (conn->hcon->type == LE_LINK) { 1215 if (conn->hcon->type == LE_LINK) {
1199 if (smp_conn_security(conn, chan->sec_level)) 1216 if (smp_conn_security(conn, chan->sec_level))
1200 l2cap_chan_ready(chan); 1217 l2cap_chan_ready(chan);