141 lines
4.1 KiB
C
141 lines
4.1 KiB
C
/*
|
|
* Copyright (c) 2020 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/** Provisioning protocol timeout in seconds. */
|
|
#define PROTOCOL_TIMEOUT_SEC 60
|
|
#define PROTOCOL_TIMEOUT_EXT_SEC 120
|
|
|
|
/** Provisioning protocol timeout. */
|
|
#define PROTOCOL_TIMEOUT K_SECONDS(PROTOCOL_TIMEOUT_SEC)
|
|
#define PROTOCOL_TIMEOUT_EXT K_SECONDS(PROTOCOL_TIMEOUT_EXT_SEC)
|
|
|
|
/** @def PROV_BEARER_BUF_HEADROOM
|
|
*
|
|
* @brief Required headroom for the bearer packet buffers.
|
|
*/
|
|
#if defined(CONFIG_BT_MESH_PB_GATT_COMMON)
|
|
#define PROV_BEARER_BUF_HEADROOM 5
|
|
#elif defined(CONFIG_BT_MESH_RPR_CLI) || defined(CONFIG_BT_MESH_RPR_SRV)
|
|
#define PROV_BEARER_BUF_HEADROOM 3
|
|
#else
|
|
#define PROV_BEARER_BUF_HEADROOM 0
|
|
#endif
|
|
|
|
/**
|
|
*
|
|
* @brief Required tailroom for the bearer packet buffers.
|
|
*/
|
|
#if defined(CONFIG_BT_MESH_RPR_CLI) || defined(CONFIG_BT_MESH_RPR_SRV)
|
|
#define PROV_BEARER_BUF_TAILROOM 4
|
|
#else
|
|
#define PROV_BEARER_BUF_TAILROOM 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,
|
|
uint8_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 Link open timeout in seconds.
|
|
* @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 uint8_t uuid[16], uint8_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);
|
|
};
|
|
|
|
struct pb_remote_ctx {
|
|
struct bt_mesh_rpr_cli *cli;
|
|
const struct bt_mesh_rpr_node *srv;
|
|
enum bt_mesh_rpr_node_refresh refresh;
|
|
};
|
|
|
|
extern const struct prov_bearer bt_mesh_pb_adv;
|
|
extern const struct prov_bearer bt_mesh_pb_gatt;
|
|
extern const struct prov_bearer pb_remote_cli;
|
|
extern const struct prov_bearer pb_remote_srv;
|
|
|
|
void bt_mesh_pb_adv_init(void);
|
|
void bt_mesh_pb_gatt_init(void);
|
|
|
|
void bt_mesh_pb_adv_reset(void);
|
|
void bt_mesh_pb_gatt_reset(void);
|