You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2022/02/24 14:33:10 UTC

[mynewt-nimble] branch master updated (8e7cbbb -> 93b3ab7)

This is an automated email from the ASF dual-hosted git repository.

andk pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git.


    from 8e7cbbb  nimble/ll: Add fixed css option
     new ee4735d  nimble/ll: Fix InitA handling in connection requests
     new a58ff76  nimble/ll: Make phy selection more configurable
     new 0a68059  nimble/ll: Update peer RPA during scan
     new 7bf2623  nimble/ll: Do not validate random address
     new 646f775  nimble/ll: Fix verification on periodic adv enable
     new fa3fd20  nimble/ll: Fix race on create connection
     new cc4dae1  nimble/ll: Do not allow duplicated connections
     new 51cb4dc  nimble/ll: Rename func to match other one
     new 0ea070d  nimble/ll: Verify hop increment in CONNECT_IND
     new 93b3ab7  nimble/ll: Check MIC on every PDU

The 10 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 nimble/controller/include/controller/ble_ll.h      |   2 -
 nimble/controller/include/controller/ble_ll_conn.h |  26 ++-
 nimble/controller/src/ble_ll.c                     |  26 ++-
 nimble/controller/src/ble_ll_adv.c                 |  39 +---
 nimble/controller/src/ble_ll_conn.c                | 209 +++++++++++----------
 nimble/controller/src/ble_ll_conn_hci.c            |  51 ++---
 nimble/controller/src/ble_ll_conn_priv.h           |   4 +-
 nimble/controller/src/ble_ll_ctrl.c                |  25 +--
 nimble/controller/src/ble_ll_scan.c                |   7 +
 nimble/controller/src/ble_ll_scan_aux.c            |  21 ++-
 nimble/controller/src/ble_ll_sync.c                |   2 +-
 nimble/controller/syscfg.yml                       |  18 ++
 12 files changed, 222 insertions(+), 208 deletions(-)

[mynewt-nimble] 08/10: nimble/ll: Rename func to match other one

Posted by an...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit 51cb4dca67d0ad55bf92379050a223e20e538cd2
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Thu Feb 24 00:01:46 2022 +0100

    nimble/ll: Rename func to match other one
---
 nimble/controller/include/controller/ble_ll_conn.h |  7 +----
 nimble/controller/src/ble_ll_adv.c                 |  2 +-
 nimble/controller/src/ble_ll_conn.c                |  8 ++---
 nimble/controller/src/ble_ll_conn_hci.c            | 36 +++++++++++-----------
 nimble/controller/src/ble_ll_conn_priv.h           |  2 +-
 nimble/controller/src/ble_ll_sync.c                |  2 +-
 6 files changed, 26 insertions(+), 31 deletions(-)

diff --git a/nimble/controller/include/controller/ble_ll_conn.h b/nimble/controller/include/controller/ble_ll_conn.h
index a75457e..ec13d00 100644
--- a/nimble/controller/include/controller/ble_ll_conn.h
+++ b/nimble/controller/include/controller/ble_ll_conn.h
@@ -389,12 +389,7 @@ struct ble_ll_conn_sm
 #define CONN_IS_PERIPHERAL(csm)     (false)
 #endif
 
-/*
- * Given a handle, returns an active connection state machine (or NULL if the
- * handle does not exist
- *
- */
-struct ble_ll_conn_sm *ble_ll_conn_find_active_conn(uint16_t handle);
+struct ble_ll_conn_sm *ble_ll_conn_find_by_handle(uint16_t handle);
 struct ble_ll_conn_sm *ble_ll_conn_find_by_peer_addr(const uint8_t* addr,
                                                      uint8_t addr_type);
 
diff --git a/nimble/controller/src/ble_ll_adv.c b/nimble/controller/src/ble_ll_adv.c
index feafadc..070c89c 100644
--- a/nimble/controller/src/ble_ll_adv.c
+++ b/nimble/controller/src/ble_ll_adv.c
@@ -4084,7 +4084,7 @@ ble_ll_adv_periodic_set_info_transfer(const uint8_t *cmdbuf, uint8_t len,
          goto done;
      }
 
-     connsm = ble_ll_conn_find_active_conn(handle);
+     connsm = ble_ll_conn_find_by_handle(handle);
      if (!connsm) {
          rc = BLE_ERR_UNK_CONN_ID;
          goto done;
diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c
index e383435..0d41d10 100644
--- a/nimble/controller/src/ble_ll_conn.c
+++ b/nimble/controller/src/ble_ll_conn.c
@@ -384,7 +384,7 @@ ble_ll_conn_cth_flow_process_cmd(const uint8_t *cmdbuf)
          * case we can simply ignore command for that connection since credits
          * are returned by LL already.
          */
-        connsm = ble_ll_conn_find_active_conn(cp->h[i].handle);
+        connsm = ble_ll_conn_find_by_handle(cp->h[i].handle);
         if (connsm) {
             ble_ll_conn_cth_flow_free_credit(connsm, cp->h[i].count);
         }
@@ -670,7 +670,7 @@ ble_ll_conn_current_sm_over(struct ble_ll_conn_sm *connsm)
  * @return struct ble_ll_conn_sm*
  */
 struct ble_ll_conn_sm *
-ble_ll_conn_find_active_conn(uint16_t handle)
+ble_ll_conn_find_by_handle(uint16_t handle)
 {
     struct ble_ll_conn_sm *connsm;
 
@@ -3146,7 +3146,7 @@ ble_ll_conn_rx_data_pdu(struct os_mbuf *rxpdu, struct ble_mbuf_hdr *hdr)
     /* XXX: there is a chance that the connection was thrown away and
        re-used before processing packets here. Fix this. */
     /* We better have a connection state machine */
-    connsm = ble_ll_conn_find_active_conn(hdr->rxinfo.handle);
+    connsm = ble_ll_conn_find_by_handle(hdr->rxinfo.handle);
     if (!connsm) {
        STATS_INC(ble_ll_conn_stats, no_conn_sm);
        goto conn_rx_data_pdu_end;
@@ -3704,7 +3704,7 @@ ble_ll_conn_tx_pkt_in(struct os_mbuf *om, uint16_t handle, uint16_t length)
 
     /* See if we have an active matching connection handle */
     conn_handle = handle & 0x0FFF;
-    connsm = ble_ll_conn_find_active_conn(conn_handle);
+    connsm = ble_ll_conn_find_by_handle(conn_handle);
     if (connsm) {
         /* Construct LL header in buffer (NOTE: pb already checked) */
         pb = handle & 0x3000;
diff --git a/nimble/controller/src/ble_ll_conn_hci.c b/nimble/controller/src/ble_ll_conn_hci.c
index bcc98a5..97d2421 100644
--- a/nimble/controller/src/ble_ll_conn_hci.c
+++ b/nimble/controller/src/ble_ll_conn_hci.c
@@ -891,7 +891,7 @@ ble_ll_conn_hci_read_rem_features(const uint8_t *cmdbuf, uint8_t len)
     }
 
     /* If no connection handle exit with error */
-    connsm = ble_ll_conn_find_active_conn(le16toh(cmd->conn_handle));
+    connsm = ble_ll_conn_find_by_handle(le16toh(cmd->conn_handle));
     if (!connsm) {
         return BLE_ERR_UNK_CONN_ID;
     }
@@ -950,7 +950,7 @@ ble_ll_conn_hci_update(const uint8_t *cmdbuf, uint8_t len)
 
     /* If no connection handle exit with error */
     handle = le16toh(cmd->conn_handle);
-    connsm = ble_ll_conn_find_active_conn(handle);
+    connsm = ble_ll_conn_find_by_handle(handle);
     if (!connsm) {
         return BLE_ERR_UNK_CONN_ID;
     }
@@ -1066,7 +1066,7 @@ ble_ll_conn_hci_param_rr(const uint8_t *cmdbuf, uint8_t len,
     }
 
     /* If we dont have a handle we cant do anything */
-    connsm = ble_ll_conn_find_active_conn(handle);
+    connsm = ble_ll_conn_find_by_handle(handle);
     if (!connsm) {
         rc = BLE_ERR_UNK_CONN_ID;
         goto done;
@@ -1132,7 +1132,7 @@ ble_ll_conn_hci_param_nrr(const uint8_t *cmdbuf, uint8_t len,
     }
 
     /* If we dont have a handle we cant do anything */
-    connsm = ble_ll_conn_find_active_conn(handle);
+    connsm = ble_ll_conn_find_by_handle(handle);
     if (!connsm) {
         rc = BLE_ERR_UNK_CONN_ID;
         goto done;
@@ -1244,7 +1244,7 @@ ble_ll_conn_hci_disconnect_cmd(const struct ble_hci_lc_disconnect_cp *cmd)
         case BLE_ERR_UNSUPP_REM_FEATURE:
         case BLE_ERR_UNIT_KEY_PAIRING:
         case BLE_ERR_CONN_PARMS:
-            connsm = ble_ll_conn_find_active_conn(handle);
+            connsm = ble_ll_conn_find_by_handle(handle);
             if (connsm) {
                 /* Do not allow command if we are in process of disconnecting */
                 if (connsm->disconnect_reason) {
@@ -1293,7 +1293,7 @@ ble_ll_conn_hci_rd_rem_ver_cmd(const uint8_t *cmdbuf, uint8_t len)
     }
 
     /* Check for valid parameters */
-    connsm = ble_ll_conn_find_active_conn(le16toh(cmd->conn_handle));
+    connsm = ble_ll_conn_find_by_handle(le16toh(cmd->conn_handle));
     if (!connsm) {
         return BLE_ERR_UNK_CONN_ID;
     }
@@ -1343,7 +1343,7 @@ ble_ll_conn_hci_rd_rssi(const uint8_t *cmdbuf, uint8_t len, uint8_t *rspbuf, uin
 
     rsp->handle = cmd->handle;
 
-    connsm = ble_ll_conn_find_active_conn(le16toh(cmd->handle));
+    connsm = ble_ll_conn_find_by_handle(le16toh(cmd->handle));
     if (!connsm) {
         rsp->rssi = 127;
         rc = BLE_ERR_UNK_CONN_ID;
@@ -1380,7 +1380,7 @@ ble_ll_conn_hci_rd_chan_map(const uint8_t *cmdbuf, uint8_t len,
     }
 
     handle = le16toh(cmd->conn_handle);
-    connsm = ble_ll_conn_find_active_conn(handle);
+    connsm = ble_ll_conn_find_by_handle(handle);
     if (!connsm) {
         rc = BLE_ERR_UNK_CONN_ID;
         memset(rsp->chan_map, 0, sizeof(rsp->chan_map));
@@ -1453,7 +1453,7 @@ ble_ll_conn_hci_set_data_len(const uint8_t *cmdbuf, uint8_t len,
 
     /* Find connection */
     handle = le16toh(cmd->conn_handle);
-    connsm = ble_ll_conn_find_active_conn(handle);
+    connsm = ble_ll_conn_find_by_handle(handle);
     if (!connsm) {
         rc = BLE_ERR_UNK_CONN_ID;
         goto done;
@@ -1518,7 +1518,7 @@ ble_ll_conn_hci_le_start_encrypt(const uint8_t *cmdbuf, uint8_t len)
         return BLE_ERR_INV_HCI_CMD_PARMS;
     }
 
-    connsm = ble_ll_conn_find_active_conn(le16toh(cmd->conn_handle));
+    connsm = ble_ll_conn_find_by_handle(le16toh(cmd->conn_handle));
     if (!connsm) {
         rc = BLE_ERR_UNK_CONN_ID;
 #if MYNEWT_VAL(BLE_LL_ROLE_PERIPHERAL)
@@ -1571,7 +1571,7 @@ ble_ll_conn_hci_le_ltk_reply(const uint8_t *cmdbuf, uint8_t len,
 
     /* Find connection handle */
     handle = le16toh(cmd->conn_handle);
-    connsm = ble_ll_conn_find_active_conn(handle);
+    connsm = ble_ll_conn_find_by_handle(handle);
     if (!connsm) {
         rc = BLE_ERR_UNK_CONN_ID;
         goto ltk_key_cmd_complete;
@@ -1630,7 +1630,7 @@ ble_ll_conn_hci_le_ltk_neg_reply(const uint8_t *cmdbuf, uint8_t len,
 
     /* Find connection handle */
     handle = le16toh(cmd->conn_handle);
-    connsm = ble_ll_conn_find_active_conn(handle);
+    connsm = ble_ll_conn_find_by_handle(handle);
     if (!connsm) {
         rc = BLE_ERR_UNK_CONN_ID;
         goto ltk_key_cmd_complete;
@@ -1673,7 +1673,7 @@ ble_ll_conn_req_peer_sca(const uint8_t *cmdbuf, uint8_t len,
     const struct ble_hci_le_request_peer_sca_cp *params = (const void *)cmdbuf;
     struct ble_ll_conn_sm *connsm;
 
-    connsm = ble_ll_conn_find_active_conn(le16toh(params->conn_handle));
+    connsm = ble_ll_conn_find_by_handle(le16toh(params->conn_handle));
     if (!connsm) {
         return BLE_ERR_UNK_CONN_ID;
     }
@@ -1718,7 +1718,7 @@ ble_ll_conn_hci_rd_auth_pyld_tmo(const uint8_t *cmdbuf, uint8_t len,
     }
 
     handle = le16toh(cmd->conn_handle);
-    connsm = ble_ll_conn_find_active_conn(handle);
+    connsm = ble_ll_conn_find_by_handle(handle);
     if (!connsm) {
         rc = BLE_ERR_UNK_CONN_ID;
         rsp->tmo = 0;
@@ -1761,7 +1761,7 @@ ble_ll_conn_hci_wr_auth_pyld_tmo(const uint8_t *cmdbuf, uint8_t len,
 
     handle = le16toh(cmd->conn_handle);
 
-    connsm = ble_ll_conn_find_active_conn(handle);
+    connsm = ble_ll_conn_find_by_handle(handle);
     if (!connsm) {
         rc = BLE_ERR_UNK_CONN_ID;
     } else {
@@ -1814,7 +1814,7 @@ ble_ll_conn_hci_le_rd_phy(const uint8_t *cmdbuf, uint8_t len,
     }
 
     handle = le16toh(cmd->conn_handle);
-    connsm = ble_ll_conn_find_active_conn(handle);
+    connsm = ble_ll_conn_find_by_handle(handle);
     if (!connsm) {
         rsp->tx_phy = 0;
         rsp->rx_phy = 0;
@@ -1854,7 +1854,7 @@ ble_ll_conn_hci_le_set_phy(const uint8_t *cmdbuf, uint8_t len)
     }
 
     handle = le16toh(cmd->conn_handle);
-    connsm = ble_ll_conn_find_active_conn(handle);
+    connsm = ble_ll_conn_find_by_handle(handle);
     if (!connsm) {
         return BLE_ERR_UNK_CONN_ID;
     }
@@ -1965,7 +1965,7 @@ ble_ll_set_sync_transfer_params(const uint8_t *cmdbuf, uint8_t len,
         goto done;
     }
 
-    connsm = ble_ll_conn_find_active_conn(le16toh(cmd->conn_handle));
+    connsm = ble_ll_conn_find_by_handle(le16toh(cmd->conn_handle));
     if (!connsm) {
         rc = BLE_ERR_UNK_CONN_ID;
         goto done;
diff --git a/nimble/controller/src/ble_ll_conn_priv.h b/nimble/controller/src/ble_ll_conn_priv.h
index c2c1a0a..7541f64 100644
--- a/nimble/controller/src/ble_ll_conn_priv.h
+++ b/nimble/controller/src/ble_ll_conn_priv.h
@@ -163,7 +163,7 @@ void ble_ll_conn_central_init(struct ble_ll_conn_sm *connsm,
                               struct ble_ll_conn_create_scan *cc_scan,
                               struct ble_ll_conn_create_params *cc_params);
 
-struct ble_ll_conn_sm *ble_ll_conn_find_active_conn(uint16_t handle);
+struct ble_ll_conn_sm *ble_ll_conn_find_by_handle(uint16_t handle);
 void ble_ll_conn_update_eff_data_len(struct ble_ll_conn_sm *connsm);
 
 /* Advertising interface */
diff --git a/nimble/controller/src/ble_ll_sync.c b/nimble/controller/src/ble_ll_sync.c
index 8912cec..e5ef0ef 100644
--- a/nimble/controller/src/ble_ll_sync.c
+++ b/nimble/controller/src/ble_ll_sync.c
@@ -2177,7 +2177,7 @@ ble_ll_sync_transfer(const uint8_t *cmdbuf, uint8_t len,
         goto done;
     }
 
-    connsm = ble_ll_conn_find_active_conn(handle);
+    connsm = ble_ll_conn_find_by_handle(handle);
     if (!connsm) {
         rc = BLE_ERR_UNK_CONN_ID;
         OS_EXIT_CRITICAL(sr);

[mynewt-nimble] 01/10: nimble/ll: Fix InitA handling in connection requests

Posted by an...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit ee4735d358a9ec4874d75959af5293fc521f4584
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Mon Feb 21 23:27:02 2022 +0100

    nimble/ll: Fix InitA handling in connection requests
    
    As per Core 5.3, Vol 6, Part B, 6.4:
    > The Link Layer should not set the InitA field to the same value as
    > the TargetA field in the received advertising PDU.
    
    This was apparently omitted during init refactor, so need to bring it
    back.
    
    Also simplify generating InitA in case we use RPA and TargetA is not
    present - we do not need to lookup for an item in RL since this is
    already done by filtering code and we can just use rpa_index.
---
 nimble/controller/include/controller/ble_ll_conn.h |  7 +-
 nimble/controller/src/ble_ll_conn.c                | 84 +++++++++++-----------
 2 files changed, 45 insertions(+), 46 deletions(-)

diff --git a/nimble/controller/include/controller/ble_ll_conn.h b/nimble/controller/include/controller/ble_ll_conn.h
index 133824b..70d6b49 100644
--- a/nimble/controller/include/controller/ble_ll_conn.h
+++ b/nimble/controller/include/controller/ble_ll_conn.h
@@ -413,10 +413,9 @@ struct ble_ll_scan_pdu_data;
 uint8_t ble_ll_conn_tx_connect_ind_pducb(uint8_t *dptr, void *pducb_arg,
                                          uint8_t *hdr_byte);
 void ble_ll_conn_prepare_connect_ind(struct ble_ll_conn_sm *connsm,
-                                    struct ble_ll_scan_pdu_data *pdu_data,
-                                    uint8_t adva_type, uint8_t *adva,
-                                    uint8_t inita_type, uint8_t *inita,
-                                    int rpa_index, uint8_t channel);
+                                     struct ble_ll_scan_pdu_data *pdu_data,
+                                     struct ble_ll_scan_addr_data *addrd,
+                                     uint8_t channel);
 
 /* Send CONNECT_IND/AUX_CONNECT_REQ */
 int ble_ll_conn_send_connect_req(struct os_mbuf *rxpdu,
diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c
index 6bd9758..df015e9 100644
--- a/nimble/controller/src/ble_ll_conn.c
+++ b/nimble/controller/src/ble_ll_conn.c
@@ -2740,15 +2740,12 @@ ble_ll_conn_event_end(struct ble_npl_event *ev)
 void
 ble_ll_conn_prepare_connect_ind(struct ble_ll_conn_sm *connsm,
                                 struct ble_ll_scan_pdu_data *pdu_data,
-                                uint8_t adva_type, uint8_t *adva,
-                                uint8_t inita_type, uint8_t *inita,
-                                int rpa_index, uint8_t channel)
+                                struct ble_ll_scan_addr_data *addrd,
+                                uint8_t channel)
 {
     uint8_t hdr;
     uint8_t *addr;
-
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY)
-    int is_rpa;
     struct ble_ll_resolv_entry *rl;
 #endif
 
@@ -2761,19 +2758,45 @@ ble_ll_conn_prepare_connect_ind(struct ble_ll_conn_sm *connsm,
     }
 #endif
 
-    if (adva_type) {
+    if (addrd->adva_type) {
         /* Set random address */
         hdr |= BLE_ADV_PDU_HDR_RXADD_MASK;
     }
 
-    if (inita) {
-        memcpy(pdu_data->inita, inita, BLE_DEV_ADDR_LEN);
-        if (inita_type) {
+    if (addrd->targeta) {
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY)
+        if (addrd->targeta_resolved) {
+            if (connsm->own_addr_type > BLE_OWN_ADDR_RANDOM) {
+                /* If TargetA was resolved we should reply with a different RPA
+                 * in InitA (see Core 5.3, Vol 6, Part B, 6.4).
+                 */
+                BLE_LL_ASSERT(addrd->rpa_index >= 0);
+                rl = &g_ble_ll_resolv_list[addrd->rpa_index];
+                hdr |= BLE_ADV_PDU_HDR_TXADD_RAND;
+                ble_ll_resolv_get_priv_addr(rl, 1, pdu_data->inita);
+            } else {
+                /* Host does not want us to use RPA so use identity */
+                if ((connsm->own_addr_type & 1) == 0) {
+                    memcpy(pdu_data->inita, g_dev_addr, BLE_DEV_ADDR_LEN);
+                } else {
+                    hdr |= BLE_ADV_PDU_HDR_TXADD_RAND;
+                    memcpy(pdu_data->inita, g_random_addr, BLE_DEV_ADDR_LEN);
+                }
+            }
+        } else {
+            memcpy(pdu_data->inita, addrd->targeta, BLE_DEV_ADDR_LEN);
+            if (addrd->targeta_type) {
+                hdr |= BLE_ADV_PDU_HDR_TXADD_RAND;
+            }
+        }
+#else
+        memcpy(pdu_data->inita, addrd->targeta, BLE_DEV_ADDR_LEN);
+        if (addrd->targeta_type) {
             hdr |= BLE_ADV_PDU_HDR_TXADD_RAND;
         }
+#endif
     } else {
         /* Get pointer to our device address */
-        connsm = g_ble_ll_conn_create_sm.connsm;
         if ((connsm->own_addr_type & 1) == 0) {
             addr = g_dev_addr;
         } else {
@@ -2783,27 +2806,13 @@ ble_ll_conn_prepare_connect_ind(struct ble_ll_conn_sm *connsm,
 
     /* XXX: do this ahead of time? Calculate the local rpa I mean */
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY)
-        if (connsm->own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) {
-            rl = NULL;
-            is_rpa = ble_ll_is_rpa(adva, adva_type);
-            if (is_rpa) {
-                if (rpa_index >= 0) {
-                    rl = &g_ble_ll_resolv_list[rpa_index];
-                }
-            } else {
-                /* we look for RL entry to generate local RPA regardless if
-                 * resolving is enabled or not (as this is is for local RPA
-                 * not peer RPA)
-                 */
-                 rl = ble_ll_resolv_list_find(adva, adva_type);
-            }
-
-            /*
-             * If peer in on resolving list, we use RPA generated with Local IRK
-             * from resolving list entry. In other case, we need to use our identity
-             * address (see  Core 5.0, Vol 6, Part B, section 6.4).
+        if ((connsm->own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) &&
+            (addrd->rpa_index >= 0)) {
+            /* We are using RPA and advertiser was on our resolving list, so
+             * we'll use RPA to reply (see Core 5.3, Vol 6, Part B, 6.4).
              */
-            if (rl && rl->rl_has_local) {
+            rl = &g_ble_ll_resolv_list[addrd->rpa_index];
+            if (rl->rl_has_local) {
                 hdr |= BLE_ADV_PDU_HDR_TXADD_RAND;
                 ble_ll_resolv_get_priv_addr(rl, 1, pdu_data->inita);
                 addr = NULL;
@@ -2818,7 +2827,7 @@ ble_ll_conn_prepare_connect_ind(struct ble_ll_conn_sm *connsm,
         }
     }
 
-    memcpy(pdu_data->adva, adva, BLE_DEV_ADDR_LEN);
+    memcpy(pdu_data->adva, addrd->adva, BLE_DEV_ADDR_LEN);
 
     pdu_data->hdr_byte = hdr;
 }
@@ -2885,7 +2894,6 @@ ble_ll_conn_send_connect_req(struct os_mbuf *rxpdu,
 {
     struct ble_ll_conn_sm *connsm;
     struct ble_mbuf_hdr *rxhdr;
-    int8_t rpa_index;
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
     uint8_t phy;
 #endif
@@ -2909,15 +2917,8 @@ ble_ll_conn_send_connect_req(struct os_mbuf *rxpdu,
         return -1;
     }
 
-#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY)
-    rpa_index = addrd->rpa_index;
-#else
-    rpa_index = -1;
-#endif
-    ble_ll_conn_prepare_connect_ind(connsm, ble_ll_scan_get_pdu_data(),
-                                    addrd->adva_type, addrd->adva,
-                                    addrd->targeta_type, addrd->targeta,
-                                    rpa_index, rxhdr->rxinfo.channel);
+    ble_ll_conn_prepare_connect_ind(connsm, ble_ll_scan_get_pdu_data(), addrd,
+                                    rxhdr->rxinfo.channel);
 
     ble_phy_set_txend_cb(NULL, NULL);
     rc = ble_phy_tx(ble_ll_conn_tx_connect_ind_pducb, connsm,
@@ -2971,7 +2972,6 @@ ble_ll_conn_central_start(uint8_t phy, uint8_t csa,
     if (addrd->targeta_resolved) {
         BLE_LL_ASSERT(addrd->rpa_index >= 0);
         BLE_LL_ASSERT(targeta);
-        ble_ll_resolv_set_local_rpa(addrd->rpa_index, targeta);
     }
 #endif
 

[mynewt-nimble] 02/10: nimble/ll: Make phy selection more configurable

Posted by an...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit a58ff76b2903f50e386f106650f5f6a57debb7a8
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Tue Feb 22 18:02:02 2022 +0100

    nimble/ll: Make phy selection more configurable
---
 nimble/controller/include/controller/ble_ll_conn.h | 10 +--
 nimble/controller/src/ble_ll.c                     | 14 +++-
 nimble/controller/src/ble_ll_conn.c                | 78 +++++++++++-----------
 nimble/controller/src/ble_ll_conn_hci.c            |  8 +--
 nimble/controller/src/ble_ll_conn_priv.h           |  2 +-
 nimble/controller/src/ble_ll_ctrl.c                | 25 +++----
 nimble/controller/syscfg.yml                       | 18 +++++
 7 files changed, 88 insertions(+), 67 deletions(-)

diff --git a/nimble/controller/include/controller/ble_ll_conn.h b/nimble/controller/include/controller/ble_ll_conn.h
index 70d6b49..136ab9d 100644
--- a/nimble/controller/include/controller/ble_ll_conn.h
+++ b/nimble/controller/include/controller/ble_ll_conn.h
@@ -162,11 +162,11 @@ struct ble_ll_conn_phy_data
     uint32_t cur_rx_phy: 2;
     uint32_t new_tx_phy: 2;
     uint32_t new_rx_phy: 2;
-    uint32_t host_pref_tx_phys_mask: 3;
-    uint32_t host_pref_rx_phys_mask: 3;
-    uint32_t req_pref_tx_phys_mask: 3;
-    uint32_t req_pref_rx_phys_mask: 3;
-    uint32_t phy_options: 2;
+    uint32_t pref_mask_tx: 3;
+    uint32_t pref_mask_rx: 3;
+    uint32_t pref_mask_tx_req: 3;
+    uint32_t pref_mask_rx_req: 3;
+    uint32_t pref_opts: 2;
 }  __attribute__((packed));
 
 #define CONN_CUR_TX_PHY_MASK(csm)   (1 << ((csm)->phy_data.cur_tx_phy - 1))
diff --git a/nimble/controller/src/ble_ll.c b/nimble/controller/src/ble_ll.c
index 5d3cb63..73b3db4 100644
--- a/nimble/controller/src/ble_ll.c
+++ b/nimble/controller/src/ble_ll.c
@@ -1597,6 +1597,7 @@ ble_ll_validate_task(void)
 int
 ble_ll_reset(void)
 {
+    uint8_t phy_mask;
     int rc;
     os_sr_t sr;
 
@@ -1634,8 +1635,17 @@ ble_ll_reset(void)
     STATS_RESET(ble_ll_stats);
 
     /* Reset any preferred PHYs */
-    g_ble_ll_data.ll_pref_tx_phys = 0;
-    g_ble_ll_data.ll_pref_rx_phys = 0;
+    phy_mask = BLE_PHY_MASK_1M;
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_2M_PHY)
+    phy_mask |= BLE_PHY_MASK_2M;
+#endif
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY)
+    phy_mask |= BLE_PHY_MASK_CODED;
+#endif
+    phy_mask &= MYNEWT_VAL(BLE_LL_CONN_PHY_DEFAULT_PREF_MASK);
+    BLE_LL_ASSERT(phy_mask);
+    g_ble_ll_data.ll_pref_tx_phys = phy_mask;
+    g_ble_ll_data.ll_pref_rx_phys = phy_mask;
 
 #if MYNEWT_VAL(BLE_LL_ROLE_PERIPHERAL) || MYNEWT_VAL(BLE_LL_ROLE_CENTRAL)
     /* Reset connection module */
diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c
index df015e9..cbfcc1a 100644
--- a/nimble/controller/src/ble_ll_conn.c
+++ b/nimble/controller/src/ble_ll_conn.c
@@ -484,38 +484,40 @@ ble_ll_conn_css_move(struct ble_ll_conn_sm *connsm, uint16_t slot_idx)
 #endif
 
 #if (BLE_LL_BT5_PHY_SUPPORTED == 1)
-/**
- * Checks to see if we should start a PHY update procedure
- *
- * If current phy is not one of the preferred we need to start control
- * procedure.
- *
- * XXX: we could also decide to change the PHY if RSSI is really good
- * and we are currently at 1Mbps or lower data rate and we could use
- * a higher data rate.
- *
- * @param connsm
- * @return 0: success; -1: no phy update procedure started
- */
-int
-ble_ll_conn_chk_phy_upd_start(struct ble_ll_conn_sm *csm)
+static inline int
+ble_ll_conn_phy_should_update(uint8_t pref_mask, uint8_t curr_mask)
 {
-    int rc;
+#if MYNEWT_VAL(BLE_LL_CONN_PHY_PREFER_2M)
+    /* Should change to 2M if preferred, but not active */
+    if ((pref_mask & BLE_PHY_MASK_2M) && (curr_mask != BLE_PHY_MASK_2M)) {
+        return 1;
+    }
+#endif
 
-    /* If no host preferences or  */
-    if (((csm->phy_data.host_pref_tx_phys_mask == 0) &&
-         (csm->phy_data.host_pref_rx_phys_mask == 0)) ||
-        ((csm->phy_data.host_pref_tx_phys_mask & CONN_CUR_TX_PHY_MASK(csm)) &&
-         (csm->phy_data.host_pref_rx_phys_mask & CONN_CUR_RX_PHY_MASK(csm)))) {
-        rc = -1;
-    } else {
-        csm->phy_data.req_pref_tx_phys_mask = csm->phy_data.host_pref_tx_phys_mask;
-        csm->phy_data.req_pref_rx_phys_mask = csm->phy_data.host_pref_rx_phys_mask;
-        ble_ll_ctrl_proc_start(csm, BLE_LL_CTRL_PROC_PHY_UPDATE, NULL);
-        rc = 0;
+    /* Should change to active phy is not preferred */
+    if ((curr_mask & pref_mask) == 0) {
+        return 1;
     }
 
-    return rc;
+    return 0;
+}
+
+int
+ble_ll_conn_phy_update_if_needed(struct ble_ll_conn_sm *connsm)
+{
+    if (!ble_ll_conn_phy_should_update(connsm->phy_data.pref_mask_tx,
+                                       CONN_CUR_TX_PHY_MASK(connsm)) &&
+        !ble_ll_conn_phy_should_update(connsm->phy_data.pref_mask_rx,
+                                       CONN_CUR_RX_PHY_MASK(connsm))) {
+        return -1;
+    }
+
+    connsm->phy_data.pref_mask_tx_req = connsm->phy_data.pref_mask_tx;
+    connsm->phy_data.pref_mask_rx_req = connsm->phy_data.pref_mask_rx;
+
+    ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_PHY_UPDATE, NULL);
+
+    return 0;
 }
 #endif
 
@@ -952,7 +954,7 @@ ble_ll_conn_adjust_pyld_len(struct ble_ll_conn_sm *connsm, uint16_t pyld_len)
 
     if (connsm->phy_tx_transition) {
         phy_mode = ble_ll_phy_to_phy_mode(connsm->phy_tx_transition,
-                                          connsm->phy_data.phy_options);
+                                          connsm->phy_data.pref_opts);
     } else {
         phy_mode = connsm->phy_data.tx_phy_mode;
     }
@@ -1847,11 +1849,11 @@ ble_ll_conn_sm_new(struct ble_ll_conn_sm *connsm)
     connsm->phy_data.cur_rx_phy = BLE_PHY_1M;
     connsm->phy_data.tx_phy_mode = BLE_PHY_MODE_1M;
     connsm->phy_data.rx_phy_mode = BLE_PHY_MODE_1M;
-    connsm->phy_data.req_pref_tx_phys_mask = 0;
-    connsm->phy_data.req_pref_rx_phys_mask = 0;
-    connsm->phy_data.host_pref_tx_phys_mask = g_ble_ll_data.ll_pref_tx_phys;
-    connsm->phy_data.host_pref_rx_phys_mask = g_ble_ll_data.ll_pref_rx_phys;
-    connsm->phy_data.phy_options = 0;
+    connsm->phy_data.pref_mask_tx_req = 0;
+    connsm->phy_data.pref_mask_rx_req = 0;
+    connsm->phy_data.pref_mask_tx = g_ble_ll_data.ll_pref_tx_phys;
+    connsm->phy_data.pref_mask_rx = g_ble_ll_data.ll_pref_rx_phys;
+    connsm->phy_data.pref_opts = 0;
     connsm->phy_tx_transition = 0;
 #endif
 
@@ -2343,14 +2345,14 @@ ble_ll_conn_next_event(struct ble_ll_conn_sm *connsm)
             connsm->phy_data.cur_tx_phy = connsm->phy_data.new_tx_phy;
             connsm->phy_data.tx_phy_mode =
                                 ble_ll_phy_to_phy_mode(connsm->phy_data.cur_tx_phy,
-                                                   connsm->phy_data.phy_options);
+                                                   connsm->phy_data.pref_opts);
         }
 
         if (connsm->phy_data.new_rx_phy) {
             connsm->phy_data.cur_rx_phy = connsm->phy_data.new_rx_phy;
             connsm->phy_data.rx_phy_mode =
                                 ble_ll_phy_to_phy_mode(connsm->phy_data.cur_rx_phy,
-                                                   connsm->phy_data.phy_options);
+                                                   connsm->phy_data.pref_opts);
         }
 
         /* Clear flags and set flag to send event at next instant */
@@ -2527,7 +2529,7 @@ ble_ll_conn_created(struct ble_ll_conn_sm *connsm, struct ble_mbuf_hdr *rxhdr)
 
     /* Send connection complete event to inform host of connection */
     if (rc) {
-#if (BLE_LL_BT5_PHY_SUPPORTED == 1)
+#if (BLE_LL_BT5_PHY_SUPPORTED == 1) && MYNEWT_VAL(BLE_LL_CONN_PHY_INIT_UPDATE)
         /*
          * If we have default phy preferences and they are different than
          * the current PHY's in use, start update procedure.
@@ -2536,7 +2538,7 @@ ble_ll_conn_created(struct ble_ll_conn_sm *connsm, struct ble_mbuf_hdr *rxhdr)
          * XXX: should we attempt to start this without knowing if
          * the other side can support it?
          */
-        if (!ble_ll_conn_chk_phy_upd_start(connsm)) {
+        if (!ble_ll_conn_phy_update_if_needed(connsm)) {
             CONN_F_CTRLR_PHY_UPDATE(connsm) = 1;
         }
 #endif
diff --git a/nimble/controller/src/ble_ll_conn_hci.c b/nimble/controller/src/ble_ll_conn_hci.c
index ac21255..6d821d3 100644
--- a/nimble/controller/src/ble_ll_conn_hci.c
+++ b/nimble/controller/src/ble_ll_conn_hci.c
@@ -1872,9 +1872,9 @@ ble_ll_conn_hci_le_set_phy(const uint8_t *cmdbuf, uint8_t len)
         goto phy_cmd_param_err;
     }
 
-    connsm->phy_data.phy_options = phy_options & 0x03;
-    connsm->phy_data.host_pref_tx_phys_mask = tx_phys,
-    connsm->phy_data.host_pref_rx_phys_mask = rx_phys;
+    connsm->phy_data.pref_opts = phy_options & 0x03;
+    connsm->phy_data.pref_mask_tx = tx_phys,
+    connsm->phy_data.pref_mask_rx = rx_phys;
 
     /*
      * The host preferences override the default phy preferences. Currently,
@@ -1900,7 +1900,7 @@ ble_ll_conn_hci_le_set_phy(const uint8_t *cmdbuf, uint8_t len)
             CONN_F_HOST_PHY_UPDATE(connsm) = 1;
         } else {
             /* Check if we should start phy update procedure */
-            if (!ble_ll_conn_chk_phy_upd_start(connsm)) {
+            if (!ble_ll_conn_phy_update_if_needed(connsm)) {
                 CONN_F_HOST_PHY_UPDATE(connsm) = 1;
             } else {
                 /*
diff --git a/nimble/controller/src/ble_ll_conn_priv.h b/nimble/controller/src/ble_ll_conn_priv.h
index 3d49f49..c2c1a0a 100644
--- a/nimble/controller/src/ble_ll_conn_priv.h
+++ b/nimble/controller/src/ble_ll_conn_priv.h
@@ -244,7 +244,7 @@ int ble_ll_hci_acl_rx(struct os_mbuf *om, void *arg);
 int ble_ll_conn_hci_le_rd_phy(const uint8_t *cmdbuf, uint8_t len,
                               uint8_t *rsp, uint8_t *rsplen);
 int ble_ll_conn_hci_le_set_phy(const uint8_t *cmdbuf, uint8_t len);
-int ble_ll_conn_chk_phy_upd_start(struct ble_ll_conn_sm *connsm);
+int ble_ll_conn_phy_update_if_needed(struct ble_ll_conn_sm *connsm);
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
 int ble_ll_conn_hci_ext_create(const uint8_t *cmdbuf, uint8_t len);
 #endif
diff --git a/nimble/controller/src/ble_ll_ctrl.c b/nimble/controller/src/ble_ll_ctrl.c
index 5212cb5..c30f4e3 100644
--- a/nimble/controller/src/ble_ll_ctrl.c
+++ b/nimble/controller/src/ble_ll_ctrl.c
@@ -672,7 +672,7 @@ ble_ll_ctrl_phy_update_proc_complete(struct ble_ll_conn_sm *connsm)
     /* Must check if we need to start host procedure */
     if (chk_host_phy) {
         if (CONN_F_HOST_PHY_UPDATE(connsm)) {
-            if (ble_ll_conn_chk_phy_upd_start(connsm)) {
+            if (ble_ll_conn_phy_update_if_needed(connsm)) {
                 CONN_F_HOST_PHY_UPDATE(connsm) = 0;
             } else {
                 chk_proc_stop = 0;
@@ -751,11 +751,11 @@ ble_ll_ctrl_phy_update_ind_make(struct ble_ll_conn_sm *connsm, uint8_t *dptr,
 
     /* Get m_to_s and s_to_m masks */
     if (periph_req) {
-        m_to_s = connsm->phy_data.host_pref_tx_phys_mask & rx_phys;
-        s_to_m = connsm->phy_data.host_pref_rx_phys_mask & tx_phys;
+        m_to_s = connsm->phy_data.pref_mask_tx & rx_phys;
+        s_to_m = connsm->phy_data.pref_mask_rx & tx_phys;
     } else {
-        m_to_s = connsm->phy_data.req_pref_tx_phys_mask & rx_phys;
-        s_to_m = connsm->phy_data.req_pref_rx_phys_mask & tx_phys;
+        m_to_s = connsm->phy_data.pref_mask_tx_req & rx_phys;
+        s_to_m = connsm->phy_data.pref_mask_rx_req & tx_phys;
     }
 
     if (is_periph_sym) {
@@ -844,17 +844,8 @@ ble_ll_ctrl_phy_update_ind_make(struct ble_ll_conn_sm *connsm, uint8_t *dptr,
 static void
 ble_ll_ctrl_phy_req_rsp_make(struct ble_ll_conn_sm *connsm, uint8_t *ctrdata)
 {
-    /* If no preference we use current phy */
-    if (connsm->phy_data.host_pref_tx_phys_mask == 0) {
-        ctrdata[0] = CONN_CUR_TX_PHY_MASK(connsm);
-    } else {
-        ctrdata[0] = connsm->phy_data.host_pref_tx_phys_mask;
-    }
-    if (connsm->phy_data.host_pref_rx_phys_mask == 0) {
-        ctrdata[1] = CONN_CUR_RX_PHY_MASK(connsm);
-    } else {
-        ctrdata[1] = connsm->phy_data.host_pref_rx_phys_mask;
-    }
+    ctrdata[0] = connsm->phy_data.pref_mask_tx;
+    ctrdata[1] = connsm->phy_data.pref_mask_rx;
 }
 
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_SCA_UPDATE)
@@ -3017,7 +3008,7 @@ ble_ll_ctrl_tx_done(struct os_mbuf *txpdu, struct ble_ll_conn_sm *connsm)
         if (connsm->conn_role == BLE_LL_CONN_ROLE_PERIPHERAL) {
             connsm->phy_tx_transition =
                     ble_ll_ctrl_phy_tx_transition_get(
-                            connsm->phy_data.req_pref_tx_phys_mask);
+                            connsm->phy_data.pref_mask_tx_req);
         }
         break;
 #endif
diff --git a/nimble/controller/syscfg.yml b/nimble/controller/syscfg.yml
index ec1ef93..a312ab3 100644
--- a/nimble/controller/syscfg.yml
+++ b/nimble/controller/syscfg.yml
@@ -103,6 +103,24 @@ syscfg.defs:
         description: 'Size of the resolving list.'
         value: '4'
 
+    BLE_LL_CONN_PHY_DEFAULT_PREF_MASK:
+        description: >
+            Default PHY preference mask used if no HCI LE Set Preferred PHY
+            was received.
+        value: 0x07
+    BLE_LL_CONN_PHY_PREFER_2M:
+        description: >
+            If enabled, LL will always attempt to switch to 2M PHY if present
+            in preferred mask even if active PHY is also allowed by that mask.
+            Otherwise LL will not attempt to switch PHY as long as active PHY
+            is present in preferred mask.
+        value: 0
+    BLE_LL_CONN_PHY_INIT_UPDATE:
+        description: >
+            If enabled, LL will attempt to switch PHY (depending on preferences
+            mask set) after connection was established.
+        value: 0
+
     # Data length management definitions for connections. These define the
     # maximum size of the PDU's that will be sent and/or received in a
     # connection.

[mynewt-nimble] 06/10: nimble/ll: Fix race on create connection

Posted by an...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit fa3fd20b79d0151878d384a37369eb994d8638a2
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Wed Feb 23 17:01:42 2022 +0100

    nimble/ll: Fix race on create connection
    
    If AUX_CONNECT_RSP is invalid we should immediately remove connection
    from scheduler, then we can do other stuff. In other case, we may be
    a bit too late and scheduler will fire already scheduled connection
    event for a connection that is not created.
---
 nimble/controller/src/ble_ll_scan_aux.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/nimble/controller/src/ble_ll_scan_aux.c b/nimble/controller/src/ble_ll_scan_aux.c
index 933c3f7..c637be7 100644
--- a/nimble/controller/src/ble_ll_scan_aux.c
+++ b/nimble/controller/src/ble_ll_scan_aux.c
@@ -1567,8 +1567,9 @@ ble_ll_scan_aux_rx_pkt_in_for_initiator(struct os_mbuf *rxpdu,
     aux = rxinfo->user_data;
 
     if (rxinfo->flags & BLE_MBUF_HDR_F_IGNORED) {
+        ble_ll_scan_aux_free(aux);
         ble_ll_scan_chk_resume();
-        goto done;
+        return;
     }
 
     if (!(rxinfo->flags & BLE_MBUF_HDR_F_CONNECT_RSP_RXD)) {
@@ -1582,19 +1583,14 @@ ble_ll_scan_aux_rx_pkt_in_for_initiator(struct os_mbuf *rxpdu,
     if (ble_ll_scan_aux_check_connect_rsp(rxpdu->om_data,
                                           ble_ll_scan_get_pdu_data(),
                                           &addrd) < 0) {
+        ble_ll_conn_send_connect_req_cancel();
+        ble_ll_scan_aux_free(aux);
         ble_ll_scan_chk_resume();
-        goto done;
+        return;
     }
 
-    aux->flags &= ~BLE_LL_SCAN_AUX_F_W4_CONNECT_RSP;
-
     ble_ll_scan_sm_stop(0);
     ble_ll_conn_created_on_aux(rxpdu, &addrd, aux->targeta);
-
-done:
-    if (aux->flags & BLE_LL_SCAN_AUX_F_W4_CONNECT_RSP) {
-        ble_ll_conn_send_connect_req_cancel();
-    }
     ble_ll_scan_aux_free(aux);
 }
 #endif

[mynewt-nimble] 03/10: nimble/ll: Update peer RPA during scan

Posted by an...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit 0a680598f0c7c20dd626bf3689c5fa35554cbd51
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Tue Feb 22 18:02:39 2022 +0100

    nimble/ll: Update peer RPA during scan
    
    We need to keep track of peer RPA during scan so it can be retrieved by
    host using LE Read Peer Resolvable Address at any time.
---
 nimble/controller/src/ble_ll_scan.c     | 7 +++++++
 nimble/controller/src/ble_ll_scan_aux.c | 7 +++++++
 2 files changed, 14 insertions(+)

diff --git a/nimble/controller/src/ble_ll_scan.c b/nimble/controller/src/ble_ll_scan.c
index b04138d..46e1cb6 100644
--- a/nimble/controller/src/ble_ll_scan.c
+++ b/nimble/controller/src/ble_ll_scan.c
@@ -1931,6 +1931,13 @@ ble_ll_scan_rx_pkt_in_on_legacy(uint8_t pdu_type, struct os_mbuf *om,
     ble_ll_scan_get_addr_data_from_legacy(pdu_type, rxbuf, addrd);
     ble_ll_scan_rx_pkt_in_restore_addr_data(hdr, addrd);
 
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY)
+    if (addrd->adva_resolved) {
+        BLE_LL_ASSERT(addrd->rpa_index >= 0);
+        ble_ll_resolv_set_peer_rpa(addrd->rpa_index, addrd->adva);
+    }
+#endif
+
     send_hci_report = !scansm->scan_filt_dups ||
                       !ble_ll_scan_dup_check_legacy(addrd->adv_addr_type,
                                                     addrd->adv_addr,
diff --git a/nimble/controller/src/ble_ll_scan_aux.c b/nimble/controller/src/ble_ll_scan_aux.c
index 9504771..933c3f7 100644
--- a/nimble/controller/src/ble_ll_scan_aux.c
+++ b/nimble/controller/src/ble_ll_scan_aux.c
@@ -1669,6 +1669,13 @@ ble_ll_scan_aux_rx_pkt_in(struct os_mbuf *rxpdu, struct ble_mbuf_hdr *rxhdr)
     }
 #endif
 
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY)
+    if (addrd.adva_resolved) {
+        BLE_LL_ASSERT(addrd.rpa_index >= 0);
+        ble_ll_resolv_set_peer_rpa(addrd.rpa_index, addrd.adva);
+    }
+#endif
+
     scan_duplicate = ble_ll_scan_get_filt_dups() &&
                      ble_ll_scan_dup_check_ext(addrd.adv_addr_type,
                                                addrd.adv_addr, true, aux->adi);

[mynewt-nimble] 07/10: nimble/ll: Do not allow duplicated connections

Posted by an...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit cc4dae19d3e44845febc558fbb3506a70f2a2da9
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Wed Feb 23 23:59:32 2022 +0100

    nimble/ll: Do not allow duplicated connections
    
    This fixes LL/CON/INI/BI-03-C.
---
 nimble/controller/include/controller/ble_ll_conn.h |  2 ++
 nimble/controller/src/ble_ll_adv.c                 | 33 +---------------------
 nimble/controller/src/ble_ll_conn.c                | 15 ++++++++++
 nimble/controller/src/ble_ll_conn_hci.c            |  7 +++++
 4 files changed, 25 insertions(+), 32 deletions(-)

diff --git a/nimble/controller/include/controller/ble_ll_conn.h b/nimble/controller/include/controller/ble_ll_conn.h
index 136ab9d..a75457e 100644
--- a/nimble/controller/include/controller/ble_ll_conn.h
+++ b/nimble/controller/include/controller/ble_ll_conn.h
@@ -395,6 +395,8 @@ struct ble_ll_conn_sm
  *
  */
 struct ble_ll_conn_sm *ble_ll_conn_find_active_conn(uint16_t handle);
+struct ble_ll_conn_sm *ble_ll_conn_find_by_peer_addr(const uint8_t* addr,
+                                                     uint8_t addr_type);
 
 /* required for unit testing */
 uint8_t ble_ll_conn_calc_dci(struct ble_ll_conn_sm *conn, uint16_t latency);
diff --git a/nimble/controller/src/ble_ll_adv.c b/nimble/controller/src/ble_ll_adv.c
index d65789a..feafadc 100644
--- a/nimble/controller/src/ble_ll_adv.c
+++ b/nimble/controller/src/ble_ll_adv.c
@@ -4111,37 +4111,6 @@ ble_ll_adv_periodic_set_info_transfer(const uint8_t *cmdbuf, uint8_t len,
 #endif
 
 /**
- * Says whether the specified address is already connected or not.
- * @param   [in]    addr        The peer address.
- * @param   [in]    addr_type   Public address (0) or random address (1).
- * @return  Return 1 if already connected, 0 otherwise.
- */
-#if MYNEWT_VAL(BLE_LL_ROLE_PERIPHERAL)
-static int
-ble_ll_adv_already_connected(const uint8_t* addr, uint8_t addr_type)
-{
-    struct ble_ll_conn_sm *connsm;
-
-    /* extracted from ble_ll_conn_periph_start function */
-    SLIST_FOREACH(connsm, &g_ble_ll_conn_active_list, act_sle) {
-        if (!memcmp(&connsm->peer_addr, addr, BLE_DEV_ADDR_LEN)) {
-            if (addr_type == BLE_ADDR_RANDOM) {
-                if (connsm->peer_addr_type & 1) {
-                    return 1;
-                }
-            } else {
-                if ((connsm->peer_addr_type & 1) == 0) {
-                    return 1;
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-#endif
-
-/**
  * Called when the LL receives a scan request or connection request
  *
  * Context: Called from interrupt context.
@@ -4278,7 +4247,7 @@ ble_ll_adv_rx_req(uint8_t pdu_type, struct os_mbuf *rxpdu)
     } else if (pdu_type == BLE_ADV_PDU_TYPE_AUX_CONNECT_REQ) {
 #if MYNEWT_VAL(BLE_LL_ROLE_PERIPHERAL)
         /* See if the device is already connected */
-        if (ble_ll_adv_already_connected(peer, peer_addr_type)) {
+        if (ble_ll_conn_find_by_peer_addr(peer, peer_addr_type)) {
             return -1;
         }
 
diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c
index cbfcc1a..e383435 100644
--- a/nimble/controller/src/ble_ll_conn.c
+++ b/nimble/controller/src/ble_ll_conn.c
@@ -483,6 +483,21 @@ ble_ll_conn_css_move(struct ble_ll_conn_sm *connsm, uint16_t slot_idx)
 }
 #endif
 
+struct ble_ll_conn_sm *
+ble_ll_conn_find_by_peer_addr(const uint8_t *addr, uint8_t addr_type)
+{
+    struct ble_ll_conn_sm *connsm;
+
+    SLIST_FOREACH(connsm, &g_ble_ll_conn_active_list, act_sle) {
+        if (!memcmp(&connsm->peer_addr, addr, BLE_DEV_ADDR_LEN) &&
+            !((connsm->peer_addr_type ^ addr_type) & 1)) {
+            return connsm;
+        }
+    }
+
+    return NULL;
+}
+
 #if (BLE_LL_BT5_PHY_SUPPORTED == 1)
 static inline int
 ble_ll_conn_phy_should_update(uint8_t pref_mask, uint8_t curr_mask)
diff --git a/nimble/controller/src/ble_ll_conn_hci.c b/nimble/controller/src/ble_ll_conn_hci.c
index 6d821d3..bcc98a5 100644
--- a/nimble/controller/src/ble_ll_conn_hci.c
+++ b/nimble/controller/src/ble_ll_conn_hci.c
@@ -532,6 +532,9 @@ ble_ll_conn_hci_create(const uint8_t *cmdbuf, uint8_t len)
         return BLE_ERR_CMD_DISALLOWED;
     }
 
+    if (ble_ll_conn_find_by_peer_addr(cmd->peer_addr, cmd->peer_addr_type)) {
+        return BLE_ERR_ACL_CONN_EXISTS;
+    }
 
 #if MYNEWT_VAL(BLE_LL_CONN_STRICT_SCHED)
     css_slot_idx = ble_ll_conn_css_get_next_slot();
@@ -752,6 +755,10 @@ ble_ll_conn_hci_ext_create(const uint8_t *cmdbuf, uint8_t len)
         return BLE_ERR_CMD_DISALLOWED;
     }
 
+    if (ble_ll_conn_find_by_peer_addr(cmd->peer_addr, cmd->peer_addr_type)) {
+        return BLE_ERR_ACL_CONN_EXISTS;
+    }
+
 #if MYNEWT_VAL(BLE_LL_CONN_STRICT_SCHED)
     css_slot_idx = ble_ll_conn_css_get_next_slot();
     if (css_slot_idx == BLE_LL_CONN_CSS_NO_SLOT) {

[mynewt-nimble] 09/10: nimble/ll: Verify hop increment in CONNECT_IND

Posted by an...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit 0ea070d09f96e20643ae37119addf61152bc9e6c
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Thu Feb 24 13:51:26 2022 +0100

    nimble/ll: Verify hop increment in CONNECT_IND
    
    We should ignore CONNECT_IND with invalid hop increment value.
    
    This fixes LL/DDI/ADV/BI-07-C.
---
 nimble/controller/src/ble_ll_conn.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c
index 0d41d10..398b4e2 100644
--- a/nimble/controller/src/ble_ll_conn.c
+++ b/nimble/controller/src/ble_ll_conn.c
@@ -3831,7 +3831,8 @@ ble_ll_conn_periph_start(uint8_t *rxbuf, uint8_t pat, struct ble_mbuf_hdr *rxhdr
         (connsm->conn_itvl < BLE_HCI_CONN_ITVL_MIN) ||
         (connsm->conn_itvl > BLE_HCI_CONN_ITVL_MAX) ||
         (connsm->tx_win_size < BLE_LL_CONN_TX_WIN_MIN) ||
-        (connsm->periph_latency > BLE_LL_CONN_PERIPH_LATENCY_MAX)) {
+        (connsm->periph_latency > BLE_LL_CONN_PERIPH_LATENCY_MAX) ||
+        (connsm->hop_inc < 5) || (connsm->hop_inc > 16)) {
         goto err_periph_start;
     }
 

[mynewt-nimble] 05/10: nimble/ll: Fix verification on periodic adv enable

Posted by an...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit 646f7757fdd1a4f8ac5a0fcb7b1dcc0ff353a145
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Wed Feb 23 16:59:52 2022 +0100

    nimble/ll: Fix verification on periodic adv enable
    
    Enabling periodic advertising before parameters are set should return
    "command disallowed" since we do no supprt vendor-specific default
    parameters.
    
    This fixes HCI/DDI/BV-07-C.
---
 nimble/controller/src/ble_ll_adv.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/nimble/controller/src/ble_ll_adv.c b/nimble/controller/src/ble_ll_adv.c
index d8d251b..d65789a 100644
--- a/nimble/controller/src/ble_ll_adv.c
+++ b/nimble/controller/src/ble_ll_adv.c
@@ -3969,6 +3969,10 @@ ble_ll_adv_periodic_enable(const uint8_t *cmdbuf, uint8_t len)
             return BLE_ERR_CMD_DISALLOWED;
         }
 
+        if (!(advsm->flags & BLE_LL_ADV_SM_FLAG_PERIODIC_CONFIGURED)) {
+            return BLE_ERR_CMD_DISALLOWED;
+        }
+
         /* If Enable is set to 0x01 and the length of the periodic advertising
          * data is greater than the maximum that the Controller can transmit
          * within the chosen periodicadvertising interval, the Controller shall

[mynewt-nimble] 04/10: nimble/ll: Do not validate random address

Posted by an...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit 7bf2623c5b7c4b36a9db3be1ffaefc0e1d737a56
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Tue Feb 22 20:53:37 2022 +0100

    nimble/ll: Do not validate random address
    
    The Core spec does not mention anywhere that we should validate if
    random address has proper bits set so we can skip that part. We only
    assume that all-zeroes means random is not set, just as we do for
    public.
---
 nimble/controller/include/controller/ble_ll.h |  2 --
 nimble/controller/src/ble_ll.c                | 12 ++++--------
 2 files changed, 4 insertions(+), 10 deletions(-)

diff --git a/nimble/controller/include/controller/ble_ll.h b/nimble/controller/include/controller/ble_ll.h
index fb731ab..97233e9 100644
--- a/nimble/controller/include/controller/ble_ll.h
+++ b/nimble/controller/include/controller/ble_ll.h
@@ -478,8 +478,6 @@ void ble_ll_init(void);
 /* Reset the Link Layer */
 int ble_ll_reset(void);
 
-int ble_ll_is_valid_public_addr(const uint8_t *addr);
-
 /* 'Boolean' function returning true if address is a valid random address */
 int ble_ll_is_valid_random_addr(const uint8_t *addr);
 
diff --git a/nimble/controller/src/ble_ll.c b/nimble/controller/src/ble_ll.c
index 73b3db4..362d466 100644
--- a/nimble/controller/src/ble_ll.c
+++ b/nimble/controller/src/ble_ll.c
@@ -594,8 +594,8 @@ ble_ll_addr_subtype(const uint8_t *addr, uint8_t addr_type)
     }
 }
 
-int
-ble_ll_is_valid_public_addr(const uint8_t *addr)
+static int
+ble_ll_is_valid_addr(const uint8_t *addr)
 {
     int i;
 
@@ -661,13 +661,13 @@ ble_ll_is_valid_own_addr_type(uint8_t own_addr_type, const uint8_t *random_addr)
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY)
     case BLE_HCI_ADV_OWN_ADDR_PRIV_PUB:
 #endif
-        rc = ble_ll_is_valid_public_addr(g_dev_addr);
+        rc = ble_ll_is_valid_addr(g_dev_addr);
         break;
     case BLE_HCI_ADV_OWN_ADDR_RANDOM:
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY)
     case BLE_HCI_ADV_OWN_ADDR_PRIV_RAND:
 #endif
-        rc = ble_ll_is_valid_random_addr(random_addr);
+        rc = ble_ll_is_valid_addr(random_addr);
         break;
     default:
         rc = 0;
@@ -728,10 +728,6 @@ ble_ll_set_random_addr(const uint8_t *cmdbuf, uint8_t len, bool hci_adv_ext)
     }
 #endif
 
-    if (!ble_ll_is_valid_random_addr(cmd->addr)) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
-    }
-
     memcpy(g_random_addr, cmd->addr, BLE_DEV_ADDR_LEN);
 
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)

[mynewt-nimble] 10/10: nimble/ll: Check MIC on every PDU

Posted by an...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit 93b3ab71dc94a4cde14d91c65b5869e5a28ba5e3
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Thu Feb 24 12:55:57 2022 +0100

    nimble/ll: Check MIC on every PDU
    
    We should check for MIC failure before any other checks to detect
    failures even on corrupted PDUs.
    
    This fixes LL/SEC/PER/BI-04-C.
---
 nimble/controller/src/ble_ll_conn.c | 21 +++++++++------------
 1 file changed, 9 insertions(+), 12 deletions(-)

diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c
index 398b4e2..d1725f2 100644
--- a/nimble/controller/src/ble_ll_conn.c
+++ b/nimble/controller/src/ble_ll_conn.c
@@ -3161,6 +3161,15 @@ ble_ll_conn_rx_data_pdu(struct os_mbuf *rxpdu, struct ble_mbuf_hdr *hdr)
     acl_len = rxbuf[1];
     llid = hdr_byte & BLE_LL_DATA_HDR_LLID_MASK;
 
+
+#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION)
+    if (BLE_MBUF_HDR_MIC_FAILURE(hdr)) {
+        STATS_INC(ble_ll_conn_stats, mic_failures);
+        ble_ll_conn_timeout(connsm, BLE_ERR_CONN_TERM_MIC);
+        goto conn_rx_data_pdu_end;
+    }
+#endif
+
     /*
      * Check that the LLID and payload length are reasonable.
      * Empty payload is only allowed for LLID == 01b.
@@ -3232,18 +3241,6 @@ ble_ll_conn_rx_data_pdu(struct os_mbuf *rxpdu, struct ble_mbuf_hdr *hdr)
         goto conn_rx_data_pdu_end;
     }
 
-#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_ENCRYPTION)
-    /*
-     * XXX: should we check to see if we are in a state where we
-     * might expect to get an encrypted PDU?
-     */
-    if (BLE_MBUF_HDR_MIC_FAILURE(hdr)) {
-        STATS_INC(ble_ll_conn_stats, mic_failures);
-        ble_ll_conn_timeout(connsm, BLE_ERR_CONN_TERM_MIC);
-        goto conn_rx_data_pdu_end;
-    }
-#endif
-
     if (llid == BLE_LL_LLID_CTRL) {
         /* Process control frame */
         STATS_INC(ble_ll_conn_stats, rx_ctrl_pdus);