From df257c1950dac5227b03b6254bbc682712fafb19 Mon Sep 17 00:00:00 2001 From: Szymon Janc Date: Mon, 23 Jun 2014 16:28:33 +0200 Subject: [PATCH] android/gatt: Use proper address when connecting If device was using RPA but address was resolved IDA must be used. --- android/bluetooth.c | 14 ++++++++++++++ android/bluetooth.h | 2 ++ android/gatt.c | 20 ++++++++++++++++++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/android/bluetooth.c b/android/bluetooth.c index 3030571cd..946e93279 100644 --- a/android/bluetooth.c +++ b/android/bluetooth.c @@ -1442,6 +1442,20 @@ bool bt_is_device_le(const bdaddr_t *addr) return dev->le; } +const bdaddr_t *bt_get_id_addr(const bdaddr_t *addr, uint8_t *type) +{ + struct device *dev; + + dev = find_device(addr); + if (!dev) + return NULL; + + if (type) + *type = dev->bdaddr_type; + + return &dev->bdaddr; +} + const char *bt_get_adapter_name(void) { return adapter.name; diff --git a/android/bluetooth.h b/android/bluetooth.h index eb50fe162..dde477d20 100644 --- a/android/bluetooth.h +++ b/android/bluetooth.h @@ -76,3 +76,5 @@ void bt_update_sign_counter(const bdaddr_t *addr, enum bt_csrk_type type); void bt_store_gatt_ccc(const bdaddr_t *addr, uint16_t value); uint16_t bt_get_gatt_ccc(const bdaddr_t *addr); + +const bdaddr_t *bt_get_id_addr(const bdaddr_t *addr, uint8_t *type); diff --git a/android/gatt.c b/android/gatt.c index 32853fa1f..bc254c9bd 100644 --- a/android/gatt.c +++ b/android/gatt.c @@ -1423,6 +1423,8 @@ static int connect_le(struct gatt_device *dev) GIOChannel *io; GError *gerr = NULL; char addr[18]; + const bdaddr_t *bdaddr; + uint8_t bdaddr_type; ba2str(&dev->bdaddr, addr); @@ -1438,6 +1440,20 @@ static int connect_le(struct gatt_device *dev) BT_IO_SEC_LOW; /* + * If address type is random it might be that IRK was received and + * random is just for faking Android Framework. ID address should be + * used for connection if present. + */ + if (dev->bdaddr_type == BDADDR_LE_RANDOM) { + bdaddr = bt_get_id_addr(&dev->bdaddr, &bdaddr_type); + if (!bdaddr) + return -EINVAL; + } else { + bdaddr = &dev->bdaddr; + bdaddr_type = dev->bdaddr_type; + } + + /* * This connection will help us catch any PDUs that comes before * pairing finishes */ @@ -1445,8 +1461,8 @@ static int connect_le(struct gatt_device *dev) BT_IO_OPT_SOURCE_BDADDR, &adapter_addr, BT_IO_OPT_SOURCE_TYPE, BDADDR_LE_PUBLIC, - BT_IO_OPT_DEST_BDADDR, &dev->bdaddr, - BT_IO_OPT_DEST_TYPE, dev->bdaddr_type, + BT_IO_OPT_DEST_BDADDR, bdaddr, + BT_IO_OPT_DEST_TYPE, bdaddr_type, BT_IO_OPT_CID, ATT_CID, BT_IO_OPT_SEC_LEVEL, sec_level, BT_IO_OPT_INVALID); -- 2.11.0