|
@@ -613,7 +613,7 @@ int hci_conn_del(struct hci_conn *conn)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src)
|
|
|
+struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src, uint8_t src_type)
|
|
|
{
|
|
|
int use_src = bacmp(src, BDADDR_ANY);
|
|
|
struct hci_dev *hdev = NULL, *d;
|
|
@@ -634,7 +634,29 @@ struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src)
|
|
|
*/
|
|
|
|
|
|
if (use_src) {
|
|
|
- if (!bacmp(&d->bdaddr, src)) {
|
|
|
+ bdaddr_t id_addr;
|
|
|
+ u8 id_addr_type;
|
|
|
+
|
|
|
+ if (src_type == BDADDR_BREDR) {
|
|
|
+ if (!lmp_bredr_capable(d))
|
|
|
+ continue;
|
|
|
+ bacpy(&id_addr, &d->bdaddr);
|
|
|
+ id_addr_type = BDADDR_BREDR;
|
|
|
+ } else {
|
|
|
+ if (!lmp_le_capable(d))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ hci_copy_identity_address(d, &id_addr,
|
|
|
+ &id_addr_type);
|
|
|
+
|
|
|
+ /* Convert from HCI to three-value type */
|
|
|
+ if (id_addr_type == ADDR_LE_DEV_PUBLIC)
|
|
|
+ id_addr_type = BDADDR_LE_PUBLIC;
|
|
|
+ else
|
|
|
+ id_addr_type = BDADDR_LE_RANDOM;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!bacmp(&id_addr, src) && id_addr_type == src_type) {
|
|
|
hdev = d; break;
|
|
|
}
|
|
|
} else {
|