Bluetooth: Fix using invalid responder address as peripheral

If Static Random address is used as Identity Address and local privacy
is not used, responder address for slave connection was not set to
Identity Address.

Change-Id: I7a057c0fcb8e6d7e043952a092d16e959841f792
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
This commit is contained in:
Szymon Janc 2016-04-29 11:02:55 +02:00
commit 7c87c089fd
2 changed files with 9 additions and 8 deletions

View file

@ -673,9 +673,9 @@ static void le_conn_complete(struct net_buf *buf)
*/
} else {
bt_addr_le_copy(&conn->le.init_addr, &evt->peer_addr);
if (bt_dev.adv_addr_type == BT_ADDR_LE_PUBLIC) {
bt_addr_le_copy(&conn->le.resp_addr,
&bt_dev.id_addr);
if (atomic_test_bit(bt_dev.flags, BT_DEV_ADVERTISING_ID)) {
bt_addr_le_copy(&conn->le.resp_addr, &bt_dev.id_addr);
} else {
bt_addr_le_copy(&conn->le.resp_addr,
&bt_dev.random_addr);
@ -3440,13 +3440,15 @@ int bt_le_adv_start(const struct bt_le_adv_param *param,
return err;
}
bt_dev.adv_addr_type = set_param->own_addr_type;
err = set_advertise_enable();
if (err) {
return err;
}
if (param->addr_type == BT_LE_ADV_ADDR_IDENTITY) {
atomic_set_bit(bt_dev.flags, BT_DEV_ADVERTISING_ID);
}
atomic_set_bit(bt_dev.flags, BT_DEV_KEEP_ADVERTISING);
return 0;
@ -3465,6 +3467,7 @@ int bt_le_adv_stop(void)
return err;
}
atomic_clear_bit(bt_dev.flags, BT_DEV_ADVERTISING_ID);
atomic_clear_bit(bt_dev.flags, BT_DEV_KEEP_ADVERTISING);
return 0;

View file

@ -30,6 +30,7 @@ enum {
BT_DEV_ADVERTISING,
BT_DEV_KEEP_ADVERTISING,
BT_DEV_ADVERTISING_ID,
BT_DEV_SCANNING,
BT_DEV_EXPLICIT_SCAN,
@ -65,9 +66,6 @@ struct bt_dev {
/* Current local Random Address */
bt_addr_le_t random_addr;
/* Current advertising address type */
uint8_t adv_addr_type;
/* Controller version & manufacturer information */
uint8_t hci_version;
uint16_t hci_revision;