All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vinicius Costa Gomes <vinicius.gomes@openbossa.org>
To: Szymon Janc <szymon.janc@tieto.com>
Cc: linux-bluetooth@vger.kernel.org,
	par-gunnar.p.hjalmdahl@stericsson.com,
	henrik.possung@stericsson.com
Subject: Re: [PATCH v3 4/5] Bluetooth: Add add/remove_remote_oob_data management commands
Date: Mon, 21 Mar 2011 11:26:40 -0300	[thread overview]
Message-ID: <20110321142639.GA2685@piper> (raw)
In-Reply-To: <1300712821-23172-5-git-send-email-szymon.janc@tieto.com>

Hi Szymon,

On 14:07 Mon 21 Mar, Szymon Janc wrote:
> This patch adds commands to add and remove remote OOB data to the managment
> interface. Remote data is stored in kernel and can be used by corresponding
> HCI commands and events when needed.
> 
> Signed-off-by: Szymon Janc <szymon.janc@tieto.com>
> ---
>  include/net/bluetooth/hci.h      |   19 ++++++++++
>  include/net/bluetooth/hci_core.h |   16 ++++++++
>  include/net/bluetooth/mgmt.h     |   12 ++++++
>  net/bluetooth/hci_core.c         |   67 ++++++++++++++++++++++++++++++++++
>  net/bluetooth/hci_event.c        |   34 +++++++++++++++++
>  net/bluetooth/mgmt.c             |   75 ++++++++++++++++++++++++++++++++++++++
>  6 files changed, 223 insertions(+), 0 deletions(-)
> 
> diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
> index 0ac0804..8c71e88 100644
> --- a/include/net/bluetooth/hci.h
> +++ b/include/net/bluetooth/hci.h
> @@ -428,6 +428,20 @@ struct hci_rp_user_confirm_reply {
>  
>  #define HCI_OP_USER_CONFIRM_NEG_REPLY	0x042d
>  
> +
> +#define HCI_OP_REMOTE_OOB_DATA_REPLY	0x0430
> +struct hci_cp_remote_oob_data_reply {
> +	bdaddr_t bdaddr;
> +	__u8     hash[16];
> +	__u8     randomizer[16];
> +} __packed;
> +
> +#define HCI_OP_REMOTE_OOB_DATA_NEG_REPLY	0x0433
> +struct hci_cp_remote_oob_data_neg_reply {
> +	bdaddr_t bdaddr;
> +} __packed;
> +
> +
>  #define HCI_OP_IO_CAPABILITY_NEG_REPLY	0x0434
>  struct hci_cp_io_capability_neg_reply {
>  	bdaddr_t bdaddr;
> @@ -964,6 +978,11 @@ struct hci_ev_user_confirm_req {
>  	__le32		passkey;
>  } __packed;
>  
> +#define HCI_EV_REMOTE_OOB_DATA_REQUEST	0x35
> +struct hci_ev_remote_oob_data_request {
> +	bdaddr_t bdaddr;
> +} __packed;
> +
>  #define HCI_EV_SIMPLE_PAIR_COMPLETE	0x36
>  struct hci_ev_simple_pair_complete {
>  	__u8     status;
> diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
> index fd9b8a3..87bff51 100644
> --- a/include/net/bluetooth/hci_core.h
> +++ b/include/net/bluetooth/hci_core.h
> @@ -82,6 +82,13 @@ struct link_key {
>  	u8 pin_len;
>  };
>  
> +struct oob_data {
> +	struct list_head list;
> +	bdaddr_t bdaddr;
> +	u8 hash[16];
> +	u8 randomizer[16];
> +};
> +
>  #define NUM_REASSEMBLY 4
>  struct hci_dev {
>  	struct list_head list;
> @@ -169,6 +176,8 @@ struct hci_dev {
>  
>  	struct list_head	link_keys;
>  
> +	struct list_head	remote_oob_data;
> +
>  	struct hci_dev_stats	stat;
>  
>  	struct sk_buff_head	driver_init;
> @@ -505,6 +514,13 @@ int hci_add_link_key(struct hci_dev *hdev, int new_key, bdaddr_t *bdaddr,
>  						u8 *key, u8 type, u8 pin_len);
>  int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
>  
> +int hci_remote_oob_data_clear(struct hci_dev *hdev);
> +struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
> +							bdaddr_t *bdaddr);
> +int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
> +								u8 *randomizer);
> +int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr);
> +
>  void hci_del_off_timer(struct hci_dev *hdev);
>  
>  void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
> diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h
> index 6ebb126..1a6283f 100644
> --- a/include/net/bluetooth/mgmt.h
> +++ b/include/net/bluetooth/mgmt.h
> @@ -183,6 +183,18 @@ struct mgmt_rp_read_local_oob_data {
>  	__u8 randomizer[16];
>  } __packed;
>  
> +#define MGMT_OP_ADD_REMOTE_OOB_DATA	0x0019
> +struct mgmt_cp_add_remote_oob_data {
> +	bdaddr_t bdaddr;
> +	__u8 hash[16];
> +	__u8 randomizer[16];
> +} __packed;
> +
> +#define MGMT_OP_REMOVE_REMOTE_OOB_DATA	0x001A
> +struct mgmt_cp_remove_remote_oob_data {
> +	bdaddr_t bdaddr;
> +} __packed;
> +
>  #define MGMT_EV_CMD_COMPLETE		0x0001
>  struct mgmt_ev_cmd_complete {
>  	__le16 opcode;
> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
> index 1f11fe3..1fa9ce5 100644
> --- a/net/bluetooth/hci_core.c
> +++ b/net/bluetooth/hci_core.c
> @@ -1080,6 +1080,70 @@ static void hci_cmd_timer(unsigned long arg)
>  	tasklet_schedule(&hdev->cmd_task);
>  }
>  
> +struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
> +							bdaddr_t *bdaddr)
> +{
> +	struct oob_data *data;
> +
> +	list_for_each_entry(data, &hdev->remote_oob_data, list)
> +		if (bacmp(bdaddr, &data->bdaddr) == 0)
> +			return data;
> +
> +	return NULL;
> +}
> +
> +int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr)
> +{
> +	struct oob_data *data;
> +
> +	data = hci_find_remote_oob_data(hdev, bdaddr);
> +	if (!data)
> +		return -ENOENT;
> +
> +	BT_DBG("%s removing %s", hdev->name, batostr(bdaddr));
> +
> +	list_del(&data->list);
> +	kfree(data);
> +
> +	return 0;
> +}
> +
> +int hci_remote_oob_data_clear(struct hci_dev *hdev)
> +{
> +	struct oob_data *data, *n;
> +
> +	list_for_each_entry_safe(data, n, &hdev->remote_oob_data, list) {
> +		list_del(&data->list);
> +		kfree(data);
> +	}
> +
> +	return 0;
> +}
> +
> +int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
> +								u8 *randomizer)
> +{
> +	struct oob_data *data;
> +
> +	data = hci_find_remote_oob_data(hdev, bdaddr);
> +
> +	if (!data) {
> +		data = kmalloc(sizeof(*data), GFP_ATOMIC);
> +		if (!data)
> +			return -ENOMEM;
> +
> +		bacpy(&data->bdaddr, bdaddr);
> +		list_add(&data->list, &hdev->remote_oob_data);
> +	}
> +
> +	memcpy(data->hash, hash, 16);
> +	memcpy(data->randomizer, randomizer, 16);
> +
> +	BT_DBG("%s for %s", hdev->name, batostr(bdaddr));
> +
> +	return 0;
> +}
> +
>  /* Register HCI device */
>  int hci_register_dev(struct hci_dev *hdev)
>  {
> @@ -1144,6 +1208,8 @@ int hci_register_dev(struct hci_dev *hdev)
>  
>  	INIT_LIST_HEAD(&hdev->link_keys);
>  
> +	INIT_LIST_HEAD(&hdev->remote_oob_data);
> +
>  	INIT_WORK(&hdev->power_on, hci_power_on);
>  	INIT_WORK(&hdev->power_off, hci_power_off);
>  	setup_timer(&hdev->off_timer, hci_auto_off, (unsigned long) hdev);
> @@ -1223,6 +1289,7 @@ int hci_unregister_dev(struct hci_dev *hdev)
>  	hci_blacklist_clear(hdev);
>  	hci_uuids_clear(hdev);
>  	hci_link_keys_clear(hdev);
> +	hci_remote_oob_data_clear(hdev);
>  	hci_dev_unlock_bh(hdev);
>  
>  	__hci_dev_put(hdev);
> diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> index 0223b38..fba5998 100644
> --- a/net/bluetooth/hci_event.c
> +++ b/net/bluetooth/hci_event.c
> @@ -2473,6 +2473,37 @@ static inline void hci_remote_host_features_evt(struct hci_dev *hdev, struct sk_
>  	hci_dev_unlock(hdev);
>  }
>  
> +static inline void hci_remote_oob_data_request_evt(struct hci_dev *hdev,
> +							struct sk_buff *skb)
> +{
> +	struct hci_ev_remote_oob_data_request *ev = (void *) skb->data;
> +	struct oob_data *data;
> +
> +	BT_DBG("%s", hdev->name);
> +
> +	hci_dev_lock(hdev);
> +
> +	data = hci_find_remote_oob_data(hdev, &ev->bdaddr);
> +	if (data) {
> +		struct hci_cp_remote_oob_data_reply cp;
> +
> +		bacpy(&cp.bdaddr, &ev->bdaddr);
> +		memcpy(cp.hash, data->hash, 16);
> +		memcpy(cp.randomizer, data->randomizer, 16);
> +
> +		hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_REPLY, sizeof(cp),
> +									&cp);
> +	} else {
> +		struct hci_cp_remote_oob_data_neg_reply cp;
> +
> +		bacpy(&cp.bdaddr, &ev->bdaddr);
> +		hci_send_cmd(hdev, HCI_OP_REMOTE_OOB_DATA_NEG_REPLY, sizeof(cp),
> +									&cp);
> +	}
> +
> +	hci_dev_unlock(hdev);
> +}
> +
>  static inline void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
>  {
>  	struct hci_ev_le_conn_complete *ev = (void *) skb->data;
> @@ -2673,6 +2704,9 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
>  
>  	case HCI_EV_LE_META:
>  		hci_le_meta_evt(hdev, skb);
> +

Looks like you are missing a "break" here.

> +	case HCI_EV_REMOTE_OOB_DATA_REQUEST:
> +		hci_remote_oob_data_request_evt(hdev, skb);
>  		break;
>  
>  	default:
> diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
> index a72cbf6..46c96b3 100644
> --- a/net/bluetooth/mgmt.c
> +++ b/net/bluetooth/mgmt.c
> @@ -1349,6 +1349,74 @@ unlock:
>  	return err;
>  }
>  
> +static int add_remote_oob_data(struct sock *sk, u16 index, unsigned char *data,
> +									u16 len)
> +{
> +	struct hci_dev *hdev;
> +	struct mgmt_cp_add_remote_oob_data *cp = (void *) data;
> +	int err;
> +
> +	BT_DBG("hci%u ", index);
> +
> +	if (len != sizeof(*cp))
> +		return cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA,
> +									EINVAL);
> +
> +	hdev = hci_dev_get(index);
> +	if (!hdev)
> +		return cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA,
> +									ENODEV);
> +
> +	hci_dev_lock_bh(hdev);
> +
> +	err = hci_add_remote_oob_data(hdev, &cp->bdaddr, cp->hash,
> +								cp->randomizer);
> +	if (err < 0)
> +		err = cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA, -err);
> +	else
> +		err = cmd_complete(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA, NULL,
> +									0);
> +
> +	hci_dev_unlock_bh(hdev);
> +	hci_dev_put(hdev);
> +
> +	return err;
> +}
> +
> +static int remove_remote_oob_data(struct sock *sk, u16 index,
> +						unsigned char *data, u16 len)
> +{
> +	struct hci_dev *hdev;
> +	struct mgmt_cp_remove_remote_oob_data *cp = (void *)data;
> +	int err;
> +
> +	BT_DBG("hci%u ", index);
> +
> +	if (len != sizeof(*cp))
> +		return cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
> +									EINVAL);
> +
> +	hdev = hci_dev_get(index);
> +	if (!hdev)
> +		return cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
> +									ENODEV);
> +
> +	hci_dev_lock_bh(hdev);
> +
> +	err = hci_remove_remote_oob_data(hdev, &cp->bdaddr);
> +	if (err < 0)
> +		err = cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
> +									-err);
> +	else
> +		err = cmd_complete(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
> +								NULL, 0);
> +
> +	hci_dev_unlock_bh(hdev);
> +	hci_dev_put(hdev);
> +
> +	return err;
> +}
> +
>  int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
>  {
>  	unsigned char *buf;
> @@ -1450,6 +1518,13 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
>  	case MGMT_OP_READ_LOCAL_OOB_DATA:
>  		err = read_local_oob_data(sk, index);
>  		break;
> +	case MGMT_OP_ADD_REMOTE_OOB_DATA:
> +		err = add_remote_oob_data(sk, index, buf + sizeof(*hdr), len);
> +		break;
> +	case MGMT_OP_REMOVE_REMOTE_OOB_DATA:
> +		err = remove_remote_oob_data(sk, index, buf + sizeof(*hdr),
> +									len);
> +		break;
>  
>  	default:
>  		BT_DBG("Unknown op %u", opcode);
> -- 
> 1.7.0.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


Cheers,
-- 
Vinicius

  reply	other threads:[~2011-03-21 14:26 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-21 13:06 [PATCH v3 0/5] Support for OOB in mgmt interface Szymon Janc
2011-03-21 13:06 ` [PATCH v3 1/5] Bluetooth: Rename cmd to param in pending_cmd Szymon Janc
2011-03-21 13:06 ` [PATCH v3 2/5] Bluetooth: Allow for NULL data in mgmt_pending_add Szymon Janc
2011-03-21 13:06 ` [PATCH v3 3/5] Bluetooth: Add read_local_oob_data management command Szymon Janc
2011-03-21 13:07 ` [PATCH v3 4/5] Bluetooth: Add add/remove_remote_oob_data management commands Szymon Janc
2011-03-21 14:26   ` Vinicius Costa Gomes [this message]
2011-03-21 14:42     ` Szymon Janc
2011-03-21 13:07 ` [PATCH v3 5/5] Bluetooth: Enable support for out of band association model Szymon Janc

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=20110321142639.GA2685@piper \
    --to=vinicius.gomes@openbossa.org \
    --cc=henrik.possung@stericsson.com \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=par-gunnar.p.hjalmdahl@stericsson.com \
    --cc=szymon.janc@tieto.com \
    /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.