Re: [PATCH 03/17] Bluetooth: Stop scanning on LE connection

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

 



Hi Marcel,

On Wed, Feb 26, 2014 at 3:23 AM, Marcel Holtmann <marcel@xxxxxxxxxxxx> wrote:
> Hi Andre,
>
>> Some LE controllers don't support scanning and creating a connection
>> at the same time. So we should always stop scanning in order to
>> establish the connection.
>>
>> Since we may prematurely stop the discovery procedure in favor of
>> the connection establishment, we should also cancel hdev->le_scan_
>> disable delayed work and set the discovery state to DISCOVERY_STOPPED.
>>
>> This change does a small improvement since it is not mandatory the
>> user stops scanning before connecting anymore. Moreover, this change
>> is required by upcoming LE auto connection mechanism in order to work
>> properly with controllers that don't support background scanning and
>> connection establishment at the same time.
>>
>> In future, we might want to do a small optimization by checking if
>> controller is able to scan and connect at the same time. For now,
>> we want the simplest approach so we always stop scanning (even if
>> the controller is able to carry out both operations).
>>
>> Signed-off-by: Andre Guedes <andre.guedes@xxxxxxxxxxxxx>
>> ---
>> include/net/bluetooth/hci.h |  1 +
>> net/bluetooth/hci_conn.c    | 89 ++++++++++++++++++++++++++++++++++++++++++++-
>> 2 files changed, 88 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
>> index 1bb45a4..c3834d3 100644
>> --- a/include/net/bluetooth/hci.h
>> +++ b/include/net/bluetooth/hci.h
>> @@ -356,6 +356,7 @@ enum {
>>
>> /* ---- HCI Error Codes ---- */
>> #define HCI_ERROR_AUTH_FAILURE                0x05
>> +#define HCI_ERROR_MEMORY_EXCEEDED    0x07
>> #define HCI_ERROR_CONNECTION_TIMEOUT  0x08
>> #define HCI_ERROR_REJ_BAD_ADDR                0x0f
>> #define HCI_ERROR_REMOTE_USER_TERM    0x13
>> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
>> index dc8aad9..ae2c3e1 100644
>> --- a/net/bluetooth/hci_conn.c
>> +++ b/net/bluetooth/hci_conn.c
>> @@ -594,12 +594,83 @@ static int hci_create_le_conn(struct hci_conn *conn)
>>       return 0;
>> }
>>
>> +static void hci_req_add_le_create_conn(struct hci_request *req,
>> +                                    struct hci_conn *conn)
>> +{
>> +     struct hci_cp_le_create_conn cp;
>> +     struct hci_dev *hdev = conn->hdev;
>> +     u8 own_addr_type;
>> +
>> +     memset(&cp, 0, sizeof(cp));
>> +
>> +     /* Update random address, but set require_privacy to false so
>> +      * that we never connect with an unresolvable address.
>> +      */
>> +     if (hci_update_random_address(req, false, &own_addr_type))
>> +             return;
>> +
>> +     conn->src_type = own_addr_type;
>> +
>> +     cp.scan_interval = cpu_to_le16(hdev->le_scan_interval);
>> +     cp.scan_window = cpu_to_le16(hdev->le_scan_window);
>> +     bacpy(&cp.peer_addr, &conn->dst);
>> +     cp.peer_addr_type = conn->dst_type;
>> +     cp.own_address_type = conn->src_type;
>
> the reason why you get the own_addr_type when setting the random address is to actually use it here.
>
> This is important since in cases where LE Privacy is enabled and we are using RPA, we want the random address used.

Year, I'm aware of it. 'own_addr_type' is assigned to
'conn->src_type'. Then, 'conn->src_type' is used in
'cp.own_address_type'.

IOW:
        conn->src_type = own_addr_type;
        ...
        cp.own_address_type = conn->src_type;

Or am I missing something?

BR,

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