mesh: Add reset link functionality to provisioning bearers

Reset provisioning bearers when bt_mesh_reset() is called. Accept
another provisioning attempt after link close.

Signed-off-by: Michał Narajowski <michal.narajowski@codecoup.pl>
This commit is contained in:
Michał Narajowski 2020-06-22 13:27:34 +02:00 committed by Johan Hedberg
commit 9a0602417a
4 changed files with 37 additions and 5 deletions

View file

@ -189,11 +189,20 @@ static void reset_adv_link(void)
k_delayed_work_cancel(&link.prot_timer);
if (atomic_test_bit(link.flags, PROVISIONER)) {
/* Clear everything except the retransmit and protocol timer
* delayed work objects.
*/
(void)memset(&link, 0, offsetof(struct pb_adv, tx.retransmit));
link.rx.id = XACT_ID_NVAL;
} else {
/* Accept another provisioning attempt */
link.id = 0;
atomic_clear(link.flags);
link.rx.id = XACT_ID_MAX;
link.tx.id = XACT_ID_NVAL;
}
link.tx.pending_ack = XACT_ID_NVAL;
link.rx.buf = &rx_buf;
net_buf_simple_reset(link.rx.buf);
@ -839,6 +848,11 @@ void pb_adv_init(void)
k_delayed_work_init(&link.tx.retransmit, prov_retransmit);
}
void pb_adv_reset(void)
{
reset_adv_link();
}
const struct prov_bearer pb_adv = {
.type = BT_MESH_PROV_ADV,
.link_open = prov_link_open,

View file

@ -141,6 +141,11 @@ void pb_gatt_init(void)
k_delayed_work_init(&link.prot_timer, protocol_timeout);
}
void pb_gatt_reset(void)
{
reset_state();
}
const struct prov_bearer pb_gatt = {
.type = BT_MESH_PROV_GATT,
.link_accept = link_accept,

View file

@ -1247,6 +1247,16 @@ void bt_mesh_prov_complete(uint16_t net_idx, uint16_t addr)
void bt_mesh_prov_reset(void)
{
if (IS_ENABLED(CONFIG_BT_MESH_PB_ADV)) {
pb_adv_reset();
}
if (IS_ENABLED(CONFIG_BT_MESH_PB_GATT)) {
pb_gatt_reset();
}
reset_state();
if (prov->reset) {
prov->reset();
}

View file

@ -111,3 +111,6 @@ extern const struct prov_bearer pb_gatt;
void pb_adv_init(void);
void pb_gatt_init(void);
void pb_adv_reset(void);
void pb_gatt_reset(void);