Skip to content

Commit ace420f

Browse files
LingaoMHaavardRei
authored andcommitted
[nrf fromtree] Bluetooth: Mesh: Fixes after proxy advertising unable to send messages
When Proxy advertising or PB-GATT Advertising Enabled and use a same advertising sets. As adv\_start will call multi HCI Command will cause syswork_q yield. At same time, if another thread(BT RX) all schedule\_send will cause unable send mesh message, because ADV\_FLAG\_ACTIVE was be set, but ADV\_FLAG\_PROXY not set currentlly. Add ADV\_FLAG\_SCHEDULE\_PENDING indicate mesh buf has been pendings but not scheduled, so when proxy advertising enable, let's take again, as we can't break or terminated adv\_start, so we must waiting proxy advertising enabled. But after zephyrproject-rtos/zephyr#68558 The `k_work_is_pending` always true in `send_pending_adv`, which cause unable to send more mesh message until more mesh message comming Signed-off-by: Lingao Meng <[email protected]> (cherry picked from commit 537d215) Signed-off-by: Håvard Reierstad <[email protected]>
1 parent deebd3b commit ace420f

File tree

1 file changed

+24
-19
lines changed

1 file changed

+24
-19
lines changed

subsys/bluetooth/mesh/adv_ext.c

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,28 @@ static const char * const adv_tag_to_str[] = {
266266
[BT_MESH_ADV_TAG_PROV] = "prov adv",
267267
};
268268

269+
static bool schedule_send_with_mask(struct bt_mesh_ext_adv *ext_adv, int ignore_mask)
270+
{
271+
if (atomic_test_and_clear_bit(ext_adv->flags, ADV_FLAG_PROXY)) {
272+
atomic_clear_bit(ext_adv->flags, ADV_FLAG_PROXY_START);
273+
(void)bt_le_ext_adv_stop(ext_adv->instance);
274+
275+
atomic_clear_bit(ext_adv->flags, ADV_FLAG_ACTIVE);
276+
}
277+
278+
if (atomic_test_bit(ext_adv->flags, ADV_FLAG_ACTIVE)) {
279+
atomic_set_bit(ext_adv->flags, ADV_FLAG_SCHEDULE_PENDING);
280+
return false;
281+
} else if ((~ignore_mask) & k_work_busy_get(&ext_adv->work)) {
282+
return false;
283+
}
284+
285+
atomic_clear_bit(ext_adv->flags, ADV_FLAG_SCHEDULE_PENDING);
286+
k_work_submit(&ext_adv->work);
287+
288+
return true;
289+
}
290+
269291
static void send_pending_adv(struct k_work *work)
270292
{
271293
struct bt_mesh_ext_adv *ext_adv;
@@ -339,30 +361,13 @@ static void send_pending_adv(struct k_work *work)
339361
}
340362

341363
if (atomic_test_and_clear_bit(ext_adv->flags, ADV_FLAG_SCHEDULE_PENDING)) {
342-
schedule_send(ext_adv);
364+
schedule_send_with_mask(ext_adv, K_WORK_RUNNING);
343365
}
344366
}
345367

346368
static bool schedule_send(struct bt_mesh_ext_adv *ext_adv)
347369
{
348-
if (atomic_test_and_clear_bit(ext_adv->flags, ADV_FLAG_PROXY)) {
349-
atomic_clear_bit(ext_adv->flags, ADV_FLAG_PROXY_START);
350-
(void)bt_le_ext_adv_stop(ext_adv->instance);
351-
352-
atomic_clear_bit(ext_adv->flags, ADV_FLAG_ACTIVE);
353-
}
354-
355-
if (atomic_test_bit(ext_adv->flags, ADV_FLAG_ACTIVE)) {
356-
atomic_set_bit(ext_adv->flags, ADV_FLAG_SCHEDULE_PENDING);
357-
return false;
358-
} else if (k_work_is_pending(&ext_adv->work)) {
359-
return false;
360-
}
361-
362-
atomic_clear_bit(ext_adv->flags, ADV_FLAG_SCHEDULE_PENDING);
363-
k_work_submit(&ext_adv->work);
364-
365-
return true;
370+
return schedule_send_with_mask(ext_adv, 0);
366371
}
367372

368373
void bt_mesh_adv_gatt_update(void)

0 commit comments

Comments
 (0)