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 <joakim.andersson@nordicsemi.no>
This commit is contained in:
Joakim Andersson 2020-02-25 10:48:30 +01:00 committed by Johan Hedberg
commit 09b89ef585
2 changed files with 38 additions and 27 deletions

View file

@ -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();
}

View file

@ -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();
}