OSDN Git Service

android/gatt: Use proper address when connecting
authorSzymon Janc <szymon.janc@tieto.com>
Mon, 23 Jun 2014 14:28:33 +0000 (16:28 +0200)
committerSzymon Janc <szymon.janc@gmail.com>
Tue, 24 Jun 2014 20:40:14 +0000 (22:40 +0200)
If device was using RPA but address was resolved IDA must be used.

android/bluetooth.c
android/bluetooth.h
android/gatt.c

index 3030571..946e932 100644 (file)
@@ -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;
index eb50fe1..dde477d 100644 (file)
@@ -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);
index 32853fa..bc254c9 100644 (file)
@@ -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);