2010-10-22 23:56:57

by Anderson Briglia

[permalink] [raw]
Subject: [PATCH 3/6] Bluetooth: Implement the first SMP commands

From: Vinicius Costa Gomes <[email protected]>

These simple commands will allow the SMP procedure to be started
and terminated with a not supported error. This is the first step
toward something useful.

Signed-off-by: Vinicius Costa Gomes <[email protected]>
---
net/bluetooth/l2cap.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 117 insertions(+), 0 deletions(-)

diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c
index 1ac44f4..ba87c84 100644
--- a/net/bluetooth/l2cap.c
+++ b/net/bluetooth/l2cap.c
@@ -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>

#define VERSION "2.15"

@@ -307,6 +308,85 @@ static void l2cap_chan_del(struct sock *sk, int err)
}
}

+static struct sk_buff *smp_build_cmd(struct l2cap_conn *conn, u8 code,
+ u16 dlen, void *data)
+{
+ struct sk_buff *skb;
+ struct l2cap_hdr *lh;
+ int len;
+
+ len = L2CAP_HDR_SIZE + 1 + dlen;
+
+ if (len > conn->mtu)
+ return NULL;
+
+ skb = bt_skb_alloc(len, GFP_ATOMIC);
+ if (!skb)
+ return NULL;
+
+ lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
+ lh->len = cpu_to_le16(1 + dlen);
+ lh->cid = cpu_to_le16(L2CAP_CID_SMP);
+
+ memcpy(skb_put(skb, 1), &code, 1);
+
+ memcpy(skb_put(skb, dlen), data, dlen);
+
+ return skb;
+}
+
+static inline void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
+{
+ struct sk_buff *skb = smp_build_cmd(conn, code, len, data);
+
+ BT_DBG("code 0x%2.2x", code);
+
+ if (!skb)
+ return;
+
+ hci_send_acl(conn->hcon, skb, 0);
+}
+
+static int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level)
+{
+ __u8 authreq;
+
+ BT_DBG("conn %p hcon %p level 0x%2.2x", conn, conn->hcon, sec_level);
+
+ switch (sec_level) {
+ case BT_SECURITY_MEDIUM:
+ /* Encrypted, no MITM protection */
+ authreq = 0x01;
+ break;
+
+ case BT_SECURITY_HIGH:
+ /* Bonding, MITM protection */
+ authreq = 0x05;
+ break;
+
+ case BT_SECURITY_LOW:
+ default:
+ return 1;
+ }
+
+ if (conn->hcon->link_mode & HCI_LM_MASTER) {
+ struct smp_cmd_pairing cp;
+ cp.io_capability = 0x00;
+ cp.oob_flag = 0x00;
+ cp.max_key_size = 16;
+ cp.init_key_dist = 0x00;
+ cp.resp_key_dist = 0x00;
+ cp.auth_req = authreq;
+ smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
+ } else {
+ struct smp_cmd_security_req cp;
+ cp.auth_req = authreq;
+ smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
+ }
+
+ return 0;
+}
+
/* Service level security */
static inline int l2cap_check_security(struct sock *sk)
{
@@ -4562,6 +4642,43 @@ done:
return 0;
}

+static inline void smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb)
+{
+ __u8 code = skb->data[0];
+ __u8 reason;
+
+ skb_pull(skb, 1);
+
+ switch (code) {
+ case SMP_CMD_PAIRING_REQ:
+ reason = SMP_PAIRING_NOTSUPP;
+ smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, 1, &reason);
+ l2cap_conn_del(conn->hcon, 0x05);
+ break;
+
+ case SMP_CMD_PAIRING_FAIL:
+ break;
+
+ case SMP_CMD_PAIRING_RSP:
+ case SMP_CMD_PAIRING_CONFIRM:
+ case SMP_CMD_PAIRING_RANDOM:
+ case SMP_CMD_ENCRYPT_INFO:
+ case SMP_CMD_MASTER_IDENT:
+ case SMP_CMD_IDENT_INFO:
+ case SMP_CMD_IDENT_ADDR_INFO:
+ case SMP_CMD_SIGN_INFO:
+ case SMP_CMD_SECURITY_REQ:
+ default:
+ BT_DBG("Unknown command code 0x%2.2x", code);
+
+ reason = SMP_CMD_NOTSUPP;
+ smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, 1, &reason);
+ l2cap_conn_del(conn->hcon, 0x05);
+ }
+
+ kfree_skb(skb);
+}
+
static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
{
struct l2cap_hdr *lh = (void *) skb->data;
--
1.7.0.4



2010-10-29 20:45:43

by Gustavo Padovan

[permalink] [raw]
Subject: Re: [PATCH 3/6] Bluetooth: Implement the first SMP commands

Hi Anderson,

* Anderson Lizardo <[email protected]> [2010-10-29 16:28:32 -0400]:

> On Thu, Oct 28, 2010 at 5:17 AM, Gustavo F. Padovan
> <[email protected]> wrote:
> > Yep, we may need a new smp.c file.
>
> It seems that to support multiple C files, there should not be a .c
> file with the same basename as the final module. This means we would
> need to rename l2cap.c to something else.
>
> Gustavo, I remember you had some patches to split l2cap.c... Do you
> still intend to apply them? If so, having a separate "smp.c" file will
> be much easier.

Yes, but I still have to discuss one part of the patch with Marcel.

>
> For now, in our branch we renamed "l2cap.c" to "l2cap_core.c" and
> added the following to net/bluetooth/Makefile:

I'm fine with it, that would done anyway in the future.

--
Gustavo F. Padovan
ProFUSION embedded systems - http://profusion.mobi

2010-10-29 20:28:32

by Anderson Lizardo

[permalink] [raw]
Subject: Re: [PATCH 3/6] Bluetooth: Implement the first SMP commands

On Thu, Oct 28, 2010 at 5:17 AM, Gustavo F. Padovan
<[email protected]> wrote:
> Yep, we may need a new smp.c file.

It seems that to support multiple C files, there should not be a .c
file with the same basename as the final module. This means we would
need to rename l2cap.c to something else.

Gustavo, I remember you had some patches to split l2cap.c... Do you
still intend to apply them? If so, having a separate "smp.c" file will
be much easier.

For now, in our branch we renamed "l2cap.c" to "l2cap_core.c" and
added the following to net/bluetooth/Makefile:

l2cap-objs := l2cap_core.o smp.o

Regards,
--
Anderson Lizardo
OpenBossa Labs - INdT
Manaus - Brazil

2010-10-28 09:17:33

by Gustavo Padovan

[permalink] [raw]
Subject: Re: [PATCH 3/6] Bluetooth: Implement the first SMP commands

* Luiz Augusto von Dentz <[email protected]> [2010-10-26 08:22:16 -0700]:

> Hi,
>
> On Tue, Oct 26, 2010 at 2:26 AM, Ville Tervo <[email protected]> wrote:
> > On Mon, Oct 25, 2010 at 03:03:56PM +0200, ext Gustavo F. Padovan wrote:
> >> Hi Vinicius,
> >>
> >> * Anderson Briglia <[email protected]> [2010-10-22 19:56:57 -0400]:
> >>
> >> > From: Vinicius Costa Gomes <[email protected]>
> >> >
> >> > These simple commands will allow the SMP procedure to be started
> >> > and terminated with a not supported error. This is the first step
> >> > toward something useful.
> >> >
> >> > Signed-off-by: Vinicius Costa Gomes <[email protected]>
> >> > ---
> >> > ?net/bluetooth/l2cap.c | ?117 +++++++++++++++++++++++++++++++++++++++++++++++++
> >> > ?1 files changed, 117 insertions(+), 0 deletions(-)
> >> >
> >> > diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c
> >> > index 1ac44f4..ba87c84 100644
> >> > --- a/net/bluetooth/l2cap.c
> >> > +++ b/net/bluetooth/l2cap.c
> >> > @@ -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>
> >> >
> >> > ?#define VERSION "2.15"
> >> >
> >> > @@ -307,6 +308,85 @@ static void l2cap_chan_del(struct sock *sk, int err)
> >> > ? ? }
> >> > ?}
> >> >
> >> > +static struct sk_buff *smp_build_cmd(struct l2cap_conn *conn, u8 code,
> >> > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? u16 dlen, void *data)
> >>
> >> Call this l2cap_smp_build_cmd()
> >
> > Should the whole smp stuff be in separate file (smp.c)? It's not a l2cap feature but a
> > protocol using l2cap. In that case smp_build_cmd would be good name.
>
> +1
>
> It is also much better for maintenance and development since there is
> less patches touching the l2cap.c so less chances of conflicts,
> rebases and regressions on l2cap.

Yep, we may need a new smp.c file.

--
Gustavo F. Padovan
ProFUSION embedded systems - http://profusion.mobi

2010-10-26 15:22:16

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: [PATCH 3/6] Bluetooth: Implement the first SMP commands

Hi,

On Tue, Oct 26, 2010 at 2:26 AM, Ville Tervo <[email protected]> wrote:
> On Mon, Oct 25, 2010 at 03:03:56PM +0200, ext Gustavo F. Padovan wrote:
>> Hi Vinicius,
>>
>> * Anderson Briglia <[email protected]> [2010-10-22 19:56:57 -0400]:
>>
>> > From: Vinicius Costa Gomes <[email protected]>
>> >
>> > These simple commands will allow the SMP procedure to be started
>> > and terminated with a not supported error. This is the first step
>> > toward something useful.
>> >
>> > Signed-off-by: Vinicius Costa Gomes <[email protected]>
>> > ---
>> > ?net/bluetooth/l2cap.c | ?117 +++++++++++++++++++++++++++++++++++++++++++++++++
>> > ?1 files changed, 117 insertions(+), 0 deletions(-)
>> >
>> > diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c
>> > index 1ac44f4..ba87c84 100644
>> > --- a/net/bluetooth/l2cap.c
>> > +++ b/net/bluetooth/l2cap.c
>> > @@ -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>
>> >
>> > ?#define VERSION "2.15"
>> >
>> > @@ -307,6 +308,85 @@ static void l2cap_chan_del(struct sock *sk, int err)
>> > ? ? }
>> > ?}
>> >
>> > +static struct sk_buff *smp_build_cmd(struct l2cap_conn *conn, u8 code,
>> > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? u16 dlen, void *data)
>>
>> Call this l2cap_smp_build_cmd()
>
> Should the whole smp stuff be in separate file (smp.c)? It's not a l2cap feature but a
> protocol using l2cap. In that case smp_build_cmd would be good name.

+1

It is also much better for maintenance and development since there is
less patches touching the l2cap.c so less chances of conflicts,
rebases and regressions on l2cap.


--
Luiz Augusto von Dentz
Computer Engineer

2010-10-26 09:26:23

by Ville Tervo

[permalink] [raw]
Subject: Re: [PATCH 3/6] Bluetooth: Implement the first SMP commands

On Mon, Oct 25, 2010 at 03:03:56PM +0200, ext Gustavo F. Padovan wrote:
> Hi Vinicius,
>
> * Anderson Briglia <[email protected]> [2010-10-22 19:56:57 -0400]:
>
> > From: Vinicius Costa Gomes <[email protected]>
> >
> > These simple commands will allow the SMP procedure to be started
> > and terminated with a not supported error. This is the first step
> > toward something useful.
> >
> > Signed-off-by: Vinicius Costa Gomes <[email protected]>
> > ---
> > net/bluetooth/l2cap.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++
> > 1 files changed, 117 insertions(+), 0 deletions(-)
> >
> > diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c
> > index 1ac44f4..ba87c84 100644
> > --- a/net/bluetooth/l2cap.c
> > +++ b/net/bluetooth/l2cap.c
> > @@ -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>
> >
> > #define VERSION "2.15"
> >
> > @@ -307,6 +308,85 @@ static void l2cap_chan_del(struct sock *sk, int err)
> > }
> > }
> >
> > +static struct sk_buff *smp_build_cmd(struct l2cap_conn *conn, u8 code,
> > + u16 dlen, void *data)
>
> Call this l2cap_smp_build_cmd()

Should the whole smp stuff be in separate file (smp.c)? It's not a l2cap feature but a
protocol using l2cap. In that case smp_build_cmd would be good name.

--
Ville

2010-10-25 13:03:56

by Gustavo Padovan

[permalink] [raw]
Subject: Re: [PATCH 3/6] Bluetooth: Implement the first SMP commands

Hi Vinicius,

* Anderson Briglia <[email protected]> [2010-10-22 19:56:57 -0400]:

> From: Vinicius Costa Gomes <[email protected]>
>
> These simple commands will allow the SMP procedure to be started
> and terminated with a not supported error. This is the first step
> toward something useful.
>
> Signed-off-by: Vinicius Costa Gomes <[email protected]>
> ---
> net/bluetooth/l2cap.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 117 insertions(+), 0 deletions(-)
>
> diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c
> index 1ac44f4..ba87c84 100644
> --- a/net/bluetooth/l2cap.c
> +++ b/net/bluetooth/l2cap.c
> @@ -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>
>
> #define VERSION "2.15"
>
> @@ -307,6 +308,85 @@ static void l2cap_chan_del(struct sock *sk, int err)
> }
> }
>
> +static struct sk_buff *smp_build_cmd(struct l2cap_conn *conn, u8 code,
> + u16 dlen, void *data)

Call this l2cap_smp_build_cmd()

> +{
> + struct sk_buff *skb;
> + struct l2cap_hdr *lh;
> + int len;
> +
> + len = L2CAP_HDR_SIZE + 1 + dlen;
> +
> + if (len > conn->mtu)
> + return NULL;
> +
> + skb = bt_skb_alloc(len, GFP_ATOMIC);
> + if (!skb)
> + return NULL;
> +
> + lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
> + lh->len = cpu_to_le16(1 + dlen);

cpu_to_le16(len - L2CAP_HDR_SIZE) here

> + lh->cid = cpu_to_le16(L2CAP_CID_SMP);
> +
> + memcpy(skb_put(skb, 1), &code, 1);
> +
> + memcpy(skb_put(skb, dlen), data, dlen);
> +
> + return skb;
> +}
> +
> +static inline void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)

and this l2cap_smp_send_cmd.

> +{
> + struct sk_buff *skb = smp_build_cmd(conn, code, len, data);
> +
> + BT_DBG("code 0x%2.2x", code);
> +
> + if (!skb)
> + return;
> +
> + hci_send_acl(conn->hcon, skb, 0);
> +}
> +
> +static int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level)
> +{


l2cap_smp_conn_security() here.

> + __u8 authreq;
> +
> + BT_DBG("conn %p hcon %p level 0x%2.2x", conn, conn->hcon, sec_level);
> +
> + switch (sec_level) {
> + case BT_SECURITY_MEDIUM:
> + /* Encrypted, no MITM protection */
> + authreq = 0x01;
> + break;
> +
> + case BT_SECURITY_HIGH:
> + /* Bonding, MITM protection */
> + authreq = 0x05;
> + break;
> +
> + case BT_SECURITY_LOW:
> + default:
> + return 1;
> + }
> +
> + if (conn->hcon->link_mode & HCI_LM_MASTER) {
> + struct smp_cmd_pairing cp;
> + cp.io_capability = 0x00;
> + cp.oob_flag = 0x00;
> + cp.max_key_size = 16;
> + cp.init_key_dist = 0x00;
> + cp.resp_key_dist = 0x00;
> + cp.auth_req = authreq;
> + smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
> + } else {
> + struct smp_cmd_security_req cp;
> + cp.auth_req = authreq;
> + smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
> + }
> +
> + return 0;
> +}
> +
> /* Service level security */
> static inline int l2cap_check_security(struct sock *sk)
> {
> @@ -4562,6 +4642,43 @@ done:
> return 0;
> }
>
> +static inline void smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb)

l2cap_smp_sig_channel()

--
Gustavo F. Padovan
ProFUSION embedded systems - http://profusion.mobi