Bluetooth: Mesh: Split out provisioning bearers
Splits PB-ADV and PB-GATT into separate modules with a common interface to modularize prov.c. Additional trivial fixes from testing: - Reduces warnings for normal occurances like repeated packets. - Makes link ack a non-reliable packet to prevent it from being repeated until prov invite. - Provisioner does not send link fail, but closes the link (as per spec section 5.4.4). This prevents lingering zombie links on both sides. Signed-off-by: Trond Einar Snekvik <Trond.Einar.Snekvik@nordicsemi.no>
This commit is contained in:
parent
1f8c9c7efc
commit
09333caf52
7 changed files with 1317 additions and 954 deletions
113
subsys/bluetooth/mesh/prov_bearer.h
Normal file
113
subsys/bluetooth/mesh/prov_bearer.h
Normal file
|
@ -0,0 +1,113 @@
|
|||
/* Bluetooth Mesh */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2020 Nordic Semiconductor ASA
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#define PROTOCOL_TIMEOUT K_SECONDS(60)
|
||||
|
||||
/** @def PROV_BEARER_BUF_HEADROOM
|
||||
*
|
||||
* @brief Required headroom for the bearer packet buffers.
|
||||
*/
|
||||
#if defined(CONFIG_BT_MESH_PB_GATT)
|
||||
#define PROV_BEARER_BUF_HEADROOM 5
|
||||
#else
|
||||
#define PROV_BEARER_BUF_HEADROOM 0
|
||||
#endif
|
||||
|
||||
enum prov_bearer_link_status {
|
||||
PROV_BEARER_LINK_STATUS_SUCCESS,
|
||||
PROV_BEARER_LINK_STATUS_TIMEOUT,
|
||||
PROV_BEARER_LINK_STATUS_FAIL,
|
||||
};
|
||||
|
||||
struct prov_bearer;
|
||||
|
||||
/** Callbacks from bearer to host */
|
||||
struct prov_bearer_cb {
|
||||
|
||||
void (*link_opened)(const struct prov_bearer *bearer, void *cb_data);
|
||||
|
||||
void (*link_closed)(const struct prov_bearer *bearer, void *cb_data,
|
||||
enum prov_bearer_link_status reason);
|
||||
|
||||
void (*error)(const struct prov_bearer *bearer, void *cb_data,
|
||||
u8_t err);
|
||||
|
||||
void (*recv)(const struct prov_bearer *bearer, void *cb_data,
|
||||
struct net_buf_simple *buf);
|
||||
};
|
||||
|
||||
typedef void (*prov_bearer_send_complete_t)(int err, void *cb_data);
|
||||
|
||||
/** Provisioning bearer API */
|
||||
struct prov_bearer {
|
||||
/** Provisioning bearer type. */
|
||||
bt_mesh_prov_bearer_t type;
|
||||
|
||||
/** @brief Enable link establishment as a provisionee.
|
||||
*
|
||||
* Prompts the bearer to make itself visible to provisioners, and
|
||||
* start accepting link open messages.
|
||||
*
|
||||
* @param cb Bearer event callbacks used for the duration of the link.
|
||||
* @param cb_data Context parameter to pass to the bearer callbacks.
|
||||
*
|
||||
* @return Zero on success, or (negative) error code otherwise.
|
||||
*/
|
||||
int (*link_accept)(const struct prov_bearer_cb *cb, void *cb_data);
|
||||
|
||||
/** @brief Send a packet on an established link.
|
||||
*
|
||||
* @param buf Payload buffer. Requires @ref
|
||||
* PROV_BEARER_BUF_HEADROOM bytes of headroom.
|
||||
* @param cb Callback to call when sending is complete.
|
||||
* @param cb_data Callback data.
|
||||
*
|
||||
* @return Zero on success, or (negative) error code otherwise.
|
||||
*/
|
||||
int (*send)(struct net_buf_simple *buf, prov_bearer_send_complete_t cb,
|
||||
void *cb_data);
|
||||
|
||||
/** @brief Clear any ongoing transmissions, if possible.
|
||||
*
|
||||
* Bearers that don't support tx clearing must implement this callback
|
||||
* and leave it empty.
|
||||
*/
|
||||
void (*clear_tx)(void);
|
||||
|
||||
/* Only available in provisioners: */
|
||||
|
||||
/** @brief Open a new link as a provisioner.
|
||||
*
|
||||
* Only available in provisioners. Bearers that don't support the
|
||||
* provisioner role should leave this as NULL.
|
||||
*
|
||||
* @param uuid UUID of the node to establish a link to.
|
||||
* @param timeout Protocol timeout.
|
||||
* @param cb Bearer event callbacks used for the duration of the link.
|
||||
* @param cb_data Context parameter to pass to the bearer callbacks.
|
||||
*
|
||||
* @return Zero on success, or (negative) error code otherwise.
|
||||
*/
|
||||
int (*link_open)(const u8_t uuid[16], s32_t timeout,
|
||||
const struct prov_bearer_cb *cb, void *cb_data);
|
||||
|
||||
/** @brief Close the current link.
|
||||
*
|
||||
* Only available in provisioners. Bearers that don't support the
|
||||
* provisioner role should leave this as NULL.
|
||||
*
|
||||
* @param status Link status for the link close message.
|
||||
*/
|
||||
void (*link_close)(enum prov_bearer_link_status status);
|
||||
};
|
||||
|
||||
extern const struct prov_bearer pb_adv;
|
||||
extern const struct prov_bearer pb_gatt;
|
||||
|
||||
void pb_adv_init(void);
|
||||
void pb_gatt_init(void);
|
Loading…
Add table
Add a link
Reference in a new issue