aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorVinicius Costa Gomes <vinicius.gomes@openbossa.org>2011-08-19 20:06:55 -0400
committerGustavo F. Padovan <padovan@profusion.mobi>2011-09-21 11:58:11 -0400
commit160dc6ac1256ed15a507bec9a2ff1f6d24a5a3ff (patch)
treed5000a274444f1c1f6db3962e005edae197e16eb /net
parent7a512d0172d3f54079efb2983afe04a5e68cfe50 (diff)
Bluetooth: Add support for running SMP without a socket
When doing the pairing procedure we won't have an associated socket, but we still have to do the SMP negotiation. This adds support for encrypting the link and exchanging keys. Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@openbossa.org> Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
Diffstat (limited to 'net')
-rw-r--r--net/bluetooth/l2cap_core.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 8136752d824b..e699837c3b8c 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -907,6 +907,9 @@ static void l2cap_conn_ready(struct l2cap_conn *conn)
907 if (!conn->hcon->out && conn->hcon->type == LE_LINK) 907 if (!conn->hcon->out && conn->hcon->type == LE_LINK)
908 l2cap_le_conn_ready(conn); 908 l2cap_le_conn_ready(conn);
909 909
910 if (conn->hcon->out && conn->hcon->type == LE_LINK)
911 smp_conn_security(conn, conn->hcon->pending_sec_level);
912
910 read_lock(&conn->chan_lock); 913 read_lock(&conn->chan_lock);
911 914
912 list_for_each_entry(chan, &conn->chan_l, list) { 915 list_for_each_entry(chan, &conn->chan_l, list) {
@@ -4095,6 +4098,11 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
4095 4098
4096 BT_DBG("conn %p", conn); 4099 BT_DBG("conn %p", conn);
4097 4100
4101 if (hcon->type == LE_LINK) {
4102 smp_distribute_keys(conn, 0);
4103 del_timer(&conn->security_timer);
4104 }
4105
4098 read_lock(&conn->chan_lock); 4106 read_lock(&conn->chan_lock);
4099 4107
4100 list_for_each_entry(chan, &conn->chan_l, list) { 4108 list_for_each_entry(chan, &conn->chan_l, list) {
@@ -4107,9 +4115,7 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
4107 if (chan->scid == L2CAP_CID_LE_DATA) { 4115 if (chan->scid == L2CAP_CID_LE_DATA) {
4108 if (!status && encrypt) { 4116 if (!status && encrypt) {
4109 chan->sec_level = hcon->sec_level; 4117 chan->sec_level = hcon->sec_level;
4110 del_timer(&conn->security_timer);
4111 l2cap_chan_ready(sk); 4118 l2cap_chan_ready(sk);
4112 smp_distribute_keys(conn, 0);
4113 } 4119 }
4114 4120
4115 bh_unlock_sock(sk); 4121 bh_unlock_sock(sk);