From 329b910babccebb2bc5db5592dd652695aba72fa Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 21 Oct 2021 14:35:21 -0700 Subject: btdev: Set Local RPA when own_addr_type is 0x03 This enables the emulator to properly emulate the generation of a Local RPA so it always set the random_addr when Create Connection sets 0x03 as own_addr_type 0x03: < HCI Command: LE Extended.. (0x08|0x0043) plen 26 Filter policy: Accept list is not used (0x00) Own address type: Random (0x03) Peer address type: Public (0x00) Peer address: 00:AA:01:01:00:00 (Intel Corporation) Initiating PHYs: 0x01 Entry 0: LE 1M Scan interval: 60.000 msec (0x0060) Scan window: 60.000 msec (0x0060) Min connection interval: 30.00 msec (0x0018) Max connection interval: 50.00 msec (0x0028) Connection latency: 0 (0x0000) Supervision timeout: 420 msec (0x002a) Min connection length: 0.000 msec (0x0000) Max connection length: 0.000 msec (0x0000) > HCI Event: Command Status (0x0f) plen 4 LE Extended Create Connection (0x08|0x0043) ncmd 1 Status: Success (0x00) > HCI Event: LE Meta Event (0x3e) plen 31 LE Enhanced Connection Complete (0x0a) Status: Success (0x00) Handle: 42 Role: Central (0x00) Peer address type: Public (0x00) Peer address: 00:AA:01:01:00:00 (Intel Corporation) Local resolvable private address: 60:0C:C5:B9:10:5D (Resolvable) Peer resolvable private address: 00:00:00:00:00:00 (Non-Resolvable) Connection interval: 50.00 msec (0x0028) Connection latency: 0 (0x0000) Supervision timeout: 420 msec (0x002a) Central clock accuracy: 0x00 --- emulator/btdev.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'emulator') diff --git a/emulator/btdev.c b/emulator/btdev.c index 956dcee7f..03003d949 100644 --- a/emulator/btdev.c +++ b/emulator/btdev.c @@ -5124,9 +5124,10 @@ static void le_ext_conn_complete(struct btdev *btdev, ev.status = status; ev.peer_addr_type = btdev->le_scan_own_addr_type; - if (ev.peer_addr_type == 0x01) + if (ev.peer_addr_type == 0x01 || ev.peer_addr_type == 0x03) { + ev.peer_addr_type = 0x01; memcpy(ev.peer_addr, btdev->random_addr, 6); - else + } else memcpy(ev.peer_addr, btdev->bdaddr, 6); ev.role = 0x01; @@ -5135,6 +5136,11 @@ static void le_ext_conn_complete(struct btdev *btdev, ev.latency = lecc->latency; ev.supv_timeout = lecc->supv_timeout; + /* Set Local RPA if an RPA was generated for the advertising */ + if (ext_adv->rpa) + memcpy(ev.local_rpa, ext_adv->random_addr, + sizeof(ev.local_rpa)); + le_meta_event(conn->link->dev, BT_HCI_EVT_LE_ENHANCED_CONN_COMPLETE, &ev, sizeof(ev)); @@ -5148,10 +5154,13 @@ static void le_ext_conn_complete(struct btdev *btdev, memcpy(ev.peer_addr, cmd->peer_addr, 6); ev.role = 0x00; - /* Set Local RPA if an RPA was generated for the advertising */ - if (ext_adv->rpa) - memcpy(ev.local_rpa, ext_adv->random_addr, - sizeof(ev.local_rpa)); + /* Use random address as Local RPA if Create Connection own_addr_type + * is 0x03 since that expects the controller to generate the RPA. + */ + if (btdev->le_scan_own_addr_type == 0x03) + memcpy(ev.local_rpa, btdev->random_addr, 6); + else + memset(ev.local_rpa, 0, sizeof(ev.local_rpa)); le_meta_event(btdev, BT_HCI_EVT_LE_ENHANCED_CONN_COMPLETE, &ev, sizeof(ev)); -- cgit v1.2.1