Skip to content

Commit 09b89ef

Browse files
joerchanjhedberg
authored andcommitted
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 <[email protected]>
1 parent ce99a5b commit 09b89ef

File tree

2 files changed

+38
-27
lines changed

2 files changed

+38
-27
lines changed

samples/bluetooth/central/src/main.c

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,20 @@ static void device_found(const bt_addr_le_t *addr, s8_t rssi, u8_t type,
5050
default_conn = bt_conn_create_le(addr, BT_LE_CONN_PARAM_DEFAULT);
5151
}
5252

53+
static void start_scan(void)
54+
{
55+
int err;
56+
57+
/* This demo doesn't require active scan */
58+
err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, device_found);
59+
if (err) {
60+
printk("Scanning failed to start (err %d)\n", err);
61+
return;
62+
}
63+
64+
printk("Scanning successfully started\n");
65+
}
66+
5367
static void connected(struct bt_conn *conn, u8_t err)
5468
{
5569
char addr[BT_ADDR_LE_STR_LEN];
@@ -58,6 +72,11 @@ static void connected(struct bt_conn *conn, u8_t err)
5872

5973
if (err) {
6074
printk("Failed to connect to %s (%u)\n", addr, err);
75+
76+
bt_conn_unref(default_conn);
77+
default_conn = NULL;
78+
79+
start_scan();
6180
return;
6281
}
6382

@@ -73,7 +92,6 @@ static void connected(struct bt_conn *conn, u8_t err)
7392
static void disconnected(struct bt_conn *conn, u8_t reason)
7493
{
7594
char addr[BT_ADDR_LE_STR_LEN];
76-
int err;
7795

7896
if (conn != default_conn) {
7997
return;
@@ -86,11 +104,7 @@ static void disconnected(struct bt_conn *conn, u8_t reason)
86104
bt_conn_unref(default_conn);
87105
default_conn = NULL;
88106

89-
/* This demo doesn't require active scan */
90-
err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, device_found);
91-
if (err) {
92-
printk("Scanning failed to start (err %d)\n", err);
93-
}
107+
start_scan();
94108
}
95109

96110
static struct bt_conn_cb conn_callbacks = {
@@ -112,11 +126,5 @@ void main(void)
112126

113127
bt_conn_cb_register(&conn_callbacks);
114128

115-
err = bt_le_scan_start(BT_LE_SCAN_ACTIVE, device_found);
116-
if (err) {
117-
printk("Scanning failed to start (err %d)\n", err);
118-
return;
119-
}
120-
121-
printk("Scanning successfully started\n");
129+
start_scan();
122130
}

samples/bluetooth/central_hr/src/main.c

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,10 @@ static void device_found(const bt_addr_le_t *addr, s8_t rssi, u8_t type,
150150
}
151151
}
152152

153-
static int scan_start(void)
153+
static void start_scan(void)
154154
{
155+
int err;
156+
155157
/* Use active scanning and disable duplicate filtering to handle any
156158
* devices that might update their advertising data at runtime. */
157159
struct bt_le_scan_param scan_param = {
@@ -161,7 +163,13 @@ static int scan_start(void)
161163
.window = BT_GAP_SCAN_FAST_WINDOW,
162164
};
163165

164-
return bt_le_scan_start(&scan_param, device_found);
166+
err = bt_le_scan_start(&scan_param, device_found);
167+
if (err) {
168+
printk("Scanning failed to start (err %d)\n", err);
169+
return;
170+
}
171+
172+
printk("Scanning successfully started\n");
165173
}
166174

167175
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)
173181

174182
if (conn_err) {
175183
printk("Failed to connect to %s (%u)\n", addr, conn_err);
184+
185+
bt_conn_unref(default_conn);
186+
default_conn = NULL;
187+
188+
start_scan();
176189
return;
177190
}
178191

@@ -209,10 +222,7 @@ static void disconnected(struct bt_conn *conn, u8_t reason)
209222
bt_conn_unref(default_conn);
210223
default_conn = NULL;
211224

212-
err = scan_start();
213-
if (err) {
214-
printk("Scanning failed to start (err %d)\n", err);
215-
}
225+
start_scan();
216226
}
217227

218228
static struct bt_conn_cb conn_callbacks = {
@@ -234,12 +244,5 @@ void main(void)
234244

235245
bt_conn_cb_register(&conn_callbacks);
236246

237-
err = scan_start();
238-
239-
if (err) {
240-
printk("Scanning failed to start (err %d)\n", err);
241-
return;
242-
}
243-
244-
printk("Scanning successfully started\n");
247+
start_scan();
245248
}

0 commit comments

Comments
 (0)