You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by na...@apache.org on 2020/01/07 11:18:21 UTC
[mynewt-nimble] 14/14: apps/bttester: Add connection retries on
fail to be established
This is an automated email from the ASF dual-hosted git repository.
naraj pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
commit 23faa0a28e30adc1f57f3cfe076480217fce9634
Author: MichaĆ Narajowski <mi...@codecoup.pl>
AuthorDate: Tue Dec 10 14:23:03 2019 +0100
apps/bttester: Add connection retries on fail to be established
---
apps/bttester/src/gap.c | 128 +++++++++++++++++++++++++++++++----------------
apps/bttester/syscfg.yml | 4 ++
2 files changed, 88 insertions(+), 44 deletions(-)
diff --git a/apps/bttester/src/gap.c b/apps/bttester/src/gap.c
index 687f806..9d6de04 100644
--- a/apps/bttester/src/gap.c
+++ b/apps/bttester/src/gap.c
@@ -56,9 +56,25 @@ static ble_addr_t peer_id_addr;
static ble_addr_t peer_ota_addr;
static bool encrypted = false;
-struct os_callout update_params_co;
+static struct os_callout update_params_co;
static struct gap_conn_param_update_cmd update_params;
+static struct os_callout connected_ev_co;
+static struct gap_device_connected_ev connected_ev;
+#define CONNECTED_EV_DELAY_MS(itvl) 8 * BLE_HCI_CONN_ITVL * itvl / 1000
+static int connection_attempts;
+
+static const struct ble_gap_conn_params dflt_conn_params = {
+ .scan_itvl = 0x0010,
+ .scan_window = 0x0010,
+ .itvl_min = BLE_GAP_INITIAL_CONN_ITVL_MIN,
+ .itvl_max = BLE_GAP_INITIAL_CONN_ITVL_MAX,
+ .latency = 0,
+ .supervision_timeout = 0x0100,
+ .min_ce_len = 0x0010,
+ .max_ce_len = 0x0300,
+};
+
static void conn_param_update(struct os_event *ev);
@@ -649,10 +665,30 @@ static void periph_privacy(struct ble_gap_conn_desc desc)
}
}
+static void device_connected_ev_send(struct os_event *ev)
+{
+ struct ble_gap_conn_desc desc;
+ int rc;
+
+ SYS_LOG_DBG("");
+
+ rc = gap_conn_find_by_addr((ble_addr_t *)&connected_ev, &desc);
+ if (rc) {
+ tester_rsp(BTP_SERVICE_ID_GAP, GAP_EV_DEVICE_CONNECTED,
+ CONTROLLER_INDEX, BTP_STATUS_FAILED);
+ return;
+ }
+
+ tester_send(BTP_SERVICE_ID_GAP, GAP_EV_DEVICE_CONNECTED,
+ CONTROLLER_INDEX, (u8_t *) &connected_ev,
+ sizeof(connected_ev));
+
+ periph_privacy(desc);
+}
+
static void le_connected(u16_t conn_handle, int status)
{
struct ble_gap_conn_desc desc;
- struct gap_device_connected_ev ev;
ble_addr_t *addr;
int rc;
@@ -672,27 +708,21 @@ static void le_connected(u16_t conn_handle, int status)
addr = &desc.peer_id_addr;
- memcpy(ev.address, addr->val, sizeof(ev.address));
- ev.address_type = addr->type;
- ev.conn_itvl = desc.conn_itvl;
- ev.conn_latency = desc.conn_latency;
- ev.supervision_timeout = desc.supervision_timeout;
-
-#if MYNEWT_VAL(BTTESTER_CONN_PARAM_UPDATE)
- memcpy(update_params.address, addr->val, sizeof(ev.address));
- update_params.address_type = addr->type;
- update_params.conn_itvl_min = desc.conn_itvl;
- update_params.conn_itvl_max = desc.conn_itvl;
- update_params.conn_latency = desc.conn_latency + 1;
- update_params.supervision_timeout = desc.supervision_timeout;
-
- conn_param_update(NULL);
-#endif
+ memcpy(connected_ev.address, addr->val, sizeof(connected_ev.address));
+ connected_ev.address_type = addr->type;
+ connected_ev.conn_itvl = desc.conn_itvl;
+ connected_ev.conn_latency = desc.conn_latency;
+ connected_ev.supervision_timeout = desc.supervision_timeout;
+#if MYNEWT_VAL(BTTESTER_CONN_RETRY)
+ os_callout_reset(&connected_ev_co,
+ os_time_ms_to_ticks32(
+ CONNECTED_EV_DELAY_MS(desc.conn_itvl)));
+#else
tester_send(BTP_SERVICE_ID_GAP, GAP_EV_DEVICE_CONNECTED,
- CONTROLLER_INDEX, (u8_t *) &ev, sizeof(ev));
-
- periph_privacy(desc);
+ CONTROLLER_INDEX, (u8_t *) &connected_ev,
+ sizeof(connected_ev));
+#endif
}
static void le_disconnected(struct ble_gap_conn_desc *conn, int reason)
@@ -702,6 +732,33 @@ static void le_disconnected(struct ble_gap_conn_desc *conn, int reason)
SYS_LOG_DBG("");
+#if MYNEWT_VAL(BTTESTER_CONN_RETRY)
+ int rc;
+
+ if ((reason == BLE_HS_HCI_ERR(BLE_ERR_CONN_ESTABLISHMENT)) &&
+ os_callout_queued(&connected_ev_co)) {
+ if (connection_attempts < MYNEWT_VAL(BTTESTER_CONN_RETRY)) {
+ os_callout_stop(&connected_ev_co);
+
+ /* try connecting again */
+ rc = ble_gap_connect(own_addr_type, addr, 0,
+ &dflt_conn_params, gap_event_cb,
+ NULL);
+
+ if (rc == 0) {
+ connection_attempts++;
+ return;
+ }
+ }
+ } else if (os_callout_queued(&connected_ev_co)) {
+ os_callout_stop(&connected_ev_co);
+ return;
+ }
+#endif
+
+ connection_attempts = 0;
+ memset(&connected_ev, 0, sizeof(connected_ev));
+
memcpy(ev.address, addr->val, sizeof(ev.address));
ev.address_type = addr->type;
@@ -1142,32 +1199,15 @@ static int gap_event_cb(struct ble_gap_event *event, void *arg)
static void connect(const u8_t *data, u16_t len)
{
- struct ble_gap_conn_params conn_params = { 0 };
- u8_t status;
- int rc;
+ u8_t status = BTP_STATUS_SUCCESS;
SYS_LOG_DBG("");
- conn_params.scan_itvl = 0x0010;
- conn_params.scan_window = 0x0010;
- conn_params.itvl_min = BLE_GAP_INITIAL_CONN_ITVL_MIN;
- conn_params.itvl_max = BLE_GAP_INITIAL_CONN_ITVL_MAX;
- conn_params.latency = 0;
- conn_params.supervision_timeout = 0x0100;
- conn_params.min_ce_len = 0x0010;
- conn_params.max_ce_len = 0x0300;
-
- rc = ble_gap_connect(own_addr_type, (ble_addr_t *) data,
- 0, &conn_params,
- gap_event_cb, NULL);
- if (rc) {
+ if (ble_gap_connect(own_addr_type, (ble_addr_t *) data, 0,
+ &dflt_conn_params, gap_event_cb, NULL)) {
status = BTP_STATUS_FAILED;
- goto rsp;
}
- status = BTP_STATUS_SUCCESS;
-
-rsp:
tester_rsp(BTP_SERVICE_ID_GAP, GAP_CONNECT, CONTROLLER_INDEX, status);
}
@@ -1416,9 +1456,6 @@ static int conn_param_update_master(u16_t conn_handle,
return rc;
}
-struct os_callout update_params_co;
-static struct gap_conn_param_update_cmd update_params;
-
static void conn_param_update(struct os_event *ev)
{
struct ble_gap_conn_desc desc;
@@ -1620,6 +1657,9 @@ static void tester_init_gap_cb(int err)
os_callout_init(&update_params_co, os_eventq_dflt_get(),
conn_param_update, NULL);
+ os_callout_init(&connected_ev_co, os_eventq_dflt_get(),
+ device_connected_ev_send, NULL);
+
tester_rsp(BTP_SERVICE_ID_CORE, CORE_REGISTER_SERVICE, BTP_INDEX_NONE,
BTP_STATUS_SUCCESS);
}
diff --git a/apps/bttester/syscfg.yml b/apps/bttester/syscfg.yml
index d2291aa..d0fffe1 100644
--- a/apps/bttester/syscfg.yml
+++ b/apps/bttester/syscfg.yml
@@ -51,6 +51,10 @@ syscfg.defs:
description: Limited advertising timeout
value: 30000
+ BTTESTER_CONN_RETRY:
+ description: Retry connections when connection failed to be established
+ value: 3
+
BTTESTER_BTP_DATA_SIZE_MAX:
description: Maximum BTP payload
value: 2048