Bluetooth: Mesh: Use relay bufs/pool for brg_cfg

Adds support for using relay buffers and advertising set for the subnet
bridge feature, even if the relay feature is disabled.

Signed-off-by: Håvard Reierstad <haavard.reierstad@nordicsemi.no>
This commit is contained in:
Håvard Reierstad 2024-11-19 09:49:55 +01:00 committed by Anas Nashif
parent d231b459df
commit 665a555e75
4 changed files with 26 additions and 16 deletions

View file

@ -113,13 +113,16 @@ protection to ensure network security. Key considerations to take into account a
Relay buffer considerations
===========================
When a message is relayed between subnets by a Subnet Bridge, it is allocated from the relay buffer.
To ensure that messages can be retransmitted to all subnetworks,
the :kconfig:option:`CONFIG_BT_MESH_RELAY_BUF_COUNT` option should be increased accordingly.
When a message is relayed between subnets by a Subnet Bridge, it is allocated from the relay buffer
pool. The number of relay buffers are configurable using the
:kconfig:option:`CONFIG_BT_MESH_RELAY_BUF_COUNT` Kconfig option.
However, if the :kconfig:option:`CONFIG_BT_MESH_RELAY` feature is disabled, the messages will be
allocated from the advertising buffer instead. In this case, increase the
:kconfig:option:`CONFIG_BT_MESH_ADV_BUF_COUNT` option to allow for sufficient buffer space.
When :kconfig:option:`CONFIG_BT_MESH_ADV_EXT` is enabled, messages will be transmitted using the
relay advertising sets. The number of advertising sets are configurable using the
:kconfig:option:`CONFIG_BT_MESH_RELAY_ADV_SETS` Kconfig option.
Both the relay buffer pool and advertising sets can be used even if the relay feature
:kconfig:option:`CONFIG_BT_MESH_RELAY` is disabled.
Replay protection and Bridging Table
====================================

View file

@ -165,11 +165,13 @@ config BT_MESH_RELAY_ADV_SETS
int "Maximum of simultaneous relay message support"
default 0
range 0 BT_EXT_ADV_MAX_ADV_SET
depends on BT_MESH_RELAY
depends on BT_MESH_RELAY || BT_MESH_BRG_CFG_SRV
help
Maximum of simultaneous relay message support. Requires controller support
multiple advertising sets.
Note that: The Subnet Bridge feature uses the relay advertising sets.
config BT_MESH_ADV_EXT_RELAY_USING_MAIN_ADV_SET
bool "Use the main advertising set to relay messages"
depends on BT_MESH_RELAY_ADV_SETS > 0
@ -471,8 +473,11 @@ config BT_MESH_RELAY_RETRANSMIT_INTERVAL
messages, in milliseconds. Can be changed through runtime
configuration.
endif # BT_MESH_RELAY
config BT_MESH_RELAY_BUF_COUNT
int "Number of advertising buffers for relayed messages"
depends on BT_MESH_RELAY || BT_MESH_BRG_CFG_SRV
default 32
range 1 256
help
@ -486,7 +491,9 @@ config BT_MESH_RELAY_BUF_COUNT
BT_MESH_RELAY_ADV_SETS allows the increase in the number of buffers
while maintaining the latency.
endif # BT_MESH_RELAY
Note that: The Subnet Bridge feature uses the relay advertising buffers. If both the Relay
feature and the Subnet Bridge feature is enabled, the added load should be taken into
account.
endmenu # Network layer

View file

@ -137,7 +137,7 @@ void bt_mesh_adv_unref(struct bt_mesh_adv *adv)
struct k_mem_slab *slab = &local_adv_pool;
#if defined(CONFIG_BT_MESH_RELAY)
#if (defined(CONFIG_BT_MESH_RELAY) || defined(CONFIG_BT_MESH_BRG_CFG_SRV))
if (adv->ctx.tag == BT_MESH_ADV_TAG_RELAY) {
slab = &relay_adv_pool;
}
@ -156,7 +156,7 @@ struct bt_mesh_adv *bt_mesh_adv_create(enum bt_mesh_adv_type type,
enum bt_mesh_adv_tag tag,
uint8_t xmit, k_timeout_t timeout)
{
#if defined(CONFIG_BT_MESH_RELAY)
#if (defined(CONFIG_BT_MESH_RELAY) || defined(CONFIG_BT_MESH_BRG_CFG_SRV))
if (tag == BT_MESH_ADV_TAG_RELAY) {
return adv_create_from_pool(&relay_adv_pool,
type, tag, xmit, timeout);
@ -202,7 +202,7 @@ struct bt_mesh_adv *bt_mesh_adv_get(k_timeout_t timeout)
K_POLL_MODE_NOTIFY_ONLY,
&bt_mesh_adv_queue,
0),
#if defined(CONFIG_BT_MESH_RELAY) && \
#if (defined(CONFIG_BT_MESH_RELAY) || defined(CONFIG_BT_MESH_BRG_CFG_SRV)) && \
(defined(CONFIG_BT_MESH_ADV_LEGACY) || \
defined(CONFIG_BT_MESH_ADV_EXT_RELAY_USING_MAIN_ADV_SET) || \
!(CONFIG_BT_MESH_RELAY_ADV_SETS))
@ -228,7 +228,7 @@ struct bt_mesh_adv *bt_mesh_adv_get_by_tag(enum bt_mesh_adv_tag_bit tags, k_time
return k_fifo_get(&bt_mesh_friend_queue, timeout);
}
if (IS_ENABLED(CONFIG_BT_MESH_RELAY) &&
if ((IS_ENABLED(CONFIG_BT_MESH_RELAY) || IS_ENABLED(CONFIG_BT_MESH_BRG_CFG_SRV)) &&
!(tags & BT_MESH_ADV_TAG_BIT_LOCAL)) {
return k_fifo_get(&bt_mesh_relay_queue, timeout);
}
@ -247,7 +247,7 @@ void bt_mesh_adv_get_cancel(void)
k_fifo_cancel_wait(&bt_mesh_adv_queue);
if (IS_ENABLED(CONFIG_BT_MESH_RELAY)) {
if ((IS_ENABLED(CONFIG_BT_MESH_RELAY) || IS_ENABLED(CONFIG_BT_MESH_BRG_CFG_SRV))) {
k_fifo_cancel_wait(&bt_mesh_relay_queue);
}
@ -281,7 +281,7 @@ void bt_mesh_adv_send(struct bt_mesh_adv *adv, const struct bt_mesh_send_cb *cb,
return;
}
if ((IS_ENABLED(CONFIG_BT_MESH_RELAY) &&
if (((IS_ENABLED(CONFIG_BT_MESH_RELAY) || IS_ENABLED(CONFIG_BT_MESH_BRG_CFG_SRV)) &&
adv->ctx.tag == BT_MESH_ADV_TAG_RELAY) ||
(IS_ENABLED(CONFIG_BT_MESH_PB_ADV_USE_RELAY_SETS) &&
adv->ctx.tag == BT_MESH_ADV_TAG_PROV)) {

View file

@ -108,9 +108,9 @@ static struct bt_mesh_ext_adv advs[] = {
#if CONFIG_BT_MESH_RELAY_ADV_SETS
[1 ... CONFIG_BT_MESH_RELAY_ADV_SETS] = {
.tags = (
#if defined(CONFIG_BT_MESH_RELAY)
#if (defined(CONFIG_BT_MESH_RELAY) || defined(CONFIG_BT_MESH_BRG_CFG_SRV))
BT_MESH_ADV_TAG_BIT_RELAY |
#endif /* CONFIG_BT_MESH_RELAY */
#endif /* CONFIG_BT_MESH_RELAY || CONFIG_BT_MESH_BRG_CFG_SRV */
#if defined(CONFIG_BT_MESH_PB_ADV_USE_RELAY_SETS)
BT_MESH_ADV_TAG_BIT_PROV |
#endif /* CONFIG_BT_MESH_PB_ADV_USE_RELAY_SETS */