btdev: Set Local RPA when own_addr_type is 0x03
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 21 Oct 2021 21:35:21 +0000 (14:35 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 11 Mar 2022 13:38:37 +0000 (19:08 +0530)
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

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
emulator/btdev.c

index 956dcee..03003d9 100755 (executable)
@@ -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));