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_BLUETOOTH_MESH_BLOB_SRV_H_
8 : #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_BLOB_SRV_H_
9 :
10 : #include <zephyr/bluetooth/mesh/access.h>
11 : #include <zephyr/bluetooth/mesh/blob.h>
12 :
13 : #ifdef __cplusplus
14 : extern "C" {
15 : #endif
16 :
17 : /**
18 : * @defgroup bt_mesh_blob_srv Bluetooth Mesh BLOB Transfer Server model API
19 : * @ingroup bt_mesh
20 : * @{
21 : */
22 :
23 : struct bt_mesh_blob_srv;
24 :
25 : /**
26 : *
27 : * @brief Max number of blocks in a single transfer.
28 : */
29 : #if defined(CONFIG_BT_MESH_BLOB_SRV)
30 : #define BT_MESH_BLOB_BLOCKS_MAX \
31 : (DIV_ROUND_UP(CONFIG_BT_MESH_BLOB_SIZE_MAX, \
32 : CONFIG_BT_MESH_BLOB_BLOCK_SIZE_MIN))
33 : #else
34 1 : #define BT_MESH_BLOB_BLOCKS_MAX 1
35 : #endif
36 :
37 : /**
38 : *
39 : * @brief BLOB Transfer Server model composition data entry.
40 : *
41 : * @param _srv Pointer to a @ref bt_mesh_blob_srv instance.
42 : */
43 1 : #define BT_MESH_MODEL_BLOB_SRV(_srv) \
44 : BT_MESH_MODEL_CB(BT_MESH_MODEL_ID_BLOB_SRV, _bt_mesh_blob_srv_op, \
45 : NULL, _srv, &_bt_mesh_blob_srv_cb)
46 :
47 : /** @brief BLOB Transfer Server model event handlers.
48 : *
49 : * All callbacks are optional.
50 : */
51 1 : struct bt_mesh_blob_srv_cb {
52 : /** @brief Transfer start callback.
53 : *
54 : * Called when the transfer has started with the prepared BLOB ID.
55 : *
56 : * @param srv BLOB Transfer Server instance.
57 : * @param ctx Message context for the incoming start message. The
58 : * entire transfer will be sent from the same source
59 : * address.
60 : * @param xfer Transfer parameters.
61 : *
62 : * @return 0 on success, or (negative) error code to reject the
63 : * transfer.
64 : */
65 1 : int (*start)(struct bt_mesh_blob_srv *srv, struct bt_mesh_msg_ctx *ctx,
66 : struct bt_mesh_blob_xfer *xfer);
67 :
68 : /** @brief Transfer end callback.
69 : *
70 : * Called when the transfer ends, either because it was cancelled, or
71 : * because it finished successfully. A new transfer may be prepared.
72 : *
73 : * @note The transfer may end before it's started if the start
74 : * parameters are invalid.
75 : *
76 : * @param srv BLOB Transfer Server instance.
77 : * @param id BLOB ID of the cancelled transfer.
78 : * @param success Whether the transfer was successful.
79 : */
80 1 : void (*end)(struct bt_mesh_blob_srv *srv, uint64_t id, bool success);
81 :
82 : /** @brief Transfer suspended callback.
83 : *
84 : * Called if the Server timed out while waiting for a transfer packet.
85 : * A suspended transfer may resume later from the start of the current
86 : * block. Any received chunks in the current block should be discarded,
87 : * they will be received again if the transfer resumes.
88 : *
89 : * The transfer will call @c resumed again when resuming.
90 : *
91 : * @note The BLOB Transfer Server does not run a timer in the suspended state,
92 : * and it's up to the application to determine whether the
93 : * transfer should be permanently cancelled. Without interaction,
94 : * the transfer will be suspended indefinitely, and the BLOB Transfer
95 : * Server will not accept any new transfers.
96 : *
97 : * @param srv BLOB Transfer Server instance.
98 : */
99 1 : void (*suspended)(struct bt_mesh_blob_srv *srv);
100 :
101 : /** @brief Transfer resume callback.
102 : *
103 : * Called if the transfer is resumed after being suspended.
104 : *
105 : * @param srv BLOB Transfer Server instance.
106 : */
107 1 : void (*resume)(struct bt_mesh_blob_srv *srv);
108 :
109 : /** @brief Transfer recovery callback.
110 : *
111 : * Called when the Bluetooth Mesh subsystem is started if the device is rebooted
112 : * in the middle of a transfer.
113 : *
114 : * Transfers will not be resumed after a reboot if this callback is not
115 : * defined.
116 : *
117 : * @param srv BLOB Transfer Server instance.
118 : * @param xfer Transfer to resume.
119 : * @param io BLOB stream return parameter. Must be set to a valid
120 : * BLOB stream by the callback.
121 : *
122 : * @return 0 on success, or (negative) error code to abandon the
123 : * transfer.
124 : */
125 1 : int (*recover)(struct bt_mesh_blob_srv *srv,
126 : struct bt_mesh_blob_xfer *xfer,
127 : const struct bt_mesh_blob_io **io);
128 : };
129 :
130 : /** @brief BLOB Transfer Server model instance. */
131 1 : struct bt_mesh_blob_srv {
132 : /** Event handler callbacks. */
133 1 : const struct bt_mesh_blob_srv_cb *cb;
134 :
135 : /* Runtime state: */
136 0 : const struct bt_mesh_blob_io *io;
137 0 : struct k_work_delayable rx_timeout;
138 0 : struct bt_mesh_blob_block block;
139 0 : const struct bt_mesh_model *mod;
140 0 : enum bt_mesh_blob_xfer_phase phase;
141 :
142 0 : struct bt_mesh_blob_srv_state {
143 0 : struct bt_mesh_blob_xfer xfer;
144 0 : uint16_t cli;
145 0 : uint16_t app_idx;
146 0 : uint16_t timeout_base;
147 0 : uint16_t mtu_size;
148 0 : uint8_t ttl;
149 :
150 : /* Bitfield of pending blocks. */
151 0 : ATOMIC_DEFINE(blocks, BT_MESH_BLOB_BLOCKS_MAX);
152 0 : } state;
153 :
154 : /* Pull mode (Pull BLOB Transfer Mode) behavior. */
155 : struct {
156 0 : uint16_t chunk_idx;
157 0 : struct k_work_delayable report;
158 0 : } pull;
159 : };
160 :
161 : /** @brief Prepare BLOB Transfer Server for an incoming transfer.
162 : *
163 : * Before a BLOB Transfer Server can receive a transfer, the transfer must be prepared
164 : * through some application level mechanism. The BLOB Transfer Server will only accept
165 : * incoming transfers with a matching BLOB ID.
166 : *
167 : * @param srv BLOB Transfer Server instance.
168 : * @param id BLOB ID to accept.
169 : * @param io BLOB stream to write the incoming BLOB to.
170 : * @param ttl Time to live value to use in responses to the BLOB Transfer Client.
171 : * @param timeout_base Extra time for the Client to respond in addition to the
172 : * base 10 seconds, in 10-second increments.
173 : *
174 : * @return 0 on success, or (negative) error code on failure.
175 : */
176 1 : int bt_mesh_blob_srv_recv(struct bt_mesh_blob_srv *srv, uint64_t id,
177 : const struct bt_mesh_blob_io *io, uint8_t ttl,
178 : uint16_t timeout_base);
179 :
180 : /** @brief Cancel the current BLOB transfer.
181 : *
182 : * Tells the BLOB Transfer Client to drop this device from the list of Targets for the
183 : * current transfer. Note that the client may continue sending the transfer to
184 : * other Targets.
185 : *
186 : * @param srv BLOB Transfer Server instance.
187 : *
188 : * @return 0 on success, or (negative) error code on failure.
189 : */
190 1 : int bt_mesh_blob_srv_cancel(struct bt_mesh_blob_srv *srv);
191 :
192 : /** @brief Get the current state of the BLOB Transfer Server.
193 : *
194 : * @param srv BLOB Transfer Server instance.
195 : *
196 : * @return true if the BLOB Transfer Server is currently participating in a transfer,
197 : * false otherwise.
198 : */
199 1 : bool bt_mesh_blob_srv_is_busy(const struct bt_mesh_blob_srv *srv);
200 :
201 : /** @brief Get the current progress of the active transfer in percent.
202 : *
203 : * @param srv BLOB Transfer Server instance.
204 : *
205 : * @return The current transfer progress, or 0 if no transfer is active.
206 : */
207 1 : uint8_t bt_mesh_blob_srv_progress(const struct bt_mesh_blob_srv *srv);
208 :
209 : /** @cond INTERNAL_HIDDEN */
210 : extern const struct bt_mesh_model_op _bt_mesh_blob_srv_op[];
211 : extern const struct bt_mesh_model_cb _bt_mesh_blob_srv_cb;
212 : /** @endcond */
213 :
214 : /** @} */
215 :
216 : #ifdef __cplusplus
217 : }
218 : #endif
219 :
220 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_BLOB_SRV_H_ */
|