1 /* USER CODE BEGIN Header */
2 /**
3   ******************************************************************************
4   * @file    aci_gatt_nwk.h
5   * @author  MCD Application Team
6   * @brief   Adaptation layer from GATT native interface to GATT network
7   *                      processor interface
8   ******************************************************************************
9   * @attention
10   *
11   * Copyright (c) 2024 STMicroelectronics.
12   * All rights reserved.
13   *
14   * This software is licensed under terms that can be found in the LICENSE file
15   * in the root directory of this software component.
16   * If no LICENSE file comes with this software, it is provided AS-IS.
17   *
18   ******************************************************************************
19   */
20 /* USER CODE END Header */
21 
22 #ifndef ACI_GATT_NWK_H
23 #define ACI_GATT_NWK_H
24 
25 /******************************************************************************
26  * Includes
27  *****************************************************************************/
28 #include "app_conf.h"
29 
30 /******************************************************************************
31  * CONSTANT SYMBOLS
32  *****************************************************************************/
33 #define ACI_GATT_WR_MAX_NUM_OF_LINK                 (CFG_BLE_NUM_RADIO_TASKS)
34 
35 /**
36  * If this bit is set, then Attribute  Modified Event is generated
37  */
38 #define GATT_SERVER_ATTR_WRITE                      (0x01U)
39 
40 #define GATT_DESCR_ACCESS_PERM_NONE                 (0x00U)
41 #define GATT_DESCR_ACCESS_PERM_READ                 (0x01U)
42 #define GATT_DESCR_ACCESS_PERM_WRITE                (0x02U)
43 #define GATT_DESCR_ACCESS_PERM_WRITE_NO_RESP        (0x04U)
44 #define GATT_DESCR_ACCESS_PERM_SIGNED_WRITE         (0x08U)
45 
46 #define GATT_AUTHOR_OP_TYPE_READ                    (0x00U)
47 #define GATT_AUTHOR_OP_TYPE_WRITE                   (0x10U)
48 #define GATT_AUTHOR_OP_TYPE_WRITE_CMD               (0x11U)
49 #define GATT_AUTHOR_OP_TYPE_PREP_WRITE              (0x12U)
50 
51 #define L2C_CID_ATTRIBUTE_PROTOCOL                  (4U)
52 
53 /******************************************************************************
54  * TYPES
55  *****************************************************************************/
56 /** Documentation for C union Service_UUID_t */
57 typedef union Service_UUID_t_s
58 {
59     /** 16-bit UUID
60      */
61     uint16_t Service_UUID_16;
62     /** 128-bit UUID
63      */
64     uint8_t Service_UUID_128[16];
65 } Service_UUID_t;
66 /** Documentation for C union Char_UUID_t */
67 typedef union Char_UUID_t_s
68 {
69     /** 16-bit UUID
70      */
71     uint16_t Char_UUID_16;
72     /** 128-bit UUID
73      */
74     uint8_t Char_UUID_128[16];
75 } Char_UUID_t;
76 /** Documentation for C union Char_Desc_Uuid_t */
77 typedef union Char_Desc_Uuid_t_s
78 {
79     /** 16-bit UUID
80      */
81     uint16_t Char_UUID_16;
82     /** 128-bit UUID
83      */
84     uint8_t Char_UUID_128[16];
85 } Char_Desc_Uuid_t;
86 /******************************************************************************
87  * FUNCTION PROTOTYPES
88  *****************************************************************************/
89 
90 /**
91  * @brief Initialize ACI GATT nwk component
92  *
93  * @param pwrq_size[in] The size of the buffer assigned to PWRQ module.
94  *
95  * @return void
96  *
97  */
98 void ACI_gatt_nwk_init(uint16_t pwrq_size);
99 
100 /**
101  * @brief Reset ACI GATT nwk component, erasing any allocated attributes and values.
102  *
103  * @return void
104  *
105  */
106 void ACI_gatt_nwk_reset(void);
107 
108 /**
109  * @brief Procedure Complete Event handler. This function is used to release the
110  * locket value buffer.
111  *
112  * @param Connection_Handle[in] The connection handle for which the Procedure
113  *                              Complete event is issued.
114  * @param CID[in] The channel ID.
115  * @param Error_Code[in] The returned error coded.
116  *
117  * @return void
118  *
119  */
120 void ACI_gatt_nwk_proc_complete(uint16_t Connection_Handle, uint16_t CID, uint8_t Error_Code);
121 
122 /**
123  * @brief Disconnection Event handler. This function is used to release the
124  * allocated resources for the given connection handle.
125  *
126  * @param Connection_Handle[in] The connection handle
127  * @param CID[in] The channel ID.
128  *
129  * @return void
130  *
131  */
132 void ACI_gatt_nwk_disconnection(uint16_t Connection_Handle, uint16_t CID);
133 
134 /**
135  * @brief Add a service to GATT Server. When a service is created in the server, the host needs to
136  * reserve the handle ranges for this service using Max_Attribute_Records parameter. This
137  * parameter specifies the maximum number of attribute records that can be added to this
138  * service (including the service attribute, include attribute, characteristic attribute,
139  * characteristic value attribute and characteristic descriptor attribute). Handle of the created
140  * service is returned in command complete event. Service declaration is taken from the service pool.
141  * The attributes for characteristics and descriptors are allocated from the attribute pool.
142  * @param Service_UUID_Type UUID type.
143  * Values:
144  * - 0x01: 16-bit UUID
145  * - 0x02: 128-bit UUID
146  * @param Service_UUID See @ref Service_UUID_t
147  * @param Service_Type Service type.
148  * Values:
149  * - 0x01: Primary Service
150  * - 0x02: Secondary Service
151  * @param Max_Attribute_Records Maximum number of attribute records that can be added to this service
152  * @param[out] Service_Handle Handle of the Service.
153  * When this service is added, a handle is allocated by the server for this service.
154  * Server also allocates a range of handles for this service from serviceHandle to <serviceHandle + max_attr_records - 1>
155  * @retval Value indicating success or error code.
156  */
157 tBleStatus aci_gatt_srv_add_service_nwk(uint8_t Service_UUID_Type,
158                                         Service_UUID_t *Service_UUID,
159                                         uint8_t Service_Type,
160                                         uint8_t Max_Attribute_Records,
161                                         uint16_t *Service_Handle);
162 /**
163  * @brief Include a service given by Included_Handle to another
164  * service given by Service_Handle. Attribute server creates an INCLUDE definition
165  * attribute and return the handle of this attribute in Included_handle.
166  * @param Service_Handle Handle of the Service to which another service has to be included.
167  * Values:
168  * - 0x0001 ... 0xFFFF
169  * @param Included_Service_Handle Attribute Handle of the Service which has to be included in service
170  * Values:
171  * - 0x0001 ... 0xFFFF
172  * @param[out] Include_Handle Handle of the include declaration
173  * @retval Value indicating success or error code.
174  */
175 tBleStatus aci_gatt_srv_include_service_nwk(uint16_t Service_Handle,
176                                             uint16_t Included_Service_Handle,
177                                             uint16_t *Include_Handle);
178 /**
179  * @brief Add a characteristic to a service.
180  * @param Service_Handle Handle of the Service to which the characteristic will be added
181  * Values:
182  * - 0x0001 ... 0xFFFF
183  * @param Char_UUID_Type UUID type.
184  * Values:
185  * - 0x01: 16-bit UUID
186  * - 0x02: 128-bit UUID
187  * @param Char_UUID See @ref Char_UUID_t
188  * @param Char_Value_Length Maximum length of the characteristic value.
189  * Values:
190  * - 0 ... 512
191  * @param Char_Properties Characteristic Properties (Volume 3, Part G, section 3.3.1.1 of Bluetooth Specification 4.1)
192  * Flags:
193  * - 0x00: CHAR_PROP_NONE
194  * - 0x01: CHAR_PROP_BROADCAST (Broadcast)
195  * - 0x02: CHAR_PROP_READ (Read)
196  * - 0x04: CHAR_PROP_WRITE_WITHOUT_RESP (Write w/o resp)
197  * - 0x08: CHAR_PROP_WRITE (Write)
198  * - 0x10: CHAR_PROP_NOTIFY (Notify)
199  * - 0x20: CHAR_PROP_INDICATE (Indicate)
200  * - 0x40: CHAR_PROP_SIGNED_WRITE (Authenticated Signed Writes)
201  * - 0x80: CHAR_PROP_EXT (Extended Properties)
202  * @param Security_Permissions Security permission flags.
203  * Flags:
204  * - 0x00: None
205  * - 0x01: AUTHEN_READ (Need authentication to read)
206  * - 0x04: ENCRY_READ (Need encryption to read)
207  * - 0x08: AUTHEN_WRITE (need authentication to write)
208  * - 0x20: ENCRY_WRITE (need encryption to write)
209  * @param GATT_Evt_Mask GATT event mask.
210  * Flags:
211  * - 0x00: GATT_DONT_NOTIFY_EVENTS
212  * - 0x01: GATT_NOTIFY_ATTRIBUTE_WRITE
213  * - 0x02: GATT_NOTIFY_WRITE_REQ_AND_WAIT_FOR_APPL_RESP
214  * - 0x04: GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP
215  * @param Enc_Key_Size Minimum encryption key size required to read the characteristic.
216  * Values:
217  * - 0x07 ... 0x10
218  * @param Is_Variable Specify if the characteristic value has a fixed length or
219  * a variable length.
220  * Values:
221  * - 0x00: Fixed length
222  * - 0x01: Variable length
223  * @param[out] Char_Handle Handle of the Characteristic that has been added.
224  * It is the handle of the characteristic declaration.
225  * The attribute that holds the characteristic value is allocated at the next handle,
226  * followed by the Client Characteristic Configuration descriptor if the characteristic
227  * has CHAR_PROP_NOTIFY or CHAR_PROP_INDICATE properties.
228  * @retval Value indicating success or error code.
229  */
230 tBleStatus aci_gatt_srv_add_char_nwk(uint16_t Service_Handle,
231                                      uint8_t Char_UUID_Type,
232                                      Char_UUID_t *Char_UUID,
233                                      uint16_t Char_Value_Length,
234                                      uint8_t Char_Properties,
235                                      uint8_t Security_Permissions,
236                                      uint8_t GATT_Evt_Mask,
237                                      uint8_t Enc_Key_Size,
238                                      uint8_t Is_Variable,
239                                      uint16_t *Char_Handle);
240 
241 /**
242  * @brief Add a characteristic descriptor to a characteristic.
243  * @param Char_Handle Handle of the characteristic to which description has to be added
244  * Values:
245  * - 0x0001 ... 0xFFFF
246  * @param Char_Desc_Uuid_Type UUID type.
247  * Values:
248  * - 0x01: 16-bit UUID
249  * - 0x02: 128-bit UUID
250  * @param Char_Desc_Uuid See @ref Char_Desc_Uuid_t
251  * @param Char_Desc_Value_Max_Len The maximum length of the descriptor value
252  * Values:
253  * - 0 ... 512
254  * @param Char_Desc_Value_Length Current Length of the characteristic descriptor value
255  * Values:
256  * - 0 ... 512
257  * @param Char_Desc_Value Value of the characteristic description
258  * @param Security_Permissions Security permission flags.
259  * Flags:
260  * - 0x00: None
261  * - 0x01: AUTHEN_READ (Need authentication to read)
262  * - 0x04: ENCRY_READ (Need encryption to read)
263  * - 0x08: AUTHEN_WRITE (need authentication to write)
264  * - 0x20: ENCRY_WRITE (need encryption to write)
265  * @param Access_Permissions Access permission
266  * Flags:
267  * - 0x00: None
268  * - 0x01: READ
269  * - 0x02: WRITE
270  * - 0x04: WRITE_WO_RESP
271  * - 0x08: SIGNED_WRITE
272  * @param GATT_Evt_Mask GATT event mask.
273  * Flags:
274  * - 0x00: GATT_DONT_NOTIFY_EVENTS
275  * - 0x01: GATT_NOTIFY_ATTRIBUTE_WRITE
276  * - 0x02: GATT_NOTIFY_WRITE_REQ_AND_WAIT_FOR_APPL_RESP
277  * - 0x04: GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP
278  * @param Enc_Key_Size Minimum encryption key size required to read the characteristic.
279  * Values:
280  * - 0x07 ... 0x10
281  * @param Is_Variable Specify if the characteristic value has a fixed length or
282  * a variable length.
283  * Values:
284  * - 0x00: Fixed length
285  * - 0x01: Variable length
286  * @param[out] Char_Desc_Handle Handle of the characteristic descriptor
287  * Values:
288  * - 0x0001 ... 0xFFFF
289  * @retval Value indicating success or error code.
290  */
291 tBleStatus aci_gatt_srv_add_char_desc_nwk(uint16_t Char_Handle,
292                                           uint8_t Char_Desc_Uuid_Type,
293                                           Char_Desc_Uuid_t *Char_Desc_Uuid,
294                                           uint16_t Char_Desc_Value_Max_Len,
295                                           uint16_t Char_Desc_Value_Length,
296                                           uint8_t Char_Desc_Value[],
297                                           uint8_t Security_Permissions,
298                                           uint8_t Access_Permissions,
299                                           uint8_t GATT_Evt_Mask,
300                                           uint8_t Enc_Key_Size,
301                                           uint8_t Is_Variable,
302                                           uint16_t *Char_Desc_Handle);
303 
304 /**
305  * @brief Update an attribute value.
306  *
307  * @param Attr_Handle Handle of the attribute
308  * Values:
309  * - 0x0001 ... 0xFFFF
310  * @param Val_Offset The offset from which the attribute value has to be updated.
311  * If this is set to 0 and the attribute value is of variable length, then the length of the attribute will be set to the Char_Value_Length.
312  * If the Val_Offset is set to a value greater than 0, then the length of the attribute will be set to the maximum length as
313  * specified for the attribute while adding the characteristic.
314  * Values:
315  * - 0 ... 511
316  * @param Value_Length Length of the attribute value in octets
317  * @param Value Attribute value
318  * @retval Value indicating success or error code.
319  */
320 tBleStatus aci_gatt_srv_write_handle_value_nwk(uint16_t Attr_Handle,
321                                                uint16_t Val_Offset,
322                                                uint16_t Value_Length,
323                                                uint8_t Value[]);
324 /**
325  * @brief Delete the specified characteristic from the service.
326  * @param Char_Handle Handle of the characteristic which has to be deleted
327  * Values:
328  * - 0x0001 ... 0xFFFF
329  * @retval Value indicating success or error code.
330  */
331 tBleStatus aci_gatt_srv_rm_char_nwk(uint16_t Char_Handle);
332 /**
333  * @brief Delete the specified service from the GATT server database.
334  * @param Serv_Handle Handle of the service to be deleted
335  * Values:
336  * - 0x0001 ... 0xFFFF
337  * @retval Value indicating success or error code.
338  */
339 tBleStatus aci_gatt_srv_rm_service_nwk(uint16_t Serv_Handle);
340 /**
341  * @brief Delete the Include definition from the service.
342  * @param Include_Handle Handle of the included service which has to be deleted
343  * Values:
344  * - 0x0001 ... 0xFFFF
345  * @retval Value indicating success or error code.
346  */
347 tBleStatus aci_gatt_srv_rm_include_service_nwk(uint16_t Include_Handle);
348 
349 /**
350  * @brief This command sets the security permission for the attribute handle specified. Currently the
351  * setting of security permission is allowed only for client configuration descriptor.
352  * @param Attr_Handle Handle of the attribute whose security permission has to be modified
353  * Values:
354  * - 0x0001 ... 0xFFFF
355  * @param Security_Permissions Security permission flags.
356  * Flags:
357  * - 0x00: None
358  * - 0x01: AUTHEN_READ (Need authentication to read)
359  * - 0x04: ENCRY_READ (Need encryption to read)
360  * - 0x08: AUTHEN_WRITE (need authentication to write)
361  * - 0x20: ENCRY_WRITE (need encryption to write)
362  * @retval Value indicating success or error code.
363  */
364 tBleStatus aci_gatt_srv_set_security_permission_nwk(uint16_t Attr_Handle,
365                                                     uint8_t Security_Permissions);
366 /**
367  * @brief Reads the value of the attribute handle specified from the local GATT database.
368  * @param Attr_Handle Handle of the attribute to read
369  * Values:
370  * - 0x0001 ... 0xFFFF
371  * @param Offset Offset from which the value needs to be read
372  * Values:
373  * - 0 ... 511
374  * @param Value_Length_Requested Maximum number of octets to be returned as attribute value
375  * Values:
376  * - 0 ... 512
377  * @param[out] Length Length of the attribute value
378  * @param[out] Value_Length Length in octets of the Value parameter
379  * @param[out] Value Attribute value
380  * @retval Value indicating success or error code.
381  */
382 tBleStatus aci_gatt_srv_read_handle_value_nwk(uint16_t Attr_Handle,
383                                               uint16_t Offset,
384                                               uint16_t Value_Length_Requested,
385                                               uint16_t *Length,
386                                               uint16_t *Value_Length,
387                                               uint8_t Value[]);
388 
389 /**
390  * @brief Reads the value for that kind of attributes that have different values
391  * for each connection, e.g. the Client Characteristic Configuration Descriptors.
392  * @param Connection_Handle Connection handle for which the attribute value will be read.
393  * @param Attr_Handle Handle of the attribute to read
394  * Values:
395  * - 0x0001 ... 0xFFFF
396  * @param[out] Value_Length Length in octets of the Value parameter.
397  * @param[out] Value Where value is stored. The length of the Value buffer should
398  *                   be at least equal to 16 octets.
399  * @retval Value indicating success or error code.
400  */
401 tBleStatus aci_gatt_srv_read_multiple_instance_handle_value_nwk(uint16_t Connection_Handle,
402                                                                 uint16_t Attr_Handle,
403                                                                 uint16_t *Value_Length,
404                                                                 uint8_t Value[]);
405 /**
406  * @brief This command sets the access permission for the attribute handle specified.
407  * @param Attr_Handle Handle of the attribute whose security permission has to be modified
408  * Values:
409  * - 0x0001 ... 0xFFFF
410  * @param Access_Permissions Access permission
411  * Values:
412  * - 0x00: None
413  * - 0x01: READ
414  * - 0x02: WRITE
415  * - 0x04: WRITE_NO_RESP
416  * - 0x08: SIGNED_WRITE
417  * @retval Value indicating success or error code.
418  */
419 tBleStatus aci_gatt_srv_set_access_permission_nwk(uint16_t Attr_Handle,
420                                                   uint8_t Access_Permissions);
421 
422 /**
423  * @brief
424  * @param Conn_Handle Connection handle to be used to identify the connection with the peer device.
425  * Values:
426  * - 0x0000 ... 0x0EFF
427  * @param Item_Index
428  * @param[out] Attr_Handle
429  * @param[out] Value_Offset
430  * @param[out] Value_Length Length in octets of the Value parameter
431  * @param[out] Value Attribute value
432  * @retval Value indicating success or error code.
433  */
434 tBleStatus aci_gatt_srv_read_prepare_queue_nwk(uint16_t Conn_Handle,
435                                                uint8_t Item_Index,
436                                                uint16_t *Attr_Handle,
437                                                uint16_t *Value_Offset,
438                                                uint16_t *Value_Length,
439                                                uint8_t Value[]);
440 /**
441  * @brief Start the procedure to write an attribute value.
442  * When the procedure is completed, a @ref aci_gatt_clt_proc_complete_event event is generated.
443  * During the procedure, @ref aci_att_clt_prepare_write_resp_event and @ref aci_att_clt_exec_write_resp_event
444  * events are raised.
445  * @param Connection_Handle Connection handle that identifies the connection.
446  * Values:
447  * - 0x0000 ... 0x0EFF
448  * @param Attr_Handle Handle of the attribute to be written
449  * Values:
450  * - 0x0001 ... 0xFFFF
451  * @param Attribute_Val_Length Length of the value to be written
452  * @param Attribute_Val Value to be written
453  * @retval Value indicating success or error code.
454  */
455 tBleStatus aci_gatt_clt_write_nwk(uint16_t Connection_Handle,
456                                   uint16_t CID,
457                                   uint16_t Attr_Handle,
458                                   uint16_t Attribute_Val_Length,
459                                   uint8_t Attribute_Val[]);
460 /**
461  * @brief Start the procedure to write a long attribute value.
462  * When the procedure is completed, a @ref aci_gatt_clt_proc_complete_event event is generated.
463  * During the procedure, @ref aci_att_clt_prepare_write_resp_event and @ref aci_att_clt_exec_write_resp_event
464  * events are raised.
465  * @param Connection_Handle Connection handle that identifies the connection.
466  * Values:
467  * - 0x0000 ... 0x0EFF
468  * @param Attr_Handle Handle of the attribute to be written
469  * Values:
470  * - 0x0001 ... 0xFFFF
471  * @param Val_Offset Offset at which the attribute has to be written
472  * Values:
473  * - 0 ... 511
474  * @param Attribute_Val_Length Length of the value to be written
475  * @param Attribute_Val Value to be written
476  * @retval Value indicating success or error code.
477  */
478 tBleStatus aci_gatt_clt_write_long_nwk(uint16_t Connection_Handle,
479                                        uint16_t CID,
480                                        uint16_t Attr_Handle,
481                                        uint16_t Val_Offset,
482                                        uint16_t Attribute_Val_Length,
483                                        uint8_t Attribute_Val[]);
484 /**
485  * @brief Start the procedure to write a characteristic reliably.
486  * When the procedure is completed, a  @ref aci_gatt_clt_proc_complete_event event is generated.
487  * During the procedure, @ref aci_att_clt_prepare_write_resp_event and @ref aci_att_clt_exec_write_resp_event
488  * events are raised.
489  * @param Connection_Handle Connection handle that identifies the connection.
490  * Values:
491  * - 0x0000 ... 0x0EFF
492  * @param Attr_Handle Handle of the attribute to be written
493  * Values:
494  * - 0x0001 ... 0xFFFF
495  * @param Val_Offset Offset at which the attribute has to be written
496  * Values:
497  * - 0 ... 511
498  * @param Attribute_Val_Length Length of the value to be written
499  * @param Attribute_Val Value to be written
500  * @retval Value indicating success or error code.
501  */
502 tBleStatus aci_gatt_clt_write_char_reliable_nwk(uint16_t Connection_Handle,
503                                                 uint16_t CID,
504                                                 uint16_t Attr_Handle,
505                                                 uint16_t Val_Offset,
506                                                 uint16_t Attribute_Val_Length,
507                                                 uint8_t Attribute_Val[]);
508 
509 /**
510  * @brief
511  * @param Conn_Handle Connection handle to be used to identify the connection with the peer device.
512  * Values:
513  * - 0x0000 ... 0x0EFF
514  * @param Attr_Handle Offset from which the value needs to be read or write
515  * Values:
516  * - 0 ... 511
517  * @param Operation_Type
518  * Values:
519  * - 0x00: Read
520  * - 0x10: Write Request
521  * - 0x11: Write Command or Signed Write Command
522  * - 0x12: Prepare Write Request
523  * @param Error_Code Offset from which the value needs to be read or write
524  * Values:
525  * - 0 ... 511
526  * @param Data_Offset Offset from which the value needs to be read or write
527  * Values:
528  * - 0 ... 511
529  * @param Data_Length Length of Data field
530  * @param Data The data that the client has requested to write
531  * @retval Value indicating success or error code.
532  */
533 tBleStatus aci_gatt_srv_authorize_resp_nwk(uint16_t Conn_Handle,
534                                            uint16_t CID,
535                                            uint16_t Attr_Handle,
536                                            uint8_t Operation_Type,
537                                            uint8_t Error_Code,
538                                            uint16_t Data_Offset,
539                                            uint16_t Data_Length,
540                                            uint8_t Data[]);
541 
542 /**
543  * @brief This event is generated if authorization is needed to access the attribute value.
544  * @ref aci_gatt_srv_authorize_resp_nwk command must be sent in response to this event.
545  * @param Conn_Handle Connection handle to be used to identify the connection with the peer device.
546  * Values:
547  * - 0x0000 ... 0x0EFF
548  * @param Attr_Handle
549  * @param Operation_Type
550  * Values:
551  * - 0x00: Read
552  * - 0x10: Write Request
553  * - 0x11: Write Command or Signed Write Command
554  * - 0x12: Prepare Write Request
555  * @param Attr_Val_Offset Offset from which the value needs to be read or write
556  * Values:
557  * - 0 ... 511
558  * @param Data_Length Length of Data field
559  * @param Data The data that the client has requested to write
560  * @retval None
561  */
562 void aci_gatt_srv_authorize_nwk_event(uint16_t Conn_Handle,
563                                       uint16_t CID,
564                                       uint16_t Attr_Handle,
565                                       uint8_t Operation_Type,
566                                       uint16_t Attr_Val_Offset,
567                                       uint8_t Data_Length,
568                                       uint8_t Data[]);
569 
570 /**
571  * @brief Response to aci_att_srv_exec_write_req_event.
572  * @param Conn_Handle Connection handle that identifies the connection.
573  *        Values:
574  *        - 0x0000 ... 0x0EFF
575  * @param Exec If 1, allow execution of queued writes. If 0 flush all queued
576  *        writes for the given connection handle.
577  *        Values:
578  *        - 0x00: FLUSH
579  *        - 0x01: EXECUTE
580  * @retval Value indicating success or error code.
581  */
582 tBleStatus aci_gatt_srv_exec_write_resp_nwk(uint16_t Conn_Handle,
583                                             uint16_t CID,
584                                             uint8_t Exec);
585 
586 #endif
587