diff --git a/components/bt/esp_ble_mesh/mesh_core/friend.c b/components/bt/esp_ble_mesh/mesh_core/friend.c index 45217ad3cf..b2f57dcccd 100644 --- a/components/bt/esp_ble_mesh/mesh_core/friend.c +++ b/components/bt/esp_ble_mesh/mesh_core/friend.c @@ -64,6 +64,7 @@ enum { }; static void (*friend_cb)(bool establish, uint16_t lpn_addr, uint8_t reason); +static void enqueue_update(struct bt_mesh_friend *frnd, uint8_t md); static bool friend_init = false; @@ -233,7 +234,23 @@ void bt_mesh_friend_sec_update(uint16_t net_idx) } if (net_idx == BLE_MESH_KEY_ANY || frnd->net_idx == net_idx) { - frnd->sec_update = 1U; + /* For case MESH/NODE/FRND/FN/BV-20-C. + * A situation is: + * The friend node may receive more than one different secure updates + * consecutively. And using the previous approach will cause only the + * latest Friend Update message been enqueued. + * So we update the implementation here to enqueue the Friend Update + * message immediately once a different secure beacon is received. + * + * A disadvantage of the change is: + * A friend node may receive different secure beacons. Then the + * beacon_cache mechanism will not work. This will cause the friend + * message queue been full of these secure beacons. So before enqueuing + * the secure updates, we should check if the currently received one + * is already exists in the message queue. Or enhance the beacon cache + * filtering mechanism. + */ + enqueue_update(frnd, 1); } } } @@ -699,7 +716,6 @@ static void enqueue_update(struct bt_mesh_friend *frnd, uint8_t md) return; } - frnd->sec_update = 0U; enqueue_buf(frnd, buf); } @@ -1116,10 +1132,6 @@ static void enqueue_friend_pdu(struct bt_mesh_friend *frnd, BT_DBG("type %u", type); if (type == BLE_MESH_FRIEND_PDU_SINGLE) { - if (frnd->sec_update) { - enqueue_update(frnd, 1); - } - enqueue_buf(frnd, buf); return; } @@ -1136,10 +1148,6 @@ static void enqueue_friend_pdu(struct bt_mesh_friend *frnd, net_buf_slist_put(&seg->queue, buf); if (type == BLE_MESH_FRIEND_PDU_COMPLETE) { - if (frnd->sec_update) { - enqueue_update(frnd, 1); - } - sys_slist_merge_slist(&frnd->queue, &seg->queue); frnd->queue_size += seg->seg_count; diff --git a/components/bt/esp_ble_mesh/mesh_core/net.h b/components/bt/esp_ble_mesh/mesh_core/net.h index 8a1b9b343a..f982c41cee 100644 --- a/components/bt/esp_ble_mesh/mesh_core/net.h +++ b/components/bt/esp_ble_mesh/mesh_core/net.h @@ -95,7 +95,6 @@ struct bt_mesh_friend { uint8_t fsn:1, send_last:1, pending_req:1, - sec_update:1, pending_buf:1, valid:1, established:1;