Skip to content

Commit 18e072b

Browse files
Michał Narajowskicarlescufi
authored andcommitted
[nrf fromtree] Bluetooth: host: Cancel limited adv timeout when advertising stopped
Advertising might stop when: - it was stopped by application - device connected to a peer - extended advertising reached stop condition defined in BT_LE_EXT_ADV_START_PARAM - this is handled in ll Signed-off-by: Michał Narajowski <[email protected]> (cherry picked from commit a9db9a3) Signed-off-by: Martin Tverdal <[email protected]>
1 parent 553ff26 commit 18e072b

File tree

4 files changed

+22
-5
lines changed

4 files changed

+22
-5
lines changed

subsys/bluetooth/host/adv.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,11 @@ int bt_le_adv_start_ext(struct bt_le_ext_adv *adv,
997997

998998
static void adv_timeout(struct k_work *work);
999999

1000+
int bt_le_lim_adv_cancel_timeout(struct bt_le_ext_adv *adv)
1001+
{
1002+
return k_work_cancel_delayable(&adv->lim_adv_timeout_work);
1003+
}
1004+
10001005
int bt_le_adv_start(const struct bt_le_adv_param *param,
10011006
const struct bt_data *ad, size_t ad_len,
10021007
const struct bt_data *sd, size_t sd_len)
@@ -1020,8 +1025,8 @@ int bt_le_adv_start(const struct bt_le_adv_param *param,
10201025
}
10211026

10221027
if (ad_is_limited(ad, ad_len)) {
1023-
k_work_init_delayable(&adv->timeout_work, adv_timeout);
1024-
k_work_reschedule(&adv->timeout_work,
1028+
k_work_init_delayable(&adv->lim_adv_timeout_work, adv_timeout);
1029+
k_work_reschedule(&adv->lim_adv_timeout_work,
10251030
K_SECONDS(CONFIG_BT_LIM_ADV_TIMEOUT));
10261031
}
10271032

@@ -1033,6 +1038,8 @@ int bt_le_adv_stop(void)
10331038
struct bt_le_ext_adv *adv = bt_le_adv_lookup_legacy();
10341039
int err;
10351040

1041+
(void)bt_le_lim_adv_cancel_timeout(adv);
1042+
10361043
if (!adv) {
10371044
BT_ERR("No valid legacy adv");
10381045
return 0;
@@ -1284,6 +1291,8 @@ int bt_le_ext_adv_start(struct bt_le_ext_adv *adv,
12841291

12851292
int bt_le_ext_adv_stop(struct bt_le_ext_adv *adv)
12861293
{
1294+
(void)bt_le_lim_adv_cancel_timeout(adv);
1295+
12871296
atomic_clear_bit(adv->flags, BT_ADV_PERSIST);
12881297

12891298
if (!atomic_test_bit(adv->flags, BT_ADV_ENABLED)) {
@@ -1360,13 +1369,13 @@ int bt_le_ext_adv_delete(struct bt_le_ext_adv *adv)
13601369
static void adv_timeout(struct k_work *work)
13611370
{
13621371
int err = 0;
1363-
#if defined(CONFIG_BT_EXT_ADV)
13641372
struct k_work_delayable *dwork;
13651373
struct bt_le_ext_adv *adv;
13661374

13671375
dwork = k_work_delayable_from_work(work);
1368-
adv = CONTAINER_OF(dwork, struct bt_le_ext_adv, timeout_work);
1376+
adv = CONTAINER_OF(dwork, struct bt_le_ext_adv, lim_adv_timeout_work);
13691377

1378+
#if defined(CONFIG_BT_EXT_ADV)
13701379
if (adv == bt_dev.adv) {
13711380
err = bt_le_adv_stop();
13721381
} else {
@@ -1582,6 +1591,7 @@ void bt_hci_le_adv_set_terminated(struct net_buf *buf)
15821591
adv = bt_adv_lookup_handle(evt->adv_handle);
15831592
conn_handle = sys_le16_to_cpu(evt->conn_handle);
15841593

1594+
(void)bt_le_lim_adv_cancel_timeout(adv);
15851595
#if (CONFIG_BT_ID_MAX > 1) && (CONFIG_BT_EXT_ADV_MAX_ADV_SET > 1)
15861596
bt_dev.adv_conn_id = adv->id;
15871597
for (int i = 0; i < ARRAY_SIZE(bt_dev.cached_conn_complete); i++) {

subsys/bluetooth/host/adv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ int bt_le_adv_set_enable_ext(struct bt_le_ext_adv *adv,
1919
bool enable,
2020
const struct bt_le_ext_adv_start_param *param);
2121
int bt_le_adv_set_enable_legacy(struct bt_le_ext_adv *adv, bool enable);
22+
int bt_le_lim_adv_cancel_timeout(struct bt_le_ext_adv *adv);

subsys/bluetooth/host/hci_core.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,6 +1323,12 @@ static void le_legacy_conn_complete(struct net_buf *buf)
13231323
struct bt_hci_evt_le_conn_complete *evt = (void *)buf->data;
13241324
struct bt_hci_evt_le_enh_conn_complete enh;
13251325

1326+
#if defined(CONFIG_BT_BROADCASTER)
1327+
struct bt_le_ext_adv *adv = bt_le_adv_lookup_legacy();
1328+
1329+
(void)bt_le_lim_adv_cancel_timeout(adv);
1330+
#endif
1331+
13261332
BT_DBG("status 0x%02x role %u %s", evt->status, evt->role,
13271333
bt_addr_le_str(&evt->peer_addr));
13281334

subsys/bluetooth/host/hci_core.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ struct bt_le_ext_adv {
151151
int8_t tx_power;
152152
#endif /* defined(CONFIG_BT_EXT_ADV) */
153153

154-
struct k_work_delayable timeout_work;
154+
struct k_work_delayable lim_adv_timeout_work;
155155
};
156156

157157
enum {

0 commit comments

Comments
 (0)