Bluetooth: Start SMP procedure
authorAnderson Briglia <anderson.briglia@openbossa.org>
Tue, 7 Jun 2011 21:46:31 +0000 (18:46 -0300)
committerJaikumar Ganesh <jaikumar@google.com>
Mon, 11 Jul 2011 18:59:20 +0000 (11:59 -0700)
Start SMP procedure for LE connections. This modification intercepts
l2cap received frames and call proper SMP functions to start the SMP
procedure. By now, no keys are being used.

Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@openbossa.org>
Signed-off-by: Anderson Briglia <anderson.briglia@openbossa.org>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
net/bluetooth/l2cap_core.c

index 2250217c6c5f0c54a4b3e30ab9262b355091b30e..2d7c6b1e4ea8bfc4c7263bcfaa6f03d1e85cdd87 100644 (file)
@@ -54,6 +54,7 @@
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
 #include <net/bluetooth/l2cap.h>
+#include <net/bluetooth/smp.h>
 
 int disable_ertm;
 
@@ -910,12 +911,15 @@ static void l2cap_conn_ready(struct l2cap_conn *conn)
                        __clear_chan_timer(chan);
                        l2cap_state_change(chan, BT_CONNECTED);
                        sk->sk_state_change(sk);
+                       if (smp_conn_security(conn, chan->sec_level))
+                               BT_DBG("Insufficient security");
                }
 
                if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
                        __clear_chan_timer(chan);
                        l2cap_state_change(chan, BT_CONNECTED);
                        sk->sk_state_change(sk);
+
                } else if (chan->state == BT_CONNECT)
                        l2cap_do_start(chan);
 
@@ -4061,6 +4065,11 @@ static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
                l2cap_att_channel(conn, cid, skb);
                break;
 
+       case L2CAP_CID_SMP:
+               if (smp_sig_channel(conn, skb))
+                       l2cap_conn_del(conn->hcon, EACCES);
+               break;
+
        default:
                l2cap_data_channel(conn, cid, skb);
                break;