All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gustavo Padovan <padovan@profusion.mobi>
To: Brian Gix <bgix@codeaurora.org>
Cc: linux-bluetooth@vger.kernel.org
Subject: Re: [PATCH 1/1] Bluetooth: Add support for LE Passkeys to MGMTOPS
Date: Wed, 9 Nov 2011 15:24:11 -0200	[thread overview]
Message-ID: <20111109172411.GA2672@joana> (raw)
In-Reply-To: <1320855666-8471-1-git-send-email-bgix@codeaurora.org>

Hi Brian,

* Brian Gix <bgix@codeaurora.org> [2011-11-09 08:21:06 -0800]:

> LE pairing is a Host based algorythm that requires User entered
> passkeys to obtain Man-In-The-Middle (MITM) level protection,
> unlike it's BR/EDR based conterpart SSP. This interface addition
> enables this ability.
> 
> Signed-off-by: Brian Gix <bgix@codeaurora.org>
> ---
>  include/net/bluetooth/mgmt.h |   11 ++++++
>  net/bluetooth/mgmt.c         |   77 ++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 86 insertions(+), 2 deletions(-)
> 
> diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h
> index 3e320c9..d67683f 100644
> --- a/include/net/bluetooth/mgmt.h
> +++ b/include/net/bluetooth/mgmt.h
> @@ -228,6 +228,17 @@ struct mgmt_cp_set_fast_connectable {
>  	__u8 enable;
>  } __packed;
>  
> +#define MGMT_OP_USER_PASSKEY_REPLY	0x0020
> +struct mgmt_cp_user_passkey_reply {
> +	bdaddr_t bdaddr;
> +	__le32 passkey;
> +} __packed;
> +
> +#define MGMT_OP_USER_PASSKEY_NEG_REPLY	0x0021
> +struct mgmt_cp_user_passkey_neg_reply {
> +	bdaddr_t bdaddr;
> +} __packed;
> +
>  #define MGMT_EV_CMD_COMPLETE		0x0001
>  struct mgmt_ev_cmd_complete {
>  	__le16 opcode;
> diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
> index 4cb2f95..c61b31e 100644
> --- a/net/bluetooth/mgmt.c
> +++ b/net/bluetooth/mgmt.c
> @@ -1429,6 +1429,7 @@ static int user_confirm_reply(struct sock *sk, u16 index, unsigned char *data,
>  	u16 mgmt_op, hci_op;
>  	struct pending_cmd *cmd;
>  	struct hci_dev *hdev;
> +	struct hci_conn *conn;
>  	int err;
>  
>  	BT_DBG("");
> @@ -1452,19 +1453,85 @@ static int user_confirm_reply(struct sock *sk, u16 index, unsigned char *data,
>  
>  	if (!test_bit(HCI_UP, &hdev->flags)) {
>  		err = cmd_status(sk, index, mgmt_op, ENETDOWN);
> -		goto failed;
> +		goto done;
> +	}
> +
> +	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
> +	if (!conn) {
> +		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->bdaddr);
> +		if (!conn) {
> +			err = cmd_status(sk, index, mgmt_op, ENOTCONN);
> +			goto done;
> +		}
> +
> +		/* Forward Confirm response to SMP */
> +
> +		err = cmd_status(sk, index, mgmt_op, 0);
> +		goto done;

user_confirm_reply changes should be in a separate commit. Let's not mix
things here.

>  	}
>  
>  	cmd = mgmt_pending_add(sk, mgmt_op, index, data, len);
>  	if (!cmd) {
>  		err = -ENOMEM;
> -		goto failed;
> +		goto done;
>  	}
>  
>  	err = hci_send_cmd(hdev, hci_op, sizeof(cp->bdaddr), &cp->bdaddr);
>  	if (err < 0)
>  		mgmt_pending_remove(cmd);
>  
> +done:
> +	hci_dev_unlock_bh(hdev);
> +	hci_dev_put(hdev);
> +
> +	return err;
> +}
> +
> +static int user_passkey_reply(struct sock *sk, u16 index, unsigned char *data,
> +							u16 len, int success)
> +{
> +	struct mgmt_cp_user_passkey_reply *cp = (void *) data;
> +	u16 mgmt_op;
> +	u32 passkey = 0;
> +	struct hci_dev *hdev;
> +	struct hci_conn *conn;
> +	int expected_len, err = 0;
> +
> +	BT_DBG("");
> +
> +	if (success) {
> +		mgmt_op = MGMT_OP_USER_PASSKEY_REPLY;
> +		expected_len = sizeof(*cp);
> +		passkey = le32_to_cpu(cp->passkey);
> +	} else {
> +		mgmt_op = MGMT_OP_USER_PASSKEY_NEG_REPLY;
> +		expected_len = sizeof(struct mgmt_cp_user_passkey_neg_reply);
> +	}
> +
> +	if (len != expected_len)
> +		return cmd_status(sk, index, mgmt_op, EINVAL);
> +
> +	hdev = hci_dev_get(index);
> +	if (!hdev)
> +		return cmd_status(sk, index, mgmt_op, ENODEV);
> +
> +	hci_dev_lock_bh(hdev);
> +
> +	if (!test_bit(HCI_UP, &hdev->flags)) {
> +		err = cmd_status(sk, index, mgmt_op, ENETDOWN);
> +		goto failed;
> +	}
> +
> +	conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->bdaddr);
> +	if (!conn) {
> +		err = cmd_status(sk, index, mgmt_op, ENOTCONN);
> +		goto failed;
> +	}
> +
> +	/* Forward Passkey response to SMP */

Passkey reply should work for both BR/EDR and LE, so let's do this a way that
it works for both with the same command.

	Gustavo

  reply	other threads:[~2011-11-09 17:24 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-09 16:21 [PATCH 1/1] Bluetooth: Add support for LE Passkeys to MGMTOPS Brian Gix
2011-11-09 17:24 ` Gustavo Padovan [this message]
2011-11-09 19:51   ` Brian Gix

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20111109172411.GA2672@joana \
    --to=padovan@profusion.mobi \
    --cc=bgix@codeaurora.org \
    --cc=linux-bluetooth@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.