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.
This commit is contained in:
Rahul Tank
2023-03-01 12:11:55 +05:30
committed by Łukasz Rymanowski
parent d7eb050cfe
commit ca22da24b4
+180 -6
View File
@@ -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;
}