From 09b89ef585d8ebba5fcb672b30cb670dd0f31772 Mon Sep 17 00:00:00 2001 From: Joakim Andersson Date: Tue, 25 Feb 2020 10:48:30 +0100 Subject: [PATCH] Bluetooth: samples: Unref conn object on create connection timeout Handle connected callback with error status not releasing the default conn object in central samples. This can happen when the initiator fails to create the connection within 3 seconds and is canceled by the host. Also restart the scan role in this case. Signed-off-by: Joakim Andersson --- samples/bluetooth/central/src/main.c | 34 +++++++++++++++---------- samples/bluetooth/central_hr/src/main.c | 31 ++++++++++++---------- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/samples/bluetooth/central/src/main.c b/samples/bluetooth/central/src/main.c index 05d835add00..f3086b4701e 100644 --- a/samples/bluetooth/central/src/main.c +++ b/samples/bluetooth/central/src/main.c @@ -50,6 +50,20 @@ static void device_found(const bt_addr_le_t *addr, s8_t rssi, u8_t type, default_conn = bt_conn_create_le(addr, BT_LE_CONN_PARAM_DEFAULT); } +static void start_scan(void) +{ + int err; + + /* This demo doesn't require active scan */ + err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, device_found); + if (err) { + printk("Scanning failed to start (err %d)\n", err); + return; + } + + printk("Scanning successfully started\n"); +} + static void connected(struct bt_conn *conn, u8_t err) { char addr[BT_ADDR_LE_STR_LEN]; @@ -58,6 +72,11 @@ static void connected(struct bt_conn *conn, u8_t err) if (err) { printk("Failed to connect to %s (%u)\n", addr, err); + + bt_conn_unref(default_conn); + default_conn = NULL; + + start_scan(); return; } @@ -73,7 +92,6 @@ static void connected(struct bt_conn *conn, u8_t err) static void disconnected(struct bt_conn *conn, u8_t reason) { char addr[BT_ADDR_LE_STR_LEN]; - int err; if (conn != default_conn) { return; @@ -86,11 +104,7 @@ static void disconnected(struct bt_conn *conn, u8_t reason) bt_conn_unref(default_conn); default_conn = NULL; - /* This demo doesn't require active scan */ - err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, device_found); - if (err) { - printk("Scanning failed to start (err %d)\n", err); - } + start_scan(); } static struct bt_conn_cb conn_callbacks = { @@ -112,11 +126,5 @@ void main(void) bt_conn_cb_register(&conn_callbacks); - err = bt_le_scan_start(BT_LE_SCAN_ACTIVE, device_found); - if (err) { - printk("Scanning failed to start (err %d)\n", err); - return; - } - - printk("Scanning successfully started\n"); + start_scan(); } diff --git a/samples/bluetooth/central_hr/src/main.c b/samples/bluetooth/central_hr/src/main.c index f30f535bd0b..f3e056f6007 100644 --- a/samples/bluetooth/central_hr/src/main.c +++ b/samples/bluetooth/central_hr/src/main.c @@ -150,8 +150,10 @@ static void device_found(const bt_addr_le_t *addr, s8_t rssi, u8_t type, } } -static int scan_start(void) +static void start_scan(void) { + int err; + /* Use active scanning and disable duplicate filtering to handle any * devices that might update their advertising data at runtime. */ struct bt_le_scan_param scan_param = { @@ -161,7 +163,13 @@ static int scan_start(void) .window = BT_GAP_SCAN_FAST_WINDOW, }; - return bt_le_scan_start(&scan_param, device_found); + err = bt_le_scan_start(&scan_param, device_found); + if (err) { + printk("Scanning failed to start (err %d)\n", err); + return; + } + + printk("Scanning successfully started\n"); } static void connected(struct bt_conn *conn, u8_t conn_err) @@ -173,6 +181,11 @@ static void connected(struct bt_conn *conn, u8_t conn_err) if (conn_err) { printk("Failed to connect to %s (%u)\n", addr, conn_err); + + bt_conn_unref(default_conn); + default_conn = NULL; + + start_scan(); return; } @@ -209,10 +222,7 @@ static void disconnected(struct bt_conn *conn, u8_t reason) bt_conn_unref(default_conn); default_conn = NULL; - err = scan_start(); - if (err) { - printk("Scanning failed to start (err %d)\n", err); - } + start_scan(); } static struct bt_conn_cb conn_callbacks = { @@ -234,12 +244,5 @@ void main(void) bt_conn_cb_register(&conn_callbacks); - err = scan_start(); - - if (err) { - printk("Scanning failed to start (err %d)\n", err); - return; - } - - printk("Scanning successfully started\n"); + start_scan(); }