diff options
author | Andrei Emeltchenko <andrei.emeltchenko@intel.com> | 2012-05-29 06:59:16 -0400 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2012-06-04 23:34:13 -0400 |
commit | 416fa7527d6bf658e5517ea36d2de9270be2c11e (patch) | |
tree | 60f3f131884ff8aa5e0d02c9a098e612138aa5a2 | |
parent | f6410a849b76f56c78d989786eb427b85a559b9f (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>
-rw-r--r-- | include/net/bluetooth/l2cap.h | 1 | ||||
-rw-r--r-- | net/bluetooth/a2mp.c | 3 | ||||
-rw-r--r-- | net/bluetooth/l2cap_core.c | 17 |
3 files changed, 19 insertions, 2 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index aaba222306b6..a00b43ecbc77 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
@@ -581,6 +581,7 @@ struct l2cap_conn { | |||
581 | #define L2CAP_CHAN_RAW 1 | 581 | #define L2CAP_CHAN_RAW 1 |
582 | #define L2CAP_CHAN_CONN_LESS 2 | 582 | #define L2CAP_CHAN_CONN_LESS 2 |
583 | #define L2CAP_CHAN_CONN_ORIENTED 3 | 583 | #define L2CAP_CHAN_CONN_ORIENTED 3 |
584 | #define L2CAP_CHAN_CONN_FIX_A2MP 4 | ||
584 | 585 | ||
585 | /* ----- L2CAP socket info ----- */ | 586 | /* ----- L2CAP socket info ----- */ |
586 | #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) | 587 | #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) |
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); |