Linux bluetooth development
 help / color / mirror / Atom feed
From: Marcel Holtmann <marcel@holtmann.org>
To: Andre Guedes <andre.guedes@openbossa.org>
Cc: linux-bluetooth@vger.kernel.org
Subject: Re: [PATCH 08/17] Bluetooth: Introduce LE auto connection infrastructure
Date: Tue, 25 Feb 2014 22:31:15 -0800	[thread overview]
Message-ID: <BFCD757D-FF1F-40B4-AD64-61D6EC10C346@holtmann.org> (raw)
In-Reply-To: <1393362104-12175-9-git-send-email-andre.guedes@openbossa.org>

Hi Andre,

> This patch introduces the LE auto connection infrastructure which
> will be used to implement the LE auto connection options.
> 
> In summary, the auto connection mechanism works as follows: Once the
> first pending LE connection is created, the background scanning is
> started. When the target device is found in range, the kernel
> autonomously starts the connection attempt. If connection is
> established successfully, that pending LE connection is deleted and
> the background is stopped.
> 
> To achieve that, this patch introduces the hci_update_background_scan()
> which controls the background scanning state. This function starts or
> stops the background scanning based on the hdev->pend_le_conns list. If
> there is no pending LE connection, the background scanning is stopped.
> Otherwise, we start the background scanning.
> 
> Then, every time a pending LE connection is added we call hci_update_
> background_scan() so the background scanning is started (in case it is
> not already running). Likewise, every time a pending LE connection is
> deleted we call hci_update_background_scan() so the background scanning
> is stopped (in case this was the last pending LE connection) or it is
> started again (in case we have more pending LE connections). Finally,
> we also call hci_update_background_scan() in hci_le_conn_failed() so
> the background scan is restarted in case the connection establishment
> fails. This way the background scanning keeps running until all pending
> LE connection are established.
> 
> At this point, resolvable addresses are not support by this
> infrastructure. The proper support is added in upcoming patches.
> 
> Signed-off-by: Andre Guedes <andre.guedes@openbossa.org>
> ---
> include/net/bluetooth/hci_core.h |  2 +
> net/bluetooth/hci_conn.c         |  5 +++
> net/bluetooth/hci_core.c         | 93 +++++++++++++++++++++++++++++++++++++++-
> net/bluetooth/hci_event.c        | 38 ++++++++++++++++
> 4 files changed, 136 insertions(+), 2 deletions(-)
> 
> diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
> index e08405d..617cf49 100644
> --- a/include/net/bluetooth/hci_core.h
> +++ b/include/net/bluetooth/hci_core.h
> @@ -806,6 +806,8 @@ void hci_pend_le_conn_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type);
> void hci_pend_le_conn_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type);
> void hci_pend_le_conns_clear(struct hci_dev *hdev);
> 
> +void hci_update_background_scan(struct hci_dev *hdev);
> +
> void hci_uuids_clear(struct hci_dev *hdev);
> 
> void hci_link_keys_clear(struct hci_dev *hdev);
> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> index ccf4a4f..e79351c 100644
> --- a/net/bluetooth/hci_conn.c
> +++ b/net/bluetooth/hci_conn.c
> @@ -527,6 +527,11 @@ void hci_le_conn_failed(struct hci_conn *conn, u8 status)
> 	hci_proto_connect_cfm(conn, status);
> 
> 	hci_conn_del(conn);
> +
> +	/* Since we may have temporarily stopped the background scanning in
> +	 * favor of connection establishment, we should restart it.
> +	 */
> +	hci_update_background_scan(hdev);
> }
> 
> static void create_le_conn_complete(struct hci_dev *hdev, u8 status)
> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
> index 142ecd8..d242217 100644
> --- a/net/bluetooth/hci_core.c
> +++ b/net/bluetooth/hci_core.c
> @@ -3281,7 +3281,7 @@ void hci_pend_le_conn_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
> 
> 	entry = hci_pend_le_conn_lookup(hdev, addr, addr_type);
> 	if (entry)
> -		return;
> +		goto done;
> 
> 	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
> 	if (!entry) {
> @@ -3295,6 +3295,9 @@ void hci_pend_le_conn_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
> 	list_add(&entry->list, &hdev->pend_le_conns);
> 
> 	BT_DBG("addr %pMR (type %u)", addr, addr_type);
> +
> +done:
> +	hci_update_background_scan(hdev);
> }
> 
> /* This function requires the caller holds hdev->lock */
> @@ -3304,12 +3307,15 @@ void hci_pend_le_conn_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
> 
> 	entry = hci_pend_le_conn_lookup(hdev, addr, addr_type);
> 	if (!entry)
> -		return;
> +		goto done;
> 
> 	list_del(&entry->list);
> 	kfree(entry);
> 
> 	BT_DBG("addr %pMR (type %u)", addr, addr_type);
> +
> +done:
> +	hci_update_background_scan(hdev);
> }
> 
> /* This function requires the caller holds hdev->lock */
> @@ -4946,3 +4952,86 @@ void hci_req_add_le_scan_disable(struct hci_request *req)
> 	cp.enable = LE_SCAN_DISABLE;
> 	hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp);
> }
> +
> +static void update_background_scan_complete(struct hci_dev *hdev, u8 status)
> +{
> +	if (status)
> +		BT_DBG("HCI request failed to update background scanning: "
> +		       "status 0x%2.2x", status);
> +}
> +
> +/* This function controls the background scanning based on hdev->pend_le_conns
> + * list. If there are pending LE connection we start the background scanning,
> + * otherwise we stop it.
> + *
> + * This function requires the caller holds hdev->lock.
> + */
> +void hci_update_background_scan(struct hci_dev *hdev)
> +{
> +	struct hci_cp_le_set_scan_param param_cp;
> +	struct hci_cp_le_set_scan_enable enable_cp;
> +	struct hci_request req;
> +	struct hci_conn *conn;
> +	int err;
> +
> +	hci_req_init(&req, hdev);
> +
> +	if (list_empty(&hdev->pend_le_conns)) {
> +		/* If there is no pending LE connections, we should stop
> +		 * the background scanning.
> +		 */
> +
> +		/* If controller is not scanning we are done. */
> +		if (!test_bit(HCI_LE_SCAN, &hdev->dev_flags))
> +			return;
> +
> +		hci_req_add_le_scan_disable(&req);
> +
> +		BT_DBG("%s stopping background scanning", hdev->name);
> +	} else {
> +		u8 own_addr_type;
> +
> +		/* If there is at least one pending LE connection, we should
> +		 * keep the background scan running.
> +		 */
> +
> +		/* If controller is already scanning we are done. */
> +		if (test_bit(HCI_LE_SCAN, &hdev->dev_flags))
> +			return;
> +
> +		/* If controller is connecting, we should not start scanning
> +		 * since some controllers are not able to scan and connect at
> +		 * the same time.
> +		 */
> +		conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
> +		if (conn)
> +			return;
> +
> +		/* Use private address since remote doesn't need to identify us.
> +		 * Strictly speaking, this is not required since no SCAN_REQ is
> +		 * sent in passive scanning.
> +		 */
> +		if (hci_update_random_address(&req, true, &own_addr_type))
> +			return;

the comment above is confusing. Reason is simple. We might use a RPA if LE Privacy has been enabled. The require_privacy == true will fallback to URPA in case privacy is not enabled. If privacy is enabled, then no matter what require_privacy is set to, we will use a random address.

It should say something along the lines of this:

	/* Set require_privacy to true to avoid identification from
	 * unknown peer devices. Since this is passive scanning, no
	 * SCAN_REQ using the local identity should be sent. Mandating
	 * privacy is just an extra precaution.
	 */

Regards

Marcel


  reply	other threads:[~2014-02-26  6:31 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-25 21:01 [PATCH 00/17] LE auto connection Andre Guedes
2014-02-25 21:01 ` [PATCH 01/17] Bluetooth: Create hci_req_add_le_scan_disable helper Andre Guedes
2014-02-25 21:01 ` [PATCH 02/17] Bluetooth: Declare le_conn_failed in hci_core.h Andre Guedes
2014-02-25 21:01 ` [PATCH 03/17] Bluetooth: Stop scanning on LE connection Andre Guedes
2014-02-26  6:23   ` Marcel Holtmann
2014-02-26 19:34     ` Andre Guedes
2014-02-26 19:50       ` Marcel Holtmann
2014-02-26 20:26         ` Johan Hedberg
2014-02-25 21:01 ` [PATCH 04/17] Bluetooth: Remove unused function Andre Guedes
2014-02-25 21:01 ` [PATCH 05/17] Bluetooth: Refactor HCI connection code Andre Guedes
2014-02-25 21:01 ` [PATCH 06/17] Bluetooth: Move address type conversion to outside hci_connect_le Andre Guedes
2014-02-25 21:01 ` [PATCH 07/17] Bluetooth: Introduce hdev->pend_le_conn list Andre Guedes
2014-02-25 21:01 ` [PATCH 08/17] Bluetooth: Introduce LE auto connection infrastructure Andre Guedes
2014-02-26  6:31   ` Marcel Holtmann [this message]
2014-02-26 19:34     ` Andre Guedes
2014-02-25 21:01 ` [PATCH 09/17] Bluetooth: Introduce LE auto connect options Andre Guedes
2014-02-25 21:01 ` [PATCH 10/17] Bluetooth: Connection parameters and auto connection Andre Guedes
2014-02-26  6:33   ` Marcel Holtmann
2014-02-26 19:34     ` Andre Guedes
2014-02-26 19:52       ` Marcel Holtmann
2014-02-25 21:01 ` [PATCH 11/17] Bluetooth: Temporarily stop background scanning on discovery Andre Guedes
2014-02-25 21:01 ` [PATCH 12/17] Bluetooth: Auto connection and power on Andre Guedes
2014-02-25 21:01 ` [PATCH 13/17] Bluetooth: Connection parameters and resolvable address Andre Guedes
2014-02-26  6:37   ` Marcel Holtmann
2014-02-26 19:34     ` Andre Guedes
2014-02-25 21:01 ` [PATCH 14/17] Bluetooth: Support resolvable private addresses Andre Guedes
2014-02-25 21:01 ` [PATCH 15/17] Bluetooth: Add le_auto_conn file on debugfs Andre Guedes
2014-02-26  6:41   ` Marcel Holtmann
2014-02-26 19:35     ` Andre Guedes
2014-02-25 21:01 ` [PATCH 16/17] Bluetooth: Create hci_req_add_le_passive_scan helper Andre Guedes
2014-02-26  6:44   ` Marcel Holtmann
2014-02-26 19:35     ` Andre Guedes
2014-02-25 21:01 ` [PATCH 17/17] Bluetooth: Update background scan parameters Andre Guedes
2014-02-26  6:47   ` Marcel Holtmann
2014-02-26 19:35     ` Andre Guedes

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=BFCD757D-FF1F-40B4-AD64-61D6EC10C346@holtmann.org \
    --to=marcel@holtmann.org \
    --cc=andre.guedes@openbossa.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox