Skip to content

Commit 93a36fb

Browse files
committed
feat(ble_mesh): add BLE 5.0 extended advertising and long packet support
- Add extended advertising configuration with customizable PHY selection (1M, 2M, Coded) - Implement long packet mode to overcome standard BLE Mesh packet length limitations - Add configurable advertising parameters: interval, count, channel map, TX power - Introduce enhanced message context structure for fine-grained advertising control - Add Kconfig options for buffer management and segment count configuration - Support both forced and preferred long packet transmission modes - Update advertising buffer pools to accommodate extended and long packet types - Add validation for enhanced advertising parameters and packet length limits - Maintain backward compatibility with existing BLE Mesh functionality
1 parent d331400 commit 93a36fb

File tree

23 files changed

+1693
-191
lines changed

23 files changed

+1693
-191
lines changed

components/bt/esp_ble_mesh/Kconfig.in

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,86 @@ if BLE_MESH
4141
help
4242
This option to enable BLE Mesh using some BLE 5.0 APIs.
4343

44+
menuconfig BLE_MESH_EXT_ADV
45+
bool "Enable extended advertising for BLE Mesh"
46+
depends on BLE_MESH_USE_BLE_50
47+
default n
48+
help
49+
Enable broadcasting of BLE Mesh messages using BLE 5.0 extended advertising.
50+
This allows control of extended advertising parameters (e.g., PHY selection)
51+
while maintaining standard BLE Mesh packet length.
52+
53+
config BLE_MESH_EXT_ADV_BUF_COUNT
54+
int "Number of extended advertising buffers"
55+
depends on BLE_MESH_EXT_ADV
56+
range 6 256
57+
default 60
58+
help
59+
Number of buffer slots allocated for extended advertising packets.
60+
61+
config BLE_MESH_EXT_RELAY_ADV_BUF_COUNT
62+
int "Number of extended relay advertising buffers"
63+
depends on BLE_MESH_EXT_ADV
64+
depends on BLE_MESH_RELAY
65+
range 0 256
66+
default 60
67+
help
68+
Number of buffer slots allocated for extended advertising packets used in message relay.
69+
70+
menuconfig BLE_MESH_LONG_PACKET
71+
bool "Enable non-standard long packet mode for BLE Mesh"
72+
depends on BLE_MESH_EXT_ADV
73+
default n
74+
help
75+
Enable extended-length advertising packets for BLE Mesh using BLE 5.0 extended advertising.
76+
This overrides the standard BLE Mesh packet length limitations.
77+
78+
config BLE_MESH_LONG_PACKET_ADV_LEN
79+
int "Maximum advertising payload length"
80+
depends on BLE_MESH_LONG_PACKET
81+
range 30 249
82+
default 105
83+
help
84+
Maximum payload length for extended advertising packets (bytes).
85+
Range: 30-249 bytes.
86+
Default: 105.
87+
Note: Maximum access payload = (LENGTH - 17) × SEGMENT_COUNT
88+
- Transmission: Uses BLE_MESH_LONG_PACKET_TX_SEG_CNT
89+
- Reception: Uses BLE_MESH_LONG_PACKET_RX_SEG_CNT
90+
91+
config BLE_MESH_LONG_PACKET_ADV_BUF_COUNT
92+
int "Long packet advertising buffer count"
93+
depends on BLE_MESH_LONG_PACKET
94+
default 20
95+
help
96+
Number of advertising buffers allocated for long packet transmissions.
97+
98+
config BLE_MESH_LONG_PACKET_RELAY_ADV_BUF_COUNT
99+
int "Long packet relay buffer count"
100+
depends on BLE_MESH_LONG_PACKET
101+
depends on BLE_MESH_RELAY
102+
default 20
103+
help
104+
Number of advertising buffers allocated for relay long packets.
105+
106+
config BLE_MESH_LONG_PACKET_TX_SEG_CNT
107+
int "Maximum transmission segments per message"
108+
depends on BLE_MESH_LONG_PACKET
109+
range 1 BLE_MESH_TX_SEG_MAX if BLE_MESH_TX_SEG_MAX < BLE_MESH_LONG_PACKET_ADV_BUF_COUNT
110+
range 1 BLE_MESH_LONG_PACKET_ADV_BUF_COUNT if BLE_MESH_TX_SEG_MAX >= BLE_MESH_LONG_PACKET_ADV_BUF_COUNT
111+
default 20
112+
help
113+
Maximum number of segments for outgoing long packet messages.
114+
Upper bound: min(BLE_MESH_TX_SEG_MAX, BLE_MESH_LONG_PACKET_ADV_BUF_COUNT)
115+
116+
config BLE_MESH_LONG_PACKET_RX_SEG_CNT
117+
int "Maximum reception segments per message"
118+
depends on BLE_MESH_LONG_PACKET
119+
range 1 BLE_MESH_LONG_PACKET_ADV_BUF_COUNT
120+
default 20
121+
help
122+
Maximum number of segments supported for receiving long packet messages.
123+
44124
config BLE_MESH_ADV_INST_ID
45125
depends on BLE_MESH_USE_BLE_50
46126
int "Extended adv instance for Mesh normal packets"

components/bt/esp_ble_mesh/api/core/esp_ble_mesh_networking_api.c

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2017-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2017-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -30,8 +30,55 @@ static esp_err_t ble_mesh_model_send_msg(esp_ble_mesh_model_t *model,
3030

3131
ESP_BLE_HOST_STATUS_CHECK(ESP_BLE_HOST_STATUS_ENABLED);
3232

33-
if (ctx && ctx->addr == ESP_BLE_MESH_ADDR_UNASSIGNED) {
34-
BT_ERR("Invalid destination address 0x0000");
33+
if (ctx) {
34+
if (ctx->addr == ESP_BLE_MESH_ADDR_UNASSIGNED) {
35+
BT_ERR("Invalid destination address 0x0000");
36+
return ESP_ERR_INVALID_ARG;
37+
}
38+
39+
if (ctx->enh.adv_cfg_used &&
40+
ctx->enh.adv_cfg.channel_map & BIT(3)) {
41+
BT_ERR("Invalid channel map 0x%04x: bit 3 is reserved", ctx->enh.adv_cfg.channel_map);
42+
return ESP_ERR_INVALID_ARG;
43+
}
44+
45+
#if CONFIG_BLE_MESH_EXT_ADV
46+
if (ctx->enh.ext_adv_cfg_used) {
47+
if (ctx->enh.ext_adv_cfg.primary_phy == ESP_BLE_MESH_ADV_PHY_CODED) {
48+
BT_ERR("Primary phy can't be set to coded phy");
49+
return ESP_ERR_INVALID_ARG;
50+
}
51+
52+
if (ctx->enh.ext_adv_cfg.primary_phy == ESP_BLE_MESH_ADV_PHY_UNASSIGNED) {
53+
ctx->enh.ext_adv_cfg.primary_phy = ESP_BLE_MESH_ADV_PHY_DEFAULT;
54+
}
55+
56+
if (ctx->enh.ext_adv_cfg.secondary_phy == ESP_BLE_MESH_ADV_PHY_UNASSIGNED) {
57+
ctx->enh.ext_adv_cfg.secondary_phy = ESP_BLE_MESH_ADV_PHY_DEFAULT;
58+
}
59+
}
60+
#if CONFIG_BLE_MESH_LONG_PACKET
61+
if (ctx->enh.long_pkt_cfg_used &&
62+
(ctx->enh.long_pkt_cfg != ESP_BLE_MESH_LONG_PACKET_FORCE &&
63+
ctx->enh.long_pkt_cfg != ESP_BLE_MESH_LONG_PACKET_PREFER)) {
64+
BT_ERR("Invalid long packet configuration %d (expected FORCE=1 or PREFER=2)",
65+
ctx->enh.long_pkt_cfg);
66+
}
67+
68+
if (ctx->enh.long_pkt_cfg_used && (op_len + length + mic_len > ESP_BLE_MESH_EXT_SDU_MAX_LEN)) {
69+
BT_ERR("The length(%d) exceeds the maximum length supported by the long packet", length);
70+
return ESP_ERR_INVALID_ARG;
71+
}
72+
if (((!ctx->enh.long_pkt_cfg_used) && op_len + length + mic_len > MIN(ESP_BLE_MESH_SDU_MAX_LEN, ESP_BLE_MESH_TX_SDU_MAX))) {
73+
BT_ERR("Too large data length %d", length);
74+
return ESP_ERR_INVALID_ARG;
75+
}
76+
#endif /* CONFIG_BLE_MESH_LONG_PACKET */
77+
#endif /* CONFIG_BLE_MESH_EXT_ADV */
78+
} // if (ctx)
79+
80+
if (op_len + length + mic_len > MIN(ESP_BLE_MESH_SDU_MAX_LEN, ESP_BLE_MESH_TX_SDU_MAX)) {
81+
BT_ERR("Too large data length %d", length);
3582
return ESP_ERR_INVALID_ARG;
3683
}
3784

@@ -70,11 +117,6 @@ static esp_err_t ble_mesh_model_send_msg(esp_ble_mesh_model_t *model,
70117
ESP_BLE_MESH_MIC_LONG : ESP_BLE_MESH_MIC_SHORT;
71118
}
72119

73-
if (op_len + length + mic_len > MIN(ESP_BLE_MESH_SDU_MAX_LEN, ESP_BLE_MESH_TX_SDU_MAX)) {
74-
BT_ERR("Too large data length %d", length);
75-
return ESP_ERR_INVALID_ARG;
76-
}
77-
78120
if (act == BTC_BLE_MESH_ACT_MODEL_PUBLISH) {
79121
bt_mesh_model_msg_init(model->pub->msg, opcode);
80122
net_buf_simple_add_mem(model->pub->msg, data, length);

components/bt/esp_ble_mesh/api/esp_ble_mesh_defs.h

Lines changed: 170 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2017-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2017-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -20,6 +20,12 @@ extern "C" {
2020

2121
/*!< The maximum length of a BLE Mesh message, including Opcode, Payload and TransMIC */
2222
#define ESP_BLE_MESH_SDU_MAX_LEN 384
23+
#if CONFIG_BLE_MESH_LONG_PACKET
24+
/* Extended SDU maximum length (included Opcode, Payload and TransMIC) calculation:
25+
* SEGMENT_COUNT × (ADV_PAYLOAD_LEN - 17 bytes overhead)
26+
* 17 bytes = 9 bytes mesh network header + 4 bytes transport overhead + 4 bytes NetMIC */
27+
#define ESP_BLE_MESH_EXT_SDU_MAX_LEN (CONFIG_BLE_MESH_LONG_PACKET_TX_SEG_CNT * (CONFIG_BLE_MESH_LONG_PACKET_ADV_LEN - 17))
28+
#endif /* CONFIG_BLE_MESH_LONG_PACKET */
2329

2430
/*!< Length of a short Mesh MIC. */
2531
#define ESP_BLE_MESH_MIC_SHORT 4
@@ -613,6 +619,166 @@ struct esp_ble_mesh_model {
613619
*/
614620
#define ESP_BLE_MESH_MODEL_NONE ((esp_ble_mesh_model_t []){})
615621

622+
#if CONFIG_BLE_MESH_USE_BLE_50
623+
#define ESP_BLE_MESH_ADV_CHAN_UNASSIGNED (0)
624+
#define ESP_BLE_MESH_ADV_CHAN_37 BIT(0)
625+
#define ESP_BLE_MESH_ADV_CHAN_38 BIT(1)
626+
#define ESP_BLE_MESH_ADV_CHAN_39 BIT(2)
627+
628+
#define ESP_BLE_MESH_DEFAULT_CHANNEL_MAP (ESP_BLE_MESH_ADV_CHAN_37| \
629+
ESP_BLE_MESH_ADV_CHAN_38| \
630+
ESP_BLE_MESH_ADV_CHAN_39)
631+
632+
#define ESP_BLE_MESH_ADV_PHY_UNASSIGNED (0)
633+
#define ESP_BLE_MESH_ADV_PHY_1M (1)
634+
#define ESP_BLE_MESH_ADV_PHY_2M (2)
635+
#define ESP_BLE_MESH_ADV_PHY_CODED (3)
636+
#define ESP_BLE_MESH_ADV_PHY_DEFAULT ESP_BLE_MESH_ADV_PHY_1M
637+
#endif /* CONFIG_BLE_MESH_USE_BLE_50 */
638+
639+
/**
640+
* Enhanced configuration for Mesh messages with legacy advertising
641+
*/
642+
typedef struct {
643+
/**
644+
* Advertising interval in milliseconds.
645+
* If set to 0, the Mesh protocol stack's xmit parameters are used.
646+
* If set to another value (e.g., 10), the advertising interval will be 10 ms.
647+
*/
648+
uint32_t adv_itvl;
649+
650+
/**
651+
* Number of advertising per packet.
652+
* If set to 0, the Mesh protocol stack's xmit parameters are used.
653+
* If set to another value (e.g., 3), the number of advertising per packet will be 3.
654+
*/
655+
uint8_t adv_cnt;
656+
657+
/**
658+
* Advertising channel map.
659+
* If set to 0, the protocol stack uses default channels.
660+
* If set to another value (e.g., ESP_BLE_MESH_ADV_CHAN_37),
661+
* the advertising channel map will be 0x01, the advertising
662+
* packet will only advertise on channel 37.
663+
*/
664+
uint8_t channel_map;
665+
} esp_ble_mesh_adv_cfg_t;
666+
667+
#if CONFIG_BLE_MESH_EXT_ADV
668+
/** Enhanced configuration for Mesh messages with extended advertising */
669+
typedef struct {
670+
/**
671+
* Primary PHY for advertising (ESP_BLE_MESH_ADV_PHY_1M or
672+
* ESP_BLE_MESH_ADV_PHY_CODED).
673+
* When using coded PHY, receivers must use coded scanning.
674+
*/
675+
uint8_t primary_phy;
676+
677+
/**
678+
* Secondary PHY for advertising (ESP_BLE_MESH_ADV_PHY_1M,
679+
* ESP_BLE_MESH_ADV_PHY_2M, or ESP_BLE_MESH_ADV_PHY_CODED).
680+
* When using coded PHY, receivers must use coded scanning.
681+
*/
682+
uint8_t secondary_phy;
683+
684+
/**
685+
* Include TX power in advertising packets (0: disabled, 1: enabled).
686+
* Allows receivers/relays to maintain original transmission power.
687+
*/
688+
uint8_t include_tx_power:1;
689+
690+
/** Transmission power level (in dBm) */
691+
int8_t tx_power;
692+
} esp_ble_mesh_ext_adv_cfg_t;
693+
#endif /* CONFIG_BLE_MESH_EXT_ADV */
694+
695+
#if CONFIG_BLE_MESH_LONG_PACKET
696+
/** Force this message to use long packet format */
697+
#define ESP_BLE_MESH_LONG_PACKET_FORCE (1)
698+
699+
/**
700+
* Whether to use the long packet mode will be chosen by the protocol stack,
701+
* which currently makes the decision based on message length.
702+
* Advertising using the standard BLE Mesh protocol when possible.
703+
* Switch to long packet mode for advertising when the standard BLE
704+
* Mesh protocol cannot be used.
705+
*/
706+
#define ESP_BLE_MESH_LONG_PACKET_PREFER (2)
707+
#endif /* CONFIG_BLE_MESH_LONG_PACKET */
708+
709+
/** Enhanced message advertising parameters */
710+
typedef struct {
711+
/**
712+
* Use custom advertising parameters (0: disabled, 1: enabled).
713+
* When enabled, `adv_cfg` parameters override stack defaults.
714+
*/
715+
uint8_t adv_cfg_used:1;
716+
717+
#if CONFIG_BLE_MESH_EXT_ADV
718+
/**
719+
* Use extended advertising parameters (0: disabled, 1: enabled).
720+
* When enabled, `ext_adv_cfg` parameters override stack defaults.
721+
*/
722+
uint8_t ext_adv_cfg_used:1;
723+
#endif /* CONFIG_BLE_MESH_EXT_ADV */
724+
725+
#if CONFIG_BLE_MESH_LONG_PACKET
726+
/**
727+
* Control long packet usage (0: disabled, 1: enabled).
728+
* When disabled, the protocol stack cannot use long packets to
729+
* send this message.
730+
*/
731+
uint8_t long_pkt_cfg_used:1;
732+
#endif /* CONFIG_BLE_MESH_LONG_PACKET */
733+
734+
/** Standard advertising parameters */
735+
esp_ble_mesh_adv_cfg_t adv_cfg;
736+
737+
#if CONFIG_BLE_MESH_EXT_ADV
738+
/** Extended advertising parameters */
739+
esp_ble_mesh_ext_adv_cfg_t ext_adv_cfg;
740+
#endif /* CONFIG_BLE_MESH_EXT_ADV */
741+
742+
#if CONFIG_BLE_MESH_LONG_PACKET
743+
/**
744+
* Long packet configuration:
745+
* - ESP_BLE_MESH_LONG_PACKET_FORCE
746+
* - ESP_BLE_MESH_LONG_PACKET_PREFER
747+
*/
748+
uint8_t long_pkt_cfg:2;
749+
#endif /* CONFIG_BLE_MESH_LONG_PACKET */
750+
} esp_ble_mesh_msg_enh_params_t;
751+
752+
#define ESP_BLE_MESH_ADV_CFG_NULL ((esp_ble_mesh_adv_cfg_t){0})
753+
#define ESP_BLE_MESH_EXT_ADV_CFG_NULL ((esp_ble_mesh_ext_adv_cfg_t){0})
754+
755+
#define ESP_BLE_MESH_ADV_CFG_DEFAULT \
756+
((esp_ble_mesh_adv_cfg_t){\
757+
.adv_itvl= 0, \
758+
.adv_cnt = 0, \
759+
.channel_map = ESP_BLE_MESH_DEFAULT_CHANNEL_MAP, \
760+
})
761+
762+
#define ESP_BLE_MESH_EXT_ADV_CFG_DEFAULT \
763+
((esp_ble_mesh_ext_adv_cfg_t){ \
764+
.primary_phy = ESP_BLE_MESH_ADV_PHY_1M, \
765+
.secondary_phy = ESP_BLE_MESH_ADV_PHY_1M, \
766+
.tx_power = 0x7f, \
767+
.include_tx_power = false,\
768+
})
769+
770+
#if CONFIG_BLE_MESH_LONG_PACKET
771+
#define ESP_BLE_MESH_LONG_PACKET_DEF_ENH_SET(ADV_CFG, EXT_ADV_CFG, LONG_PACKET_CFG) \
772+
((esp_ble_mesh_msg_enh_params_t){ \
773+
.adv_cfg_used = true,\
774+
.adv_cfg = ADV_CFG, \
775+
.ext_adv_cfg_used = true, \
776+
.ext_adv_cfg = EXT_ADV_CFG, \
777+
.long_pkt_cfg_used = true, \
778+
.long_pkt_cfg = LONG_PACKET_CFG, \
779+
})
780+
#endif /* CONFIG_BLE_MESH_LONG_PACKET */
781+
616782
/** Message sending context.
617783
* This structure is associated with struct bt_mesh_msg_ctx in mesh_access.h
618784
*/
@@ -664,6 +830,9 @@ typedef struct {
664830

665831
/** Indicate if the message is sent by a node server model, no need to be initialized before sending message */
666832
bool srv_send __attribute__((deprecated));
833+
834+
/** Enhanced message advertising parameters */
835+
esp_ble_mesh_msg_enh_params_t enh;
667836
} esp_ble_mesh_msg_ctx_t;
668837

669838
/** Provisioning properties & capabilities.

components/bt/esp_ble_mesh/btc/btc_ble_mesh_prov.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2950,6 +2950,8 @@ void btc_ble_mesh_model_call_handler(btc_msg_t *msg)
29502950
.msg_timeout = arg->model_send.msg_timeout,
29512951
};
29522952

2953+
memcpy(&param.ctx.enh, &arg->model_send.ctx->enh, sizeof(bt_mesh_msg_enh_params_t));
2954+
29532955
err = bt_mesh_client_send_msg(&param, buf, arg->model_send.need_rsp,
29542956
btc_ble_mesh_client_model_timeout_cb);
29552957
bt_mesh_free_buf(buf);

0 commit comments

Comments
 (0)