From ca22da24b46424f117fec1b1e26e40871f57732f Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Wed, 1 Mar 2023 12:11:55 +0530 Subject: [PATCH] Nimble/host: Add check status before executing stack command Added change of checking stack status in APIs exposed to user to avoid incorrect behaviour of executing commands without stack initialized. --- nimble/host/src/ble_gap.c | 186 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 180 insertions(+), 6 deletions(-) diff --git a/nimble/host/src/ble_gap.c b/nimble/host/src/ble_gap.c index b6d54bc30..85b4c4418 100644 --- a/nimble/host/src/ble_gap.c +++ b/nimble/host/src/ble_gap.c @@ -490,6 +490,10 @@ ble_gap_conn_find_by_addr(const ble_addr_t *addr, #if NIMBLE_BLE_CONNECT struct ble_hs_conn *conn; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); conn = ble_hs_conn_find_by_addr(addr); @@ -543,6 +547,10 @@ int ble_gap_set_priv_mode(const ble_addr_t *peer_addr, uint8_t priv_mode) { #if NIMBLE_BLE_CONNECT + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + return ble_hs_pvcy_set_mode(peer_addr, priv_mode); #else return BLE_HS_ENOTSUP; @@ -558,6 +566,10 @@ ble_gap_read_le_phy(uint16_t conn_handle, uint8_t *tx_phy, uint8_t *rx_phy) struct ble_hs_conn *conn; int rc; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); conn = ble_hs_conn_find(conn_handle); ble_hs_unlock(); @@ -606,6 +618,10 @@ ble_gap_set_prefered_default_le_phy(uint8_t tx_phys_mask, uint8_t rx_phys_mask) return BLE_ERR_INV_HCI_CMD_PARMS; } + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + memset(&cmd, 0, sizeof(cmd)); if (tx_phys_mask == 0) { @@ -636,6 +652,10 @@ ble_gap_set_prefered_le_phy(uint16_t conn_handle, uint8_t tx_phys_mask, struct ble_hci_le_set_phy_cp cmd; struct ble_hs_conn *conn; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); conn = ble_hs_conn_find(conn_handle); ble_hs_unlock(); @@ -2239,6 +2259,10 @@ ble_gap_wl_set(const ble_addr_t *addrs, uint8_t white_list_count) STATS_INC(ble_gap_stats, wl_set); + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); for (i = 0; i < white_list_count; i++) { @@ -2343,6 +2367,10 @@ ble_gap_adv_stop(void) #if NIMBLE_BLE_ADVERTISE && !MYNEWT_VAL(BLE_EXT_ADV) int rc; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); rc = ble_gap_adv_stop_no_lock(); ble_hs_unlock(); @@ -2540,6 +2568,10 @@ ble_gap_adv_start(uint8_t own_addr_type, const ble_addr_t *direct_addr, STATS_INC(ble_gap_stats, adv_start); + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); rc = ble_gap_adv_validate(own_addr_type, direct_addr, adv_params); @@ -2556,11 +2588,6 @@ ble_gap_adv_start(uint8_t own_addr_type, const ble_addr_t *direct_addr, } } - if (!ble_hs_is_enabled()) { - rc = BLE_HS_EDISABLED; - goto done; - } - if (ble_gap_is_preempted()) { rc = BLE_HS_EPREEMPTED; goto done; @@ -2625,6 +2652,10 @@ ble_gap_adv_set_data(const uint8_t *data, int data_len) STATS_INC(ble_gap_stats, adv_set_data); + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + /* Check for valid parameters */ if (((data == NULL) && (data_len != 0)) || (data_len > BLE_HCI_MAX_ADV_DATA_LEN)) { @@ -2649,6 +2680,9 @@ ble_gap_adv_rsp_set_data(const uint8_t *data, int data_len) struct ble_hci_le_set_scan_rsp_data_cp cmd; uint16_t opcode; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } /* Check for valid parameters */ if (((data == NULL) && (data_len != 0)) || @@ -2675,6 +2709,10 @@ ble_gap_adv_set_fields(const struct ble_hs_adv_fields *adv_fields) uint8_t buf_sz; int rc; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + rc = ble_hs_adv_set_fields(adv_fields, buf, &buf_sz, sizeof buf); if (rc != 0) { return rc; @@ -2883,6 +2921,10 @@ ble_gap_ext_adv_configure(uint8_t instance, return BLE_HS_EINVAL; } + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + rc = ble_gap_ext_adv_params_validate(params); if (rc) { return rc; @@ -2947,6 +2989,10 @@ ble_gap_ext_adv_set_addr(uint8_t instance, const ble_addr_t *addr) return BLE_HS_EINVAL; } + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); rc = ble_gap_ext_adv_set_addr_no_lock(instance, addr->val); ble_hs_unlock(); @@ -2967,6 +3013,10 @@ ble_gap_ext_adv_start(uint8_t instance, int duration, int max_events) return BLE_HS_EINVAL; } + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); if (!ble_gap_slave[instance].configured) { ble_hs_unlock(); @@ -3244,6 +3294,11 @@ ble_gap_ext_adv_set_data(uint8_t instance, struct os_mbuf *data) goto done; } + if (!ble_hs_is_enabled()) { + rc = BLE_HS_EDISABLED; + goto done; + } + ble_hs_lock(); rc = ble_gap_ext_adv_set_data_validate(instance, data); if (rc != 0) { @@ -3311,6 +3366,11 @@ ble_gap_ext_adv_rsp_set_data(uint8_t instance, struct os_mbuf *data) goto done; } + if (!ble_hs_is_enabled()) { + rc = BLE_HS_EDISABLED; + goto done; + } + ble_hs_lock(); rc = ble_gap_ext_adv_rsp_set_validate(instance, data); if (rc != 0) { @@ -3339,6 +3399,10 @@ ble_gap_ext_adv_remove(uint8_t instance) return BLE_HS_EINVAL; } + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); if (!ble_gap_slave[instance].configured) { ble_hs_unlock(); @@ -3372,6 +3436,10 @@ ble_gap_ext_adv_clear(void) uint8_t instance; uint16_t opcode; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); for (instance = 0; instance < BLE_ADV_INSTANCES; instance++) { @@ -3464,6 +3532,10 @@ ble_gap_periodic_adv_configure(uint8_t instance, return BLE_HS_EINVAL; } + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + rc = ble_gap_periodic_adv_params_validate(params); if (rc) { return rc; @@ -3510,6 +3582,10 @@ ble_gap_periodic_adv_start(uint8_t instance) return BLE_HS_EINVAL; } + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); /* Periodic advertising cannot start unless it is configured before */ @@ -3657,6 +3733,11 @@ ble_gap_periodic_adv_set_data(uint8_t instance, struct os_mbuf *data) goto done; } + if (!ble_hs_is_enabled()) { + rc = BLE_HS_EDISABLED; + goto done; + } + ble_hs_lock(); rc = ble_gap_periodic_adv_set_data_validate(instance, data); @@ -3705,6 +3786,10 @@ ble_gap_periodic_adv_stop(uint8_t instance) return BLE_HS_EINVAL; } + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); rc = ble_gap_periodic_adv_stop_no_lock(instance); ble_hs_unlock(); @@ -3761,6 +3846,10 @@ ble_gap_periodic_adv_sync_create(const ble_addr_t *addr, uint8_t adv_sid, return BLE_HS_EINVAL; } + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); /* No sync can be created if another sync is still pending */ @@ -3849,6 +3938,10 @@ ble_gap_periodic_adv_sync_terminate(uint16_t sync_handle) uint16_t opcode; int rc; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); if (ble_gap_sync.op == BLE_GAP_OP_SYNC) { @@ -3895,6 +3988,10 @@ ble_gap_periodic_adv_sync_reporting(uint16_t sync_handle, bool enable) uint16_t opcode; int rc; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); if (ble_gap_sync.op == BLE_GAP_OP_SYNC) { @@ -3931,6 +4028,10 @@ ble_gap_periodic_adv_sync_transfer(uint16_t sync_handle, uint16_t conn_handle, uint16_t opcode; int rc; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); conn = ble_hs_conn_find(conn_handle); @@ -3975,6 +4076,10 @@ ble_gap_periodic_adv_sync_set_info(uint8_t instance, uint16_t conn_handle, return BLE_HS_EINVAL; } + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); if (ble_gap_slave[instance].periodic_op != BLE_GAP_OP_S_PERIODIC_ADV) { /* periodic adv not enabled */ @@ -4037,6 +4142,10 @@ ble_gap_periodic_adv_sync_receive(uint16_t conn_handle, struct ble_hs_conn *conn; int rc; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); conn = ble_hs_conn_find(conn_handle); @@ -4097,6 +4206,10 @@ ble_gap_add_dev_to_periodic_adv_list(const ble_addr_t *peer_addr, return BLE_ERR_INV_HCI_CMD_PARMS; } + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + cmd.peer_addr_type = peer_addr->type; memcpy(cmd.peer_addr, peer_addr->val, BLE_DEV_ADDR_LEN); cmd.sid = adv_sid; @@ -4117,6 +4230,10 @@ ble_gap_rem_dev_from_periodic_adv_list(const ble_addr_t *peer_addr, uint8_t adv_ return BLE_ERR_INV_HCI_CMD_PARMS; } + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + cmd.peer_addr_type = peer_addr->type; memcpy(cmd.peer_addr, peer_addr->val, BLE_DEV_ADDR_LEN); cmd.sid = adv_sid; @@ -4324,6 +4441,10 @@ ble_gap_disc_cancel(void) #if NIMBLE_BLE_SCAN int rc; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); rc = ble_gap_disc_cancel_no_lock(); ble_hs_unlock(); @@ -4417,6 +4538,10 @@ ble_gap_ext_disc(uint8_t own_addr_type, uint16_t duration, uint16_t period, STATS_INC(ble_gap_stats, discover); + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); rc = ble_gap_disc_ext_validate(own_addr_type); @@ -4543,6 +4668,10 @@ ble_gap_disc(uint8_t own_addr_type, int32_t duration_ms, #if MYNEWT_VAL(BLE_EXT_ADV) struct ble_gap_ext_disc_params p = {0}; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + p.itvl = disc_params->itvl; p.passive = disc_params->passive; p.window = disc_params->window; @@ -4564,6 +4693,10 @@ ble_gap_disc(uint8_t own_addr_type, int32_t duration_ms, STATS_INC(ble_gap_stats, discover); + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); /* Make a copy of the parameter strcuture and fill unspecified values with @@ -4966,7 +5099,8 @@ ble_gap_ext_connect(uint8_t own_addr_type, const ble_addr_t *peer_addr, } if (!ble_hs_is_enabled()) { - return BLE_HS_EDISABLED; + rc = BLE_HS_EDISABLED; + goto done; } if (ble_gap_is_preempted()) { @@ -5242,6 +5376,10 @@ ble_gap_terminate(uint16_t conn_handle, uint8_t hci_reason) STATS_INC(ble_gap_stats, terminate); + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); conn = ble_hs_conn_find(conn_handle); @@ -5321,6 +5459,10 @@ ble_gap_conn_cancel(void) #if MYNEWT_VAL(BLE_ROLE_CENTRAL) int rc; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); rc = ble_gap_conn_cancel_no_lock(); ble_hs_unlock(); @@ -5579,6 +5721,10 @@ ble_gap_update_params(uint16_t conn_handle, return BLE_HS_EINVAL; } + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + STATS_INC(ble_gap_stats, update); memset(&l2cap_params, 0, sizeof l2cap_params); entry = NULL; @@ -5692,6 +5838,10 @@ ble_gap_security_initiate(uint16_t conn_handle) STATS_INC(ble_gap_stats, security_initiate); + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + ble_hs_lock(); conn = ble_hs_conn_find(conn_handle); if (conn != NULL) { @@ -5753,6 +5903,10 @@ ble_gap_pair_initiate(uint16_t conn_handle) { int rc; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + rc = ble_sm_pair_initiate(conn_handle); return rc; @@ -5770,6 +5924,10 @@ ble_gap_encryption_initiate(uint16_t conn_handle, ble_hs_conn_flags_t conn_flags; int rc; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + rc = ble_hs_atomic_conn_flags(conn_handle, &conn_flags); if (rc != 0) { return rc; @@ -5793,6 +5951,10 @@ ble_gap_unpair(const ble_addr_t *peer_addr) #if NIMBLE_BLE_SM struct ble_hs_conn *conn; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + if (ble_addr_cmp(peer_addr, BLE_ADDR_ANY) == 0) { return BLE_HS_EINVAL; } @@ -5823,6 +5985,10 @@ ble_gap_unpair_oldest_peer(void) int num_peers; int rc; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + rc = ble_store_util_bonded_peers( &oldest_peer_id_addr, &num_peers, 1); if (rc != 0) { @@ -5852,6 +6018,10 @@ ble_gap_unpair_oldest_except(const ble_addr_t *peer_addr) int num_peers; int rc, i; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + rc = ble_store_util_bonded_peers( &peer_id_addrs[0], &num_peers, MYNEWT_VAL(BLE_STORE_MAX_BONDS)); if (rc != 0) { @@ -5988,6 +6158,10 @@ ble_gap_conn_rssi(uint16_t conn_handle, int8_t *out_rssi) { int rc; + if (!ble_hs_is_enabled()) { + return BLE_HS_EDISABLED; + } + rc = ble_hs_hci_util_read_rssi(conn_handle, out_rssi); return rc; }