2014-12-11 09:29:44

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH v2 1/2] android/gatt: Remove discoverable flag from device found callback

Android is interested in all of the Scan Responses. Also the ones which
are set as non discoverable. It is in order to support
Observer\Broadcaster mode. Therefore discoverable flag can be removed
from the device found callback. This patch does it.
---
android/bluetooth.c | 5 +----
android/bluetooth.h | 3 +--
android/gatt.c | 5 ++---
3 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/android/bluetooth.c b/android/bluetooth.c
index 6443cfe..44bfe4d 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -1946,12 +1946,9 @@ static void update_found_device(const bdaddr_t *bdaddr, uint8_t bdaddr_type,

/* Notify Gatt if its registered for LE events */
if (bdaddr_type != BDADDR_BREDR && gatt_device_found_cb) {
- bool discoverable;
bdaddr_t *addr;
uint8_t addr_type;

- discoverable = eir.flags & (EIR_LIM_DISC | EIR_GEN_DISC);
-
/*
* If RPA is set it means that IRK was received and ID address
* is being used. Android Framework is still using old RPA and
@@ -1967,7 +1964,7 @@ static void update_found_device(const bdaddr_t *bdaddr, uint8_t bdaddr_type,
}

gatt_device_found_cb(addr, addr_type, rssi, data_len, data,
- discoverable, dev->le_bonded);
+ dev->le_bonded);
}

if (!dev->bredr_paired && !dev->le_paired)
diff --git a/android/bluetooth.h b/android/bluetooth.h
index 8970559..4b7a70d 100644
--- a/android/bluetooth.h
+++ b/android/bluetooth.h
@@ -42,8 +42,7 @@ void bt_adapter_remove_record(uint32_t handle);

typedef void (*bt_le_device_found)(const bdaddr_t *addr, uint8_t addr_type,
int rssi, uint16_t eir_len,
- const void *eir, bool discoverable,
- bool bonded);
+ const void *eir, bool bonded);
bool bt_le_register(bt_le_device_found cb);
void bt_le_unregister(void);

diff --git a/android/gatt.c b/android/gatt.c
index b2ce9c1..519e347 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -1648,15 +1648,14 @@ static void bt_le_discovery_stop_cb(void)

static void le_device_found_handler(const bdaddr_t *addr, uint8_t addr_type,
int rssi, uint16_t eir_len,
- const void *eir,
- bool discoverable, bool bonded)
+ const void *eir, bool bonded)
{
uint8_t buf[IPC_MTU];
struct hal_ev_gatt_client_scan_result *ev = (void *) buf;
struct gatt_device *dev;
char bda[18];

- if (!scanning || (!discoverable && !bonded))
+ if (!scanning)
goto connect;

ba2str(addr, bda);
--
1.8.4



2014-12-18 09:05:49

by Szymon Janc

[permalink] [raw]
Subject: Re: [PATCH v2 1/2] android/gatt: Remove discoverable flag from device found callback

Hi Ɓukasz,

On Thursday 11 of December 2014 10:29:44 Lukasz Rymanowski wrote:
> Android is interested in all of the Scan Responses. Also the ones which
> are set as non discoverable. It is in order to support
> Observer\Broadcaster mode. Therefore discoverable flag can be removed
> from the device found callback. This patch does it.
> ---
> android/bluetooth.c | 5 +----
> android/bluetooth.h | 3 +--
> android/gatt.c | 5 ++---
> 3 files changed, 4 insertions(+), 9 deletions(-)
>
> diff --git a/android/bluetooth.c b/android/bluetooth.c
> index 6443cfe..44bfe4d 100644
> --- a/android/bluetooth.c
> +++ b/android/bluetooth.c
> @@ -1946,12 +1946,9 @@ static void update_found_device(const bdaddr_t *bdaddr, uint8_t bdaddr_type,
>
> /* Notify Gatt if its registered for LE events */
> if (bdaddr_type != BDADDR_BREDR && gatt_device_found_cb) {
> - bool discoverable;
> bdaddr_t *addr;
> uint8_t addr_type;
>
> - discoverable = eir.flags & (EIR_LIM_DISC | EIR_GEN_DISC);
> -
> /*
> * If RPA is set it means that IRK was received and ID address
> * is being used. Android Framework is still using old RPA and
> @@ -1967,7 +1964,7 @@ static void update_found_device(const bdaddr_t *bdaddr, uint8_t bdaddr_type,
> }
>
> gatt_device_found_cb(addr, addr_type, rssi, data_len, data,
> - discoverable, dev->le_bonded);
> + dev->le_bonded);
> }
>
> if (!dev->bredr_paired && !dev->le_paired)
> diff --git a/android/bluetooth.h b/android/bluetooth.h
> index 8970559..4b7a70d 100644
> --- a/android/bluetooth.h
> +++ b/android/bluetooth.h
> @@ -42,8 +42,7 @@ void bt_adapter_remove_record(uint32_t handle);
>
> typedef void (*bt_le_device_found)(const bdaddr_t *addr, uint8_t addr_type,
> int rssi, uint16_t eir_len,
> - const void *eir, bool discoverable,
> - bool bonded);
> + const void *eir, bool bonded);
> bool bt_le_register(bt_le_device_found cb);
> void bt_le_unregister(void);
>
> diff --git a/android/gatt.c b/android/gatt.c
> index b2ce9c1..519e347 100644
> --- a/android/gatt.c
> +++ b/android/gatt.c
> @@ -1648,15 +1648,14 @@ static void bt_le_discovery_stop_cb(void)
>
> static void le_device_found_handler(const bdaddr_t *addr, uint8_t addr_type,
> int rssi, uint16_t eir_len,
> - const void *eir,
> - bool discoverable, bool bonded)
> + const void *eir, bool bonded)
> {
> uint8_t buf[IPC_MTU];
> struct hal_ev_gatt_client_scan_result *ev = (void *) buf;
> struct gatt_device *dev;
> char bda[18];
>
> - if (!scanning || (!discoverable && !bonded))
> + if (!scanning)
> goto connect;
>
> ba2str(addr, bda);
>

This patch is now applied, thanks.

Second needs to be rebased.

--
Best regards,
Szymon Janc

2014-12-16 11:11:06

by Lukasz Rymanowski

[permalink] [raw]
Subject: Re: [PATCH v2 1/2] android/gatt: Remove discoverable flag from device found callback

Hi,

On 11 December 2014 at 10:29, Lukasz Rymanowski
<[email protected]> wrote:
> Android is interested in all of the Scan Responses. Also the ones which
> are set as non discoverable. It is in order to support
> Observer\Broadcaster mode. Therefore discoverable flag can be removed
> from the device found callback. This patch does it.
> ---

ping

> android/bluetooth.c | 5 +----
> android/bluetooth.h | 3 +--
> android/gatt.c | 5 ++---
> 3 files changed, 4 insertions(+), 9 deletions(-)
>
> diff --git a/android/bluetooth.c b/android/bluetooth.c
> index 6443cfe..44bfe4d 100644
> --- a/android/bluetooth.c
> +++ b/android/bluetooth.c
> @@ -1946,12 +1946,9 @@ static void update_found_device(const bdaddr_t *bdaddr, uint8_t bdaddr_type,
>
> /* Notify Gatt if its registered for LE events */
> if (bdaddr_type != BDADDR_BREDR && gatt_device_found_cb) {
> - bool discoverable;
> bdaddr_t *addr;
> uint8_t addr_type;
>
> - discoverable = eir.flags & (EIR_LIM_DISC | EIR_GEN_DISC);
> -
> /*
> * If RPA is set it means that IRK was received and ID address
> * is being used. Android Framework is still using old RPA and
> @@ -1967,7 +1964,7 @@ static void update_found_device(const bdaddr_t *bdaddr, uint8_t bdaddr_type,
> }
>
> gatt_device_found_cb(addr, addr_type, rssi, data_len, data,
> - discoverable, dev->le_bonded);
> + dev->le_bonded);
> }
>
> if (!dev->bredr_paired && !dev->le_paired)
> diff --git a/android/bluetooth.h b/android/bluetooth.h
> index 8970559..4b7a70d 100644
> --- a/android/bluetooth.h
> +++ b/android/bluetooth.h
> @@ -42,8 +42,7 @@ void bt_adapter_remove_record(uint32_t handle);
>
> typedef void (*bt_le_device_found)(const bdaddr_t *addr, uint8_t addr_type,
> int rssi, uint16_t eir_len,
> - const void *eir, bool discoverable,
> - bool bonded);
> + const void *eir, bool bonded);
> bool bt_le_register(bt_le_device_found cb);
> void bt_le_unregister(void);
>
> diff --git a/android/gatt.c b/android/gatt.c
> index b2ce9c1..519e347 100644
> --- a/android/gatt.c
> +++ b/android/gatt.c
> @@ -1648,15 +1648,14 @@ static void bt_le_discovery_stop_cb(void)
>
> static void le_device_found_handler(const bdaddr_t *addr, uint8_t addr_type,
> int rssi, uint16_t eir_len,
> - const void *eir,
> - bool discoverable, bool bonded)
> + const void *eir, bool bonded)
> {
> uint8_t buf[IPC_MTU];
> struct hal_ev_gatt_client_scan_result *ev = (void *) buf;
> struct gatt_device *dev;
> char bda[18];
>
> - if (!scanning || (!discoverable && !bonded))
> + if (!scanning)
> goto connect;
>
> ba2str(addr, bda);
> --
> 1.8.4
>

2014-12-11 09:29:45

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH v2 2/2] android/gatt: Add connectable flag to device found callback

GATT is interested in advertising event type. i.e if it is connectable
or not. It is because GATT does not want to triggers connection to
devices doing non-connectable advertising.
This patch add such support.
---
android/bluetooth.c | 9 ++++++---
android/bluetooth.h | 3 ++-
android/gatt.c | 10 +++++++---
3 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/android/bluetooth.c b/android/bluetooth.c
index 44bfe4d..48ca231 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -1917,6 +1917,7 @@ static bool is_new_device(const struct device *dev, unsigned int flags,

static void update_found_device(const bdaddr_t *bdaddr, uint8_t bdaddr_type,
int8_t rssi, bool confirm,
+ bool connectable,
const uint8_t *data, uint8_t data_len)
{
struct eir_data eir;
@@ -1964,7 +1965,7 @@ static void update_found_device(const bdaddr_t *bdaddr, uint8_t bdaddr_type,
}

gatt_device_found_cb(addr, addr_type, rssi, data_len, data,
- dev->le_bonded);
+ connectable, dev->le_bonded);
}

if (!dev->bredr_paired && !dev->le_paired)
@@ -2000,6 +2001,7 @@ static void mgmt_device_found_event(uint16_t index, uint16_t length,
uint16_t eir_len;
uint32_t flags;
bool confirm_name;
+ bool connectable;
char addr[18];

if (length < sizeof(*ev)) {
@@ -2026,9 +2028,10 @@ static void mgmt_device_found_event(uint16_t index, uint16_t length,
index, addr, ev->rssi, flags, eir_len);

confirm_name = flags & MGMT_DEV_FOUND_CONFIRM_NAME;
+ connectable = !(flags & MGMT_DEV_FOUND_NOT_CONNECTABLE);

update_found_device(&ev->addr.bdaddr, ev->addr.type, ev->rssi,
- confirm_name, eir, eir_len);
+ confirm_name, connectable, eir, eir_len);
}

static void mgmt_device_connected_event(uint16_t index, uint16_t length,
@@ -2043,7 +2046,7 @@ static void mgmt_device_connected_event(uint16_t index, uint16_t length,
return;
}

- update_found_device(&ev->addr.bdaddr, ev->addr.type, 0, false,
+ update_found_device(&ev->addr.bdaddr, ev->addr.type, 0, false, false,
&ev->eir[0], btohs(ev->eir_len));

hal_ev.status = HAL_STATUS_SUCCESS;
diff --git a/android/bluetooth.h b/android/bluetooth.h
index 4b7a70d..d09b6f2 100644
--- a/android/bluetooth.h
+++ b/android/bluetooth.h
@@ -42,7 +42,8 @@ void bt_adapter_remove_record(uint32_t handle);

typedef void (*bt_le_device_found)(const bdaddr_t *addr, uint8_t addr_type,
int rssi, uint16_t eir_len,
- const void *eir, bool bonded);
+ const void *eir, bool connectable,
+ bool bonded);
bool bt_le_register(bt_le_device_found cb);
void bt_le_unregister(void);

diff --git a/android/gatt.c b/android/gatt.c
index 519e347..83d2438 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -1648,7 +1648,8 @@ static void bt_le_discovery_stop_cb(void)

static void le_device_found_handler(const bdaddr_t *addr, uint8_t addr_type,
int rssi, uint16_t eir_len,
- const void *eir, bool bonded)
+ const void *eir,
+ bool connectable, bool bonded)
{
uint8_t buf[IPC_MTU];
struct hal_ev_gatt_client_scan_result *ev = (void *) buf;
@@ -1656,7 +1657,7 @@ static void le_device_found_handler(const bdaddr_t *addr, uint8_t addr_type,
char bda[18];

if (!scanning)
- goto connect;
+ goto done;

ba2str(addr, bda);
DBG("LE Device found: %s, rssi: %d, adv_data: %d", bda, rssi, !!eir);
@@ -1671,7 +1672,10 @@ static void le_device_found_handler(const bdaddr_t *addr, uint8_t addr_type,
HAL_EV_GATT_CLIENT_SCAN_RESULT,
sizeof(*ev) + ev->len, ev);

-connect:
+done:
+ if (!connectable)
+ return;
+
/* We use auto connect feature from kernel if possible */
if (bt_kernel_conn_control())
return;
--
1.8.4