Skip to content

Commit a9db9a3

Browse files
Michał Narajowskicarlescufi
authored andcommitted
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]>
1 parent cca76f1 commit a9db9a3

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
@@ -1045,6 +1045,11 @@ int bt_le_adv_start_ext(struct bt_le_ext_adv *adv,
10451045

10461046
static void adv_timeout(struct k_work *work);
10471047

1048+
int bt_le_lim_adv_cancel_timeout(struct bt_le_ext_adv *adv)
1049+
{
1050+
return k_work_cancel_delayable(&adv->lim_adv_timeout_work);
1051+
}
1052+
10481053
int bt_le_adv_start(const struct bt_le_adv_param *param,
10491054
const struct bt_data *ad, size_t ad_len,
10501055
const struct bt_data *sd, size_t sd_len)
@@ -1068,8 +1073,8 @@ int bt_le_adv_start(const struct bt_le_adv_param *param,
10681073
}
10691074

10701075
if (ad_is_limited(ad, ad_len)) {
1071-
k_work_init_delayable(&adv->timeout_work, adv_timeout);
1072-
k_work_reschedule(&adv->timeout_work,
1076+
k_work_init_delayable(&adv->lim_adv_timeout_work, adv_timeout);
1077+
k_work_reschedule(&adv->lim_adv_timeout_work,
10731078
K_SECONDS(CONFIG_BT_LIM_ADV_TIMEOUT));
10741079
}
10751080

@@ -1081,6 +1086,8 @@ int bt_le_adv_stop(void)
10811086
struct bt_le_ext_adv *adv = bt_le_adv_lookup_legacy();
10821087
int err;
10831088

1089+
(void)bt_le_lim_adv_cancel_timeout(adv);
1090+
10841091
if (!adv) {
10851092
BT_ERR("No valid legacy adv");
10861093
return 0;
@@ -1332,6 +1339,8 @@ int bt_le_ext_adv_start(struct bt_le_ext_adv *adv,
13321339

13331340
int bt_le_ext_adv_stop(struct bt_le_ext_adv *adv)
13341341
{
1342+
(void)bt_le_lim_adv_cancel_timeout(adv);
1343+
13351344
atomic_clear_bit(adv->flags, BT_ADV_PERSIST);
13361345

13371346
if (!atomic_test_bit(adv->flags, BT_ADV_ENABLED)) {
@@ -1406,13 +1415,13 @@ int bt_le_ext_adv_delete(struct bt_le_ext_adv *adv)
14061415
static void adv_timeout(struct k_work *work)
14071416
{
14081417
int err = 0;
1409-
#if defined(CONFIG_BT_EXT_ADV)
14101418
struct k_work_delayable *dwork;
14111419
struct bt_le_ext_adv *adv;
14121420

14131421
dwork = k_work_delayable_from_work(work);
1414-
adv = CONTAINER_OF(dwork, struct bt_le_ext_adv, timeout_work);
1422+
adv = CONTAINER_OF(dwork, struct bt_le_ext_adv, lim_adv_timeout_work);
14151423

1424+
#if defined(CONFIG_BT_EXT_ADV)
14161425
if (adv == bt_dev.adv) {
14171426
err = bt_le_adv_stop();
14181427
} else {
@@ -1628,6 +1637,7 @@ void bt_hci_le_adv_set_terminated(struct net_buf *buf)
16281637
adv = bt_adv_lookup_handle(evt->adv_handle);
16291638
conn_handle = sys_le16_to_cpu(evt->conn_handle);
16301639

1640+
(void)bt_le_lim_adv_cancel_timeout(adv);
16311641
#if (CONFIG_BT_ID_MAX > 1) && (CONFIG_BT_EXT_ADV_MAX_ADV_SET > 1)
16321642
bt_dev.adv_conn_id = adv->id;
16331643
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
@@ -1324,6 +1324,12 @@ static void le_legacy_conn_complete(struct net_buf *buf)
13241324
struct bt_hci_evt_le_conn_complete *evt = (void *)buf->data;
13251325
struct bt_hci_evt_le_enh_conn_complete enh;
13261326

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

subsys/bluetooth/host/hci_core.h

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

152-
struct k_work_delayable timeout_work;
152+
struct k_work_delayable lim_adv_timeout_work;
153153
};
154154

155155
enum {

0 commit comments

Comments
 (0)