xref: /nrf52832-nimble/packages/NimBLE-latest/nimble/host/src/ble_att_cmd_priv.h (revision 042d53a763ad75cb1465103098bb88c245d95138)
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements.  See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership.  The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License.  You may obtain a copy of the License at
9  *
10  *  http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied.  See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  */
19 
20 #ifndef H_BLE_ATT_CMD_
21 #define H_BLE_ATT_CMD_
22 
23 #include <inttypes.h>
24 #include <stddef.h>
25 #include "os/os_mbuf.h"
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 struct ble_att_hdr {
32     uint8_t opcode;
33     uint8_t data[0];
34 } __attribute__((packed));
35 
36 /**
37  * | Parameter                          | Size (octets)     |
38  * +------------------------------------+-------------------+
39  * | Attribute Opcode                   | 1                 |
40  * | Request Opcode In Error            | 1                 |
41  * | Attribute Handle In Error          | 2                 |
42  * | Error Code                         | 1                 |
43  */
44 #define BLE_ATT_ERROR_RSP_SZ             5
45 struct ble_att_error_rsp {
46     uint8_t baep_req_op;
47     uint16_t baep_handle;
48     uint8_t baep_error_code;
49 } __attribute__((packed));
50 
51 /**
52  * | Parameter                          | Size (octets)     |
53  * +------------------------------------+-------------------+
54  * | Attribute Opcode                   | 1                 |
55  * | Server Rx MTU                      | 2                 |
56  */
57 #define BLE_ATT_MTU_CMD_SZ               3
58 struct ble_att_mtu_cmd {
59     uint16_t bamc_mtu;
60 } __attribute__((packed));
61 
62 /**
63  * | Parameter                          | Size (octets)     |
64  * +------------------------------------+-------------------+
65  * | Attribute Opcode                   | 1                 |
66  * | Starting Handle                    | 2                 |
67  * | Ending Handle                      | 2                 |
68  */
69 #define BLE_ATT_FIND_INFO_REQ_SZ         5
70 struct ble_att_find_info_req {
71     uint16_t bafq_start_handle;
72     uint16_t bafq_end_handle;
73 } __attribute__((packed));
74 
75 /**
76  * | Parameter                          | Size (octets)     |
77  * +------------------------------------+-------------------+
78  * | Attribute Opcode                   | 1                 |
79  * | Format                             | 1                 |
80  * | Information Data                   | 4 to (ATT_MTU-2)  |
81  */
82 #define BLE_ATT_FIND_INFO_RSP_BASE_SZ       2
83 struct ble_att_find_info_rsp {
84     uint8_t bafp_format;
85     /* Followed by information data. */
86 } __attribute__((packed));
87 
88 #define BLE_ATT_FIND_INFO_RSP_FORMAT_16BIT   1
89 #define BLE_ATT_FIND_INFO_RSP_FORMAT_128BIT  2
90 
91 #define BLE_ATT_FIND_INFO_IDATA_16_SZ           4
92 #define BLE_ATT_FIND_INFO_IDATA_128_SZ          18
93 
94 /**
95  * | Parameter                          | Size (octets)     |
96  * +------------------------------------+-------------------+
97  * | Attribute Opcode                   | 1                 |
98  * | Starting Handle                    | 2                 |
99  * | Ending Handle                      | 2                 |
100  * | Attribute Type                     | 2                 |
101  * | Attribute Value                    | 0 to (ATT_MTU-7)  |
102  */
103 #define BLE_ATT_FIND_TYPE_VALUE_REQ_BASE_SZ   7
104 struct ble_att_find_type_value_req {
105     uint16_t bavq_start_handle;
106     uint16_t bavq_end_handle;
107     uint16_t bavq_attr_type;
108     uint16_t bavq_value[0];
109 } __attribute__((packed));
110 
111 /**
112  * | Parameter                          | Size (octets)     |
113  * +------------------------------------+-------------------+
114  * | Attribute Opcode                   | 1                 |
115  * | Information Data                   | 4 to (ATT_MTU-1)  |
116  */
117 #define BLE_ATT_FIND_TYPE_VALUE_RSP_BASE_SZ     1
118 #define BLE_ATT_FIND_TYPE_VALUE_HINFO_BASE_SZ   4
119 
120 struct ble_att_handle_group {
121         uint16_t attr_handle;
122         uint16_t group_end_handle;
123 } __attribute__((packed));
124 
125 struct ble_att_find_type_value_rsp {
126     struct ble_att_handle_group list[0];
127 } __attribute__((packed));
128 
129 /**
130  * | Parameter                          | Size (octets)     |
131  * +------------------------------------+-------------------+
132  * | Attribute Opcode                   | 1                 |
133  * | Starting Handle                    | 2                 |
134  * | Ending Handle                      | 2                 |
135  * | Attribute Type                     | 2 or 16           |
136  */
137 #define BLE_ATT_READ_TYPE_REQ_BASE_SZ   5
138 #define BLE_ATT_READ_TYPE_REQ_SZ_16     7
139 #define BLE_ATT_READ_TYPE_REQ_SZ_128    21
140 struct ble_att_read_type_req {
141     uint16_t batq_start_handle;
142     uint16_t batq_end_handle;
143     uint8_t uuid[0];
144 } __attribute__((packed));
145 
146 /**
147  * | Parameter                          | Size (octets)     |
148  * +------------------------------------+-------------------+
149  * | Attribute Opcode                   | 1                 |
150  * | Length                             | 1                 |
151  * | Attribute Data List                | 2 to (ATT_MTU-2)  |
152  */
153 #define BLE_ATT_READ_TYPE_RSP_BASE_SZ       2
154 
155 struct ble_att_attr_data_list {
156     uint16_t handle;
157     uint8_t value[0];
158 } __attribute__((packed));
159 
160 struct ble_att_read_type_rsp {
161     uint8_t batp_length;
162     struct ble_att_attr_data_list batp_list[0];
163 } __attribute__((packed));
164 
165 #define BLE_ATT_READ_TYPE_ADATA_BASE_SZ     2
166 #define BLE_ATT_READ_TYPE_ADATA_SZ_16       6
167 #define BLE_ATT_READ_TYPE_ADATA_SZ_128      20
168 
169 /**
170  * | Parameter                          | Size (octets)     |
171  * +------------------------------------+-------------------+
172  * | Attribute Opcode                   | 1                 |
173  * | Attribute Handle                   | 2                 |
174  */
175 #define BLE_ATT_READ_REQ_SZ              3
176 struct ble_att_read_req {
177     uint16_t barq_handle;
178 } __attribute__((packed));
179 
180 /**
181  * | Parameter                          | Size (octets)     |
182  * +------------------------------------+-------------------+
183  * | Attribute Opcode                   | 1                 |
184  * | Attribute Value                    | 0 to (ATT_MTU-1)  |
185  */
186 #define BLE_ATT_READ_RSP_BASE_SZ        1
187 
188 /**
189  * | Parameter                          | Size (octets)     |
190  * +------------------------------------+-------------------+
191  * | Attribute Opcode                   | 1                 |
192  * | Attribute Handle                   | 2                 |
193  * | Value Offset                       | 2                 |
194  */
195 #define BLE_ATT_READ_BLOB_REQ_SZ        5
196 struct ble_att_read_blob_req {
197     uint16_t babq_handle;
198     uint16_t babq_offset;
199 } __attribute__((packed));
200 
201 /**
202  * | Parameter                          | Size (octets)     |
203  * +------------------------------------+-------------------+
204  * | Attribute Opcode                   | 1                 |
205  * | Attribute Value                    | 0 to (ATT_MTU-1)  |
206  */
207 #define BLE_ATT_READ_BLOB_RSP_BASE_SZ   1
208 
209 /**
210  * | Parameter                          | Size (octets)     |
211  * +------------------------------------+-------------------+
212  * | Attribute Opcode                   | 1                 |
213  * | Set Of Handles                     | 4 to (ATT_MTU-1)  |
214  */
215 #define BLE_ATT_READ_MULT_REQ_BASE_SZ   1
216 struct ble_att_read_mult_req {
217         uint16_t handles[0];
218 } __attribute__((packed));
219 
220 /**
221  * | Parameter                          | Size (octets)     |
222  * +------------------------------------+-------------------+
223  * | Attribute Opcode                   | 1                 |
224  * | Set Of Values                      | 4 to (ATT_MTU-1)  |
225  */
226 #define BLE_ATT_READ_MULT_RSP_BASE_SZ   1
227 
228 /**
229  * | Parameter                          | Size (octets)     |
230  * +------------------------------------+-------------------+
231  * | Attribute Opcode                   | 1                 |
232  * | Starting Handle                    | 2                 |
233  * | Ending Handle                      | 2                 |
234  * | Attribute Group Type               | 2 or 16           |
235  */
236 #define BLE_ATT_READ_GROUP_TYPE_REQ_BASE_SZ  5
237 #define BLE_ATT_READ_GROUP_TYPE_REQ_SZ_16    7
238 #define BLE_ATT_READ_GROUP_TYPE_REQ_SZ_128   21
239 struct ble_att_read_group_type_req {
240     uint16_t bagq_start_handle;
241     uint16_t bagq_end_handle;
242     uint8_t uuid[0];
243 } __attribute__((packed));
244 
245 /**
246  * | Parameter                          | Size (octets)     |
247  * +------------------------------------+-------------------+
248  * | Attribute Opcode                   | 1                 |
249  * | Length                             | 1                 |
250  * | Attribute Data List                | 2 to (ATT_MTU-2)  |
251  */
252 #define BLE_ATT_READ_GROUP_TYPE_RSP_BASE_SZ  2
253 struct ble_att_read_group_type_rsp {
254     uint8_t bagp_length;
255 } __attribute__((packed));
256 
257 #define BLE_ATT_READ_GROUP_TYPE_ADATA_BASE_SZ   4
258 #define BLE_ATT_READ_GROUP_TYPE_ADATA_SZ_16     6
259 #define BLE_ATT_READ_GROUP_TYPE_ADATA_SZ_128    20
260 
261 /**
262  * | Parameter                          | Size (octets)     |
263  * +------------------------------------+-------------------+
264  * | Attribute Opcode                   | 1                 |
265  * | Attribute Handle                   | 2                 |
266  * | Attribute Value                    | 0 to (ATT_MTU-3)  |
267  */
268 #define BLE_ATT_WRITE_REQ_BASE_SZ       3
269 struct ble_att_write_req {
270     uint16_t bawq_handle;
271     uint8_t value[0];
272 } __attribute__((packed));
273 
274 #define BLE_ATT_WRITE_RSP_SZ            1
275 
276 /**
277  * | Parameter                          | Size (octets)     |
278  * +------------------------------------+-------------------+
279  * | Attribute Opcode                   | 1                 |
280  * | Attribute Handle                   | 2                 |
281  * | Value Offset                       | 2                 |
282  * | Part Attribute Value               | 0 to (ATT_MTU-5)  |
283  */
284 #define BLE_ATT_PREP_WRITE_CMD_BASE_SZ  5
285 struct ble_att_prep_write_cmd {
286     uint16_t bapc_handle;
287     uint16_t bapc_offset;
288     uint16_t bapc_value[0];
289 } __attribute__((packed));
290 
291 /**
292  * | Parameter                          | Size (octets)     |
293  * +------------------------------------+-------------------+
294  * | Attribute Opcode                   | 1                 |
295  * | Flags                              | 1                 |
296  */
297 #define BLE_ATT_EXEC_WRITE_REQ_SZ       2
298 struct ble_att_exec_write_req {
299     uint8_t baeq_flags;
300 } __attribute__((packed));
301 
302 #define BLE_ATT_EXEC_WRITE_F_CANCEL     0x00
303 #define BLE_ATT_EXEC_WRITE_F_EXECUTE    0x01
304 
305 /**
306  * | Parameter                          | Size (octets)     |
307  * +------------------------------------+-------------------+
308  * | Attribute Opcode                   | 1                 |
309  */
310 #define BLE_ATT_EXEC_WRITE_RSP_SZ       1
311 
312 /**
313  * | Parameter                          | Size (octets)     |
314  * +------------------------------------+-------------------+
315  * | Attribute Opcode                   | 1                 |
316  * | Attribute Handle                   | 2                 |
317  * | Attribute Value                    | 0 to (ATT_MTU-3)  |
318  */
319 #define BLE_ATT_NOTIFY_REQ_BASE_SZ      3
320 struct ble_att_notify_req {
321     uint16_t banq_handle;
322 } __attribute__((packed));
323 
324 /**
325  * | Parameter                          | Size (octets)     |
326  * +------------------------------------+-------------------+
327  * | Attribute Opcode                   | 1                 |
328  * | Attribute Handle                   | 2                 |
329  * | Attribute Value                    | 0 to (ATT_MTU-3)  |
330  */
331 #define BLE_ATT_INDICATE_REQ_BASE_SZ    3
332 struct ble_att_indicate_req {
333     uint16_t baiq_handle;
334 } __attribute__((packed));
335 
336 /**
337  * | Parameter                          | Size (octets)     |
338  * +------------------------------------+-------------------+
339  * | Attribute Opcode                   | 1                 |
340  */
341 #define BLE_ATT_INDICATE_RSP_SZ         1
342 
343 /**
344  * | Parameter                          | Size (octets)     |
345  * +------------------------------------+-------------------+
346  * | Attribute Opcode                   | 1                 |
347  * | Attribute Handle                   | 2                 |
348  * | Attribute Value                    | 0 to (ATT_MTU-3)  |
349  */
350 #define BLE_ATT_WRITE_CMD_BASE_SZ       3
351 struct ble_att_write_cmd {
352     uint16_t handle;
353     uint8_t value[0];
354 } __attribute__((packed));
355 
356 void ble_att_error_rsp_parse(const void *payload, int len,
357                              struct ble_att_error_rsp *rsp);
358 void ble_att_error_rsp_write(void *payload, int len,
359                              const struct ble_att_error_rsp *rsp);
360 void ble_att_error_rsp_log(const struct ble_att_error_rsp *cmd);
361 void ble_att_mtu_req_parse(const void *payload, int len,
362                            struct ble_att_mtu_cmd *cmd);
363 void ble_att_mtu_req_write(void *payload, int len,
364                            const struct ble_att_mtu_cmd *cmd);
365 void ble_att_mtu_rsp_parse(const void *payload, int len,
366                            struct ble_att_mtu_cmd *cmd);
367 void ble_att_mtu_rsp_write(void *payload, int len,
368                            const struct ble_att_mtu_cmd *cmd);
369 void ble_att_mtu_cmd_log(const struct ble_att_mtu_cmd *cmd);
370 void ble_att_find_info_req_parse(const void *payload, int len,
371                                  struct ble_att_find_info_req *req);
372 void ble_att_find_info_req_write(void *payload, int len,
373                                  const struct ble_att_find_info_req *req);
374 void ble_att_find_info_req_log(const struct ble_att_find_info_req *cmd);
375 void ble_att_find_info_rsp_parse(const void *payload, int len,
376                                  struct ble_att_find_info_rsp *rsp);
377 void ble_att_find_info_rsp_write(void *payload, int len,
378                                  const struct ble_att_find_info_rsp *rsp);
379 void ble_att_find_info_rsp_log(const struct ble_att_find_info_rsp *cmd);
380 void ble_att_find_type_value_req_parse(
381     const void *payload, int len, struct ble_att_find_type_value_req *req);
382 void ble_att_find_type_value_req_write(
383     void *payload, int len, const struct ble_att_find_type_value_req *req);
384 void ble_att_find_type_value_req_log(
385     const struct ble_att_find_type_value_req *cmd);
386 void ble_att_read_type_req_parse(const void *payload, int len,
387                                  struct ble_att_read_type_req *req);
388 void ble_att_read_type_req_write(void *payload, int len,
389                                  const struct ble_att_read_type_req *req);
390 void ble_att_read_type_req_log(const struct ble_att_read_type_req *cmd);
391 void ble_att_read_type_rsp_parse(const void *payload, int len,
392                                  struct ble_att_read_type_rsp *rsp);
393 void ble_att_read_type_rsp_write(void *payload, int len,
394                                  const struct ble_att_read_type_rsp *rsp);
395 void ble_att_read_type_rsp_log(const struct ble_att_read_type_rsp *cmd);
396 void ble_att_read_req_parse(const void *payload, int len,
397                             struct ble_att_read_req *req);
398 void ble_att_read_req_write(void *payload, int len,
399                             const struct ble_att_read_req *req);
400 void ble_att_read_req_log(const struct ble_att_read_req *cmd);
401 void ble_att_read_blob_req_parse(const void *payload, int len,
402                                  struct ble_att_read_blob_req *req);
403 void ble_att_read_blob_req_write(void *payload, int len,
404                                  const struct ble_att_read_blob_req *req);
405 void ble_att_read_blob_req_log(const struct ble_att_read_blob_req *cmd);
406 void ble_att_read_mult_req_parse(const void *payload, int len);
407 void ble_att_read_mult_req_write(void *payload, int len);
408 void ble_att_read_mult_rsp_parse(const void *payload, int len);
409 void ble_att_read_mult_rsp_write(void *payload, int len);
410 void ble_att_read_group_type_req_parse(
411     const void *payload, int len, struct ble_att_read_group_type_req *req);
412 void ble_att_read_group_type_req_write(
413     void *payload, int len, const struct ble_att_read_group_type_req *req);
414 void ble_att_read_group_type_req_log(
415     const struct ble_att_read_group_type_req *cmd);
416 void ble_att_read_group_type_rsp_parse(
417     const void *payload, int len, struct ble_att_read_group_type_rsp *rsp);
418 void ble_att_read_group_type_rsp_write(
419     void *payload, int len, const struct ble_att_read_group_type_rsp *rsp);
420 void ble_att_read_group_type_rsp_log(
421     const struct ble_att_read_group_type_rsp *cmd);
422 void ble_att_write_req_parse(const void *payload, int len,
423                              struct ble_att_write_req *req);
424 void ble_att_write_req_write(void *payload, int len,
425                              const struct ble_att_write_req *req);
426 void ble_att_write_cmd_parse(const void *payload, int len,
427                              struct ble_att_write_req *req);
428 void ble_att_write_cmd_write(void *payload, int len,
429                              const struct ble_att_write_req *req);
430 void ble_att_write_cmd_log(const struct ble_att_write_cmd *cmd);
431 void ble_att_write_req_log(const struct ble_att_write_req *req);
432 void ble_att_prep_write_req_parse(const void *payload, int len,
433                                   struct ble_att_prep_write_cmd *cmd);
434 void ble_att_prep_write_req_write(void *payload, int len,
435                                   const struct ble_att_prep_write_cmd *cmd);
436 void ble_att_prep_write_cmd_log(const struct ble_att_prep_write_cmd *cmd);
437 void ble_att_prep_write_rsp_parse(const void *payload, int len,
438                                   struct ble_att_prep_write_cmd *cmd);
439 void ble_att_prep_write_rsp_write(void *payload, int len,
440                                   const struct ble_att_prep_write_cmd *cmd);
441 void ble_att_exec_write_req_parse(const void *payload, int len,
442                                   struct ble_att_exec_write_req *req);
443 void ble_att_exec_write_req_log(const struct ble_att_exec_write_req *cmd);
444 void ble_att_exec_write_req_write(void *payload, int len,
445                                   const struct ble_att_exec_write_req *req);
446 void ble_att_exec_write_rsp_parse(const void *payload, int len);
447 void ble_att_exec_write_rsp_write(void *payload, int len);
448 void ble_att_notify_req_parse(const void *payload, int len,
449                               struct ble_att_notify_req *req);
450 void ble_att_notify_req_write(void *payload, int len,
451                               const struct ble_att_notify_req *req);
452 void ble_att_notify_req_log(const struct ble_att_notify_req *cmd);
453 void ble_att_indicate_req_parse(const void *payload, int len,
454                                 struct ble_att_indicate_req *req);
455 void ble_att_indicate_req_write(void *payload, int len,
456                                 const struct ble_att_indicate_req *req);
457 void ble_att_indicate_rsp_parse(const void *payload, int len);
458 void ble_att_indicate_rsp_write(void *payload, int len);
459 void ble_att_indicate_req_log(const struct ble_att_indicate_req *cmd);
460 
461 void *ble_att_cmd_prepare(uint8_t opcode, size_t len, struct os_mbuf *txom);
462 void *ble_att_cmd_get(uint8_t opcode, size_t len, struct os_mbuf **txom);
463 int ble_att_tx(uint16_t conn_handle, struct os_mbuf *txom);
464 
465 #ifdef __cplusplus
466 }
467 #endif
468 
469 #endif
470