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:17 UTC

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

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) {