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 <[email protected]> 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
