Line data Source code
1 0 : /* 2 : * Copyright (c) 2020 Nordic Semiconductor ASA 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : #ifndef ZEPHYR_INCLUDE_BT_MESH_RPR_CLI_H__ 8 : #define ZEPHYR_INCLUDE_BT_MESH_RPR_CLI_H__ 9 : 10 : #include <zephyr/kernel.h> 11 : #include <zephyr/bluetooth/mesh/access.h> 12 : #include <zephyr/bluetooth/mesh/rpr.h> 13 : 14 : #ifdef __cplusplus 15 : extern "C" { 16 : #endif 17 : 18 : /** 19 : * @defgroup bt_mesh_rpr_cli Remote Provisioning Client model 20 : * @ingroup bt_mesh 21 : * @{ 22 : */ 23 : 24 : /** Special value for the @c max_devs parameter of @ref bt_mesh_rpr_scan_start. 25 : * 26 : * Tells the Remote Provisioning Server not to put restrictions on the max 27 : * number of devices reported to the Client. 28 : */ 29 1 : #define BT_MESH_RPR_SCAN_MAX_DEVS_ANY 0 30 : 31 : struct bt_mesh_rpr_cli; 32 : 33 : /** 34 : * 35 : * @brief Remote Provisioning Client model composition data entry. 36 : * 37 : * @param _cli Pointer to a @ref bt_mesh_rpr_cli instance. 38 : */ 39 1 : #define BT_MESH_MODEL_RPR_CLI(_cli) \ 40 : BT_MESH_MODEL_CB(BT_MESH_MODEL_ID_REMOTE_PROV_CLI, \ 41 : _bt_mesh_rpr_cli_op, NULL, _cli, &_bt_mesh_rpr_cli_cb) 42 : 43 : /** Scan status response */ 44 1 : struct bt_mesh_rpr_scan_status { 45 : /** Current scan status */ 46 1 : enum bt_mesh_rpr_status status; 47 : /** Current scan state */ 48 1 : enum bt_mesh_rpr_scan scan; 49 : /** Max number of devices to report in current scan. */ 50 1 : uint8_t max_devs; 51 : /** Seconds remaining of the scan. */ 52 1 : uint8_t timeout; 53 : }; 54 : 55 : /** Remote Provisioning Server scanning capabilities */ 56 1 : struct bt_mesh_rpr_caps { 57 : /** Max number of scannable devices */ 58 1 : uint8_t max_devs; 59 : /** Supports active scan */ 60 1 : bool active_scan; 61 : }; 62 : 63 : /** Remote Provisioning Client model instance. */ 64 1 : struct bt_mesh_rpr_cli { 65 : /** @brief Scan report callback. 66 : * 67 : * @param cli Remote Provisioning Client. 68 : * @param srv Remote Provisioning Server. 69 : * @param unprov Unprovisioned device. 70 : * @param adv_data Advertisement data for the unprovisioned device, or 71 : * NULL if extended scanning hasn't been enabled. An 72 : * empty buffer indicates that the extended scanning 73 : * finished without collecting additional information. 74 : */ 75 1 : void (*scan_report)(struct bt_mesh_rpr_cli *cli, 76 : const struct bt_mesh_rpr_node *srv, 77 : struct bt_mesh_rpr_unprov *unprov, 78 : struct net_buf_simple *adv_data); 79 : 80 : /* Internal parameters */ 81 : 82 0 : struct bt_mesh_msg_ack_ctx scan_ack_ctx; 83 0 : struct bt_mesh_msg_ack_ctx prov_ack_ctx; 84 : 85 : struct { 86 0 : struct k_work_delayable timeout; 87 0 : struct bt_mesh_rpr_node srv; 88 0 : uint8_t time; 89 0 : uint8_t tx_pdu; 90 0 : uint8_t rx_pdu; 91 0 : enum bt_mesh_rpr_link_state state; 92 0 : } link; 93 : 94 0 : const struct bt_mesh_model *mod; 95 : }; 96 : 97 : /** @brief Get scanning capabilities of Remote Provisioning Server. 98 : * 99 : * @param cli Remote Provisioning Client. 100 : * @param srv Remote Provisioning Server. 101 : * @param caps Capabilities response buffer. 102 : * 103 : * @return 0 on success, or (negative) error code otherwise. 104 : */ 105 1 : int bt_mesh_rpr_scan_caps_get(struct bt_mesh_rpr_cli *cli, 106 : const struct bt_mesh_rpr_node *srv, 107 : struct bt_mesh_rpr_caps *caps); 108 : 109 : /** @brief Get current scanning state of Remote Provisioning Server. 110 : * 111 : * @param cli Remote Provisioning Client. 112 : * @param srv Remote Provisioning Server. 113 : * @param status Scan status response buffer. 114 : * 115 : * @return 0 on success, or (negative) error code otherwise. 116 : */ 117 1 : int bt_mesh_rpr_scan_get(struct bt_mesh_rpr_cli *cli, 118 : const struct bt_mesh_rpr_node *srv, 119 : struct bt_mesh_rpr_scan_status *status); 120 : 121 : /** @brief Start scanning for unprovisioned devices. 122 : * 123 : * Tells the Remote Provisioning Server to start scanning for unprovisioned 124 : * devices. The Server will report back the results through the @ref 125 : * bt_mesh_rpr_cli::scan_report callback. 126 : * 127 : * Use the @c uuid parameter to scan for a specific device, or leave it as NULL 128 : * to report all unprovisioned devices. 129 : * 130 : * The Server will ignore duplicates, and report up to @c max_devs number of 131 : * devices. Requesting a @c max_devs number that's higher than the Server's 132 : * capability will result in an error. 133 : * 134 : * @param cli Remote Provisioning Client. 135 : * @param srv Remote Provisioning Server. 136 : * @param uuid Device UUID to scan for, or NULL to report all devices. 137 : * @param timeout Scan timeout in seconds. Must be at least 1 second. 138 : * @param max_devs Max number of devices to report, or 0 to report as many as 139 : * possible. 140 : * @param status Scan status response buffer. 141 : * 142 : * @return 0 on success, or (negative) error code otherwise. 143 : */ 144 1 : int bt_mesh_rpr_scan_start(struct bt_mesh_rpr_cli *cli, 145 : const struct bt_mesh_rpr_node *srv, 146 : const uint8_t uuid[16], uint8_t timeout, 147 : uint8_t max_devs, 148 : struct bt_mesh_rpr_scan_status *status); 149 : 150 : /** @brief Start extended scanning for unprovisioned devices. 151 : * 152 : * Extended scanning supplements regular unprovisioned scanning, by allowing 153 : * the Server to report additional data for a specific device. The Remote 154 : * Provisioning Server will use active scanning to request a scan 155 : * response from the unprovisioned device, if supported. If no UUID is 156 : * provided, the Server will report a scan on its own OOB information and 157 : * advertising data. 158 : * 159 : * Use the ad_types array to specify which AD types to include in the scan 160 : * report. Some AD types invoke special behavior: 161 : * - @ref BT_DATA_NAME_COMPLETE Will report both the complete and the 162 : * shortened name. 163 : * - @ref BT_DATA_URI If the unprovisioned beacon contains a URI hash, the 164 : * Server will extend the scanning to include packets other than 165 : * the scan response, to look for URIs matching the URI hash. Only matching 166 : * URIs will be reported. 167 : * 168 : * The following AD types should not be used: 169 : * - @ref BT_DATA_NAME_SHORTENED 170 : * - @ref BT_DATA_UUID16_SOME 171 : * - @ref BT_DATA_UUID32_SOME 172 : * - @ref BT_DATA_UUID128_SOME 173 : * 174 : * Additionally, each AD type should only occur once. 175 : * 176 : * @param cli Remote Provisioning Client. 177 : * @param srv Remote Provisioning Server. 178 : * @param uuid Device UUID to start extended scanning for, or NULL to scan 179 : * the remote server. 180 : * @param timeout Scan timeout in seconds. Valid values from @ref BT_MESH_RPR_EXT_SCAN_TIME_MIN 181 : * to @ref BT_MESH_RPR_EXT_SCAN_TIME_MAX. Ignored if UUID is NULL. 182 : * @param ad_types List of AD types to include in the scan report. Must contain 1 to 183 : * CONFIG_BT_MESH_RPR_AD_TYPES_MAX entries. 184 : * @param ad_count Number of AD types in @c ad_types. 185 : * 186 : * @return 0 on success, or (negative) error code otherwise. 187 : */ 188 1 : int bt_mesh_rpr_scan_start_ext(struct bt_mesh_rpr_cli *cli, 189 : const struct bt_mesh_rpr_node *srv, 190 : const uint8_t uuid[16], uint8_t timeout, 191 : const uint8_t *ad_types, size_t ad_count); 192 : 193 : /** @brief Stop any ongoing scanning on the Remote Provisioning Server. 194 : * 195 : * @param cli Remote Provisioning Client. 196 : * @param srv Remote Provisioning Server. 197 : * @param status Scan status response buffer. 198 : * 199 : * @return 0 on success, or (negative) error code otherwise. 200 : */ 201 1 : int bt_mesh_rpr_scan_stop(struct bt_mesh_rpr_cli *cli, 202 : const struct bt_mesh_rpr_node *srv, 203 : struct bt_mesh_rpr_scan_status *status); 204 : 205 : /** @brief Get the current link status of the Remote Provisioning Server. 206 : * 207 : * @param cli Remote Provisioning Client. 208 : * @param srv Remote Provisioning Server. 209 : * @param rsp Link status response buffer. 210 : * 211 : * @return 0 on success, or (negative) error code otherwise. 212 : */ 213 1 : int bt_mesh_rpr_link_get(struct bt_mesh_rpr_cli *cli, 214 : const struct bt_mesh_rpr_node *srv, 215 : struct bt_mesh_rpr_link *rsp); 216 : 217 : /** @brief Close any open link on the Remote Provisioning Server. 218 : * 219 : * @param cli Remote Provisioning Client. 220 : * @param srv Remote Provisioning Server. 221 : * @param rsp Link status response buffer. 222 : * 223 : * @return 0 on success, or (negative) error code otherwise. 224 : */ 225 1 : int bt_mesh_rpr_link_close(struct bt_mesh_rpr_cli *cli, 226 : const struct bt_mesh_rpr_node *srv, 227 : struct bt_mesh_rpr_link *rsp); 228 : 229 : /** @brief Get the current transmission timeout value. 230 : * 231 : * @return The configured transmission timeout in milliseconds. 232 : */ 233 1 : int32_t bt_mesh_rpr_cli_timeout_get(void); 234 : 235 : /** @brief Set the transmission timeout value. 236 : * 237 : * The transmission timeout controls the amount of time the Remote Provisioning 238 : * Client models will wait for a response from the Server. 239 : * 240 : * @param timeout The new transmission timeout. 241 : */ 242 1 : void bt_mesh_rpr_cli_timeout_set(int32_t timeout); 243 : 244 : /** @cond INTERNAL_HIDDEN */ 245 : extern const struct bt_mesh_model_op _bt_mesh_rpr_cli_op[]; 246 : extern const struct bt_mesh_model_cb _bt_mesh_rpr_cli_cb; 247 : /** @endcond */ 248 : 249 : /** @} */ 250 : 251 : #ifdef __cplusplus 252 : } 253 : #endif 254 : 255 : #endif /* ZEPHYR_INCLUDE_BT_MESH_RPR_CLI_H__ */