You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ry...@apache.org on 2020/03/27 12:02:57 UTC
[mynewt-nimble] branch master updated: nimble/host: Reset master
and slave states on host reset
This is an automated email from the ASF dual-hosted git repository.
rymek pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
The following commit(s) were added to refs/heads/master by this push:
new 1a963cc nimble/host: Reset master and slave states on host reset
1a963cc is described below
commit 1a963cc37795c9d55ef21afa5c211bbf75bb0cb1
Author: Prasad Alatkar <pr...@espressif.com>
AuthorDate: Fri Mar 20 15:06:51 2020 +0530
nimble/host: Reset master and slave states on host reset
---
nimble/host/src/ble_gap.c | 52 +++++++++++++++++++++++++++++++++++++++++-
nimble/host/src/ble_gap_priv.h | 1 +
nimble/host/src/ble_hs.c | 11 ++-------
3 files changed, 54 insertions(+), 10 deletions(-)
diff --git a/nimble/host/src/ble_gap.c b/nimble/host/src/ble_gap.c
index 693ba30..4729dd0 100644
--- a/nimble/host/src/ble_gap.c
+++ b/nimble/host/src/ble_gap.c
@@ -1020,7 +1020,7 @@ ble_gap_slave_set_timer(uint32_t ticks_from_now)
}
#endif
-#if NIMBLE_BLE_CONNECT
+#if (NIMBLE_BLE_CONNECT || NIMBLE_BLE_SCAN)
/**
* Called when an error is encountered while the master-connection-fsm is
* active.
@@ -1034,12 +1034,22 @@ ble_gap_master_failed(int status)
ble_gap_master_connect_failure(status);
break;
+#if NIMBLE_BLE_SCAN
+ case BLE_GAP_OP_M_DISC:
+ STATS_INC(ble_gap_stats, initiate_fail);
+ ble_gap_disc_complete();
+ ble_gap_master_reset_state();
+ break;
+#endif
+
default:
BLE_HS_DBG_ASSERT(0);
break;
}
}
+#endif
+#if NIMBLE_BLE_CONNECT
static void
ble_gap_update_failed(uint16_t conn_handle, int status)
{
@@ -1237,6 +1247,46 @@ ble_gap_adv_active_instance(uint8_t instance)
return ble_gap_slave[instance].op == BLE_GAP_OP_S_ADV;
}
+/**
+ * Clears advertisement and discovery state. This function is necessary
+ * when the controller loses its active state (e.g. on stack reset).
+ */
+void
+ble_gap_reset_state(int reason)
+{
+ uint16_t conn_handle;
+
+ while (1) {
+ conn_handle = ble_hs_atomic_first_conn_handle();
+ if (conn_handle == BLE_HS_CONN_HANDLE_NONE) {
+ break;
+ }
+
+ ble_gap_conn_broken(conn_handle, reason);
+ }
+
+#if NIMBLE_BLE_ADVERTISE
+#if MYNEWT_VAL(BLE_EXT_ADV)
+ uint8_t i;
+ for (i = 0; i < BLE_ADV_INSTANCES; i++) {
+ if (ble_gap_adv_active_instance(i)) {
+ /* Indicate to application that advertising has stopped. */
+ ble_gap_adv_finished(i, reason, 0, 0);
+ }
+ }
+#else
+ if (ble_gap_adv_active_instance(0)) {
+ /* Indicate to application that advertising has stopped. */
+ ble_gap_adv_finished(0, reason, 0, 0);
+ }
+#endif
+#endif
+
+#if (NIMBLE_BLE_SCAN || NIMBLE_BLE_CONNECT)
+ ble_gap_master_failed(reason);
+#endif
+}
+
#if NIMBLE_BLE_CONNECT
static int
ble_gap_accept_master_conn(void)
diff --git a/nimble/host/src/ble_gap_priv.h b/nimble/host/src/ble_gap_priv.h
index ce44319..c050435 100644
--- a/nimble/host/src/ble_gap_priv.h
+++ b/nimble/host/src/ble_gap_priv.h
@@ -136,6 +136,7 @@ void ble_gap_preempt(void);
void ble_gap_preempt_done(void);
int ble_gap_terminate_with_conn(struct ble_hs_conn *conn, uint8_t hci_reason);
+void ble_gap_reset_state(int reason);
void ble_gap_conn_broken(uint16_t conn_handle, int reason);
int32_t ble_gap_timer(void);
diff --git a/nimble/host/src/ble_hs.c b/nimble/host/src/ble_hs.c
index 23ac1d1..b41064f 100644
--- a/nimble/host/src/ble_hs.c
+++ b/nimble/host/src/ble_hs.c
@@ -361,7 +361,6 @@ ble_hs_sync(void)
static int
ble_hs_reset(void)
{
- uint16_t conn_handle;
int rc;
STATS_INC(ble_hs_stats, reset);
@@ -376,14 +375,8 @@ ble_hs_reset(void)
ble_hs_clear_rx_queue();
- while (1) {
- conn_handle = ble_hs_atomic_first_conn_handle();
- if (conn_handle == BLE_HS_CONN_HANDLE_NONE) {
- break;
- }
-
- ble_gap_conn_broken(conn_handle, ble_hs_reset_reason);
- }
+ /* Clear adverising and scanning states. */
+ ble_gap_reset_state(ble_hs_reset_reason);
/* Clear configured addresses. */
ble_hs_id_reset();