Line data Source code
1 1 : /** @file
2 : * @brief Generic Attribute Profile handling.
3 : */
4 :
5 : /*
6 : * Copyright (c) 2015-2016 Intel Corporation
7 : *
8 : * SPDX-License-Identifier: Apache-2.0
9 : */
10 : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_GATT_H_
11 : #define ZEPHYR_INCLUDE_BLUETOOTH_GATT_H_
12 :
13 : /**
14 : * @brief Generic Attribute Profile (GATT)
15 : * @defgroup bt_gatt Generic Attribute Profile (GATT)
16 : * @ingroup bluetooth
17 : * @{
18 : */
19 :
20 : #include <stdint.h>
21 : #include <stddef.h>
22 :
23 : #include <sys/types.h>
24 :
25 : #include <zephyr/sys/slist.h>
26 : #include <zephyr/sys/util.h>
27 : #include <zephyr/bluetooth/conn.h>
28 : #include <zephyr/bluetooth/uuid.h>
29 : #include <zephyr/bluetooth/att.h>
30 : #include <zephyr/sys/iterable_sections.h>
31 :
32 : #ifdef __cplusplus
33 : extern "C" {
34 : #endif
35 :
36 : /** GATT attribute permission bit field values */
37 1 : enum bt_gatt_perm {
38 : /** No operations supported, e.g. for notify-only */
39 : BT_GATT_PERM_NONE = 0,
40 :
41 : /** Attribute read permission. */
42 : BT_GATT_PERM_READ = BIT(0),
43 :
44 : /** Attribute write permission. */
45 : BT_GATT_PERM_WRITE = BIT(1),
46 :
47 : /** @brief Attribute read permission with encryption.
48 : *
49 : * If set, requires encryption for read access.
50 : */
51 : BT_GATT_PERM_READ_ENCRYPT = BIT(2),
52 :
53 : /** @brief Attribute write permission with encryption.
54 : *
55 : * If set, requires encryption for write access.
56 : */
57 : BT_GATT_PERM_WRITE_ENCRYPT = BIT(3),
58 :
59 : /** @brief Attribute read permission with authentication.
60 : *
61 : * If set, requires encryption using authenticated link-key for read
62 : * access.
63 : */
64 : BT_GATT_PERM_READ_AUTHEN = BIT(4),
65 :
66 : /** @brief Attribute write permission with authentication.
67 : *
68 : * If set, requires encryption using authenticated link-key for write
69 : * access.
70 : */
71 : BT_GATT_PERM_WRITE_AUTHEN = BIT(5),
72 :
73 : /** @brief Attribute prepare write permission.
74 : *
75 : * If set, allows prepare writes with use of ``BT_GATT_WRITE_FLAG_PREPARE``
76 : * passed to write callback.
77 : */
78 : BT_GATT_PERM_PREPARE_WRITE = BIT(6),
79 :
80 : /** @brief Attribute read permission with LE Secure Connection encryption.
81 : *
82 : * If set, requires that LE Secure Connections is used for read access.
83 : */
84 : BT_GATT_PERM_READ_LESC = BIT(7),
85 :
86 : /** @brief Attribute write permission with LE Secure Connection encryption.
87 : *
88 : * If set, requires that LE Secure Connections is used for write access.
89 : */
90 : BT_GATT_PERM_WRITE_LESC = BIT(8),
91 : };
92 :
93 : /**
94 : * @brief Construct error return value for attribute read and write callbacks.
95 : *
96 : * @param _att_err ATT error code
97 : *
98 : * @return Appropriate error code for the attribute callbacks.
99 : */
100 1 : #define BT_GATT_ERR(_att_err) (-(_att_err))
101 :
102 : /** GATT attribute write flags */
103 1 : enum {
104 : /** @brief Attribute prepare write flag
105 : *
106 : * If set, write callback should only check if the device is
107 : * authorized but no data shall be written.
108 : */
109 : BT_GATT_WRITE_FLAG_PREPARE = BIT(0),
110 :
111 : /** @brief Attribute write command flag
112 : *
113 : * If set, indicates that write operation is a command (Write without
114 : * response) which doesn't generate any response.
115 : */
116 : BT_GATT_WRITE_FLAG_CMD = BIT(1),
117 :
118 : /** @brief Attribute write execute flag
119 : *
120 : * If set, indicates that write operation is a execute, which indicates
121 : * the end of a long write, and will come after 1 or more
122 : * @ref BT_GATT_WRITE_FLAG_PREPARE.
123 : */
124 : BT_GATT_WRITE_FLAG_EXECUTE = BIT(2),
125 : };
126 :
127 : /* Forward declaration of GATT Attribute structure */
128 : struct bt_gatt_attr;
129 :
130 : /** @typedef bt_gatt_attr_read_func_t
131 : * @brief Attribute read callback
132 : *
133 : * This is the type of the bt_gatt_attr.read() method.
134 : *
135 : * This function may safely assume the Attribute Permissions
136 : * are satisfied for this read. Callers are responsible for
137 : * this.
138 : *
139 : * Callers may set @p conn to emulate a GATT client read, or
140 : * leave it NULL for local reads.
141 : *
142 : * @note GATT server relies on this method to handle read
143 : * operations from remote GATT clients. But this method is not
144 : * reserved for the GATT server. E.g. You can lookup attributes
145 : * in the local ATT database and invoke this method.
146 : *
147 : * @note The GATT server propagates the return value from this
148 : * method back to the remote client.
149 : *
150 : * @param conn The connection that is requesting to read.
151 : * NULL if local.
152 : * @param attr The attribute that's being read
153 : * @param buf Buffer to place the read result in
154 : * @param len Length of data to read
155 : * @param offset Offset to start reading from
156 : *
157 : * @return Number of bytes read, or in case of an error
158 : * ``BT_GATT_ERR()`` with a specific ``BT_ATT_ERR_*`` error code.
159 : */
160 1 : typedef ssize_t (*bt_gatt_attr_read_func_t)(struct bt_conn *conn,
161 : const struct bt_gatt_attr *attr,
162 : void *buf, uint16_t len,
163 : uint16_t offset);
164 :
165 : /** @typedef bt_gatt_attr_write_func_t
166 : * @brief Attribute Value write implementation
167 : *
168 : * This is the type of the bt_gatt_attr.write() method.
169 : *
170 : * This function may safely assume the Attribute Permissions
171 : * are satisfied for this write. Callers are responsible for
172 : * this.
173 : *
174 : * Callers may set @p conn to emulate a GATT client write, or
175 : * leave it NULL for local writes.
176 : *
177 : * If @p flags contains @ref BT_GATT_WRITE_FLAG_PREPARE, then
178 : * the method shall not perform a write, but instead only check
179 : * if the write is authorized and return an error code if not.
180 : *
181 : * Attribute Value write implementations can and often do have
182 : * side effects besides potentially storing the value. E.g.
183 : * togging an LED.
184 : *
185 : * @note GATT server relies on this method to handle write
186 : * operations from remote GATT clients. But this method is not
187 : * reserved for the GATT server. E.g. You can lookup attributes
188 : * in the local ATT database and invoke this method.
189 : *
190 : * @note The GATT server propagates the return value from this
191 : * method back to the remote client.
192 : *
193 : * @param conn The connection that is requesting to write
194 : * @param attr The attribute that's being written
195 : * @param buf Buffer with the data to write
196 : * @param len Number of bytes in the buffer
197 : * @param offset Offset to start writing from
198 : * @param flags Flags (``BT_GATT_WRITE_FLAG_*``)
199 : *
200 : * @return Number of bytes written, or in case of an error
201 : * ``BT_GATT_ERR()`` with a specific ``BT_ATT_ERR_*`` error code.
202 : */
203 1 : typedef ssize_t (*bt_gatt_attr_write_func_t)(struct bt_conn *conn,
204 : const struct bt_gatt_attr *attr,
205 : const void *buf, uint16_t len,
206 : uint16_t offset, uint8_t flags);
207 :
208 : /** @brief GATT Attribute
209 : *
210 : * This type primarily represents an ATT Attribute that may be
211 : * an entry in the local ATT database. The objects of this type
212 : * must be part of an array that forms a GATT service.
213 : *
214 : * While the formed GATT service is registered with the local
215 : * GATT server, pointers to this type can typically be given to
216 : * GATT server APIs, like bt_gatt_notify().
217 : *
218 : * @note This type is given as an argument to the
219 : * bt_gatt_discover() application callback, but it's not a
220 : * proper object of this type. The field @ref perm, and methods
221 : * read() and write() are not available, and it's unsound to
222 : * pass the pointer to GATT server APIs.
223 : */
224 1 : struct bt_gatt_attr {
225 : /** @brief Attribute Type, aka. "UUID"
226 : *
227 : * The Attribute Type determines the interface that can
228 : * be expected from the read() and write() methods and
229 : * the possible permission configurations.
230 : *
231 : * E.g. Attribute of type @ref BT_UUID_GATT_CPF will act as a
232 : * GATT Characteristic Presentation Format descriptor as
233 : * specified in Core Specification 3.G.3.3.3.5.
234 : *
235 : * You can define a new Attribute Type.
236 : */
237 1 : const struct bt_uuid *uuid;
238 :
239 : /** @brief Attribute Value read method
240 : *
241 : * Readable Attributes must implement this method.
242 : *
243 : * Must be NULL if the attribute is not readable.
244 : *
245 : * The behavior of this method is determined by the Attribute
246 : * Type.
247 : *
248 : * See @ref bt_gatt_attr_read_func_t.
249 : */
250 1 : bt_gatt_attr_read_func_t read;
251 :
252 : /** @brief Attribute Value write method
253 : *
254 : * Writeable Attributes must implement this method.
255 : *
256 : * Must be NULL if the attribute is not writable.
257 : *
258 : * The behavior of this method is determined by the Attribute
259 : * Type.
260 : *
261 : * See @ref bt_gatt_attr_write_func_t.
262 : */
263 1 : bt_gatt_attr_write_func_t write;
264 :
265 : /** @brief Private data for read() and write() implementation
266 : *
267 : * The meaning of this field varies and is not specified here.
268 : *
269 : * @note Attributes may have the same Attribute Type but have
270 : * different implementations, with incompatible user data.
271 : * Attribute Type alone must not be used to infer the type of
272 : * the user data.
273 : *
274 : * @sa bt_gatt_discover_func_t about this field.
275 : */
276 1 : void *user_data;
277 :
278 : /** @brief Attribute Handle or zero, maybe?
279 : *
280 : * The meaning of this field varies and is not specified here.
281 : * Some APIs use this field as input/output. It does not always
282 : * contain the Attribute Handle.
283 : *
284 : * @note Use bt_gatt_attr_get_handle() for attributes in the
285 : * local ATT database.
286 : *
287 : * @sa bt_gatt_discover_func_t about this field.
288 : */
289 1 : uint16_t handle;
290 :
291 : /** @brief Attribute Permissions
292 : *
293 : * Bit field of @ref bt_gatt_perm.
294 : *
295 : * The permissions are security requirements that must be
296 : * satisfied before calling read() or write().
297 : *
298 : * @sa bt_gatt_discover_func_t about this field.
299 : */
300 1 : uint16_t perm: 15;
301 :
302 : /** @cond INTERNAL_HIDDEN
303 : * Indicates if the attribute handle was assigned automatically.
304 : *
305 : * This flag is set to 1 if the attribute handle was assigned by the stack,
306 : * and 0 if it was manually set by the application.
307 : *
308 : * @note Applications must not modify this field.
309 : */
310 : bool _auto_assigned_handle: 1;
311 : /** @endcond */
312 : };
313 :
314 : /** @brief GATT Service structure */
315 1 : struct bt_gatt_service_static {
316 : /** Service Attributes */
317 1 : const struct bt_gatt_attr *attrs;
318 : /** Service Attribute count */
319 1 : size_t attr_count;
320 : };
321 :
322 : /** @brief GATT Service structure */
323 1 : struct bt_gatt_service {
324 : /** Service Attributes */
325 1 : struct bt_gatt_attr *attrs;
326 : /** Service Attribute count */
327 1 : size_t attr_count;
328 :
329 0 : sys_snode_t node;
330 : };
331 :
332 : /** @brief Service Attribute Value. */
333 1 : struct bt_gatt_service_val {
334 : /** Service UUID. */
335 1 : const struct bt_uuid *uuid;
336 : /** Service end handle. */
337 1 : uint16_t end_handle;
338 : };
339 :
340 : /** @brief Include Attribute Value. */
341 1 : struct bt_gatt_include {
342 : /** Service UUID. */
343 1 : const struct bt_uuid *uuid;
344 : /** Service start handle. */
345 1 : uint16_t start_handle;
346 : /** Service end handle. */
347 1 : uint16_t end_handle;
348 : };
349 :
350 : /** @brief GATT callback structure. */
351 1 : struct bt_gatt_cb {
352 : /** @brief The maximum ATT MTU on a connection has changed.
353 : *
354 : * This callback notifies the application that the maximum TX or RX
355 : * ATT MTU has increased.
356 : *
357 : * @param conn Connection object.
358 : * @param tx Updated TX ATT MTU.
359 : * @param rx Updated RX ATT MTU.
360 : */
361 1 : void (*att_mtu_updated)(struct bt_conn *conn, uint16_t tx, uint16_t rx);
362 :
363 0 : sys_snode_t node;
364 : };
365 :
366 : /** @brief GATT authorization callback structure. */
367 1 : struct bt_gatt_authorization_cb {
368 : /** @brief Authorize the GATT read operation.
369 : *
370 : * This callback allows the application to authorize the GATT
371 : * read operation for the attribute that is being read.
372 : *
373 : * @param conn Connection object.
374 : * @param attr The attribute that is being read.
375 : *
376 : * @retval true Authorize the operation and allow it to execute.
377 : * @retval false Reject the operation and prevent it from executing.
378 : */
379 1 : bool (*read_authorize)(struct bt_conn *conn,
380 : const struct bt_gatt_attr *attr);
381 :
382 : /** @brief Authorize the GATT write operation.
383 : *
384 : * This callback allows the application to authorize the GATT
385 : * write operation for the attribute that is being written.
386 : *
387 : * @param conn Connection object.
388 : * @param attr The attribute that is being written.
389 : *
390 : * @retval true Authorize the operation and allow it to execute.
391 : * @retval false Reject the operation and prevent it from executing.
392 : */
393 1 : bool (*write_authorize)(struct bt_conn *conn,
394 : const struct bt_gatt_attr *attr);
395 : };
396 :
397 : /** Characteristic Properties Bit field values */
398 :
399 : /**
400 : * @brief Characteristic broadcast property.
401 : *
402 : * If set, permits broadcasts of the Characteristic Value using Server
403 : * Characteristic Configuration Descriptor.
404 : */
405 1 : #define BT_GATT_CHRC_BROADCAST 0x01
406 : /**
407 : * @brief Characteristic read property.
408 : *
409 : * If set, permits reads of the Characteristic Value.
410 : */
411 1 : #define BT_GATT_CHRC_READ 0x02
412 : /**
413 : * @brief Characteristic write without response property.
414 : *
415 : * If set, permits write of the Characteristic Value without response.
416 : */
417 1 : #define BT_GATT_CHRC_WRITE_WITHOUT_RESP 0x04
418 : /**
419 : * @brief Characteristic write with response property.
420 : *
421 : * If set, permits write of the Characteristic Value with response.
422 : */
423 1 : #define BT_GATT_CHRC_WRITE 0x08
424 : /**
425 : * @brief Characteristic notify property.
426 : *
427 : * If set, permits notifications of a Characteristic Value without
428 : * acknowledgment.
429 : */
430 1 : #define BT_GATT_CHRC_NOTIFY 0x10
431 : /**
432 : * @brief Characteristic indicate property.
433 : *
434 : * If set, permits indications of a Characteristic Value with acknowledgment.
435 : */
436 1 : #define BT_GATT_CHRC_INDICATE 0x20
437 : /**
438 : * @brief Characteristic Authenticated Signed Writes property.
439 : *
440 : * If set, permits signed writes to the Characteristic Value.
441 : */
442 1 : #define BT_GATT_CHRC_AUTH 0x40
443 : /**
444 : * @brief Characteristic Extended Properties property.
445 : *
446 : * If set, additional characteristic properties are defined in the
447 : * Characteristic Extended Properties Descriptor.
448 : */
449 1 : #define BT_GATT_CHRC_EXT_PROP 0x80
450 :
451 : /** @brief Characteristic Attribute Value. */
452 1 : struct bt_gatt_chrc {
453 : /** Characteristic UUID. */
454 1 : const struct bt_uuid *uuid;
455 : /** Characteristic Value handle. */
456 1 : uint16_t value_handle;
457 : /** Characteristic properties. */
458 1 : uint8_t properties;
459 : };
460 :
461 : /** Characteristic Extended Properties Bit field values */
462 1 : #define BT_GATT_CEP_RELIABLE_WRITE 0x0001
463 0 : #define BT_GATT_CEP_WRITABLE_AUX 0x0002
464 :
465 : /** @brief Characteristic Extended Properties Attribute Value. */
466 1 : struct bt_gatt_cep {
467 : /** Characteristic Extended properties */
468 1 : uint16_t properties;
469 : };
470 :
471 : /** Client Characteristic Configuration Values */
472 :
473 : /**
474 : * @brief Client Characteristic Configuration Notification.
475 : *
476 : * If set, changes to Characteristic Value shall be notified.
477 : */
478 1 : #define BT_GATT_CCC_NOTIFY 0x0001
479 : /**
480 : * @brief Client Characteristic Configuration Indication.
481 : *
482 : * If set, changes to Characteristic Value shall be indicated.
483 : */
484 1 : #define BT_GATT_CCC_INDICATE 0x0002
485 :
486 : /** Client Characteristic Configuration Attribute Value */
487 1 : struct bt_gatt_ccc {
488 : /** Client Characteristic Configuration flags */
489 1 : uint16_t flags;
490 : };
491 :
492 : /** Server Characteristic Configuration Values */
493 :
494 : /**
495 : * @brief Server Characteristic Configuration Broadcast
496 : *
497 : * If set, the characteristic value shall be broadcast in the advertising data
498 : * when the server is advertising.
499 : */
500 1 : #define BT_GATT_SCC_BROADCAST 0x0001
501 :
502 : /** Server Characteristic Configuration Attribute Value */
503 1 : struct bt_gatt_scc {
504 : /** Server Characteristic Configuration flags */
505 1 : uint16_t flags;
506 : };
507 :
508 : /** @brief GATT Characteristic Presentation Format Attribute Value. */
509 1 : struct bt_gatt_cpf {
510 : /** Format of the value of the characteristic */
511 1 : uint8_t format;
512 : /** Exponent field to determine how the value of this characteristic is
513 : * further formatted
514 : */
515 1 : int8_t exponent;
516 : /** Unit of the characteristic */
517 1 : uint16_t unit;
518 : /** Name space of the description */
519 1 : uint8_t name_space;
520 : /** Description of the characteristic as defined in a higher layer profile */
521 1 : uint16_t description;
522 : };
523 :
524 : /**
525 : * @defgroup bt_gatt_server GATT Server APIs
526 : * @ingroup bt_gatt
527 : * @{
528 : */
529 :
530 : /** Converts a GATT error to string.
531 : *
532 : * The GATT errors are created with @ref BT_GATT_ERR.
533 : *
534 : * The error codes are described in the Bluetooth Core specification,
535 : * Vol 3, Part F, Section 3.4.1.1.
536 : *
537 : * The ATT and GATT documentation found in Vol 4, Part F and
538 : * Part G describe when the different error codes are used.
539 : *
540 : * See also the defined BT_ATT_ERR_* macros.
541 : *
542 : * @return The string representation of the GATT error code.
543 : * If @kconfig{CONFIG_BT_ATT_ERR_TO_STR} is not enabled,
544 : * this just returns the empty string.
545 : */
546 1 : static inline const char *bt_gatt_err_to_str(int gatt_err)
547 : {
548 : return bt_att_err_to_str((gatt_err) < 0 ? -(gatt_err) : (gatt_err));
549 : }
550 :
551 : /** @brief Register GATT callbacks.
552 : *
553 : * Register callbacks to monitor the state of GATT. The callback struct
554 : * must remain valid for the remainder of the program.
555 : *
556 : * @param cb Callback struct.
557 : */
558 1 : void bt_gatt_cb_register(struct bt_gatt_cb *cb);
559 :
560 : /** @brief Register GATT authorization callbacks.
561 : *
562 : * Register callbacks to perform application-specific authorization of GATT
563 : * operations on all registered GATT attributes. The callback structure must
564 : * remain valid throughout the entire duration of the Bluetooth subsys
565 : * activity.
566 : *
567 : * The @kconfig{CONFIG_BT_GATT_AUTHORIZATION_CUSTOM} Kconfig must be enabled
568 : * to make this API functional.
569 : *
570 : * This API allows the user to register only one callback structure
571 : * concurrently. Passing NULL unregisters the previous set of callbacks
572 : * and makes it possible to register a new one.
573 : *
574 : * @param cb Callback struct.
575 : *
576 : * @return Zero on success or negative error code otherwise
577 : */
578 1 : int bt_gatt_authorization_cb_register(const struct bt_gatt_authorization_cb *cb);
579 :
580 : /** @brief Register GATT service.
581 : *
582 : * Register GATT service. Applications can make use of
583 : * macros such as ``BT_GATT_PRIMARY_SERVICE``, ``BT_GATT_CHARACTERISTIC``,
584 : * ``BT_GATT_DESCRIPTOR``, etc.
585 : *
586 : * When using @kconfig{CONFIG_BT_SETTINGS} then all services that should have
587 : * bond configuration loaded, i.e. CCC values, must be registered before
588 : * calling @ref settings_load.
589 : *
590 : * When using @kconfig{CONFIG_BT_GATT_CACHING} and @kconfig{CONFIG_BT_SETTINGS}
591 : * then all services that should be included in the GATT Database Hash
592 : * calculation should be added before calling @ref settings_load.
593 : * All services registered after settings_load will trigger a new database hash
594 : * calculation and a new hash stored.
595 : *
596 : * There are two situations where this function can be called: either before
597 : * `bt_init()` has been called, or after `settings_load()` has been called.
598 : * Registering a service in the middle is not supported and will return an
599 : * error.
600 : *
601 : * @param svc Service containing the available attributes
602 : *
603 : * @return 0 in case of success or negative value in case of error.
604 : * @return -EAGAIN if ``bt_init()`` has been called but ``settings_load()`` hasn't yet.
605 : */
606 1 : int bt_gatt_service_register(struct bt_gatt_service *svc);
607 :
608 : /** @brief Unregister GATT service.
609 : *
610 : * @param svc Service to be unregistered.
611 : *
612 : * @return 0 in case of success or negative value in case of error.
613 : */
614 1 : int bt_gatt_service_unregister(struct bt_gatt_service *svc);
615 :
616 : /** @brief Check if GATT service is registered.
617 : *
618 : * @param svc Service to be checked.
619 : *
620 : * @return true if registered or false if not register.
621 : */
622 1 : bool bt_gatt_service_is_registered(const struct bt_gatt_service *svc);
623 :
624 0 : enum {
625 : BT_GATT_ITER_STOP = 0,
626 : BT_GATT_ITER_CONTINUE,
627 : };
628 :
629 : /** @typedef bt_gatt_attr_func_t
630 : * @brief Attribute iterator callback.
631 : *
632 : * @param attr Attribute found.
633 : * @param handle Attribute handle found.
634 : * @param user_data Data given.
635 : *
636 : * @return ``BT_GATT_ITER_CONTINUE`` if should continue to the next attribute.
637 : * @return ``BT_GATT_ITER_STOP`` to stop.
638 : */
639 1 : typedef uint8_t (*bt_gatt_attr_func_t)(const struct bt_gatt_attr *attr,
640 : uint16_t handle,
641 : void *user_data);
642 :
643 : /** @brief Attribute iterator by type.
644 : *
645 : * Iterate attributes in the given range matching given UUID and/or data.
646 : *
647 : * @param start_handle Start handle.
648 : * @param end_handle End handle.
649 : * @param uuid UUID to match, passing NULL skips UUID matching.
650 : * @param attr_data Attribute data to match, passing NULL skips data matching.
651 : * @param num_matches Number matches, passing 0 makes it unlimited.
652 : * @param func Callback function.
653 : * @param user_data Data to pass to the callback.
654 : */
655 1 : void bt_gatt_foreach_attr_type(uint16_t start_handle, uint16_t end_handle,
656 : const struct bt_uuid *uuid,
657 : const void *attr_data, uint16_t num_matches,
658 : bt_gatt_attr_func_t func,
659 : void *user_data);
660 :
661 : /** @brief Attribute iterator.
662 : *
663 : * Iterate attributes in the given range.
664 : *
665 : * @param start_handle Start handle.
666 : * @param end_handle End handle.
667 : * @param func Callback function.
668 : * @param user_data Data to pass to the callback.
669 : */
670 1 : static inline void bt_gatt_foreach_attr(uint16_t start_handle, uint16_t end_handle,
671 : bt_gatt_attr_func_t func,
672 : void *user_data)
673 : {
674 : bt_gatt_foreach_attr_type(start_handle, end_handle, NULL, NULL, 0, func,
675 : user_data);
676 : }
677 :
678 : /** @brief Iterate to the next attribute
679 : *
680 : * Iterate to the next attribute following a given attribute.
681 : *
682 : * @param attr Current Attribute.
683 : *
684 : * @return The next attribute or NULL if it cannot be found.
685 : */
686 1 : struct bt_gatt_attr *bt_gatt_attr_next(const struct bt_gatt_attr *attr);
687 :
688 : /** @brief Find Attribute by UUID.
689 : *
690 : * Find the attribute with the matching UUID.
691 : * To limit the search to a service set the attr to the service attributes and
692 : * the ``attr_count`` to the service attribute count .
693 : *
694 : * @param attr Pointer to an attribute that serves as the starting point
695 : * for the search of a match for the UUID.
696 : * Passing NULL will search the entire range.
697 : * @param attr_count The number of attributes from the starting point to
698 : * search for a match for the UUID.
699 : * Set to 0 to search until the end.
700 : * @param uuid UUID to match.
701 : */
702 1 : struct bt_gatt_attr *bt_gatt_find_by_uuid(const struct bt_gatt_attr *attr,
703 : uint16_t attr_count,
704 : const struct bt_uuid *uuid);
705 :
706 : /** @brief Get Attribute handle.
707 : *
708 : * @param attr An attribute object currently registered in the
709 : * local ATT server.
710 : *
711 : * @return Handle of the corresponding attribute or zero if the attribute
712 : * could not be found.
713 : */
714 1 : uint16_t bt_gatt_attr_get_handle(const struct bt_gatt_attr *attr);
715 :
716 : /** @brief Get the handle of the characteristic value descriptor.
717 : *
718 : * @param attr A Characteristic Attribute.
719 : *
720 : * @note The ``user_data`` of the attribute must of type @ref bt_gatt_chrc.
721 : *
722 : * @return the handle of the corresponding Characteristic Value. The value will
723 : * be zero (the invalid handle) if @p attr was not a characteristic
724 : * attribute.
725 : */
726 1 : uint16_t bt_gatt_attr_value_handle(const struct bt_gatt_attr *attr);
727 :
728 : /** @brief Generic Read Attribute value helper.
729 : *
730 : * Read attribute value from local database storing the result into buffer.
731 : *
732 : * @param conn Connection object.
733 : * @param attr Attribute to read.
734 : * @param buf Buffer to store the value.
735 : * @param buf_len Buffer length.
736 : * @param offset Start offset.
737 : * @param value Attribute value.
738 : * @param value_len Length of the attribute value.
739 : *
740 : * @return number of bytes read in case of success or negative values in
741 : * case of error.
742 : */
743 1 : ssize_t bt_gatt_attr_read(struct bt_conn *conn, const struct bt_gatt_attr *attr,
744 : void *buf, uint16_t buf_len, uint16_t offset,
745 : const void *value, uint16_t value_len);
746 :
747 : /** @brief Read Service Attribute helper.
748 : *
749 : * Read service attribute value from local database storing the result into
750 : * buffer after encoding it.
751 : * @note Only use this with attributes which ``user_data`` is a ``bt_uuid``.
752 : *
753 : * @param conn Connection object.
754 : * @param attr Attribute to read.
755 : * @param buf Buffer to store the value read.
756 : * @param len Buffer length.
757 : * @param offset Start offset.
758 : *
759 : * @return number of bytes read in case of success or negative values in
760 : * case of error.
761 : */
762 1 : ssize_t bt_gatt_attr_read_service(struct bt_conn *conn,
763 : const struct bt_gatt_attr *attr,
764 : void *buf, uint16_t len, uint16_t offset);
765 :
766 : /**
767 : * @brief Statically define and register a service.
768 : *
769 : * Helper macro to statically define and register a service.
770 : *
771 : * @param _name Service name.
772 : */
773 1 : #define BT_GATT_SERVICE_DEFINE(_name, ...) \
774 : const struct bt_gatt_attr attr_##_name[] = { __VA_ARGS__ }; \
775 : const STRUCT_SECTION_ITERABLE(bt_gatt_service_static, _name) = \
776 : BT_GATT_SERVICE(attr_##_name)
777 :
778 : #define _BT_GATT_ATTRS_ARRAY_DEFINE(n, _instances, _attrs_def) \
779 : static struct bt_gatt_attr attrs_##n[] = _attrs_def(_instances[n])
780 :
781 : #define _BT_GATT_SERVICE_ARRAY_ITEM(_n, _) BT_GATT_SERVICE(attrs_##_n)
782 :
783 : /**
784 : * @brief Statically define service structure array.
785 : *
786 : * Helper macro to statically define service structure array. Each element
787 : * of the array is linked to the service attribute array which is also
788 : * defined in this scope using ``_attrs_def`` macro.
789 : *
790 : * @param _name Name of service structure array.
791 : * @param _instances Array of instances to pass as user context to the
792 : * attribute callbacks.
793 : * @param _instance_num Number of elements in instance array.
794 : * @param _attrs_def Macro provided by the user that defines attribute
795 : * array for the service. This macro should accept single
796 : * parameter which is the instance context.
797 : */
798 : #define BT_GATT_SERVICE_INSTANCE_DEFINE( \
799 1 : _name, _instances, _instance_num, _attrs_def) \
800 : BUILD_ASSERT(ARRAY_SIZE(_instances) == _instance_num, \
801 : "The number of array elements does not match its size"); \
802 : LISTIFY(_instance_num, _BT_GATT_ATTRS_ARRAY_DEFINE, (;), \
803 : _instances, _attrs_def); \
804 : static struct bt_gatt_service _name[] = { \
805 : LISTIFY(_instance_num, _BT_GATT_SERVICE_ARRAY_ITEM, (,)) \
806 : }
807 :
808 : /**
809 : * @brief Service Structure Declaration Macro.
810 : *
811 : * Helper macro to declare a service structure.
812 : *
813 : * @param _attrs Service attributes.
814 : */
815 1 : #define BT_GATT_SERVICE(_attrs) \
816 : { \
817 : .attrs = _attrs, \
818 : .attr_count = ARRAY_SIZE(_attrs), \
819 : }
820 :
821 : /**
822 : * @brief Primary Service Declaration Macro.
823 : *
824 : * Helper macro to declare a primary service attribute.
825 : *
826 : * @param _service Service attribute value.
827 : */
828 1 : #define BT_GATT_PRIMARY_SERVICE(_service) \
829 : BT_GATT_ATTRIBUTE(BT_UUID_GATT_PRIMARY, BT_GATT_PERM_READ, \
830 : bt_gatt_attr_read_service, NULL, (void *)_service)
831 :
832 : /**
833 : * @brief Secondary Service Declaration Macro.
834 : *
835 : * Helper macro to declare a secondary service attribute.
836 : *
837 : * @note A secondary service is only intended to be included from a primary
838 : * service or another secondary service or other higher layer specification.
839 : *
840 : * @param _service Service attribute value.
841 : */
842 1 : #define BT_GATT_SECONDARY_SERVICE(_service) \
843 : BT_GATT_ATTRIBUTE(BT_UUID_GATT_SECONDARY, BT_GATT_PERM_READ, \
844 : bt_gatt_attr_read_service, NULL, (void *)_service)
845 :
846 : /** @brief Read Include Attribute helper.
847 : *
848 : * Read include service attribute value from local database storing the result
849 : * into buffer after encoding it.
850 : * @note Only use this with attributes which user_data is a ``bt_gatt_include``.
851 : *
852 : * @param conn Connection object.
853 : * @param attr Attribute to read.
854 : * @param buf Buffer to store the value read.
855 : * @param len Buffer length.
856 : * @param offset Start offset.
857 : *
858 : * @return number of bytes read in case of success or negative values in
859 : * case of error.
860 : */
861 1 : ssize_t bt_gatt_attr_read_included(struct bt_conn *conn,
862 : const struct bt_gatt_attr *attr,
863 : void *buf, uint16_t len, uint16_t offset);
864 :
865 : /**
866 : * @brief Include Service Declaration Macro.
867 : *
868 : * Helper macro to declare database internal include service attribute.
869 : *
870 : * @param _service_incl the first service attribute of service to include
871 : */
872 1 : #define BT_GATT_INCLUDE_SERVICE(_service_incl) \
873 : BT_GATT_ATTRIBUTE(BT_UUID_GATT_INCLUDE, BT_GATT_PERM_READ, \
874 : bt_gatt_attr_read_included, NULL, _service_incl)
875 :
876 : /** @brief Read Characteristic Attribute helper.
877 : *
878 : * Read characteristic attribute value from local database storing the result
879 : * into buffer after encoding it.
880 : * @note Only use this with attributes which ``user_data`` is a ``bt_gatt_chrc``.
881 : *
882 : * @param conn Connection object.
883 : * @param attr Attribute to read.
884 : * @param buf Buffer to store the value read.
885 : * @param len Buffer length.
886 : * @param offset Start offset.
887 : *
888 : * @return number of bytes read in case of success or negative values in
889 : * case of error.
890 : */
891 1 : ssize_t bt_gatt_attr_read_chrc(struct bt_conn *conn,
892 : const struct bt_gatt_attr *attr, void *buf,
893 : uint16_t len, uint16_t offset);
894 :
895 0 : #define BT_GATT_CHRC_INIT(_uuid, _handle, _props) \
896 : { \
897 : .uuid = _uuid, \
898 : .value_handle = _handle, \
899 : .properties = _props, \
900 : }
901 :
902 : /**
903 : * @brief Characteristic and Value Declaration Macro.
904 : *
905 : * Helper macro to declare a characteristic attribute along with its
906 : * attribute value.
907 : *
908 : * @param _uuid Characteristic attribute uuid.
909 : * @param _props Characteristic attribute properties,
910 : * a bitmap of ``BT_GATT_CHRC_*`` macros.
911 : * @param _perm Characteristic Attribute access permissions,
912 : * a bitmap of @ref bt_gatt_perm values.
913 : * @param _read Characteristic Attribute read callback
914 : * (@ref bt_gatt_attr_read_func_t).
915 : * @param _write Characteristic Attribute write callback
916 : * (@ref bt_gatt_attr_write_func_t).
917 : * @param _user_data Characteristic Attribute user data.
918 : */
919 1 : #define BT_GATT_CHARACTERISTIC(_uuid, _props, _perm, _read, _write, _user_data) \
920 : BT_GATT_ATTRIBUTE(BT_UUID_GATT_CHRC, BT_GATT_PERM_READ, \
921 : bt_gatt_attr_read_chrc, NULL, \
922 : ((struct bt_gatt_chrc[]) { \
923 : BT_GATT_CHRC_INIT(_uuid, 0U, _props), \
924 : })), \
925 : BT_GATT_ATTRIBUTE(_uuid, _perm, _read, _write, _user_data)
926 :
927 : #if defined(CONFIG_BT_SETTINGS_CCC_LAZY_LOADING)
928 : #define BT_GATT_CCC_MAX (CONFIG_BT_MAX_CONN)
929 : #elif defined(CONFIG_BT_CONN)
930 : #define BT_GATT_CCC_MAX (CONFIG_BT_MAX_PAIRED + CONFIG_BT_MAX_CONN)
931 : #else
932 0 : #define BT_GATT_CCC_MAX 0
933 : #endif
934 :
935 : /** @brief GATT CCC configuration entry. */
936 1 : struct bt_gatt_ccc_cfg {
937 : /** Local identity, BT_ID_DEFAULT in most cases. */
938 1 : uint8_t id;
939 : /** Remote peer address. */
940 1 : bt_addr_le_t peer;
941 : /** Configuration value. */
942 1 : uint16_t value;
943 : };
944 :
945 : /** Internal representation of CCC value */
946 : struct _bt_gatt_ccc {
947 : /** Configuration for each connection */
948 : struct bt_gatt_ccc_cfg cfg[BT_GATT_CCC_MAX];
949 :
950 : /** Highest value of all connected peer's subscriptions */
951 : uint16_t value;
952 :
953 : /** @brief CCC attribute changed callback
954 : *
955 : * @param attr The attribute that's changed value
956 : * @param value New value
957 : */
958 : void (*cfg_changed)(const struct bt_gatt_attr *attr, uint16_t value);
959 :
960 : /** @brief CCC attribute write validation callback
961 : *
962 : * @param conn The connection that is requesting to write
963 : * @param attr The attribute that's being written
964 : * @param value CCC value to write
965 : *
966 : * @return Number of bytes to write, or in case of an error
967 : * BT_GATT_ERR() with a specific error code.
968 : */
969 : ssize_t (*cfg_write)(struct bt_conn *conn,
970 : const struct bt_gatt_attr *attr, uint16_t value);
971 :
972 : /** @brief CCC attribute match handler
973 : *
974 : * Indicate if it is OK to send a notification or indication
975 : * to the subscriber.
976 : *
977 : * @param conn The connection that is being checked
978 : * @param attr The attribute that's being checked
979 : *
980 : * @return true if application has approved notification/indication,
981 : * false if application does not approve.
982 : */
983 : bool (*cfg_match)(struct bt_conn *conn,
984 : const struct bt_gatt_attr *attr);
985 : };
986 :
987 : /** @brief Read Client Characteristic Configuration Attribute helper.
988 : *
989 : * Read CCC attribute value from local database storing the result into buffer
990 : * after encoding it.
991 : *
992 : * @note Only use this with attributes which user_data is a _bt_gatt_ccc.
993 : *
994 : * @param conn Connection object.
995 : * @param attr Attribute to read.
996 : * @param buf Buffer to store the value read.
997 : * @param len Buffer length.
998 : * @param offset Start offset.
999 : *
1000 : * @return number of bytes read in case of success or negative values in
1001 : * case of error.
1002 : */
1003 1 : ssize_t bt_gatt_attr_read_ccc(struct bt_conn *conn,
1004 : const struct bt_gatt_attr *attr, void *buf,
1005 : uint16_t len, uint16_t offset);
1006 :
1007 : /** @brief Write Client Characteristic Configuration Attribute helper.
1008 : *
1009 : * Write value in the buffer into CCC attribute.
1010 : *
1011 : * @note Only use this with attributes which user_data is a _bt_gatt_ccc.
1012 : *
1013 : * @param conn Connection object.
1014 : * @param attr Attribute to read.
1015 : * @param buf Buffer to store the value read.
1016 : * @param len Buffer length.
1017 : * @param offset Start offset.
1018 : * @param flags Write flags.
1019 : *
1020 : * @return number of bytes written in case of success or negative values in
1021 : * case of error.
1022 : */
1023 1 : ssize_t bt_gatt_attr_write_ccc(struct bt_conn *conn,
1024 : const struct bt_gatt_attr *attr, const void *buf,
1025 : uint16_t len, uint16_t offset, uint8_t flags);
1026 :
1027 :
1028 : /**
1029 : * @brief Initialize Client Characteristic Configuration Declaration Macro.
1030 : *
1031 : * Helper macro to initialize a Managed CCC attribute value.
1032 : *
1033 : * @param _changed Configuration changed callback.
1034 : * @param _write Configuration write callback.
1035 : * @param _match Configuration match callback.
1036 : */
1037 1 : #define BT_GATT_CCC_INITIALIZER(_changed, _write, _match) \
1038 : { \
1039 : .cfg = {}, \
1040 : .cfg_changed = _changed, \
1041 : .cfg_write = _write, \
1042 : .cfg_match = _match, \
1043 : }
1044 :
1045 : /**
1046 : * @brief Managed Client Characteristic Configuration Declaration Macro.
1047 : *
1048 : * Helper macro to declare a Managed CCC attribute.
1049 : *
1050 : * @param _ccc CCC attribute user data, shall point to a _bt_gatt_ccc.
1051 : * @param _perm CCC access permissions,
1052 : * a bitmap of @ref bt_gatt_perm values.
1053 : */
1054 1 : #define BT_GATT_CCC_MANAGED(_ccc, _perm) \
1055 : BT_GATT_ATTRIBUTE(BT_UUID_GATT_CCC, _perm, \
1056 : bt_gatt_attr_read_ccc, bt_gatt_attr_write_ccc, \
1057 : _ccc)
1058 :
1059 : /**
1060 : * @brief Client Characteristic Configuration Declaration Macro.
1061 : *
1062 : * Helper macro to declare a CCC attribute.
1063 : *
1064 : * @param _changed Configuration changed callback.
1065 : * @param _perm CCC access permissions,
1066 : * a bitmap of @ref bt_gatt_perm values.
1067 : */
1068 1 : #define BT_GATT_CCC(_changed, _perm) \
1069 : BT_GATT_CCC_MANAGED(((struct _bt_gatt_ccc[]) \
1070 : {BT_GATT_CCC_INITIALIZER(_changed, NULL, NULL)}), _perm)
1071 :
1072 : /** @brief Read Characteristic Extended Properties Attribute helper
1073 : *
1074 : * Read CEP attribute value from local database storing the result into buffer
1075 : * after encoding it.
1076 : *
1077 : * @note Only use this with attributes which user_data is a bt_gatt_cep.
1078 : *
1079 : * @param conn Connection object
1080 : * @param attr Attribute to read
1081 : * @param buf Buffer to store the value read
1082 : * @param len Buffer length
1083 : * @param offset Start offset
1084 : *
1085 : * @return number of bytes read in case of success or negative values in
1086 : * case of error.
1087 : */
1088 1 : ssize_t bt_gatt_attr_read_cep(struct bt_conn *conn,
1089 : const struct bt_gatt_attr *attr, void *buf,
1090 : uint16_t len, uint16_t offset);
1091 :
1092 : /**
1093 : * @brief Characteristic Extended Properties Declaration Macro.
1094 : *
1095 : * Helper macro to declare a CEP attribute.
1096 : *
1097 : * @param _value Pointer to a struct bt_gatt_cep.
1098 : */
1099 1 : #define BT_GATT_CEP(_value) \
1100 : BT_GATT_DESCRIPTOR(BT_UUID_GATT_CEP, BT_GATT_PERM_READ, \
1101 : bt_gatt_attr_read_cep, NULL, (void *)_value)
1102 :
1103 : /** @brief Read Characteristic User Description Descriptor Attribute helper
1104 : *
1105 : * Read CUD attribute value from local database storing the result into buffer
1106 : * after encoding it.
1107 : *
1108 : * @note Only use this with attributes which user_data is a NULL-terminated C
1109 : * string.
1110 : *
1111 : * @param conn Connection object
1112 : * @param attr Attribute to read
1113 : * @param buf Buffer to store the value read
1114 : * @param len Buffer length
1115 : * @param offset Start offset
1116 : *
1117 : * @return number of bytes read in case of success or negative values in
1118 : * case of error.
1119 : */
1120 1 : ssize_t bt_gatt_attr_read_cud(struct bt_conn *conn,
1121 : const struct bt_gatt_attr *attr, void *buf,
1122 : uint16_t len, uint16_t offset);
1123 :
1124 : /**
1125 : * @brief Characteristic User Format Descriptor Declaration Macro.
1126 : *
1127 : * Helper macro to declare a CUD attribute.
1128 : *
1129 : * @param _value User description NULL-terminated C string.
1130 : * @param _perm Descriptor attribute access permissions,
1131 : * a bitmap of @ref bt_gatt_perm values.
1132 : */
1133 1 : #define BT_GATT_CUD(_value, _perm) \
1134 : BT_GATT_DESCRIPTOR(BT_UUID_GATT_CUD, _perm, bt_gatt_attr_read_cud, \
1135 : NULL, (void *)_value)
1136 :
1137 : /** @brief Read Characteristic Presentation format Descriptor Attribute helper
1138 : *
1139 : * Read CPF attribute value from local database storing the result into buffer
1140 : * after encoding it.
1141 : *
1142 : * @note Only use this with attributes which user_data is a bt_gatt_pf.
1143 : *
1144 : * @param conn Connection object
1145 : * @param attr Attribute to read
1146 : * @param buf Buffer to store the value read
1147 : * @param len Buffer length
1148 : * @param offset Start offset
1149 : *
1150 : * @return number of bytes read in case of success or negative values in
1151 : * case of error.
1152 : */
1153 1 : ssize_t bt_gatt_attr_read_cpf(struct bt_conn *conn,
1154 : const struct bt_gatt_attr *attr, void *buf,
1155 : uint16_t len, uint16_t offset);
1156 :
1157 : /**
1158 : * @brief Characteristic Presentation Format Descriptor Declaration Macro.
1159 : *
1160 : * Helper macro to declare a CPF attribute.
1161 : *
1162 : * @param _value Pointer to a struct bt_gatt_cpf.
1163 : */
1164 1 : #define BT_GATT_CPF(_value) \
1165 : BT_GATT_DESCRIPTOR(BT_UUID_GATT_CPF, BT_GATT_PERM_READ, \
1166 : bt_gatt_attr_read_cpf, NULL, (void *)_value)
1167 :
1168 : /**
1169 : * @brief Descriptor Declaration Macro.
1170 : *
1171 : * Helper macro to declare a descriptor attribute.
1172 : *
1173 : * @param _uuid Descriptor attribute uuid.
1174 : * @param _perm Descriptor attribute access permissions,
1175 : * a bitmap of @ref bt_gatt_perm values.
1176 : * @param _read Descriptor attribute read callback
1177 : * (@ref bt_gatt_attr_read_func_t).
1178 : * @param _write Descriptor attribute write callback
1179 : * (@ref bt_gatt_attr_write_func_t).
1180 : * @param _user_data Descriptor attribute user data.
1181 : */
1182 1 : #define BT_GATT_DESCRIPTOR(_uuid, _perm, _read, _write, _user_data) \
1183 : BT_GATT_ATTRIBUTE(_uuid, _perm, _read, _write, _user_data)
1184 :
1185 : /**
1186 : * @brief Attribute Declaration Macro.
1187 : *
1188 : * Helper macro to declare an attribute.
1189 : *
1190 : * @param _uuid Attribute uuid.
1191 : * @param _perm Attribute access permissions,
1192 : * a bitmap of @ref bt_gatt_perm values.
1193 : * @param _read Attribute read callback (@ref bt_gatt_attr_read_func_t).
1194 : * @param _write Attribute write callback (@ref bt_gatt_attr_write_func_t).
1195 : * @param _user_data Attribute user data.
1196 : */
1197 1 : #define BT_GATT_ATTRIBUTE(_uuid, _perm, _read, _write, _user_data) \
1198 : { \
1199 : .uuid = _uuid, \
1200 : .read = _read, \
1201 : .write = _write, \
1202 : .user_data = _user_data, \
1203 : .handle = 0, \
1204 : .perm = _perm, \
1205 : }
1206 :
1207 : /** @brief Notification complete result callback.
1208 : *
1209 : * @param conn Connection object.
1210 : * @param user_data Data passed in by the user.
1211 : */
1212 1 : typedef void (*bt_gatt_complete_func_t) (struct bt_conn *conn, void *user_data);
1213 :
1214 0 : struct bt_gatt_notify_params {
1215 : /** @brief Notification Attribute UUID type
1216 : *
1217 : * Optional, use to search for an attribute with matching UUID when
1218 : * the attribute object pointer is not known.
1219 : */
1220 1 : const struct bt_uuid *uuid;
1221 : /** @brief Notification Attribute object
1222 : *
1223 : * Optional if uuid is provided, in this case it will be used as start
1224 : * range to search for the attribute with the given UUID.
1225 : */
1226 1 : const struct bt_gatt_attr *attr;
1227 : /** Notification Value data */
1228 1 : const void *data;
1229 : /** Notification Value length */
1230 1 : uint16_t len;
1231 : /** Notification Value callback */
1232 1 : bt_gatt_complete_func_t func;
1233 : /** Notification Value callback user data */
1234 1 : void *user_data;
1235 : #if defined(CONFIG_BT_EATT)
1236 0 : enum bt_att_chan_opt chan_opt;
1237 : #endif /* CONFIG_BT_EATT */
1238 : };
1239 :
1240 : /** @brief Notify attribute value change.
1241 : *
1242 : * This function works in the same way as @ref bt_gatt_notify.
1243 : * With the addition that after sending the notification the
1244 : * callback function will be called.
1245 : *
1246 : * The callback is run from System Workqueue context.
1247 : * When called from the System Workqueue context this API will not wait for
1248 : * resources for the callback but instead return an error.
1249 : * The number of pending callbacks can be increased with the
1250 : * @kconfig{CONFIG_BT_CONN_TX_MAX} option.
1251 : *
1252 : * Alternatively it is possible to notify by UUID by setting it on the
1253 : * parameters, when using this method the attribute if provided is used as the
1254 : * start range when looking up for possible matches.
1255 : *
1256 : * @param conn Connection object.
1257 : * @param params Notification parameters.
1258 : *
1259 : * @return 0 in case of success or negative value in case of error.
1260 : */
1261 1 : int bt_gatt_notify_cb(struct bt_conn *conn,
1262 : struct bt_gatt_notify_params *params);
1263 :
1264 : /** @brief Send multiple notifications in a single PDU.
1265 : *
1266 : * The GATT Server will send a single ATT_MULTIPLE_HANDLE_VALUE_NTF PDU
1267 : * containing all the notifications passed to this API.
1268 : *
1269 : * All `params` must have the same `func` and `user_data` (due to
1270 : * implementation limitation). But `func(user_data)` will be invoked for each
1271 : * parameter.
1272 : *
1273 : * As this API may block to wait for Bluetooth Host resources, it is not
1274 : * recommended to call it from a cooperative thread or a Bluetooth callback.
1275 : *
1276 : * The peer's GATT Client must write to this device's Client Supported Features
1277 : * attribute and set the bit for Multiple Handle Value Notifications before
1278 : * this API can be used.
1279 : *
1280 : * Only use this API to force the use of the ATT_MULTIPLE_HANDLE_VALUE_NTF PDU.
1281 : * For standard applications, `bt_gatt_notify_cb` is preferred, as it will use
1282 : * this PDU if supported and automatically fallback to ATT_HANDLE_VALUE_NTF
1283 : * when not supported by the peer.
1284 : *
1285 : * This API has an additional limitation: it only accepts valid attribute
1286 : * references and not UUIDs like `bt_gatt_notify` and `bt_gatt_notify_cb`.
1287 : *
1288 : * @param conn
1289 : * Target client.
1290 : * Notifying all connected clients by passing `NULL` is not yet supported,
1291 : * please use `bt_gatt_notify` instead.
1292 : * @param num_params
1293 : * Element count of `params` array. Has to be greater than 1.
1294 : * @param params
1295 : * Array of notification parameters. It is okay to free this after calling
1296 : * this function.
1297 : *
1298 : * @retval 0
1299 : * Success. The PDU is queued for sending.
1300 : * @retval -EINVAL
1301 : * - One of the attribute handles is invalid.
1302 : * - Only one parameter was passed. This API expects 2 or more.
1303 : * - Not all `func` were equal or not all `user_data` were equal.
1304 : * - One of the characteristics is not notifiable.
1305 : * - An UUID was passed in one of the parameters.
1306 : * @retval -ERANGE
1307 : * - The notifications cannot all fit in a single ATT_MULTIPLE_HANDLE_VALUE_NTF.
1308 : * - They exceed the MTU of all open ATT bearers.
1309 : * @retval -EPERM
1310 : * The connection has a lower security level than required by one of the
1311 : * attributes.
1312 : * @retval -EOPNOTSUPP
1313 : * The peer hasn't yet communicated that it supports this PDU type.
1314 : */
1315 1 : int bt_gatt_notify_multiple(struct bt_conn *conn,
1316 : uint16_t num_params,
1317 : struct bt_gatt_notify_params params[]);
1318 :
1319 : /** @brief Notify attribute value change.
1320 : *
1321 : * Send notification of attribute value change, if connection is NULL notify
1322 : * all peer that have notification enabled via CCC otherwise do a direct
1323 : * notification only the given connection.
1324 : *
1325 : * The attribute object on the parameters can be the so called Characteristic
1326 : * Declaration, which is usually declared with BT_GATT_CHARACTERISTIC followed
1327 : * by BT_GATT_CCC, or the Characteristic Value Declaration which is
1328 : * automatically created after the Characteristic Declaration when using
1329 : * BT_GATT_CHARACTERISTIC.
1330 : *
1331 : * @param conn Connection object.
1332 : * @param attr Characteristic or Characteristic Value attribute.
1333 : * @param data Pointer to Attribute data.
1334 : * @param len Attribute value length.
1335 : *
1336 : * @return 0 in case of success or negative value in case of error.
1337 : */
1338 1 : static inline int bt_gatt_notify(struct bt_conn *conn,
1339 : const struct bt_gatt_attr *attr,
1340 : const void *data, uint16_t len)
1341 : {
1342 : struct bt_gatt_notify_params params;
1343 :
1344 : memset(¶ms, 0, sizeof(params));
1345 :
1346 : params.attr = attr;
1347 : params.data = data;
1348 : params.len = len;
1349 : #if defined(CONFIG_BT_EATT)
1350 : params.chan_opt = BT_ATT_CHAN_OPT_NONE;
1351 : #endif /* CONFIG_BT_EATT */
1352 :
1353 : return bt_gatt_notify_cb(conn, ¶ms);
1354 : }
1355 :
1356 : /** @brief Notify attribute value change by UUID.
1357 : *
1358 : * Send notification of attribute value change, if connection is NULL notify
1359 : * all peer that have notification enabled via CCC otherwise do a direct
1360 : * notification only on the given connection.
1361 : *
1362 : * The attribute object is the starting point for the search of the UUID.
1363 : *
1364 : * @param conn Connection object.
1365 : * @param uuid The UUID. If the server contains multiple services with the same
1366 : * UUID, then the first occurrence, starting from the attr given,
1367 : * is used.
1368 : * @param attr Pointer to an attribute that serves as the starting point for
1369 : * the search of a match for the UUID.
1370 : * @param data Pointer to Attribute data.
1371 : * @param len Attribute value length.
1372 : *
1373 : * @return 0 in case of success or negative value in case of error.
1374 : */
1375 1 : static inline int bt_gatt_notify_uuid(struct bt_conn *conn,
1376 : const struct bt_uuid *uuid,
1377 : const struct bt_gatt_attr *attr,
1378 : const void *data, uint16_t len)
1379 : {
1380 : struct bt_gatt_notify_params params;
1381 :
1382 : memset(¶ms, 0, sizeof(params));
1383 :
1384 : params.uuid = uuid;
1385 : params.attr = attr;
1386 : params.data = data;
1387 : params.len = len;
1388 : #if defined(CONFIG_BT_EATT)
1389 : params.chan_opt = BT_ATT_CHAN_OPT_NONE;
1390 : #endif /* CONFIG_BT_EATT */
1391 :
1392 : return bt_gatt_notify_cb(conn, ¶ms);
1393 : }
1394 :
1395 : /* Forward declaration of the bt_gatt_indicate_params structure */
1396 : struct bt_gatt_indicate_params;
1397 :
1398 : /** @typedef bt_gatt_indicate_func_t
1399 : * @brief Indication complete result callback.
1400 : *
1401 : * @param conn Connection object.
1402 : * @param params Indication params object.
1403 : * @param err ATT error code
1404 : */
1405 1 : typedef void (*bt_gatt_indicate_func_t)(struct bt_conn *conn,
1406 : struct bt_gatt_indicate_params *params,
1407 : uint8_t err);
1408 :
1409 0 : typedef void (*bt_gatt_indicate_params_destroy_t)(
1410 : struct bt_gatt_indicate_params *params);
1411 :
1412 : /** @brief GATT Indicate Value parameters */
1413 1 : struct bt_gatt_indicate_params {
1414 : /** @brief Indicate Attribute UUID type
1415 : *
1416 : * Optional, use to search for an attribute with matching UUID when
1417 : * the attribute object pointer is not known.
1418 : */
1419 1 : const struct bt_uuid *uuid;
1420 : /** @brief Indicate Attribute object
1421 : *
1422 : * Optional if uuid is provided, in this case it will be used as start
1423 : * range to search for the attribute with the given UUID.
1424 : */
1425 1 : const struct bt_gatt_attr *attr;
1426 : /** Indicate Value callback */
1427 1 : bt_gatt_indicate_func_t func;
1428 : /** Indicate operation complete callback */
1429 1 : bt_gatt_indicate_params_destroy_t destroy;
1430 : /** Indicate Value data*/
1431 1 : const void *data;
1432 : /** Indicate Value length*/
1433 1 : uint16_t len;
1434 : /** Private reference counter */
1435 : uint8_t _ref;
1436 : #if defined(CONFIG_BT_EATT)
1437 0 : enum bt_att_chan_opt chan_opt;
1438 : #endif /* CONFIG_BT_EATT */
1439 : };
1440 :
1441 : /** @brief Indicate attribute value change.
1442 : *
1443 : * Send an indication of attribute value change. if connection is NULL
1444 : * indicate all peer that have notification enabled via CCC otherwise do a
1445 : * direct indication only the given connection.
1446 : *
1447 : * The attribute object on the parameters can be the so called Characteristic
1448 : * Declaration, which is usually declared with BT_GATT_CHARACTERISTIC followed
1449 : * by BT_GATT_CCC, or the Characteristic Value Declaration which is
1450 : * automatically created after the Characteristic Declaration when using
1451 : * BT_GATT_CHARACTERISTIC.
1452 : *
1453 : * Alternatively it is possible to indicate by UUID by setting it on the
1454 : * parameters, when using this method the attribute if provided is used as the
1455 : * start range when looking up for possible matches.
1456 : *
1457 : * @note This procedure is asynchronous therefore the parameters need to
1458 : * remains valid while it is active. The procedure is active until
1459 : * the destroy callback is run.
1460 : *
1461 : * @param conn Connection object.
1462 : * @param params Indicate parameters.
1463 : *
1464 : * @return 0 in case of success or negative value in case of error.
1465 : */
1466 1 : int bt_gatt_indicate(struct bt_conn *conn,
1467 : struct bt_gatt_indicate_params *params);
1468 :
1469 :
1470 : /** @brief Check if connection have subscribed to attribute
1471 : *
1472 : * Check if connection has subscribed to attribute value change.
1473 : *
1474 : * The attribute object can be the so called Characteristic Declaration,
1475 : * which is usually declared with BT_GATT_CHARACTERISTIC followed
1476 : * by BT_GATT_CCC, or the Characteristic Value Declaration which is
1477 : * automatically created after the Characteristic Declaration when using
1478 : * BT_GATT_CHARACTERISTIC, or the Client Characteristic Configuration
1479 : * Descriptor (CCCD) which is created by BT_GATT_CCC.
1480 : *
1481 : * @param conn Connection object.
1482 : * @param attr Attribute object.
1483 : * @param ccc_type The subscription type, @ref BT_GATT_CCC_NOTIFY and/or
1484 : * @ref BT_GATT_CCC_INDICATE.
1485 : *
1486 : * @return true if the attribute object has been subscribed.
1487 : */
1488 1 : bool bt_gatt_is_subscribed(struct bt_conn *conn,
1489 : const struct bt_gatt_attr *attr, uint16_t ccc_type);
1490 :
1491 : /** @brief Get ATT MTU for a connection
1492 : *
1493 : * Get negotiated ATT connection MTU, note that this does not equal the largest
1494 : * amount of attribute data that can be transferred within a single packet.
1495 : *
1496 : * @param conn Connection object.
1497 : *
1498 : * @return MTU in bytes
1499 : */
1500 1 : uint16_t bt_gatt_get_mtu(struct bt_conn *conn);
1501 :
1502 : /** @brief Get Unenhanced ATT (UATT) MTU for a connection
1503 : *
1504 : * Get UATT connection MTU.
1505 : *
1506 : * The ATT_MTU defines the largest size of an ATT PDU, encompassing the ATT
1507 : * opcode, additional fields, and any attribute value payload. Consequently,
1508 : * the maximum size of a value payload is less and varies based on the type
1509 : * of ATT PDU. For example, in an ATT_HANDLE_VALUE_NTF PDU, the Attribute Value
1510 : * field can contain up to ATT_MTU - 3 octets (size of opcode and handle).
1511 : *
1512 : * @param conn Connection object.
1513 : *
1514 : * @return 0 if @p conn does not have an UATT ATT_MTU (e.g: disconnected).
1515 : * @return Current UATT ATT_MTU.
1516 : */
1517 1 : uint16_t bt_gatt_get_uatt_mtu(struct bt_conn *conn);
1518 :
1519 : /** @} */
1520 :
1521 : /**
1522 : * @defgroup bt_gatt_client GATT Client APIs
1523 : * @ingroup bt_gatt
1524 : * @{
1525 : */
1526 :
1527 : /** @brief GATT Exchange MTU parameters */
1528 1 : struct bt_gatt_exchange_params {
1529 : /** Response callback */
1530 1 : void (*func)(struct bt_conn *conn, uint8_t err,
1531 : struct bt_gatt_exchange_params *params);
1532 : };
1533 :
1534 : /** @brief Exchange MTU
1535 : *
1536 : * This client procedure can be used to set the MTU to the maximum possible
1537 : * size the buffers can hold.
1538 : *
1539 : * @note Shall only be used once per connection.
1540 : *
1541 : * The Response comes in callback @p params->func. The callback is run from
1542 : * the context specified by 'config BT_RECV_CONTEXT'.
1543 : * @p params must remain valid until start of callback.
1544 : *
1545 : * This function will block while the ATT request queue is full, except when
1546 : * called from the BT RX thread, as this would cause a deadlock.
1547 : *
1548 : * @param conn Connection object.
1549 : * @param params Exchange MTU parameters.
1550 : *
1551 : * @retval 0 Successfully queued request. Will call @p params->func on
1552 : * resolution.
1553 : *
1554 : * @retval -ENOMEM ATT request queue is full and blocking would cause deadlock.
1555 : * Allow a pending request to resolve before retrying, or call this function
1556 : * outside the BT RX thread to get blocking behavior. Queue size is controlled
1557 : * by @kconfig{CONFIG_BT_ATT_TX_COUNT}.
1558 : *
1559 : * @retval -EALREADY The MTU exchange procedure has been already performed.
1560 : */
1561 1 : int bt_gatt_exchange_mtu(struct bt_conn *conn,
1562 : struct bt_gatt_exchange_params *params);
1563 :
1564 : struct bt_gatt_discover_params;
1565 :
1566 : /** @typedef bt_gatt_discover_func_t
1567 : * @brief Discover attribute callback function.
1568 : *
1569 : * @param conn Connection object.
1570 : * @param attr Attribute found, or NULL if not found.
1571 : * @param params Discovery parameters given.
1572 : *
1573 : * If discovery procedure has completed this callback will be called with
1574 : * attr set to NULL. This will not happen if procedure was stopped by returning
1575 : * BT_GATT_ITER_STOP.
1576 : *
1577 : * The attribute object as well as its UUID and value objects are temporary and
1578 : * must be copied to in order to cache its information.
1579 : * Only the following fields of the attribute contains valid information:
1580 : * - uuid UUID representing the type of attribute.
1581 : * - handle Handle in the remote database.
1582 : * - user_data The value of the attribute, if the discovery type maps to an
1583 : * ATT operation that provides this information. NULL otherwise.
1584 : * See below.
1585 : *
1586 : * The effective type of @c attr->user_data is determined by @c params. Note
1587 : * that the fields @c params->type and @c params->uuid are left unchanged by
1588 : * the discovery procedure.
1589 : *
1590 : * @c params->type | @c params->uuid | Type of @c attr->user_data
1591 : * -------------------------------------|-------------------------|---------------------------
1592 : * @ref BT_GATT_DISCOVER_PRIMARY | any | @ref bt_gatt_service_val
1593 : * @ref BT_GATT_DISCOVER_SECONDARY | any | @ref bt_gatt_service_val
1594 : * @ref BT_GATT_DISCOVER_INCLUDE | any | @ref bt_gatt_include
1595 : * @ref BT_GATT_DISCOVER_CHARACTERISTIC | any | @ref bt_gatt_chrc
1596 : * @ref BT_GATT_DISCOVER_STD_CHAR_DESC | @ref BT_UUID_GATT_CEP | @ref bt_gatt_cep
1597 : * @ref BT_GATT_DISCOVER_STD_CHAR_DESC | @ref BT_UUID_GATT_CCC | @ref bt_gatt_ccc
1598 : * @ref BT_GATT_DISCOVER_STD_CHAR_DESC | @ref BT_UUID_GATT_SCC | @ref bt_gatt_scc
1599 : * @ref BT_GATT_DISCOVER_STD_CHAR_DESC | @ref BT_UUID_GATT_CPF | @ref bt_gatt_cpf
1600 : * @ref BT_GATT_DISCOVER_DESCRIPTOR | any | NULL
1601 : * @ref BT_GATT_DISCOVER_ATTRIBUTE | any | NULL
1602 : *
1603 : * Also consider if using read-by-type instead of discovery is more convenient.
1604 : * See @ref bt_gatt_read with @ref bt_gatt_read_params.handle_count set to
1605 : * @c 0.
1606 : *
1607 : * @return BT_GATT_ITER_CONTINUE to continue discovery procedure.
1608 : * @return BT_GATT_ITER_STOP to stop discovery procedure.
1609 : */
1610 1 : typedef uint8_t (*bt_gatt_discover_func_t)(struct bt_conn *conn,
1611 : const struct bt_gatt_attr *attr,
1612 : struct bt_gatt_discover_params *params);
1613 :
1614 : /** GATT Discover types */
1615 1 : enum {
1616 : /** Discover Primary Services. */
1617 : BT_GATT_DISCOVER_PRIMARY,
1618 : /** Discover Secondary Services. */
1619 : BT_GATT_DISCOVER_SECONDARY,
1620 : /** Discover Included Services. */
1621 : BT_GATT_DISCOVER_INCLUDE,
1622 : /** @brief Discover Characteristic Values.
1623 : *
1624 : * Discover Characteristic Value and its properties.
1625 : */
1626 : BT_GATT_DISCOVER_CHARACTERISTIC,
1627 : /** @brief Discover Descriptors.
1628 : *
1629 : * Discover Attributes which are not services or characteristics.
1630 : *
1631 : * @note The use of this type of discover is not recommended for
1632 : * discovering in ranges across multiple services/characteristics
1633 : * as it may incur in extra round trips.
1634 : */
1635 : BT_GATT_DISCOVER_DESCRIPTOR,
1636 : /** @brief Discover Attributes.
1637 : *
1638 : * Discover Attributes of any type.
1639 : *
1640 : * @note The use of this type of discover is not recommended for
1641 : * discovering in ranges across multiple services/characteristics
1642 : * as it may incur in more round trips.
1643 : */
1644 : BT_GATT_DISCOVER_ATTRIBUTE,
1645 : /** @brief Discover standard characteristic descriptor values.
1646 : *
1647 : * Discover standard characteristic descriptor values and their
1648 : * properties.
1649 : * Supported descriptors:
1650 : * - Characteristic Extended Properties
1651 : * - Client Characteristic Configuration
1652 : * - Server Characteristic Configuration
1653 : * - Characteristic Presentation Format
1654 : */
1655 : BT_GATT_DISCOVER_STD_CHAR_DESC,
1656 : };
1657 :
1658 : /** Handle value to denote that the CCC will be automatically discovered */
1659 1 : #define BT_GATT_AUTO_DISCOVER_CCC_HANDLE 0x0000U
1660 :
1661 : /** @brief GATT Discover Attributes parameters */
1662 1 : struct bt_gatt_discover_params {
1663 : /** Discover UUID type */
1664 1 : const struct bt_uuid *uuid;
1665 : /** Discover attribute callback */
1666 1 : bt_gatt_discover_func_t func;
1667 : union {
1668 : struct {
1669 : /** Include service attribute declaration handle */
1670 1 : uint16_t attr_handle;
1671 : /** Included service start handle */
1672 1 : uint16_t start_handle;
1673 : /** Included service end handle */
1674 1 : uint16_t end_handle;
1675 : } _included;
1676 : /** Discover start handle */
1677 : uint16_t start_handle;
1678 0 : };
1679 : /** Discover end handle */
1680 : uint16_t end_handle;
1681 : /** Discover type */
1682 1 : uint8_t type;
1683 : #if defined(CONFIG_BT_GATT_AUTO_DISCOVER_CCC) || defined(__DOXYGEN__)
1684 : /** Only for stack-internal use, used for automatic discovery. */
1685 1 : struct bt_gatt_subscribe_params *sub_params;
1686 : #endif /* defined(CONFIG_BT_GATT_AUTO_DISCOVER_CCC) || defined(__DOXYGEN__) */
1687 : #if defined(CONFIG_BT_EATT)
1688 0 : enum bt_att_chan_opt chan_opt;
1689 : #endif /* CONFIG_BT_EATT */
1690 : };
1691 :
1692 : /** @brief GATT Discover function
1693 : *
1694 : * This procedure is used by a client to discover attributes on a server.
1695 : *
1696 : * Primary Service Discovery: Procedure allows to discover primary services
1697 : * either by Discover All Primary Services or
1698 : * Discover Primary Services by Service UUID.
1699 : * Include Service Discovery: Procedure allows to discover all Include Services
1700 : * within specified range.
1701 : * Characteristic Discovery: Procedure allows to discover all characteristics
1702 : * within specified handle range as well as
1703 : * discover characteristics with specified UUID.
1704 : * Descriptors Discovery: Procedure allows to discover all characteristic
1705 : * descriptors within specified range.
1706 : *
1707 : * For each attribute found the callback is called which can then decide
1708 : * whether to continue discovering or stop.
1709 : *
1710 : * The Response comes in callback @p params->func. The callback is run from
1711 : * the BT RX thread. @p params must remain valid until start of callback where
1712 : * iter `attr` is `NULL` or callback will return `BT_GATT_ITER_STOP`.
1713 : *
1714 : * This function will block while the ATT request queue is full, except when
1715 : * called from the BT RX thread, as this would cause a deadlock.
1716 : *
1717 : * @param conn Connection object.
1718 : * @param params Discover parameters.
1719 : *
1720 : * @retval 0 Successfully queued request. Will call @p params->func on
1721 : * resolution.
1722 : *
1723 : * @retval -ENOMEM ATT request queue is full and blocking would cause deadlock.
1724 : * Allow a pending request to resolve before retrying, or call this function
1725 : * outside the BT RX thread to get blocking behavior. Queue size is controlled
1726 : * by @kconfig{CONFIG_BT_ATT_TX_COUNT}.
1727 : */
1728 1 : int bt_gatt_discover(struct bt_conn *conn,
1729 : struct bt_gatt_discover_params *params);
1730 :
1731 : struct bt_gatt_read_params;
1732 :
1733 : /** @typedef bt_gatt_read_func_t
1734 : * @brief Read callback function
1735 : *
1736 : * When reading using by_uuid, `params->start_handle` is the attribute handle
1737 : * for this `data` item.
1738 : *
1739 : * @param conn Connection object.
1740 : * @param err ATT error code.
1741 : * @param params Read parameters used.
1742 : * @param data Attribute value data. NULL means read has completed.
1743 : * @param length Attribute value length.
1744 : *
1745 : * @return BT_GATT_ITER_CONTINUE if should continue to the next attribute.
1746 : * @return BT_GATT_ITER_STOP to stop.
1747 : */
1748 1 : typedef uint8_t (*bt_gatt_read_func_t)(struct bt_conn *conn, uint8_t err,
1749 : struct bt_gatt_read_params *params,
1750 : const void *data, uint16_t length);
1751 :
1752 : /** @brief GATT Read parameters */
1753 1 : struct bt_gatt_read_params {
1754 : /** Read attribute callback. */
1755 1 : bt_gatt_read_func_t func;
1756 : /** If equals to 1 single.handle and single.offset are used.
1757 : * If greater than 1 multiple.handles are used.
1758 : * If equals to 0 by_uuid is used for Read Using Characteristic UUID.
1759 : */
1760 1 : size_t handle_count;
1761 : union {
1762 : struct {
1763 : /** Attribute handle. */
1764 1 : uint16_t handle;
1765 : /** Attribute data offset. */
1766 1 : uint16_t offset;
1767 0 : } single;
1768 : struct {
1769 : /** Attribute handles to read with Read Multiple
1770 : * Characteristic Values.
1771 : */
1772 1 : uint16_t *handles;
1773 : /** If true use Read Multiple Variable Length
1774 : * Characteristic Values procedure.
1775 : * The values of the set of attributes may be of
1776 : * variable or unknown length.
1777 : * If false use Read Multiple Characteristic Values
1778 : * procedure.
1779 : * The values of the set of attributes must be of a
1780 : * known fixed length, with the exception of the last
1781 : * value that can have a variable length.
1782 : */
1783 1 : bool variable;
1784 0 : } multiple;
1785 : struct {
1786 : /** First requested handle number. */
1787 1 : uint16_t start_handle;
1788 : /** Last requested handle number. */
1789 1 : uint16_t end_handle;
1790 : /** 2 or 16 octet UUID. */
1791 1 : const struct bt_uuid *uuid;
1792 0 : } by_uuid;
1793 0 : };
1794 : #if defined(CONFIG_BT_EATT)
1795 0 : enum bt_att_chan_opt chan_opt;
1796 : #endif /* CONFIG_BT_EATT */
1797 : /** Internal */
1798 : uint16_t _att_mtu;
1799 : };
1800 :
1801 : /** @brief Read Attribute Value by handle
1802 : *
1803 : * This procedure read the attribute value and return it to the callback.
1804 : *
1805 : * When reading attributes by UUID the callback can be called multiple times
1806 : * depending on how many instances of given the UUID exists with the
1807 : * start_handle being updated for each instance.
1808 : *
1809 : * To perform a GATT Long Read procedure, start with a Characteristic Value
1810 : * Read (by setting @c offset @c 0 and @c handle_count @c 1) and then return
1811 : * @ref BT_GATT_ITER_CONTINUE from the callback. This is equivalent to calling
1812 : * @ref bt_gatt_read again, but with the correct offset to continue the read.
1813 : * This may be repeated until the procedure is complete, which is signaled by
1814 : * the callback being called with @p data set to @c NULL.
1815 : *
1816 : * Note that returning @ref BT_GATT_ITER_CONTINUE is really starting a new ATT
1817 : * operation, so this can fail to allocate resources. However, all API errors
1818 : * are reported as if the server returned @ref BT_ATT_ERR_UNLIKELY. There is no
1819 : * way to distinguish between this condition and a @ref BT_ATT_ERR_UNLIKELY
1820 : * response from the server itself.
1821 : *
1822 : * Note that the effect of returning @ref BT_GATT_ITER_CONTINUE from the
1823 : * callback varies depending on the type of read operation.
1824 : *
1825 : * The Response comes in callback @p params->func. The callback is run from
1826 : * the context specified by 'config BT_RECV_CONTEXT'.
1827 : * @p params must remain valid until start of callback.
1828 : *
1829 : * This function will block while the ATT request queue is full, except when
1830 : * called from the BT RX thread, as this would cause a deadlock.
1831 : *
1832 : * @param conn Connection object.
1833 : * @param params Read parameters.
1834 : *
1835 : * @retval 0 Successfully queued request. Will call @p params->func on
1836 : * resolution.
1837 : *
1838 : * @retval -ENOMEM ATT request queue is full and blocking would cause deadlock.
1839 : * Allow a pending request to resolve before retrying, or call this function
1840 : * outside the BT RX thread to get blocking behavior. Queue size is controlled
1841 : * by @kconfig{CONFIG_BT_ATT_TX_COUNT}.
1842 : */
1843 1 : int bt_gatt_read(struct bt_conn *conn, struct bt_gatt_read_params *params);
1844 :
1845 : struct bt_gatt_write_params;
1846 :
1847 : /** @typedef bt_gatt_write_func_t
1848 : * @brief Write callback function
1849 : *
1850 : * @param conn Connection object.
1851 : * @param err ATT error code.
1852 : * @param params Write parameters used.
1853 : */
1854 1 : typedef void (*bt_gatt_write_func_t)(struct bt_conn *conn, uint8_t err,
1855 : struct bt_gatt_write_params *params);
1856 :
1857 : /** @brief GATT Write parameters */
1858 1 : struct bt_gatt_write_params {
1859 : /** Response callback */
1860 1 : bt_gatt_write_func_t func;
1861 : /** Attribute handle */
1862 1 : uint16_t handle;
1863 : /** Attribute data offset */
1864 1 : uint16_t offset;
1865 : /** Data to be written */
1866 1 : const void *data;
1867 : /** Length of the data */
1868 1 : uint16_t length;
1869 : #if defined(CONFIG_BT_EATT)
1870 0 : enum bt_att_chan_opt chan_opt;
1871 : #endif /* CONFIG_BT_EATT */
1872 : };
1873 :
1874 : /** @brief Write Attribute Value by handle
1875 : *
1876 : * The Response comes in callback @p params->func. The callback is run from
1877 : * the context specified by 'config BT_RECV_CONTEXT'.
1878 : * @p params must remain valid until start of callback.
1879 : *
1880 : * This function will block while the ATT request queue is full, except when
1881 : * called from Bluetooth event context. When called from Bluetooth context,
1882 : * this function will instead instead return `-ENOMEM` if it would block to
1883 : * avoid a deadlock.
1884 : *
1885 : * @param conn Connection object.
1886 : * @param params Write parameters.
1887 : *
1888 : * @retval 0 Successfully queued request. Will call @p params->func on
1889 : * resolution.
1890 : *
1891 : * @retval -ENOMEM ATT request queue is full and blocking would cause deadlock.
1892 : * Allow a pending request to resolve before retrying, or call this function
1893 : * outside Bluetooth event context to get blocking behavior. Queue size is
1894 : * controlled by @kconfig{CONFIG_BT_ATT_TX_COUNT}.
1895 : */
1896 1 : int bt_gatt_write(struct bt_conn *conn, struct bt_gatt_write_params *params);
1897 :
1898 : /** @brief Write Attribute Value by handle without response with callback.
1899 : *
1900 : * This function works in the same way as @ref bt_gatt_write_without_response.
1901 : * With the addition that after sending the write the callback function will be
1902 : * called.
1903 : *
1904 : * The callback is run from System Workqueue context.
1905 : * When called from the System Workqueue context this API will not wait for
1906 : * resources for the callback but instead return an error.
1907 : * The number of pending callbacks can be increased with the
1908 : * @kconfig{CONFIG_BT_CONN_TX_MAX} option.
1909 : *
1910 : * This function will block while the ATT request queue is full, except when
1911 : * called from the BT RX thread, as this would cause a deadlock.
1912 : *
1913 : * @param conn Connection object.
1914 : * @param handle Attribute handle.
1915 : * @param data Data to be written.
1916 : * @param length Data length.
1917 : * @param sign Whether to sign data
1918 : * @param func Transmission complete callback.
1919 : * @param user_data User data to be passed back to callback.
1920 : *
1921 : * @retval 0 Successfully queued request.
1922 : *
1923 : * @retval -ENOMEM ATT request queue is full and blocking would cause deadlock.
1924 : * Allow a pending request to resolve before retrying, or call this function
1925 : * outside the BT RX thread to get blocking behavior. Queue size is controlled
1926 : * by @kconfig{CONFIG_BT_ATT_TX_COUNT}.
1927 : */
1928 1 : int bt_gatt_write_without_response_cb(struct bt_conn *conn, uint16_t handle,
1929 : const void *data, uint16_t length,
1930 : bool sign, bt_gatt_complete_func_t func,
1931 : void *user_data);
1932 :
1933 : /** @brief Write Attribute Value by handle without response
1934 : *
1935 : * This procedure write the attribute value without requiring an
1936 : * acknowledgment that the write was successfully performed
1937 : *
1938 : * This function will block while the ATT request queue is full, except when
1939 : * called from the BT RX thread, as this would cause a deadlock.
1940 : *
1941 : * @param conn Connection object.
1942 : * @param handle Attribute handle.
1943 : * @param data Data to be written.
1944 : * @param length Data length.
1945 : * @param sign Whether to sign data
1946 : *
1947 : * @retval 0 Successfully queued request.
1948 : *
1949 : * @retval -ENOMEM ATT request queue is full and blocking would cause deadlock.
1950 : * Allow a pending request to resolve before retrying, or call this function
1951 : * outside the BT RX thread to get blocking behavior. Queue size is controlled
1952 : * by @kconfig{CONFIG_BT_ATT_TX_COUNT}.
1953 : */
1954 1 : static inline int bt_gatt_write_without_response(struct bt_conn *conn,
1955 : uint16_t handle, const void *data,
1956 : uint16_t length, bool sign)
1957 : {
1958 : return bt_gatt_write_without_response_cb(conn, handle, data, length,
1959 : sign, NULL, NULL);
1960 : }
1961 :
1962 : struct bt_gatt_subscribe_params;
1963 :
1964 : /** @typedef bt_gatt_notify_func_t
1965 : * @brief Notification callback function
1966 : *
1967 : * In the case of an empty notification, the @p data pointer will be non-NULL
1968 : * while the @p length will be 0, which is due to the special case where
1969 : * a @p data NULL pointer means unsubscribed.
1970 : *
1971 : * @param conn Connection object. May be NULL, indicating that the peer is
1972 : * being unpaired
1973 : * @param params Subscription parameters.
1974 : * @param data Attribute value data. If NULL then subscription was removed.
1975 : * @param length Attribute value length.
1976 : *
1977 : * @return BT_GATT_ITER_CONTINUE to continue receiving value notifications.
1978 : * BT_GATT_ITER_STOP to unsubscribe from value notifications.
1979 : */
1980 1 : typedef uint8_t (*bt_gatt_notify_func_t)(struct bt_conn *conn,
1981 : struct bt_gatt_subscribe_params *params,
1982 : const void *data, uint16_t length);
1983 :
1984 : /** @typedef bt_gatt_subscribe_func_t
1985 : * @brief Subscription callback function
1986 : *
1987 : * @param conn Connection object.
1988 : * @param err ATT error code.
1989 : * @param params Subscription parameters used.
1990 : */
1991 1 : typedef void (*bt_gatt_subscribe_func_t)(struct bt_conn *conn, uint8_t err,
1992 : struct bt_gatt_subscribe_params *params);
1993 :
1994 : /** Subscription flags */
1995 0 : enum {
1996 : /** @brief Persistence flag
1997 : *
1998 : * If set, indicates that the subscription is not saved
1999 : * on the GATT server side. Therefore, upon disconnection,
2000 : * the subscription will be automatically removed
2001 : * from the client's subscriptions list and
2002 : * when the client reconnects, it will have to
2003 : * issue a new subscription.
2004 : */
2005 : BT_GATT_SUBSCRIBE_FLAG_VOLATILE,
2006 :
2007 : /** @brief No resubscribe flag
2008 : *
2009 : * By default when BT_GATT_SUBSCRIBE_FLAG_VOLATILE is unset, the
2010 : * subscription will be automatically renewed when the client
2011 : * reconnects, as a workaround for GATT servers that do not persist
2012 : * subscriptions.
2013 : *
2014 : * This flag will disable the automatic resubscription. It is useful
2015 : * if the application layer knows that the GATT server remembers
2016 : * subscriptions from previous connections and wants to avoid renewing
2017 : * the subscriptions.
2018 : */
2019 : BT_GATT_SUBSCRIBE_FLAG_NO_RESUB,
2020 :
2021 : /** @brief Write pending flag
2022 : *
2023 : * If set, indicates write operation is pending waiting remote end to
2024 : * respond.
2025 : *
2026 : * @note Internal use only.
2027 : */
2028 : BT_GATT_SUBSCRIBE_FLAG_WRITE_PENDING,
2029 :
2030 : /** @brief Sent flag
2031 : *
2032 : * If set, indicates that a subscription request (CCC write) has
2033 : * already been sent in the active connection.
2034 : *
2035 : * Used to avoid sending subscription requests multiple times when the
2036 : * @kconfig{CONFIG_BT_GATT_AUTO_RESUBSCRIBE} quirk is enabled.
2037 : *
2038 : * @note Internal use only.
2039 : */
2040 : BT_GATT_SUBSCRIBE_FLAG_SENT,
2041 :
2042 : BT_GATT_SUBSCRIBE_NUM_FLAGS
2043 : };
2044 :
2045 : /** @brief GATT Subscribe parameters */
2046 1 : struct bt_gatt_subscribe_params {
2047 : /** Notification value callback */
2048 1 : bt_gatt_notify_func_t notify;
2049 : /** Subscribe CCC write request response callback
2050 : * If given, called with the subscription parameters given when subscribing
2051 : */
2052 1 : bt_gatt_subscribe_func_t subscribe;
2053 :
2054 : /** Subscribe value handle */
2055 1 : uint16_t value_handle;
2056 : /** Subscribe CCC handle */
2057 1 : uint16_t ccc_handle;
2058 : #if defined(CONFIG_BT_GATT_AUTO_DISCOVER_CCC) || defined(__DOXYGEN__)
2059 : /** Subscribe End handle (for automatic discovery) */
2060 1 : uint16_t end_handle;
2061 : /** Discover parameters used when ccc_handle = @ref BT_GATT_AUTO_DISCOVER_CCC_HANDLE */
2062 1 : struct bt_gatt_discover_params *disc_params;
2063 : #endif /* defined(CONFIG_BT_GATT_AUTO_DISCOVER_CCC) || defined(__DOXYGEN__) */
2064 : /** Subscribe value */
2065 1 : uint16_t value;
2066 : #if defined(CONFIG_BT_SMP)
2067 : /** Minimum required security for received notification. Notifications
2068 : * and indications received over a connection with a lower security
2069 : * level are silently discarded.
2070 : */
2071 1 : bt_security_t min_security;
2072 : #endif
2073 : /** Subscription flags */
2074 1 : ATOMIC_DEFINE(flags, BT_GATT_SUBSCRIBE_NUM_FLAGS);
2075 :
2076 0 : sys_snode_t node;
2077 : #if defined(CONFIG_BT_EATT)
2078 0 : enum bt_att_chan_opt chan_opt;
2079 : #endif /* CONFIG_BT_EATT */
2080 : };
2081 :
2082 : /** @brief Subscribe Attribute Value Notification
2083 : *
2084 : * This procedure subscribe to value notification using the Client
2085 : * Characteristic Configuration handle.
2086 : * If notification received subscribe value callback is called to return
2087 : * notified value. One may then decide whether to unsubscribe directly from
2088 : * this callback. Notification callback with NULL data will not be called if
2089 : * subscription was removed by this method.
2090 : *
2091 : * The Response comes in callback @p params->subscribe. The callback is run from
2092 : * the context specified by 'config BT_RECV_CONTEXT'.
2093 : * The Notification callback @p params->notify is also called from the BT RX
2094 : * thread.
2095 : *
2096 : * @note Notifications are asynchronous therefore the @p params must remain
2097 : * valid while subscribed and cannot be reused for additional subscriptions
2098 : * whilst active.
2099 : *
2100 : * This function will block while the ATT request queue is full, except when
2101 : * called from the BT RX thread, as this would cause a deadlock.
2102 : *
2103 : * @param conn Connection object.
2104 : * @param params Subscribe parameters.
2105 : *
2106 : * @retval 0 Successfully queued request. Will call @p params->write on
2107 : * resolution.
2108 : *
2109 : * @retval -ENOMEM ATT request queue is full and blocking would cause deadlock.
2110 : * Allow a pending request to resolve before retrying, or call this function
2111 : * outside the BT RX thread to get blocking behavior. Queue size is controlled
2112 : * by @kconfig{CONFIG_BT_ATT_TX_COUNT}.
2113 : *
2114 : * @retval -EALREADY if there already exist a subscription using the @p params.
2115 : *
2116 : * @retval -EBUSY if @p params.ccc_handle is 0 and @kconfig{CONFIG_BT_GATT_AUTO_DISCOVER_CCC} is
2117 : * enabled and discovery for the @p params is already in progress.
2118 : */
2119 1 : int bt_gatt_subscribe(struct bt_conn *conn,
2120 : struct bt_gatt_subscribe_params *params);
2121 :
2122 : /** @brief Resubscribe Attribute Value Notification subscription
2123 : *
2124 : * Resubscribe to Attribute Value Notification when already subscribed from a
2125 : * previous connection. The GATT server will remember subscription from
2126 : * previous connections when bonded, so resubscribing can be done without
2127 : * performing a new subscribe procedure after a power cycle.
2128 : *
2129 : * @note Notifications are asynchronous therefore the parameters need to
2130 : * remain valid while subscribed.
2131 : *
2132 : * @param id Local identity (in most cases BT_ID_DEFAULT).
2133 : * @param peer Remote address.
2134 : * @param params Subscribe parameters.
2135 : *
2136 : * @return 0 in case of success or negative value in case of error.
2137 : */
2138 1 : int bt_gatt_resubscribe(uint8_t id, const bt_addr_le_t *peer,
2139 : struct bt_gatt_subscribe_params *params);
2140 :
2141 : /** @brief Unsubscribe Attribute Value Notification
2142 : *
2143 : * This procedure unsubscribe to value notification using the Client
2144 : * Characteristic Configuration handle. Notification callback with NULL data
2145 : * will be called if subscription was removed by this call, until then the
2146 : * parameters cannot be reused.
2147 : *
2148 : * The Response comes in callback @p params->func. The callback is run from
2149 : * the BT RX thread.
2150 : *
2151 : * This function will block while the ATT request queue is full, except when
2152 : * called from the BT RX thread, as this would cause a deadlock.
2153 : *
2154 : * @param conn Connection object.
2155 : * @param params Subscribe parameters. The parameters shall be a @ref bt_gatt_subscribe_params from
2156 : * a previous call to bt_gatt_subscribe().
2157 : *
2158 : * @retval 0 Successfully queued request. Will call @p params->write on
2159 : * resolution.
2160 : *
2161 : * @retval -ENOMEM ATT request queue is full and blocking would cause deadlock.
2162 : * Allow a pending request to resolve before retrying, or call this function
2163 : * outside the BT RX thread to get blocking behavior. Queue size is controlled
2164 : * by @kconfig{CONFIG_BT_ATT_TX_COUNT}.
2165 : */
2166 1 : int bt_gatt_unsubscribe(struct bt_conn *conn,
2167 : struct bt_gatt_subscribe_params *params);
2168 :
2169 : /** @brief Try to cancel the first pending request identified by @p params.
2170 : *
2171 : * This function does not release @p params for reuse. The usual callbacks
2172 : * for the request still apply. A successful cancel simulates a
2173 : * #BT_ATT_ERR_UNLIKELY response from the server.
2174 : *
2175 : * This function can cancel the following request functions:
2176 : * - #bt_gatt_exchange_mtu
2177 : * - #bt_gatt_discover
2178 : * - #bt_gatt_read
2179 : * - #bt_gatt_write
2180 : * - #bt_gatt_subscribe
2181 : * - #bt_gatt_unsubscribe
2182 : *
2183 : * @param conn The connection the request was issued on.
2184 : * @param params The address `params` used in the request function call.
2185 : */
2186 1 : void bt_gatt_cancel(struct bt_conn *conn, void *params);
2187 :
2188 : /** @} */
2189 :
2190 : #ifdef __cplusplus
2191 : }
2192 : #endif
2193 :
2194 : /**
2195 : * @}
2196 : */
2197 :
2198 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_GATT_H_ */
|