Bluetooth: Start SMP procedure
authorAnderson Briglia <anderson.briglia@openbossa.org>
Tue, 7 Jun 2011 21:46:31 +0000 (18:46 -0300)
committerGustavo F. Padovan <padovan@profusion.mobi>
Mon, 13 Jun 2011 18:47:04 +0000 (15:47 -0300)
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 cb68b27edc9b30f8e14e8893348f25bf130318eb..8657165043967fbcff1fe24332c86005febec825 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;
 
@@ -909,12 +910,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);
 
@@ -4060,6 +4064,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;