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