Line data Source code
1 0 : /*
2 : * Copyright (c) 2020-2022 Nordic Semiconductor ASA
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_OTS_H_
8 : #define ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_OTS_H_
9 :
10 : /**
11 : * @brief Object Transfer Service (OTS)
12 : * @defgroup bt_ots Object Transfer Service (OTS)
13 : * @ingroup bluetooth
14 : * @{
15 : *
16 : * [Experimental] Users should note that the APIs can change
17 : * as a part of ongoing development.
18 : */
19 :
20 : #include <stdbool.h>
21 : #include <stdint.h>
22 :
23 : #include <sys/types.h>
24 :
25 : #include <zephyr/sys/byteorder.h>
26 : #include <zephyr/sys/util.h>
27 : #include <zephyr/sys/crc.h>
28 : #include <zephyr/bluetooth/conn.h>
29 : #include <zephyr/bluetooth/uuid.h>
30 : #include <zephyr/bluetooth/gatt.h>
31 :
32 : #ifdef __cplusplus
33 : extern "C" {
34 : #endif
35 :
36 : /** @brief Size of OTS object ID (in bytes). */
37 1 : #define BT_OTS_OBJ_ID_SIZE 6
38 :
39 : /** @brief Minimum allowed value for object ID (except ID for directory listing) */
40 1 : #define BT_OTS_OBJ_ID_MIN 0x000000000100ULL
41 :
42 : /** @brief Maximum allowed value for object ID (except ID for directory listing) */
43 1 : #define BT_OTS_OBJ_ID_MAX 0xFFFFFFFFFFFFULL
44 :
45 : /** @brief ID of the Directory Listing Object */
46 1 : #define OTS_OBJ_ID_DIR_LIST 0x000000000000ULL
47 :
48 : /** @brief Mask for OTS object IDs, preserving the 48 bits */
49 1 : #define BT_OTS_OBJ_ID_MASK BIT64_MASK(48)
50 :
51 : /** @brief Length of OTS object ID string (in bytes). */
52 1 : #define BT_OTS_OBJ_ID_STR_LEN 15
53 :
54 : /** @brief Type of an OTS object. */
55 1 : struct bt_ots_obj_type {
56 : union {
57 : /* Used to indicate UUID type */
58 0 : struct bt_uuid uuid;
59 :
60 : /* 16-bit UUID value */
61 0 : struct bt_uuid_16 uuid_16;
62 :
63 : /* 128-bit UUID value */
64 0 : struct bt_uuid_128 uuid_128;
65 0 : };
66 : };
67 :
68 : /** @brief Properties of an OTS object. */
69 1 : enum {
70 : /** Bit 0 Deletion of this object is permitted */
71 : BT_OTS_OBJ_PROP_DELETE = 0,
72 :
73 : /** Bit 1 Execution of this object is permitted */
74 : BT_OTS_OBJ_PROP_EXECUTE = 1,
75 :
76 : /** Bit 2 Reading this object is permitted */
77 : BT_OTS_OBJ_PROP_READ = 2,
78 :
79 : /** Bit 3 Writing data to this object is permitted */
80 : BT_OTS_OBJ_PROP_WRITE = 3,
81 :
82 : /** @brief Bit 4 Appending data to this object is permitted.
83 : *
84 : * Appending data increases its Allocated Size.
85 : */
86 : BT_OTS_OBJ_PROP_APPEND = 4,
87 :
88 : /** Bit 5 Truncation of this object is permitted */
89 : BT_OTS_OBJ_PROP_TRUNCATE = 5,
90 :
91 : /** @brief Bit 6 Patching this object is permitted
92 : *
93 : * Patching this object overwrites some of
94 : * the object's existing contents.
95 : */
96 : BT_OTS_OBJ_PROP_PATCH = 6,
97 :
98 : /** Bit 7 This object is a marked object */
99 : BT_OTS_OBJ_PROP_MARKED = 7,
100 : };
101 :
102 : /** @brief Set @ref BT_OTS_OBJ_PROP_DELETE property.
103 : *
104 : * @param prop Object properties.
105 : */
106 1 : #define BT_OTS_OBJ_SET_PROP_DELETE(prop) \
107 : WRITE_BIT(prop, BT_OTS_OBJ_PROP_DELETE, 1)
108 :
109 : /** @brief Set @ref BT_OTS_OBJ_PROP_EXECUTE property.
110 : *
111 : * @param prop Object properties.
112 : */
113 1 : #define BT_OTS_OBJ_SET_PROP_EXECUTE(prop) \
114 : WRITE_BIT(prop, BT_OTS_OBJ_PROP_EXECUTE, 1)
115 :
116 : /** @brief Set @ref BT_OTS_OBJ_PROP_READ property.
117 : *
118 : * @param prop Object properties.
119 : */
120 1 : #define BT_OTS_OBJ_SET_PROP_READ(prop) \
121 : WRITE_BIT(prop, BT_OTS_OBJ_PROP_READ, 1)
122 :
123 : /** @brief Set @ref BT_OTS_OBJ_PROP_WRITE property.
124 : *
125 : * @param prop Object properties.
126 : */
127 1 : #define BT_OTS_OBJ_SET_PROP_WRITE(prop) \
128 : WRITE_BIT(prop, BT_OTS_OBJ_PROP_WRITE, 1)
129 :
130 : /** @brief Set @ref BT_OTS_OBJ_PROP_APPEND property.
131 : *
132 : * @param prop Object properties.
133 : */
134 1 : #define BT_OTS_OBJ_SET_PROP_APPEND(prop) \
135 : WRITE_BIT(prop, BT_OTS_OBJ_PROP_APPEND, 1)
136 :
137 : /** @brief Set @ref BT_OTS_OBJ_PROP_TRUNCATE property.
138 : *
139 : * @param prop Object properties.
140 : */
141 1 : #define BT_OTS_OBJ_SET_PROP_TRUNCATE(prop) \
142 : WRITE_BIT(prop, BT_OTS_OBJ_PROP_TRUNCATE, 1)
143 :
144 : /** @brief Set @ref BT_OTS_OBJ_PROP_PATCH property.
145 : *
146 : * @param prop Object properties.
147 : */
148 1 : #define BT_OTS_OBJ_SET_PROP_PATCH(prop) \
149 : WRITE_BIT(prop, BT_OTS_OBJ_PROP_PATCH, 1)
150 :
151 : /** @brief Set @ref BT_OTS_OBJ_SET_PROP_MARKED property.
152 : *
153 : * @param prop Object properties.
154 : */
155 1 : #define BT_OTS_OBJ_SET_PROP_MARKED(prop) \
156 : WRITE_BIT(prop, BT_OTS_OBJ_PROP_MARKED, 1)
157 :
158 : /** @brief Get @ref BT_OTS_OBJ_PROP_DELETE property.
159 : *
160 : * @param prop Object properties.
161 : */
162 1 : #define BT_OTS_OBJ_GET_PROP_DELETE(prop) \
163 : ((prop) & BIT(BT_OTS_OBJ_PROP_DELETE))
164 :
165 : /** @brief Get @ref BT_OTS_OBJ_PROP_EXECUTE property.
166 : *
167 : * @param prop Object properties.
168 : */
169 1 : #define BT_OTS_OBJ_GET_PROP_EXECUTE(prop) \
170 : ((prop) & BIT(BT_OTS_OBJ_PROP_EXECUTE))
171 :
172 : /** @brief Get @ref BT_OTS_OBJ_PROP_READ property.
173 : *
174 : * @param prop Object properties.
175 : */
176 1 : #define BT_OTS_OBJ_GET_PROP_READ(prop) \
177 : ((prop) & BIT(BT_OTS_OBJ_PROP_READ))
178 :
179 : /** @brief Get @ref BT_OTS_OBJ_PROP_WRITE property.
180 : *
181 : * @param prop Object properties.
182 : */
183 1 : #define BT_OTS_OBJ_GET_PROP_WRITE(prop) \
184 : ((prop) & BIT(BT_OTS_OBJ_PROP_WRITE))
185 :
186 : /** @brief Get @ref BT_OTS_OBJ_PROP_APPEND property.
187 : *
188 : * @param prop Object properties.
189 : */
190 1 : #define BT_OTS_OBJ_GET_PROP_APPEND(prop) \
191 : ((prop) & BIT(BT_OTS_OBJ_PROP_APPEND))
192 :
193 : /** @brief Get @ref BT_OTS_OBJ_PROP_TRUNCATE property.
194 : *
195 : * @param prop Object properties.
196 : */
197 1 : #define BT_OTS_OBJ_GET_PROP_TRUNCATE(prop) \
198 : ((prop) & BIT(BT_OTS_OBJ_PROP_TRUNCATE))
199 :
200 : /** @brief Get @ref BT_OTS_OBJ_PROP_PATCH property.
201 : *
202 : * @param prop Object properties.
203 : */
204 1 : #define BT_OTS_OBJ_GET_PROP_PATCH(prop) \
205 : ((prop) & BIT(BT_OTS_OBJ_PROP_PATCH))
206 :
207 : /** @brief Get @ref BT_OTS_OBJ_PROP_MARKED property.
208 : *
209 : * @param prop Object properties.
210 : */
211 1 : #define BT_OTS_OBJ_GET_PROP_MARKED(prop) \
212 : ((prop) & BIT(BT_OTS_OBJ_PROP_MARKED))
213 :
214 : /** @brief Descriptor for OTS Object Size parameter. */
215 1 : struct bt_ots_obj_size {
216 : /** @brief Current Size */
217 1 : uint32_t cur;
218 :
219 : /** @brief Allocated Size */
220 1 : uint32_t alloc;
221 : } __packed;
222 :
223 : /** @brief Object Action Control Point Feature bits. */
224 1 : enum {
225 : /** Bit 0 OACP Create Op Code Supported */
226 : BT_OTS_OACP_FEAT_CREATE = 0,
227 :
228 : /** Bit 1 OACP Delete Op Code Supported */
229 : BT_OTS_OACP_FEAT_DELETE = 1,
230 :
231 : /** Bit 2 OACP Calculate Checksum Op Code Supported */
232 : BT_OTS_OACP_FEAT_CHECKSUM = 2,
233 :
234 : /** Bit 3 OACP Execute Op Code Supported */
235 : BT_OTS_OACP_FEAT_EXECUTE = 3,
236 :
237 : /** Bit 4 OACP Read Op Code Supported */
238 : BT_OTS_OACP_FEAT_READ = 4,
239 :
240 : /** Bit 5 OACP Write Op Code Supported */
241 : BT_OTS_OACP_FEAT_WRITE = 5,
242 :
243 : /** Bit 6 Appending Additional Data to Objects Supported */
244 : BT_OTS_OACP_FEAT_APPEND = 6,
245 :
246 : /** Bit 7 Truncation of Objects Supported */
247 : BT_OTS_OACP_FEAT_TRUNCATE = 7,
248 :
249 : /** Bit 8 Patching of Objects Supported */
250 : BT_OTS_OACP_FEAT_PATCH = 8,
251 :
252 : /** Bit 9 OACP Abort Op Code Supported */
253 : BT_OTS_OACP_FEAT_ABORT = 9,
254 : };
255 :
256 : /*
257 : * @enum bt_ots_oacp_write_op_mode
258 : * @brief Mode Parameter for OACP Write Op Code.
259 : */
260 0 : enum bt_ots_oacp_write_op_mode {
261 : BT_OTS_OACP_WRITE_OP_MODE_NONE = 0,
262 : BT_OTS_OACP_WRITE_OP_MODE_TRUNCATE = BIT(1),
263 : };
264 :
265 : /** @brief Set @ref BT_OTS_OACP_SET_FEAT_CREATE feature.
266 : *
267 : * @param feat OTS features.
268 : */
269 1 : #define BT_OTS_OACP_SET_FEAT_CREATE(feat) \
270 : WRITE_BIT(feat, BT_OTS_OACP_FEAT_CREATE, 1)
271 :
272 : /** @brief Set @ref BT_OTS_OACP_FEAT_DELETE feature.
273 : *
274 : * @param feat OTS features.
275 : */
276 1 : #define BT_OTS_OACP_SET_FEAT_DELETE(feat) \
277 : WRITE_BIT(feat, BT_OTS_OACP_FEAT_DELETE, 1)
278 :
279 : /** @brief Set @ref BT_OTS_OACP_FEAT_CHECKSUM feature.
280 : *
281 : * @param feat OTS features.
282 : */
283 1 : #define BT_OTS_OACP_SET_FEAT_CHECKSUM(feat) \
284 : WRITE_BIT(feat, BT_OTS_OACP_FEAT_CHECKSUM, 1)
285 :
286 : /** @brief Set @ref BT_OTS_OACP_FEAT_EXECUTE feature.
287 : *
288 : * @param feat OTS features.
289 : */
290 1 : #define BT_OTS_OACP_SET_FEAT_EXECUTE(feat) \
291 : WRITE_BIT(feat, BT_OTS_OACP_FEAT_EXECUTE, 1)
292 :
293 : /** @brief Set @ref BT_OTS_OACP_FEAT_READ feature.
294 : *
295 : * @param feat OTS features.
296 : */
297 1 : #define BT_OTS_OACP_SET_FEAT_READ(feat) \
298 : WRITE_BIT(feat, BT_OTS_OACP_FEAT_READ, 1)
299 :
300 : /** @brief Set @ref BT_OTS_OACP_FEAT_WRITE feature.
301 : *
302 : * @param feat OTS features.
303 : */
304 1 : #define BT_OTS_OACP_SET_FEAT_WRITE(feat) \
305 : WRITE_BIT(feat, BT_OTS_OACP_FEAT_WRITE, 1)
306 :
307 : /** @brief Set @ref BT_OTS_OACP_FEAT_APPEND feature.
308 : *
309 : * @param feat OTS features.
310 : */
311 1 : #define BT_OTS_OACP_SET_FEAT_APPEND(feat) \
312 : WRITE_BIT(feat, BT_OTS_OACP_FEAT_APPEND, 1)
313 :
314 : /** @brief Set @ref BT_OTS_OACP_FEAT_TRUNCATE feature.
315 : *
316 : * @param feat OTS features.
317 : */
318 1 : #define BT_OTS_OACP_SET_FEAT_TRUNCATE(feat) \
319 : WRITE_BIT(feat, BT_OTS_OACP_FEAT_TRUNCATE, 1)
320 :
321 : /** @brief Set @ref BT_OTS_OACP_FEAT_PATCH feature.
322 : *
323 : * @param feat OTS features.
324 : */
325 1 : #define BT_OTS_OACP_SET_FEAT_PATCH(feat) \
326 : WRITE_BIT(feat, BT_OTS_OACP_FEAT_PATCH, 1)
327 :
328 : /** @brief Set @ref BT_OTS_OACP_FEAT_ABORT feature.
329 : *
330 : * @param feat OTS features.
331 : */
332 1 : #define BT_OTS_OACP_SET_FEAT_ABORT(feat) \
333 : WRITE_BIT(feat, BT_OTS_OACP_FEAT_ABORT, 1)
334 :
335 : /** @brief Get @ref BT_OTS_OACP_FEAT_CREATE feature.
336 : *
337 : * @param feat OTS features.
338 : */
339 1 : #define BT_OTS_OACP_GET_FEAT_CREATE(feat) \
340 : ((feat) & BIT(BT_OTS_OACP_FEAT_CREATE))
341 :
342 : /** @brief Get @ref BT_OTS_OACP_FEAT_DELETE feature.
343 : *
344 : * @param feat OTS features.
345 : */
346 1 : #define BT_OTS_OACP_GET_FEAT_DELETE(feat) \
347 : ((feat) & BIT(BT_OTS_OACP_FEAT_DELETE))
348 :
349 : /** @brief Get @ref BT_OTS_OACP_FEAT_CHECKSUM feature.
350 : *
351 : * @param feat OTS features.
352 : */
353 1 : #define BT_OTS_OACP_GET_FEAT_CHECKSUM(feat) \
354 : ((feat) & BIT(BT_OTS_OACP_FEAT_CHECKSUM))
355 :
356 : /** @brief Get @ref BT_OTS_OACP_FEAT_EXECUTE feature.
357 : *
358 : * @param feat OTS features.
359 : */
360 1 : #define BT_OTS_OACP_GET_FEAT_EXECUTE(feat) \
361 : ((feat) & BIT(BT_OTS_OACP_FEAT_EXECUTE))
362 :
363 : /** @brief Get @ref BT_OTS_OACP_FEAT_READ feature.
364 : *
365 : * @param feat OTS features.
366 : */
367 1 : #define BT_OTS_OACP_GET_FEAT_READ(feat) \
368 : ((feat) & BIT(BT_OTS_OACP_FEAT_READ))
369 :
370 : /** @brief Get @ref BT_OTS_OACP_FEAT_WRITE feature.
371 : *
372 : * @param feat OTS features.
373 : */
374 1 : #define BT_OTS_OACP_GET_FEAT_WRITE(feat) \
375 : ((feat) & BIT(BT_OTS_OACP_FEAT_WRITE))
376 :
377 : /** @brief Get @ref BT_OTS_OACP_FEAT_APPEND feature.
378 : *
379 : * @param feat OTS features.
380 : */
381 1 : #define BT_OTS_OACP_GET_FEAT_APPEND(feat) \
382 : ((feat) & BIT(BT_OTS_OACP_FEAT_APPEND))
383 :
384 : /** @brief Get @ref BT_OTS_OACP_FEAT_TRUNCATE feature.
385 : *
386 : * @param feat OTS features.
387 : */
388 1 : #define BT_OTS_OACP_GET_FEAT_TRUNCATE(feat) \
389 : ((feat) & BIT(BT_OTS_OACP_FEAT_TRUNCATE))
390 :
391 : /** @brief Get @ref BT_OTS_OACP_FEAT_PATCH feature.
392 : *
393 : * @param feat OTS features.
394 : */
395 1 : #define BT_OTS_OACP_GET_FEAT_PATCH(feat) \
396 : ((feat) & BIT(BT_OTS_OACP_FEAT_PATCH))
397 :
398 : /** @brief Get @ref BT_OTS_OACP_FEAT_ABORT feature.
399 : *
400 : * @param feat OTS features.
401 : */
402 1 : #define BT_OTS_OACP_GET_FEAT_ABORT(feat) \
403 : ((feat) & BIT(BT_OTS_OACP_FEAT_ABORT))
404 :
405 : /** @brief Object List Control Point Feature bits. */
406 1 : enum {
407 : /** Bit 0 OLCP Go To Op Code Supported */
408 : BT_OTS_OLCP_FEAT_GO_TO = 0,
409 :
410 : /** Bit 1 OLCP Order Op Code Supported */
411 : BT_OTS_OLCP_FEAT_ORDER = 1,
412 :
413 : /** Bit 2 OLCP Request Number of Objects Op Code Supported */
414 : BT_OTS_OLCP_FEAT_NUM_REQ = 2,
415 :
416 : /** Bit 3 OLCP Clear Marking Op Code Supported*/
417 : BT_OTS_OLCP_FEAT_CLEAR = 3,
418 : };
419 :
420 : /** @brief Set @ref BT_OTS_OLCP_FEAT_GO_TO feature.
421 : *
422 : * @param feat OTS features.
423 : */
424 1 : #define BT_OTS_OLCP_SET_FEAT_GO_TO(feat) \
425 : WRITE_BIT(feat, BT_OTS_OLCP_FEAT_GO_TO, 1)
426 :
427 : /** @brief Set @ref BT_OTS_OLCP_FEAT_ORDER feature.
428 : *
429 : * @param feat OTS features.
430 : */
431 1 : #define BT_OTS_OLCP_SET_FEAT_ORDER(feat) \
432 : WRITE_BIT(feat, BT_OTS_OLCP_FEAT_ORDER, 1)
433 :
434 : /** @brief Set @ref BT_OTS_OLCP_FEAT_NUM_REQ feature.
435 : *
436 : * @param feat OTS features.
437 : */
438 1 : #define BT_OTS_OLCP_SET_FEAT_NUM_REQ(feat) \
439 : WRITE_BIT(feat, BT_OTS_OLCP_FEAT_NUM_REQ, 1)
440 :
441 : /** @brief Set @ref BT_OTS_OLCP_FEAT_CLEAR feature.
442 : *
443 : * @param feat OTS features.
444 : */
445 1 : #define BT_OTS_OLCP_SET_FEAT_CLEAR(feat) \
446 : WRITE_BIT(feat, BT_OTS_OLCP_FEAT_CLEAR, 1)
447 :
448 : /** @brief Get @ref BT_OTS_OLCP_GET_FEAT_GO_TO feature.
449 : *
450 : * @param feat OTS features.
451 : */
452 1 : #define BT_OTS_OLCP_GET_FEAT_GO_TO(feat) \
453 : ((feat) & BIT(BT_OTS_OLCP_FEAT_GO_TO))
454 :
455 : /** @brief Get @ref BT_OTS_OLCP_GET_FEAT_ORDER feature.
456 : *
457 : * @param feat OTS features.
458 : */
459 1 : #define BT_OTS_OLCP_GET_FEAT_ORDER(feat) \
460 : ((feat) & BIT(BT_OTS_OLCP_FEAT_ORDER))
461 :
462 : /** @brief Get @ref BT_OTS_OLCP_GET_FEAT_NUM_REQ feature.
463 : *
464 : * @param feat OTS features.
465 : */
466 1 : #define BT_OTS_OLCP_GET_FEAT_NUM_REQ(feat) \
467 : ((feat) & BIT(BT_OTS_OLCP_FEAT_NUM_REQ))
468 :
469 : /** @brief Get @ref BT_OTS_OLCP_GET_FEAT_CLEAR feature.
470 : *
471 : * @param feat OTS features.
472 : */
473 1 : #define BT_OTS_OLCP_GET_FEAT_CLEAR(feat) \
474 : ((feat) & BIT(BT_OTS_OLCP_FEAT_CLEAR))
475 :
476 : /**@brief Features of the OTS. */
477 1 : struct bt_ots_feat {
478 : /* OACP Features */
479 0 : uint32_t oacp;
480 :
481 : /* OLCP Features */
482 0 : uint32_t olcp;
483 : } __packed;
484 :
485 : /** @brief Object metadata request bit field values */
486 1 : enum {
487 : /** @brief Request object name */
488 : BT_OTS_METADATA_REQ_NAME = BIT(0),
489 : /** @brief Request object type */
490 : BT_OTS_METADATA_REQ_TYPE = BIT(1),
491 : /** @brief Request object size */
492 : BT_OTS_METADATA_REQ_SIZE = BIT(2),
493 : /** @brief Request object first created time */
494 : BT_OTS_METADATA_REQ_CREATED = BIT(3),
495 : /** @brief Request object last modified time */
496 : BT_OTS_METADATA_REQ_MODIFIED = BIT(4),
497 : /** @brief Request object ID */
498 : BT_OTS_METADATA_REQ_ID = BIT(5),
499 : /** @brief Request object properties */
500 : BT_OTS_METADATA_REQ_PROPS = BIT(6),
501 : /** @brief Request all object metadata */
502 : BT_OTS_METADATA_REQ_ALL = 0x7F,
503 : };
504 :
505 : /** @brief Date and Time structure */
506 1 : struct bt_ots_date_time {
507 0 : uint16_t year;
508 0 : uint8_t month;
509 0 : uint8_t day;
510 0 : uint8_t hours;
511 0 : uint8_t minutes;
512 0 : uint8_t seconds;
513 : };
514 0 : #define BT_OTS_DATE_TIME_FIELD_SIZE 7
515 :
516 : /** @brief Metadata of an OTS object
517 : *
518 : * Used by the server as a descriptor for OTS object initialization.
519 : * Used by the client to present object metadata to the application.
520 : */
521 1 : struct bt_ots_obj_metadata {
522 :
523 : #if defined(CONFIG_BT_OTS)
524 : /** @brief Object Name */
525 : char *name;
526 : #endif /* CONFIG_BT_OTS */
527 :
528 : #if defined(CONFIG_BT_OTS_CLIENT)
529 : /* TODO: Unify client/server name */
530 : /** @brief Object name (client) */
531 : char name_c[CONFIG_BT_OTS_OBJ_MAX_NAME_LEN + 1];
532 : #endif /* CONFIG_BT_OTS_CLIENT */
533 :
534 : /** @brief Object Type */
535 1 : struct bt_ots_obj_type type;
536 :
537 : /** @brief Object Size */
538 1 : struct bt_ots_obj_size size;
539 :
540 : #if defined(CONFIG_BT_OTS_CLIENT)
541 : /** @brief Object first created time */
542 : struct bt_ots_date_time first_created;
543 :
544 : /** @brief Object last modified time */
545 : struct bt_ots_date_time modified;
546 :
547 : /** @brief Object ID */
548 : uint64_t id;
549 : #endif /* CONFIG_BT_OTS_CLIENT */
550 :
551 : /** @brief Object Properties */
552 1 : uint32_t props;
553 : };
554 :
555 : /** @brief Opaque OTS instance. */
556 : struct bt_ots;
557 :
558 : /** @brief Descriptor for OTS object addition */
559 1 : struct bt_ots_obj_add_param {
560 : /** @brief Object size to allocate */
561 1 : uint32_t size;
562 :
563 : /** @brief Object type */
564 1 : struct bt_ots_obj_type type;
565 : };
566 :
567 : /** @brief Descriptor for OTS created object.
568 : *
569 : * Descriptor for OTS object created by the application. This descriptor is
570 : * returned by @ref bt_ots_cb.obj_created callback which contains further
571 : * documentation on distinguishing between server and client object creation.
572 : */
573 1 : struct bt_ots_obj_created_desc {
574 : /** @brief Object name
575 : *
576 : * The object name as a NULL terminated string.
577 : *
578 : * When the server creates a new object the name
579 : * shall be > 0 and <= BT_OTS_OBJ_MAX_NAME_LEN
580 : * When the client creates a new object the name
581 : * shall be an empty string
582 : */
583 1 : char *name;
584 :
585 : /** @brief Object size
586 : *
587 : * @ref bt_ots_obj_size.alloc shall be >= @ref bt_ots_obj_add_param.size
588 : *
589 : * When the server creates a new object @ref bt_ots_obj_size.cur
590 : * shall be <= @ref bt_ots_obj_add_param.size
591 : * When the client creates a new object @ref bt_ots_obj_size.cur
592 : * shall be 0
593 : */
594 1 : struct bt_ots_obj_size size;
595 :
596 : /** @brief Object properties */
597 1 : uint32_t props;
598 : };
599 :
600 : /** @brief OTS callback structure. */
601 1 : struct bt_ots_cb {
602 : /** @brief Object created callback
603 : *
604 : * This callback is called whenever a new object is created.
605 : * Application can reject this request by returning an error
606 : * when it does not have necessary resources to hold this new
607 : * object. This callback is also triggered when the server
608 : * creates a new object with bt_ots_obj_add() API.
609 : *
610 : * @param ots OTS instance.
611 : * @param conn The connection that is requesting object creation or
612 : * NULL if object is created by bt_ots_obj_add().
613 : * @param id Object ID.
614 : * @param add_param Object creation requested parameters.
615 : * @param created_desc Created object descriptor that shall be filled by the
616 : * receiver of this callback.
617 : *
618 : * @return 0 in case of success or negative value in case of error.
619 : * @return -ENOTSUP if object type is not supported
620 : * @return -ENOMEM if no available space for new object.
621 : * @return -EINVAL if an invalid parameter is provided
622 : * @return other negative values are treated as a generic operation failure
623 : */
624 1 : int (*obj_created)(struct bt_ots *ots, struct bt_conn *conn, uint64_t id,
625 : const struct bt_ots_obj_add_param *add_param,
626 : struct bt_ots_obj_created_desc *created_desc);
627 :
628 : /** @brief Object deleted callback
629 : *
630 : * This callback is called whenever an object is deleted. It is
631 : * also triggered when the server deletes an object with
632 : * bt_ots_obj_delete() API.
633 : *
634 : * @param ots OTS instance.
635 : * @param conn The connection that deleted the object or NULL if
636 : * this request came from the server.
637 : * @param id Object ID.
638 : *
639 : * @retval When an error is indicated by using a negative value, the
640 : * object delete procedure is aborted and a corresponding failed
641 : * status is returned to the client.
642 : * @return 0 in case of success.
643 : * @return -EBUSY if the object is locked. This is generally not expected
644 : * to be returned by the application as the OTS layer tracks object
645 : * accesses. An object locked status is returned to the client.
646 : * @return Other negative values in case of error. A generic operation
647 : * failed status is returned to the client.
648 : */
649 1 : int (*obj_deleted)(struct bt_ots *ots, struct bt_conn *conn,
650 : uint64_t id);
651 :
652 : /** @brief Object selected callback
653 : *
654 : * This callback is called on successful object selection.
655 : *
656 : * @param ots OTS instance.
657 : * @param conn The connection that selected new object.
658 : * @param id Object ID.
659 : */
660 1 : void (*obj_selected)(struct bt_ots *ots, struct bt_conn *conn,
661 : uint64_t id);
662 :
663 : /** @brief Object read callback
664 : *
665 : * This callback is called multiple times during the Object read
666 : * operation. OTS module will keep requesting successive Object
667 : * fragments from the application until the read operation is
668 : * completed. The end of read operation is indicated by NULL data
669 : * parameter.
670 : *
671 : * @param ots OTS instance.
672 : * @param conn The connection that read object.
673 : * @param id Object ID.
674 : * @param data In: NULL once the read operations is completed.
675 : * Out: Next chunk of data to be sent.
676 : * @param len Remaining length requested by the client.
677 : * @param offset Object data offset.
678 : *
679 : * @return Data length to be sent via data parameter. This value
680 : * shall be smaller or equal to the len parameter.
681 : * @return Negative value in case of an error.
682 : */
683 1 : ssize_t (*obj_read)(struct bt_ots *ots, struct bt_conn *conn,
684 : uint64_t id, void **data, size_t len,
685 : off_t offset);
686 :
687 : /** @brief Object write callback
688 : *
689 : * This callback is called multiple times during the Object write
690 : * operation. OTS module will keep providing successive Object
691 : * fragments to the application until the write operation is
692 : * completed. The offset and length of each write fragment is
693 : * validated by the OTS module to be within the allocated size
694 : * of the object. The remaining length indicates data length
695 : * remaining to be written and will decrease each write iteration
696 : * until it reaches 0 in the last write fragment.
697 : *
698 : * @param ots OTS instance.
699 : * @param conn The connection that wrote object.
700 : * @param id Object ID.
701 : * @param data Next chunk of data to be written.
702 : * @param len Length of the current chunk of data in the buffer.
703 : * @param offset Object data offset.
704 : * @param rem Remaining length in the write operation.
705 : *
706 : * @return Number of bytes written in case of success, if the number
707 : * of bytes written does not match len, -EIO is returned to
708 : * the L2CAP layer.
709 : * @return A negative value in case of an error.
710 : * @return -EINPROGRESS has a special meaning and is unsupported at
711 : * the moment. It should not be returned.
712 : */
713 1 : ssize_t (*obj_write)(struct bt_ots *ots, struct bt_conn *conn, uint64_t id,
714 : const void *data, size_t len, off_t offset,
715 : size_t rem);
716 :
717 : /** @brief Object name written callback
718 : *
719 : * This callback is called when the object name is written.
720 : * This is a notification to the application that the object name
721 : * will be updated by the OTS service implementation.
722 : *
723 : * @param ots OTS instance.
724 : * @param conn The connection that wrote object name.
725 : * @param id Object ID.
726 : * @param cur_name Current object name.
727 : * @param new_name New object name.
728 : */
729 1 : void (*obj_name_written)(struct bt_ots *ots, struct bt_conn *conn,
730 : uint64_t id, const char *cur_name, const char *new_name);
731 :
732 : /** @brief Object Calculate checksum callback
733 : *
734 : * This callback is called when the OACP Calculate Checksum procedure is performed.
735 : * Because object data is opaque to OTS, the application is the only one who
736 : * knows where data is and should return pointer of actual object data.
737 : *
738 : * @param[in] ots OTS instance.
739 : * @param[in] conn The connection that wrote object.
740 : * @param[in] id Object ID.
741 : * @param[in] offset The first octet of the object contents need to be calculated.
742 : * @param[in] len The length number of octets object name.
743 : * @param[out] data Pointer of actual object data.
744 : *
745 : * @return 0 to accept, or any negative value to reject.
746 : */
747 1 : int (*obj_cal_checksum)(struct bt_ots *ots, struct bt_conn *conn, uint64_t id,
748 : off_t offset, size_t len, void **data);
749 : };
750 :
751 : /** @brief Descriptor for OTS initialization. */
752 1 : struct bt_ots_init_param {
753 : /* OTS features */
754 0 : struct bt_ots_feat features;
755 :
756 : /* Callbacks */
757 0 : struct bt_ots_cb *cb;
758 : };
759 :
760 : /** @brief Add an object to the OTS instance.
761 : *
762 : * This function adds an object to the OTS database. When the
763 : * object is being added, a callback obj_created() is called
764 : * to notify the user about a new object ID.
765 : *
766 : * @param ots OTS instance.
767 : * @param param Object addition parameters.
768 : *
769 : * @return ID of created object in case of success.
770 : * @return negative value in case of error.
771 : */
772 1 : int bt_ots_obj_add(struct bt_ots *ots, const struct bt_ots_obj_add_param *param);
773 :
774 : /** @brief Delete an object from the OTS instance.
775 : *
776 : * This function deletes an object from the OTS database. When the
777 : * object is deleted a callback obj_deleted() is called
778 : * to notify the user about this event. At this point, it is possible
779 : * to free allocated buffer for object data.
780 : *
781 : * @param ots OTS instance.
782 : * @param id ID of the object to be deleted (uint48).
783 : *
784 : * @return 0 in case of success or negative value in case of error.
785 : */
786 1 : int bt_ots_obj_delete(struct bt_ots *ots, uint64_t id);
787 :
788 : /** @brief Get the service declaration attribute.
789 : *
790 : * This function is enabled for CONFIG_BT_OTS_SECONDARY_SVC configuration.
791 : * The first service attribute can be included in any other GATT service.
792 : *
793 : * @param ots OTS instance.
794 : *
795 : * @return The first OTS attribute instance.
796 : */
797 1 : void *bt_ots_svc_decl_get(struct bt_ots *ots);
798 :
799 : /** @brief Initialize the OTS instance.
800 : *
801 : * @param ots OTS instance.
802 : * @param ots_init OTS initialization descriptor.
803 : *
804 : * @return 0 in case of success or negative value in case of error.
805 : */
806 1 : int bt_ots_init(struct bt_ots *ots, struct bt_ots_init_param *ots_init);
807 :
808 : /** @brief Get a free instance of OTS from the pool.
809 : *
810 : * @return OTS instance in case of success or NULL in case of error.
811 : */
812 1 : struct bt_ots *bt_ots_free_instance_get(void);
813 :
814 0 : #define BT_OTS_STOP 0
815 0 : #define BT_OTS_CONTINUE 1
816 :
817 : /* TODO: Merge server and client instance as opaque type */
818 : /** @brief OTS client instance */
819 1 : struct bt_ots_client {
820 0 : uint16_t start_handle;
821 0 : uint16_t end_handle;
822 0 : uint16_t feature_handle;
823 0 : uint16_t obj_name_handle;
824 0 : uint16_t obj_type_handle;
825 0 : uint16_t obj_size_handle;
826 0 : uint16_t obj_properties_handle;
827 0 : uint16_t obj_created_handle;
828 0 : uint16_t obj_modified_handle;
829 0 : uint16_t obj_id_handle;
830 0 : uint16_t oacp_handle;
831 0 : uint16_t olcp_handle;
832 :
833 0 : struct bt_gatt_subscribe_params oacp_sub_params;
834 0 : struct bt_gatt_discover_params oacp_sub_disc_params;
835 0 : struct bt_gatt_subscribe_params olcp_sub_params;
836 0 : struct bt_gatt_discover_params olcp_sub_disc_params;
837 :
838 0 : struct bt_gatt_write_params write_params;
839 0 : struct bt_gatt_read_params read_proc;
840 0 : struct bt_ots_client_cb *cb;
841 :
842 0 : struct bt_ots_feat features;
843 :
844 0 : struct bt_ots_obj_metadata cur_object;
845 : };
846 :
847 : /** OTS client callback structure */
848 1 : struct bt_ots_client_cb {
849 : /** @brief Callback function when a new object is selected.
850 : *
851 : * Called when the a new object is selected and the current
852 : * object has changed. The `cur_object` in `ots_inst` will
853 : * have been reset, and metadata should be read again with
854 : * bt_ots_client_read_object_metadata().
855 : *
856 : * @param ots_inst Pointer to the OTC instance.
857 : * @param conn The connection to the peer device.
858 : * @param err Error code (bt_ots_olcp_res_code).
859 : */
860 1 : void (*obj_selected)(struct bt_ots_client *ots_inst,
861 : struct bt_conn *conn, int err);
862 :
863 :
864 : /** @brief Callback function for the data of the selected
865 : * object.
866 : *
867 : * Called when the data of the selected object are read using
868 : * bt_ots_client_read_object_data().
869 : *
870 : * @param ots_inst Pointer to the OTC instance.
871 : * @param conn The connection to the peer device.
872 : * @param offset Offset of the received data.
873 : * @param len Length of the received data.
874 : * @param data_p Pointer to the received data.
875 : * @param is_complete Indicate if the whole object has been received.
876 : *
877 : * @return int BT_OTS_STOP or BT_OTS_CONTINUE. BT_OTS_STOP can
878 : * be used to stop reading.
879 : */
880 1 : int (*obj_data_read)(struct bt_ots_client *ots_inst,
881 : struct bt_conn *conn, uint32_t offset,
882 : uint32_t len, uint8_t *data_p, bool is_complete);
883 :
884 : /** @brief Callback function for metadata of the selected object.
885 : *
886 : * Called when metadata of the selected object are read using
887 : * bt_ots_client_read_object_metadata().
888 : * Not all of the metadata may have been initialized.
889 : *
890 : * @param ots_inst Pointer to the OTC instance.
891 : * @param conn The connection to the peer device.
892 : * @param err Error value. 0 on success,
893 : * GATT error or ERRNO on fail.
894 : * @param metadata_read Bitfield of the metadata that was
895 : * successfully read.
896 : */
897 1 : void (*obj_metadata_read)(struct bt_ots_client *ots_inst,
898 : struct bt_conn *conn, int err,
899 : uint8_t metadata_read);
900 :
901 : /** @brief Callback function for the data of the write object.
902 : *
903 : * Called when the data of the selected object is written using
904 : * bt_ots_client_write_object_data().
905 : *
906 : * @param ots_inst Pointer to the OTC instance.
907 : * @param conn The connection to the peer device.
908 : * @param len Length of the written data.
909 : */
910 1 : void (*obj_data_written)(struct bt_ots_client *ots_inst,
911 : struct bt_conn *conn, size_t len);
912 :
913 : /** @brief Callback function when checksum indication is received.
914 : *
915 : * Called when the oacp_ind_handler received response of
916 : * OP BT_GATT_OTS_OACP_PROC_CHECKSUM_CALC.
917 : *
918 : * @param ots_inst Pointer to the OTC instance.
919 : * @param conn The connection to the peer device.
920 : * @param err Error code (bt_gatt_ots_oacp_res_code).
921 : * @param checksum Checksum if error code is BT_GATT_OTS_OACP_RES_SUCCESS,
922 : * otherwise 0.
923 : */
924 1 : void (*obj_checksum_calculated)(struct bt_ots_client *ots_inst, struct bt_conn *conn,
925 : int err, uint32_t checksum);
926 : };
927 :
928 : /** @brief Register an Object Transfer Service Instance.
929 : *
930 : * Register an Object Transfer Service instance discovered on the peer.
931 : * Call this function when an OTS instance is discovered
932 : * (discovery is to be handled by the higher layer).
933 : *
934 : * @param[in] ots_inst Discovered OTS instance.
935 : *
936 : * @return int 0 if success, ERRNO on failure.
937 : */
938 1 : int bt_ots_client_register(struct bt_ots_client *ots_inst);
939 :
940 : /** @brief Unregister an Object Transfer Service Instance.
941 : *
942 : * Unregister an Object Transfer Service instance when disconnect from the peer.
943 : * Call this function when an ACL using OTS instance is disconnected.
944 : *
945 : * @param[in] index Index of OTS instance.
946 : *
947 : * @return int 0 if success, ERRNO on failure.
948 : */
949 1 : int bt_ots_client_unregister(uint8_t index);
950 :
951 : /** @brief OTS Indicate Handler function.
952 : *
953 : * Set this function as callback for indicate handler when discovering OTS.
954 : *
955 : * @param conn Connection object. May be NULL, indicating that the
956 : * peer is being unpaired.
957 : * @param params Subscription parameters.
958 : * @param data Attribute value data. If NULL then subscription was
959 : * removed.
960 : * @param length Attribute value length.
961 : */
962 1 : uint8_t bt_ots_client_indicate_handler(struct bt_conn *conn,
963 : struct bt_gatt_subscribe_params *params,
964 : const void *data, uint16_t length);
965 :
966 : /** @brief Read the OTS feature characteristic.
967 : *
968 : * @param otc_inst Pointer to the OTC instance.
969 : * @param conn Pointer to the connection object.
970 : *
971 : * @return int 0 if success, ERRNO on failure.
972 : */
973 1 : int bt_ots_client_read_feature(struct bt_ots_client *otc_inst,
974 : struct bt_conn *conn);
975 :
976 : /** @brief Select an object by its Object ID.
977 : *
978 : * @param otc_inst Pointer to the OTC instance.
979 : * @param conn Pointer to the connection object.
980 : * @param obj_id Object's ID.
981 : *
982 : * @return int 0 if success, ERRNO on failure.
983 : */
984 1 : int bt_ots_client_select_id(struct bt_ots_client *otc_inst,
985 : struct bt_conn *conn,
986 : uint64_t obj_id);
987 :
988 : /** @brief Select the first object.
989 : *
990 : * @param otc_inst Pointer to the OTC instance.
991 : * @param conn Pointer to the connection object.
992 : *
993 : * @return int 0 if success, ERRNO on failure.
994 : */
995 1 : int bt_ots_client_select_first(struct bt_ots_client *otc_inst,
996 : struct bt_conn *conn);
997 :
998 : /** @brief Select the last object.
999 : *
1000 : * @param otc_inst Pointer to the OTC instance.
1001 : * @param conn Pointer to the connection object.
1002 : *
1003 : * @return int 0 if success, ERRNO on failure.
1004 : */
1005 1 : int bt_ots_client_select_last(struct bt_ots_client *otc_inst,
1006 : struct bt_conn *conn);
1007 :
1008 : /** @brief Select the next object.
1009 : *
1010 : * @param otc_inst Pointer to the OTC instance.
1011 : * @param conn Pointer to the connection object.
1012 : *
1013 : * @return int 0 if success, ERRNO on failure.
1014 : */
1015 1 : int bt_ots_client_select_next(struct bt_ots_client *otc_inst,
1016 : struct bt_conn *conn);
1017 :
1018 : /** @brief Select the previous object.
1019 : *
1020 : * @param otc_inst Pointer to the OTC instance.
1021 : * @param conn Pointer to the connection object.
1022 : *
1023 : * @return int 0 if success, ERRNO on failure.
1024 : */
1025 1 : int bt_ots_client_select_prev(struct bt_ots_client *otc_inst,
1026 : struct bt_conn *conn);
1027 :
1028 : /** @brief Read the metadata of the current object.
1029 : *
1030 : * The metadata are returned in the obj_metadata_read() callback.
1031 : *
1032 : * @param otc_inst Pointer to the OTC instance.
1033 : * @param conn Pointer to the connection object.
1034 : * @param metadata Bitfield (`BT_OTS_METADATA_REQ_*`) of the metadata
1035 : * to read.
1036 : *
1037 : * @return int 0 if success, ERRNO on failure.
1038 : */
1039 1 : int bt_ots_client_read_object_metadata(struct bt_ots_client *otc_inst,
1040 : struct bt_conn *conn,
1041 : uint8_t metadata);
1042 :
1043 : /** @brief Read the data of the current selected object.
1044 : *
1045 : * This will trigger an OACP read operation for the current size of the object
1046 : * with a 0 offset and then expect receiving the content via the L2CAP CoC.
1047 : *
1048 : * The data of the object are returned in the obj_data_read() callback.
1049 : *
1050 : * @param otc_inst Pointer to the OTC instance.
1051 : * @param conn Pointer to the connection object.
1052 : *
1053 : * @return int 0 if success, ERRNO on failure.
1054 : */
1055 1 : int bt_ots_client_read_object_data(struct bt_ots_client *otc_inst,
1056 : struct bt_conn *conn);
1057 :
1058 : /** @brief Write the data of the current selected object.
1059 : *
1060 : * This will trigger an OACP write operation for the current object
1061 : * with a specified offset and then expect transferring the content via the L2CAP CoC.
1062 : *
1063 : * The length of the data written to object is returned in the obj_data_written() callback.
1064 : *
1065 : * @param otc_inst Pointer to the OTC instance.
1066 : * @param conn Pointer to the connection object.
1067 : * @param buf Pointer to the data buffer to be written.
1068 : * @param len Size of data.
1069 : * @param offset Offset to write, usually 0.
1070 : * @param mode Mode Parameter for OACP Write Op Code. See @ref bt_ots_oacp_write_op_mode.
1071 : *
1072 : * @return int 0 if success, ERRNO on failure.
1073 : */
1074 1 : int bt_ots_client_write_object_data(struct bt_ots_client *otc_inst, struct bt_conn *conn,
1075 : const void *buf, size_t len, off_t offset,
1076 : enum bt_ots_oacp_write_op_mode mode);
1077 :
1078 : /** @brief Get the checksum of the current selected object.
1079 : *
1080 : * This will trigger an OACP calculate checksum operation for the current object
1081 : * with a specified offset and length.
1082 : *
1083 : * The checksum goes to OACP IND and obj_checksum_calculated() callback.
1084 : *
1085 : * @param otc_inst Pointer to the OTC instance.
1086 : * @param conn Pointer to the connection object.
1087 : * @param offset Offset to calculate, usually 0.
1088 : * @param len Len of data to calculate checksum for. May be less than the current object's
1089 : * size, but shall not be larger.
1090 : *
1091 : * @return int 0 if success, ERRNO on failure.
1092 : */
1093 1 : int bt_ots_client_get_object_checksum(struct bt_ots_client *otc_inst, struct bt_conn *conn,
1094 : off_t offset, size_t len);
1095 :
1096 : /** @brief Directory listing object metadata callback
1097 : *
1098 : * If a directory listing is decoded using bt_ots_client_decode_dirlisting(),
1099 : * this callback will be called for each object in the directory listing.
1100 : *
1101 : * @param meta The metadata of the decoded object
1102 : *
1103 : * @return int BT_OTS_STOP or BT_OTS_CONTINUE. BT_OTS_STOP can be used to
1104 : * stop the decoding.
1105 : */
1106 1 : typedef int (*bt_ots_client_dirlisting_cb)(struct bt_ots_obj_metadata *meta);
1107 :
1108 : /** @brief Decode Directory Listing object into object metadata.
1109 : *
1110 : * If the Directory Listing object contains multiple objects, then the
1111 : * callback will be called for each of them.
1112 : *
1113 : * @param data The data received for the directory listing object.
1114 : * @param length Length of the data.
1115 : * @param cb The callback that will be called for each object.
1116 : */
1117 1 : int bt_ots_client_decode_dirlisting(uint8_t *data, uint16_t length,
1118 : bt_ots_client_dirlisting_cb cb);
1119 :
1120 : /** @brief Converts binary OTS Object ID to string.
1121 : *
1122 : * @param obj_id Object ID.
1123 : * @param str Address of user buffer with enough room to store
1124 : * formatted string containing binary Object ID.
1125 : * @param len Length of data to be copied to user string buffer.
1126 : * Refer to BT_OTS_OBJ_ID_STR_LEN about
1127 : * recommended value.
1128 : *
1129 : * @return Number of successfully formatted bytes from binary ID.
1130 : */
1131 1 : static inline int bt_ots_obj_id_to_str(uint64_t obj_id, char *str, size_t len)
1132 : {
1133 : uint8_t id[6];
1134 :
1135 : sys_put_le48(obj_id, id);
1136 :
1137 : return snprintk(str, len, "0x%02X%02X%02X%02X%02X%02X",
1138 : id[5], id[4], id[3], id[2], id[1], id[0]);
1139 : }
1140 :
1141 : /** @brief Displays one or more object metadata as text with LOG_INF.
1142 : *
1143 : * @param metadata Pointer to the first (or only) metadata in an array.
1144 : * @param count Number of metadata objects to display information of.
1145 : */
1146 1 : void bt_ots_metadata_display(struct bt_ots_obj_metadata *metadata,
1147 : uint16_t count);
1148 :
1149 : /**
1150 : * @brief Generate IEEE conform CRC32 checksum.
1151 : *
1152 : * To abstract IEEE implementation to service layer.
1153 : *
1154 : * @param data Pointer to data on which the CRC should be calculated.
1155 : * @param len Data length.
1156 : *
1157 : * @return CRC32 value.
1158 : *
1159 : */
1160 : #if defined(CONFIG_BT_OTS_OACP_CHECKSUM_SUPPORT)
1161 : static inline uint32_t bt_ots_client_calc_checksum(const uint8_t *data, size_t len)
1162 : {
1163 : return crc32_ieee(data, len);
1164 : }
1165 : #endif
1166 :
1167 : #ifdef __cplusplus
1168 : }
1169 : #endif
1170 :
1171 : /**
1172 : * @}
1173 : */
1174 :
1175 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_OTS_H_ */
|