|
|
|
@ -30,8 +30,8 @@ LOG_MODULE_REGISTER(bt_mesh_adv_ext);
@@ -30,8 +30,8 @@ LOG_MODULE_REGISTER(bt_mesh_adv_ext);
|
|
|
|
|
/* Convert from ms to 0.625ms units */ |
|
|
|
|
#define ADV_INT_FAST_MS 20 |
|
|
|
|
|
|
|
|
|
#ifndef CONFIG_BT_MESH_SIMULT_ADV_SETS |
|
|
|
|
#define CONFIG_BT_MESH_SIMULT_ADV_SETS 0 |
|
|
|
|
#ifndef CONFIG_BT_MESH_RELAY_ADV_SETS |
|
|
|
|
#define CONFIG_BT_MESH_RELAY_ADV_SETS 0 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
enum { |
|
|
|
@ -57,7 +57,7 @@ enum {
@@ -57,7 +57,7 @@ enum {
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct bt_mesh_ext_adv { |
|
|
|
|
enum bt_mesh_adv_tags tags; |
|
|
|
|
const enum bt_mesh_adv_tag_bit tags; |
|
|
|
|
ATOMIC_DEFINE(flags, ADV_FLAGS_NUM); |
|
|
|
|
struct bt_le_ext_adv *instance; |
|
|
|
|
struct net_buf *buf; |
|
|
|
@ -69,80 +69,71 @@ struct bt_mesh_ext_adv {
@@ -69,80 +69,71 @@ struct bt_mesh_ext_adv {
|
|
|
|
|
static void send_pending_adv(struct k_work *work); |
|
|
|
|
static bool schedule_send(struct bt_mesh_ext_adv *adv); |
|
|
|
|
|
|
|
|
|
static STRUCT_SECTION_ITERABLE(bt_mesh_ext_adv, adv_main) = { |
|
|
|
|
.tags = ( |
|
|
|
|
static struct bt_mesh_ext_adv advs[] = { |
|
|
|
|
[0] = { |
|
|
|
|
.tags = ( |
|
|
|
|
#if !defined(CONFIG_BT_MESH_ADV_EXT_FRIEND_SEPARATE) |
|
|
|
|
BT_MESH_ADV_TAG_FRIEND_BIT | |
|
|
|
|
BT_MESH_ADV_TAG_BIT_FRIEND | |
|
|
|
|
#endif |
|
|
|
|
#if !defined(CONFIG_BT_MESH_ADV_EXT_GATT_SEPARATE) |
|
|
|
|
BT_MESH_ADV_TAG_PROXY_BIT | |
|
|
|
|
BT_MESH_ADV_TAG_BIT_PROXY | |
|
|
|
|
#endif /* !CONFIG_BT_MESH_ADV_EXT_GATT_SEPARATE */ |
|
|
|
|
#if defined(CONFIG_BT_MESH_ADV_EXT_RELAY_USING_MAIN_ADV_SET) |
|
|
|
|
BT_MESH_ADV_TAG_RELAY_BIT | |
|
|
|
|
BT_MESH_ADV_TAG_BIT_RELAY | |
|
|
|
|
#endif /* CONFIG_BT_MESH_ADV_EXT_RELAY_USING_MAIN_ADV_SET */ |
|
|
|
|
BT_MESH_ADV_TAG_LOCAL_BIT), |
|
|
|
|
|
|
|
|
|
.work = Z_WORK_DELAYABLE_INITIALIZER(send_pending_adv), |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
#if CONFIG_BT_MESH_SIMULT_ADV_SETS |
|
|
|
|
static STRUCT_SECTION_ITERABLE_ARRAY(bt_mesh_ext_adv, adv_relay, CONFIG_BT_MESH_SIMULT_ADV_SETS) = { |
|
|
|
|
[0 ... CONFIG_BT_MESH_SIMULT_ADV_SETS - 1] = { |
|
|
|
|
#if defined(CONFIG_BT_MESH_PB_ADV) |
|
|
|
|
BT_MESH_ADV_TAG_BIT_PROV | |
|
|
|
|
#endif /* CONFIG_BT_MESH_PB_ADV */ |
|
|
|
|
BT_MESH_ADV_TAG_BIT_LOCAL |
|
|
|
|
), |
|
|
|
|
.work = Z_WORK_DELAYABLE_INITIALIZER(send_pending_adv), |
|
|
|
|
}, |
|
|
|
|
#if CONFIG_BT_MESH_RELAY_ADV_SETS |
|
|
|
|
[1 ... CONFIG_BT_MESH_RELAY_ADV_SETS] = { |
|
|
|
|
.tags = ( |
|
|
|
|
#if defined(CONFIG_BT_MESH_RELAY) |
|
|
|
|
BT_MESH_ADV_TAG_RELAY_BIT | |
|
|
|
|
BT_MESH_ADV_TAG_BIT_RELAY | |
|
|
|
|
#endif /* CONFIG_BT_MESH_RELAY */ |
|
|
|
|
#if defined(CONFIG_BT_MESH_PB_ADV) |
|
|
|
|
BT_MESH_ADV_TAG_PROV_BIT | |
|
|
|
|
#endif /* CONFIG_BT_MESH_PB_ADV */ |
|
|
|
|
#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 */ |
|
|
|
|
0), |
|
|
|
|
|
|
|
|
|
.work = Z_WORK_DELAYABLE_INITIALIZER(send_pending_adv), |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
#endif /* CONFIG_BT_MESH_SIMULT_ADV_SETS */ |
|
|
|
|
|
|
|
|
|
}, |
|
|
|
|
#endif /* CONFIG_BT_MESH_RELAY_ADV_SETS */ |
|
|
|
|
#if defined(CONFIG_BT_MESH_ADV_EXT_FRIEND_SEPARATE) |
|
|
|
|
#define ADV_EXT_FRIEND 1 |
|
|
|
|
static STRUCT_SECTION_ITERABLE(bt_mesh_ext_adv, adv_friend) = { |
|
|
|
|
.tags = BT_MESH_ADV_TAG_FRIEND_BIT, |
|
|
|
|
.work = Z_WORK_DELAYABLE_INITIALIZER(send_pending_adv), |
|
|
|
|
}; |
|
|
|
|
#else /* CONFIG_BT_MESH_ADV_EXT_FRIEND_SEPARATE */ |
|
|
|
|
#define ADV_EXT_FRIEND 0 |
|
|
|
|
{ |
|
|
|
|
.tags = BT_MESH_ADV_TAG_BIT_FRIEND, |
|
|
|
|
.work = Z_WORK_DELAYABLE_INITIALIZER(send_pending_adv), |
|
|
|
|
}, |
|
|
|
|
#endif /* CONFIG_BT_MESH_ADV_EXT_FRIEND_SEPARATE */ |
|
|
|
|
|
|
|
|
|
#if defined(CONFIG_BT_MESH_ADV_EXT_GATT_SEPARATE) |
|
|
|
|
#define ADV_EXT_GATT 1 |
|
|
|
|
static STRUCT_SECTION_ITERABLE(bt_mesh_ext_adv, adv_gatt) = { |
|
|
|
|
.tags = BT_MESH_ADV_TAG_PROXY_BIT, |
|
|
|
|
.work = Z_WORK_DELAYABLE_INITIALIZER(send_pending_adv), |
|
|
|
|
}; |
|
|
|
|
#else /* CONFIG_BT_MESH_ADV_EXT_GATT_SEPARATE */ |
|
|
|
|
#define ADV_EXT_GATT 0 |
|
|
|
|
{ |
|
|
|
|
.tags = BT_MESH_ADV_TAG_BIT_PROXY, |
|
|
|
|
.work = Z_WORK_DELAYABLE_INITIALIZER(send_pending_adv), |
|
|
|
|
}, |
|
|
|
|
#endif /* CONFIG_BT_MESH_ADV_EXT_GATT_SEPARATE */ |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
#define BT_MESH_ADV_COUNT (1 + CONFIG_BT_MESH_SIMULT_ADV_SETS + ADV_EXT_FRIEND + ADV_EXT_GATT) |
|
|
|
|
|
|
|
|
|
BUILD_ASSERT(CONFIG_BT_EXT_ADV_MAX_ADV_SET >= BT_MESH_ADV_COUNT, |
|
|
|
|
BUILD_ASSERT(ARRAY_SIZE(advs) <= CONFIG_BT_EXT_ADV_MAX_ADV_SET, |
|
|
|
|
"Insufficient adv instances"); |
|
|
|
|
|
|
|
|
|
static inline struct bt_mesh_ext_adv *relay_adv_get(void) |
|
|
|
|
{ |
|
|
|
|
#if CONFIG_BT_MESH_SIMULT_ADV_SETS |
|
|
|
|
return adv_relay; |
|
|
|
|
#else /* !CONFIG_BT_MESH_SIMULT_ADV_SETS */ |
|
|
|
|
return &adv_main; |
|
|
|
|
#endif /* CONFIG_BT_MESH_SIMULT_ADV_SETS */ |
|
|
|
|
if (!!(CONFIG_BT_MESH_RELAY_ADV_SETS)) { |
|
|
|
|
return &advs[1]; |
|
|
|
|
} else { |
|
|
|
|
return &advs[0]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static inline struct bt_mesh_ext_adv *gatt_adv_get(void) |
|
|
|
|
{ |
|
|
|
|
#if defined(CONFIG_BT_MESH_ADV_EXT_GATT_SEPARATE) |
|
|
|
|
return &adv_gatt; |
|
|
|
|
#else /* !CONFIG_BT_MESH_ADV_EXT_GATT_SEPARATE */ |
|
|
|
|
return &adv_main; |
|
|
|
|
#endif /* CONFIG_BT_MESH_ADV_EXT_GATT_SEPARATE */ |
|
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_ADV_EXT_GATT_SEPARATE)) { |
|
|
|
|
return &advs[ARRAY_SIZE(advs) - 1]; |
|
|
|
|
} else { |
|
|
|
|
return &advs[0]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int adv_start(struct bt_mesh_ext_adv *adv, |
|
|
|
@ -303,7 +294,7 @@ static void send_pending_adv(struct k_work *work)
@@ -303,7 +294,7 @@ static void send_pending_adv(struct k_work *work)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!IS_ENABLED(CONFIG_BT_MESH_GATT_SERVER) || |
|
|
|
|
!(adv->tags & BT_MESH_ADV_TAG_PROXY_BIT)) { |
|
|
|
|
!(adv->tags & BT_MESH_ADV_TAG_BIT_PROXY)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -347,8 +338,8 @@ static bool schedule_send(struct bt_mesh_ext_adv *adv)
@@ -347,8 +338,8 @@ static bool schedule_send(struct bt_mesh_ext_adv *adv)
|
|
|
|
|
atomic_clear_bit(adv->flags, ADV_FLAG_SCHEDULE_PENDING); |
|
|
|
|
|
|
|
|
|
if ((IS_ENABLED(CONFIG_BT_MESH_ADV_EXT_FRIEND_SEPARATE) && |
|
|
|
|
adv->tags & BT_MESH_ADV_TAG_FRIEND_BIT) || |
|
|
|
|
(CONFIG_BT_MESH_SIMULT_ADV_SETS > 0 && adv->tags & BT_MESH_ADV_TAG_RELAY_BIT)) { |
|
|
|
|
adv->tags & BT_MESH_ADV_TAG_BIT_FRIEND) || |
|
|
|
|
(CONFIG_BT_MESH_RELAY_ADV_SETS > 0 && adv->tags & BT_MESH_ADV_TAG_BIT_RELAY)) { |
|
|
|
|
k_work_reschedule(&adv->work, K_NO_WAIT); |
|
|
|
|
} else { |
|
|
|
|
/* The controller will send the next advertisement immediately.
|
|
|
|
@ -369,14 +360,14 @@ void bt_mesh_adv_gatt_update(void)
@@ -369,14 +360,14 @@ void bt_mesh_adv_gatt_update(void)
|
|
|
|
|
|
|
|
|
|
void bt_mesh_adv_buf_local_ready(void) |
|
|
|
|
{ |
|
|
|
|
(void)schedule_send(&adv_main); |
|
|
|
|
(void)schedule_send(advs); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void bt_mesh_adv_buf_simult_ready(void) |
|
|
|
|
void bt_mesh_adv_buf_relay_ready(void) |
|
|
|
|
{ |
|
|
|
|
struct bt_mesh_ext_adv *adv = relay_adv_get(); |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < CONFIG_BT_MESH_SIMULT_ADV_SETS; i++) { |
|
|
|
|
for (int i = 0; i < CONFIG_BT_MESH_RELAY_ADV_SETS; i++) { |
|
|
|
|
if (schedule_send(&adv[i])) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
@ -384,22 +375,26 @@ void bt_mesh_adv_buf_simult_ready(void)
@@ -384,22 +375,26 @@ void bt_mesh_adv_buf_simult_ready(void)
|
|
|
|
|
|
|
|
|
|
/* Attempt to use the main adv set for the sending of relay messages. */ |
|
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_ADV_EXT_RELAY_USING_MAIN_ADV_SET)) { |
|
|
|
|
(void)schedule_send(&adv_main); |
|
|
|
|
(void)schedule_send(advs); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void bt_mesh_adv_buf_friend_ready(void) |
|
|
|
|
{ |
|
|
|
|
#if defined(CONFIG_BT_MESH_ADV_EXT_FRIEND_SEPARATE) |
|
|
|
|
(void)schedule_send(&adv_friend); |
|
|
|
|
#endif |
|
|
|
|
if (IS_ENABLED(CONFIG_BT_MESH_ADV_EXT_FRIEND_SEPARATE)) { |
|
|
|
|
schedule_send(&advs[1 + CONFIG_BT_MESH_RELAY_ADV_SETS]); |
|
|
|
|
} else { |
|
|
|
|
schedule_send(&advs[0]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void bt_mesh_adv_buf_terminate(struct net_buf *buf) |
|
|
|
|
void bt_mesh_adv_buf_terminate(const struct net_buf *buf) |
|
|
|
|
{ |
|
|
|
|
int err; |
|
|
|
|
|
|
|
|
|
STRUCT_SECTION_FOREACH(bt_mesh_ext_adv, adv) { |
|
|
|
|
for (int i = 0; i < ARRAY_SIZE(advs); i++) { |
|
|
|
|
struct bt_mesh_ext_adv *adv = &advs[i]; |
|
|
|
|
|
|
|
|
|
if (adv->buf != buf) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
@ -421,7 +416,7 @@ void bt_mesh_adv_buf_terminate(struct net_buf *buf)
@@ -421,7 +416,7 @@ void bt_mesh_adv_buf_terminate(struct net_buf *buf)
|
|
|
|
|
|
|
|
|
|
k_work_submit(&adv->work.work); |
|
|
|
|
|
|
|
|
|
break; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -434,17 +429,18 @@ void bt_mesh_adv_init(void)
@@ -434,17 +429,18 @@ void bt_mesh_adv_init(void)
|
|
|
|
|
#if defined(CONFIG_BT_MESH_DEBUG_USE_ID_ADDR) |
|
|
|
|
.options = BT_LE_ADV_OPT_USE_IDENTITY, |
|
|
|
|
#endif |
|
|
|
|
}; |
|
|
|
|
STRUCT_SECTION_FOREACH(bt_mesh_ext_adv, adv) { |
|
|
|
|
(void)memcpy(&adv->adv_param, &adv_param, sizeof(adv_param)); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < ARRAY_SIZE(advs); i++) { |
|
|
|
|
(void)memcpy(&advs[i].adv_param, &adv_param, sizeof(adv_param)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static struct bt_mesh_ext_adv *adv_instance_find(struct bt_le_ext_adv *instance) |
|
|
|
|
{ |
|
|
|
|
STRUCT_SECTION_FOREACH(bt_mesh_ext_adv, adv) { |
|
|
|
|
if (adv->instance == instance) { |
|
|
|
|
return adv; |
|
|
|
|
for (int i = 0; i < ARRAY_SIZE(advs); i++) { |
|
|
|
|
if (advs[i].instance == instance) { |
|
|
|
|
return &advs[i]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -494,15 +490,14 @@ int bt_mesh_adv_enable(void)
@@ -494,15 +490,14 @@ int bt_mesh_adv_enable(void)
|
|
|
|
|
#endif /* CONFIG_BT_MESH_GATT_SERVER */ |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
if (adv_main.instance) { |
|
|
|
|
if (advs[0].instance) { |
|
|
|
|
/* Already initialized */ |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STRUCT_SECTION_FOREACH(bt_mesh_ext_adv, adv) { |
|
|
|
|
err = bt_le_ext_adv_create(&adv->adv_param, &adv_cb, |
|
|
|
|
&adv->instance); |
|
|
|
|
for (int i = 0; i < ARRAY_SIZE(advs); i++) { |
|
|
|
|
err = bt_le_ext_adv_create(&advs[i].adv_param, &adv_cb, |
|
|
|
|
&advs[i].instance); |
|
|
|
|
if (err) { |
|
|
|
|
return err; |
|
|
|
|
} |
|
|
|
@ -532,5 +527,5 @@ int bt_mesh_adv_gatt_start(const struct bt_le_adv_param *param,
@@ -532,5 +527,5 @@ int bt_mesh_adv_gatt_start(const struct bt_le_adv_param *param,
|
|
|
|
|
int bt_mesh_adv_bt_data_send(uint8_t num_events, uint16_t adv_interval, |
|
|
|
|
const struct bt_data *ad, size_t ad_len) |
|
|
|
|
{ |
|
|
|
|
return bt_data_send(&adv_main, num_events, adv_interval, ad, ad_len); |
|
|
|
|
return bt_data_send(advs, num_events, adv_interval, ad, ad_len); |
|
|
|
|
} |
|
|
|
|