All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andre Guedes <andre.guedes@openbossa.org>
To: linux-bluetooth@vger.kernel.org
Subject: [RFC v11 08/15] Bluetooth: Connection parameters and auto connection
Date: Mon, 24 Feb 2014 19:30:54 -0300	[thread overview]
Message-ID: <1393281061-14320-9-git-send-email-andre.guedes@openbossa.org> (raw)
In-Reply-To: <1393281061-14320-1-git-send-email-andre.guedes@openbossa.org>

This patch modifies hci_conn_params_add() and hci_conn_params_del() so
they also add/delete pending LE connections according to the auto_
connect option. This way, background scan is automatically triggered/
untriggered when connection parameters are added/removed.

For instance, when a new connection parameters with HCI_AUTO_CONN_ALWAYS
option is added and we are not connected to the device, we add a pending
LE connection for that device.

Likewise, when the connection parameters are updated we add or delete
a pending LE connection according to its new auto_connect option.

Finally, when the connection parameter is deleted we also delete the
pending LE connection (if any).

Signed-off-by: Andre Guedes <andre.guedes@openbossa.org>
---
 net/bluetooth/hci_core.c | 42 +++++++++++++++++++++++++++++++++++-------
 1 file changed, 35 insertions(+), 7 deletions(-)

diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index dbd4e8a..0c1d2e3 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -3200,6 +3200,23 @@ struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev,
 	return NULL;
 }
 
+static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type)
+{
+	struct hci_conn *conn;
+
+	conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, addr);
+	if (!conn)
+		return false;
+
+	if (conn->dst_type != type)
+		return false;
+
+	if (conn->state != BT_CONNECTED)
+		return false;
+
+	return true;
+}
+
 /* This function requires the caller holds hdev->lock */
 void hci_conn_params_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type,
 			 u8 auto_connect, u16 conn_min_interval,
@@ -3208,12 +3225,8 @@ void hci_conn_params_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type,
 	struct hci_conn_params *params;
 
 	params = hci_conn_params_lookup(hdev, addr, addr_type);
-	if (params) {
-		params->conn_min_interval = conn_min_interval;
-		params->conn_max_interval = conn_max_interval;
-		params->auto_connect = auto_connect;
-		return;
-	}
+	if (params)
+		goto update;
 
 	params = kzalloc(sizeof(*params), GFP_KERNEL);
 	if (!params) {
@@ -3223,11 +3236,24 @@ void hci_conn_params_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type,
 
 	bacpy(&params->addr, addr);
 	params->addr_type = addr_type;
+
+	list_add(&params->list, &hdev->le_conn_params);
+
+update:
 	params->conn_min_interval = conn_min_interval;
 	params->conn_max_interval = conn_max_interval;
 	params->auto_connect = auto_connect;
 
-	list_add(&params->list, &hdev->le_conn_params);
+	switch (auto_connect) {
+	case HCI_AUTO_CONN_DISABLED:
+	case HCI_AUTO_CONN_LINK_LOSS:
+		hci_pend_le_conn_del(hdev, addr, addr_type);
+		break;
+	case HCI_AUTO_CONN_ALWAYS:
+		if (!is_connected(hdev, addr, addr_type))
+			hci_pend_le_conn_add(hdev, addr, addr_type);
+		break;
+	}
 
 	BT_DBG("addr %pMR (type %u) auto_connect %u conn_min_interval 0x%.4x "
 	       "conn_max_interval 0x%.4x", addr, addr_type, auto_connect,
@@ -3243,6 +3269,8 @@ void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type)
 	if (!params)
 		return;
 
+	hci_pend_le_conn_del(hdev, addr, addr_type);
+
 	list_del(&params->list);
 	kfree(params);
 
-- 
1.8.5.4


  parent reply	other threads:[~2014-02-24 22:30 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-24 22:30 [RFC v11 00/15] LE auto connection Andre Guedes
2014-02-24 22:30 ` [RFC v11 01/15] Bluetooth: Create hci_req_add_le_scan_disable helper Andre Guedes
2014-02-25  5:57   ` Johan Hedberg
2014-02-25 17:16     ` Andre Guedes
2014-02-24 22:30 ` [RFC v11 02/15] Bluetooth: Declare le_conn_failed in hci_core.h Andre Guedes
2014-02-24 22:30 ` [RFC v11 03/15] Bluetooth: Stop scanning on LE connection Andre Guedes
2014-02-24 22:30 ` [RFC v11 04/15] Bluetooth: Remove unused function Andre Guedes
2014-02-24 22:30 ` [RFC v11 05/15] Bluetooth: Introduce hdev->pend_le_conn list Andre Guedes
2014-02-24 22:30 ` [RFC v11 06/15] Bluetooth: Introduce LE auto connection infrastructure Andre Guedes
2014-02-25  4:23   ` Johan Hedberg
2014-02-25 17:16     ` Andre Guedes
2014-02-25 17:43       ` Marcel Holtmann
2014-02-24 22:30 ` [RFC v11 07/15] Bluetooth: Introduce LE auto connect options Andre Guedes
2014-02-24 22:30 ` Andre Guedes [this message]
2014-02-24 22:30 ` [RFC v11 09/15] Bluetooth: Temporarily stop background scanning on discovery Andre Guedes
2014-02-24 22:30 ` [RFC v11 10/15] Bluetooth: Auto connection and power on Andre Guedes
2014-02-24 22:30 ` [RFC v11 11/15] Bluetooth: Connection parameters and resolvable address Andre Guedes
2014-02-24 22:30 ` [RFC v11 12/15] Bluetooth: Support resolvable private addresses Andre Guedes
2014-02-24 22:30 ` [RFC v11 13/15] Bluetooth: Add le_auto_conn file on debugfs Andre Guedes
2014-02-24 22:31 ` [RFC v11 14/15] Bluetooth: Create hci_req_add_le_passive_scan helper Andre Guedes
2014-02-24 22:31 ` [RFC v11 15/15] Bluetooth: Update background scan parameters 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=1393281061-14320-9-git-send-email-andre.guedes@openbossa.org \
    --to=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 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.