2014-12-01 14:10:12

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 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 ca3dd24..d6cfc55 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -1933,12 +1933,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
@@ -1954,7 +1951,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 b9b3c7b..ce7dc62 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -1619,15 +1619,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-01 14:10:13

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 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 | 6 +++++-
3 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/android/bluetooth.c b/android/bluetooth.c
index d6cfc55..f79ca37 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -1904,6 +1904,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;
@@ -1951,7 +1952,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)
@@ -1987,6 +1988,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)) {
@@ -2013,9 +2015,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,
@@ -2030,7 +2033,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 ce7dc62..a2cb632 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -1619,7 +1619,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;
@@ -1643,6 +1644,9 @@ static void le_device_found_handler(const bdaddr_t *addr, uint8_t addr_type,
sizeof(*ev) + ev->len, ev);

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