Re: [RFC 15/15] Bluetooth: Auto connection and power off/on

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Marcel,

On Oct 17, 2013, at 7:55 AM, Marcel Holtmann wrote:

> Hi Andre,
> 
>> If hdev is closed (e.g. Mgmt power off command, RFKILL or controller is
>> reset), the established connections are dropped and no Disconnection
>> Complete Event is sent to host. This way, the background scan is not
>> triggered when devices configured with BT_AUTO_CONN_ALWAYS option
>> disconnect. To fix this issue, before dropping the LE connections, we
>> trigger the background scan for each connected device that requires
>> BT_AUTO_CONN_ALWAYS auto connection.
>> 
>> Moreover, once the adapter is powered on, we should start the background
>> scan if we have triggers registered. This way, we keep the background
>> scan running after a power off and power on sequence.
> 
> these are actually two independent patches.

I'll split this in two patches.

> 
>> Signed-off-by: Andre Guedes <andre.guedes@xxxxxxxxxxxxx>
>> ---
>> net/bluetooth/hci_conn.c | 35 +++++++++++++++++++++++++++++++++++
>> net/bluetooth/hci_core.c |  2 ++
>> 2 files changed, 37 insertions(+)
>> 
>> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
>> index 5caf13b..66823eb 100644
>> --- a/net/bluetooth/hci_conn.c
>> +++ b/net/bluetooth/hci_conn.c
>> @@ -954,6 +954,31 @@ timer:
>> 				   msecs_to_jiffies(hdev->idle_timeout));
>> }
>> 
>> +static void le_conn_drop_fixup(struct hci_conn *conn)
>> +{
>> +	struct hci_dev *hdev = conn->hdev;
>> +	struct hci_conn_param *param;
>> +	int err;
>> +
>> +	param = hci_find_conn_param(hdev, &conn->dst, conn->dst_type);
>> +	if (!param)
>> +		return;
>> +
>> +	if (param->auto_connect != BT_AUTO_CONN_ALWAYS)
>> +		goto done;
>> +
>> +	err = hci_trigger_background_scan(hdev);
>> +	if (err) {
>> +		BT_ERR("Failed to trigger background scanning: %d", err);
>> +		goto done;
>> +	}
>> +
>> +	param->bg_scan_triggered = true;
>> +
>> +done:
>> +	hci_conn_param_put(param);
>> +}
>> +
>> /* Drop all connection on the device */
>> void hci_conn_hash_flush(struct hci_dev *hdev)
>> {
>> @@ -963,6 +988,16 @@ void hci_conn_hash_flush(struct hci_dev *hdev)
>> 	BT_DBG("hdev %s", hdev->name);
>> 
>> 	list_for_each_entry_safe(c, n, &h->list, list) {
>> +		/* If this is a LE connection in connected state we should do
>> +		 * some fixup before dropping this connection. Since no
>> +		 * Disconnection Complete Event will be sent to the host, we
>> +		 * have to trigger the background scan in case this is a
>> +		 * BT_AUTO_CONN_ALWAYS device. This is handled by the le_conn_
>> +		 * drop_fixup() helper.
>> +		 */
>> +		if (c->type == LE_LINK && c->state == BT_CONNECTED)
>> +			le_conn_drop_fixup(c);
>> +
>> 		c->state = BT_CLOSED;
> 
> I do not like this part. We already have the case where we need to re-enable advertising after a connection drops. So this should be in a common place. I do not want to hack this in into all kinds of places.

Ok, I'll follow the same approach we have for re-enable advertising.

Regards,

Andre--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux