xref: /nrf52832-nimble/packages/NimBLE-latest/nimble/host/src/ble_att_cmd.c (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 #include <errno.h>
21 #include <string.h>
22 #include "os/os.h"
23 #include "nimble/ble.h"
24 #include "ble_hs_priv.h"
25 #include "host/ble_att.h"
26 #include "host/ble_uuid.h"
27 #include "ble_hs_priv.h"
28 
29 void *
ble_att_cmd_prepare(uint8_t opcode,size_t len,struct os_mbuf * txom)30 ble_att_cmd_prepare(uint8_t opcode, size_t len, struct os_mbuf *txom)
31 {
32     struct ble_att_hdr *hdr;
33 
34     if (os_mbuf_extend(txom, sizeof(*hdr) + len) == NULL) {
35         os_mbuf_free_chain(txom);
36         return NULL;
37     }
38 
39     hdr = (struct ble_att_hdr *)(txom)->om_data;
40 
41     hdr->opcode = opcode;
42 
43     return hdr->data;
44 }
45 
46 void *
ble_att_cmd_get(uint8_t opcode,size_t len,struct os_mbuf ** txom)47 ble_att_cmd_get(uint8_t opcode, size_t len, struct os_mbuf **txom)
48 {
49     *txom = ble_hs_mbuf_l2cap_pkt();
50     if (*txom == NULL) {
51         return NULL;
52     }
53 
54     return ble_att_cmd_prepare(opcode, len, *txom);
55 }
56 
57 int
ble_att_tx(uint16_t conn_handle,struct os_mbuf * txom)58 ble_att_tx(uint16_t conn_handle, struct os_mbuf *txom)
59 {
60     struct ble_l2cap_chan *chan;
61     struct ble_hs_conn *conn;
62     int rc;
63 
64     BLE_HS_DBG_ASSERT_EVAL(txom->om_len >= 1);
65     ble_att_inc_tx_stat(txom->om_data[0]);
66 
67     ble_hs_lock();
68 
69     ble_hs_misc_conn_chan_find_reqd(conn_handle, BLE_L2CAP_CID_ATT, &conn,
70                                     &chan);
71     if (chan == NULL) {
72         os_mbuf_free_chain(txom);
73         rc = BLE_HS_ENOTCONN;
74     } else {
75         ble_att_truncate_to_mtu(chan, txom);
76         rc = ble_l2cap_tx(conn, chan, txom);
77     }
78 
79     ble_hs_unlock();
80 
81     return rc;
82 }
83 
84 static const void *
ble_att_init_parse(uint8_t op,const void * payload,int min_len,int actual_len)85 ble_att_init_parse(uint8_t op, const void *payload,
86                    int min_len, int actual_len)
87 {
88     const uint8_t *u8ptr;
89 
90     BLE_HS_DBG_ASSERT(actual_len >= min_len);
91 
92     u8ptr = payload;
93     BLE_HS_DBG_ASSERT(u8ptr[0] == op);
94 
95     return u8ptr + 1;
96 }
97 
98 static void *
ble_att_init_write(uint8_t op,void * payload,int min_len,int actual_len)99 ble_att_init_write(uint8_t op, void *payload, int min_len, int actual_len)
100 {
101     uint8_t *u8ptr;
102 
103     BLE_HS_DBG_ASSERT(actual_len >= min_len);
104 
105     u8ptr = payload;
106     u8ptr[0] = op;
107 
108     return u8ptr + 1;
109 }
110 
111 void
ble_att_error_rsp_parse(const void * payload,int len,struct ble_att_error_rsp * dst)112 ble_att_error_rsp_parse(const void *payload, int len,
113                         struct ble_att_error_rsp *dst)
114 {
115     const struct ble_att_error_rsp *src;
116 
117     src = ble_att_init_parse(BLE_ATT_OP_ERROR_RSP, payload,
118                              BLE_ATT_ERROR_RSP_SZ, len);
119 
120     dst->baep_req_op = src->baep_req_op;
121     dst->baep_handle = le16toh(src->baep_handle);
122     dst->baep_error_code = src->baep_error_code;
123 }
124 
125 void
ble_att_error_rsp_write(void * payload,int len,const struct ble_att_error_rsp * src)126 ble_att_error_rsp_write(void *payload, int len,
127                         const struct ble_att_error_rsp *src)
128 {
129     struct ble_att_error_rsp *dst;
130 
131     dst = ble_att_init_write(BLE_ATT_OP_ERROR_RSP, payload,
132                              BLE_ATT_ERROR_RSP_SZ, len);
133 
134     dst->baep_req_op = src->baep_req_op;
135     dst->baep_handle = htole16(src->baep_handle);
136     dst->baep_error_code = src->baep_error_code;
137 }
138 
139 void
ble_att_error_rsp_log(const struct ble_att_error_rsp * cmd)140 ble_att_error_rsp_log(const struct ble_att_error_rsp *cmd)
141 {
142     BLE_HS_LOG(DEBUG, "req_op=%d handle=0x%04x error_code=%d",
143                cmd->baep_req_op, cmd->baep_handle, cmd->baep_error_code);
144 }
145 
146 void
ble_att_mtu_req_parse(const void * payload,int len,struct ble_att_mtu_cmd * dst)147 ble_att_mtu_req_parse(const void *payload, int len,
148                       struct ble_att_mtu_cmd *dst)
149 {
150     const struct ble_att_mtu_cmd *src;
151 
152     src = ble_att_init_parse(BLE_ATT_OP_MTU_REQ, payload, BLE_ATT_MTU_CMD_SZ,
153                              len);
154 
155     dst->bamc_mtu = le16toh(src->bamc_mtu);
156 }
157 
158 void
ble_att_mtu_rsp_parse(const void * payload,int len,struct ble_att_mtu_cmd * dst)159 ble_att_mtu_rsp_parse(const void *payload, int len,
160                       struct ble_att_mtu_cmd *dst)
161 {
162     const struct ble_att_mtu_cmd *src;
163 
164     src = ble_att_init_parse(BLE_ATT_OP_MTU_RSP, payload, BLE_ATT_MTU_CMD_SZ,
165                              len);
166 
167     dst->bamc_mtu = le16toh(src->bamc_mtu);
168 }
169 
170 void
ble_att_mtu_req_write(void * payload,int len,const struct ble_att_mtu_cmd * src)171 ble_att_mtu_req_write(void *payload, int len,
172                       const struct ble_att_mtu_cmd *src)
173 {
174     struct ble_att_mtu_cmd *dst;
175 
176     dst = ble_att_init_write(BLE_ATT_OP_MTU_REQ, payload,
177                              BLE_ATT_MTU_CMD_SZ, len);
178 
179     dst->bamc_mtu = htole16(src->bamc_mtu);
180 }
181 
182 void
ble_att_mtu_rsp_write(void * payload,int len,const struct ble_att_mtu_cmd * src)183 ble_att_mtu_rsp_write(void *payload, int len,
184                       const struct ble_att_mtu_cmd *src)
185 {
186     struct ble_att_mtu_cmd *dst;
187 
188     dst = ble_att_init_write(BLE_ATT_OP_MTU_RSP, payload,
189                              BLE_ATT_MTU_CMD_SZ, len);
190     dst->bamc_mtu = htole16(src->bamc_mtu);
191 }
192 
193 void
ble_att_mtu_cmd_log(const struct ble_att_mtu_cmd * cmd)194 ble_att_mtu_cmd_log(const struct ble_att_mtu_cmd *cmd)
195 {
196     BLE_HS_LOG(DEBUG, "mtu=%d", cmd->bamc_mtu);
197 }
198 
199 void
ble_att_find_info_req_parse(const void * payload,int len,struct ble_att_find_info_req * dst)200 ble_att_find_info_req_parse(const void *payload, int len,
201                             struct ble_att_find_info_req *dst)
202 {
203     const struct ble_att_find_info_req *src;
204 
205     src = ble_att_init_parse(BLE_ATT_OP_FIND_INFO_REQ, payload,
206                              BLE_ATT_FIND_INFO_REQ_SZ, len);
207 
208     dst->bafq_start_handle = le16toh(src->bafq_start_handle);
209     dst->bafq_end_handle = le16toh(src->bafq_end_handle);
210 }
211 
212 void
ble_att_find_info_req_write(void * payload,int len,const struct ble_att_find_info_req * src)213 ble_att_find_info_req_write(void *payload, int len,
214                             const struct ble_att_find_info_req *src)
215 {
216     struct ble_att_find_info_req *dst;
217 
218     dst = ble_att_init_write(BLE_ATT_OP_FIND_INFO_REQ, payload,
219                              BLE_ATT_FIND_INFO_REQ_SZ, len);
220 
221     dst->bafq_start_handle = htole16(src->bafq_start_handle);
222     dst->bafq_end_handle = htole16(src->bafq_end_handle);
223 }
224 
225 void
ble_att_find_info_req_log(const struct ble_att_find_info_req * cmd)226 ble_att_find_info_req_log(const struct ble_att_find_info_req *cmd)
227 {
228     BLE_HS_LOG(DEBUG, "start_handle=0x%04x end_handle=0x%04x",
229                cmd->bafq_start_handle, cmd->bafq_end_handle);
230 }
231 
232 void
ble_att_find_info_rsp_parse(const void * payload,int len,struct ble_att_find_info_rsp * dst)233 ble_att_find_info_rsp_parse(const void *payload, int len,
234                             struct ble_att_find_info_rsp *dst)
235 {
236     const struct ble_att_find_info_rsp *src;
237 
238     src = ble_att_init_parse(BLE_ATT_OP_FIND_INFO_RSP, payload,
239                              BLE_ATT_FIND_INFO_RSP_BASE_SZ, len);
240 
241     dst->bafp_format = src->bafp_format;
242 }
243 
244 void
ble_att_find_info_rsp_write(void * payload,int len,const struct ble_att_find_info_rsp * src)245 ble_att_find_info_rsp_write(void *payload, int len,
246                             const struct ble_att_find_info_rsp *src)
247 {
248     struct ble_att_find_info_rsp *dst;
249 
250     dst = ble_att_init_write(BLE_ATT_OP_FIND_INFO_RSP, payload,
251                              BLE_ATT_FIND_INFO_RSP_BASE_SZ, len);
252 
253     dst->bafp_format = src->bafp_format;
254 }
255 
256 void
ble_att_find_info_rsp_log(const struct ble_att_find_info_rsp * cmd)257 ble_att_find_info_rsp_log(const struct ble_att_find_info_rsp *cmd)
258 {
259     BLE_HS_LOG(DEBUG, "format=%d", cmd->bafp_format);
260 }
261 
262 void
ble_att_find_type_value_req_parse(const void * payload,int len,struct ble_att_find_type_value_req * dst)263 ble_att_find_type_value_req_parse(const void *payload, int len,
264                                   struct ble_att_find_type_value_req *dst)
265 {
266     const struct ble_att_find_type_value_req *src;
267 
268     src = ble_att_init_parse(BLE_ATT_OP_FIND_TYPE_VALUE_REQ, payload,
269                              BLE_ATT_FIND_TYPE_VALUE_REQ_BASE_SZ, len);
270 
271     dst->bavq_start_handle = le16toh(src->bavq_start_handle);
272     dst->bavq_end_handle = le16toh(src->bavq_end_handle);
273     dst->bavq_attr_type = le16toh(src->bavq_attr_type);
274 }
275 
276 void
ble_att_find_type_value_req_write(void * payload,int len,const struct ble_att_find_type_value_req * src)277 ble_att_find_type_value_req_write(
278     void *payload, int len, const struct ble_att_find_type_value_req *src)
279 {
280     struct ble_att_find_type_value_req *dst;
281 
282     dst = ble_att_init_write(BLE_ATT_OP_FIND_TYPE_VALUE_REQ, payload,
283                              BLE_ATT_FIND_TYPE_VALUE_REQ_BASE_SZ, len);
284 
285     dst->bavq_start_handle = htole16(src->bavq_start_handle);
286     dst->bavq_end_handle = htole16(src->bavq_end_handle);
287     dst->bavq_attr_type = htole16(src->bavq_attr_type);
288 }
289 
290 void
ble_att_find_type_value_req_log(const struct ble_att_find_type_value_req * cmd)291 ble_att_find_type_value_req_log(const struct ble_att_find_type_value_req *cmd)
292 {
293     BLE_HS_LOG(DEBUG, "start_handle=0x%04x end_handle=0x%04x attr_type=%d",
294                cmd->bavq_start_handle, cmd->bavq_end_handle,
295                cmd->bavq_attr_type);
296 }
297 
298 void
ble_att_read_type_req_parse(const void * payload,int len,struct ble_att_read_type_req * dst)299 ble_att_read_type_req_parse(const void *payload, int len,
300                             struct ble_att_read_type_req *dst)
301 {
302     const struct ble_att_read_type_req *src;
303 
304     src = ble_att_init_parse(BLE_ATT_OP_READ_TYPE_REQ, payload,
305                              BLE_ATT_READ_TYPE_REQ_BASE_SZ, len);
306 
307     dst->batq_start_handle = le16toh(src->batq_start_handle);
308     dst->batq_end_handle = le16toh(src->batq_end_handle);
309 }
310 
311 void
ble_att_read_type_req_write(void * payload,int len,const struct ble_att_read_type_req * src)312 ble_att_read_type_req_write(void *payload, int len,
313                             const struct ble_att_read_type_req *src)
314 {
315     struct ble_att_read_type_req *dst;
316 
317     dst = ble_att_init_write(BLE_ATT_OP_READ_TYPE_REQ, payload,
318                              BLE_ATT_READ_TYPE_REQ_BASE_SZ, len);
319 
320     dst->batq_start_handle = htole16(src->batq_start_handle);
321     dst->batq_end_handle = htole16(src->batq_end_handle);
322 }
323 
324 void
ble_att_read_type_req_log(const struct ble_att_read_type_req * cmd)325 ble_att_read_type_req_log(const struct ble_att_read_type_req *cmd)
326 {
327     BLE_HS_LOG(DEBUG, "start_handle=0x%04x end_handle=0x%04x",
328                cmd->batq_start_handle, cmd->batq_end_handle);
329 }
330 
331 void
ble_att_read_type_rsp_parse(const void * payload,int len,struct ble_att_read_type_rsp * dst)332 ble_att_read_type_rsp_parse(const void *payload, int len,
333                             struct ble_att_read_type_rsp *dst)
334 {
335     const struct ble_att_read_type_rsp *src;
336 
337     src = ble_att_init_parse(BLE_ATT_OP_READ_TYPE_RSP, payload,
338                              BLE_ATT_READ_TYPE_RSP_BASE_SZ, len);
339 
340     dst->batp_length = src->batp_length;
341 }
342 
343 void
ble_att_read_type_rsp_write(void * payload,int len,const struct ble_att_read_type_rsp * src)344 ble_att_read_type_rsp_write(void *payload, int len,
345                             const struct ble_att_read_type_rsp *src)
346 {
347     struct ble_att_read_type_rsp *dst;
348 
349     dst = ble_att_init_write(BLE_ATT_OP_READ_TYPE_RSP, payload,
350                              BLE_ATT_READ_TYPE_RSP_BASE_SZ, len);
351 
352     dst->batp_length = src->batp_length;
353 }
354 
355 void
ble_att_read_type_rsp_log(const struct ble_att_read_type_rsp * cmd)356 ble_att_read_type_rsp_log(const struct ble_att_read_type_rsp *cmd)
357 {
358     BLE_HS_LOG(DEBUG, "length=%d", cmd->batp_length);
359 }
360 
361 void
ble_att_read_req_parse(const void * payload,int len,struct ble_att_read_req * dst)362 ble_att_read_req_parse(const void *payload, int len,
363                        struct ble_att_read_req *dst)
364 {
365     const struct ble_att_read_req *src;
366 
367     src = ble_att_init_parse(BLE_ATT_OP_READ_REQ, payload,
368                              BLE_ATT_READ_REQ_SZ, len);
369 
370     dst->barq_handle = le16toh(src->barq_handle);
371 }
372 
373 void
ble_att_read_req_write(void * payload,int len,const struct ble_att_read_req * src)374 ble_att_read_req_write(void *payload, int len,
375                        const struct ble_att_read_req *src)
376 {
377     struct ble_att_read_req *dst;
378 
379     dst = ble_att_init_write(BLE_ATT_OP_READ_REQ, payload,
380                              BLE_ATT_READ_REQ_SZ, len);
381 
382     dst->barq_handle = htole16(src->barq_handle);
383 }
384 
385 void
ble_att_read_req_log(const struct ble_att_read_req * cmd)386 ble_att_read_req_log(const struct ble_att_read_req *cmd)
387 {
388     BLE_HS_LOG(DEBUG, "handle=0x%04x", cmd->barq_handle);
389 }
390 
391 void
ble_att_read_blob_req_parse(const void * payload,int len,struct ble_att_read_blob_req * dst)392 ble_att_read_blob_req_parse(const void *payload, int len,
393                             struct ble_att_read_blob_req *dst)
394 {
395     const struct ble_att_read_blob_req *src;
396 
397     src = ble_att_init_parse(BLE_ATT_OP_READ_BLOB_REQ, payload,
398                              BLE_ATT_READ_BLOB_REQ_SZ, len);
399 
400     dst->babq_handle = le16toh(src->babq_handle);
401     dst->babq_offset = le16toh(src->babq_offset);
402 }
403 
404 void
ble_att_read_blob_req_write(void * payload,int len,const struct ble_att_read_blob_req * src)405 ble_att_read_blob_req_write(void *payload, int len,
406                             const struct ble_att_read_blob_req *src)
407 {
408     struct ble_att_read_blob_req *dst;
409 
410     dst = ble_att_init_write(BLE_ATT_OP_READ_BLOB_REQ, payload,
411                              BLE_ATT_READ_BLOB_REQ_SZ, len);
412 
413     dst->babq_handle = htole16(src->babq_handle);
414     dst->babq_offset = htole16(src->babq_offset);
415 }
416 
417 void
ble_att_read_blob_req_log(const struct ble_att_read_blob_req * cmd)418 ble_att_read_blob_req_log(const struct ble_att_read_blob_req *cmd)
419 {
420     BLE_HS_LOG(DEBUG, "handle=0x%04x offset=%d", cmd->babq_handle,
421                cmd->babq_offset);
422 }
423 
424 void
ble_att_read_mult_req_parse(const void * payload,int len)425 ble_att_read_mult_req_parse(const void *payload, int len)
426 {
427     ble_att_init_parse(BLE_ATT_OP_READ_MULT_REQ, payload,
428                        BLE_ATT_READ_MULT_REQ_BASE_SZ, len);
429 }
430 
431 void
ble_att_read_mult_req_write(void * payload,int len)432 ble_att_read_mult_req_write(void *payload, int len)
433 {
434     ble_att_init_write(BLE_ATT_OP_READ_MULT_REQ, payload,
435                        BLE_ATT_READ_MULT_REQ_BASE_SZ, len);
436 }
437 
438 void
ble_att_read_mult_rsp_parse(const void * payload,int len)439 ble_att_read_mult_rsp_parse(const void *payload, int len)
440 {
441     ble_att_init_parse(BLE_ATT_OP_READ_MULT_RSP, payload,
442                        BLE_ATT_READ_MULT_RSP_BASE_SZ, len);
443 }
444 
445 void
ble_att_read_mult_rsp_write(void * payload,int len)446 ble_att_read_mult_rsp_write(void *payload, int len)
447 {
448     ble_att_init_write(BLE_ATT_OP_READ_MULT_RSP, payload,
449                        BLE_ATT_READ_MULT_RSP_BASE_SZ, len);
450 }
451 
452 void
ble_att_read_group_type_req_parse(const void * payload,int len,struct ble_att_read_group_type_req * dst)453 ble_att_read_group_type_req_parse(const void *payload, int len,
454                                   struct ble_att_read_group_type_req *dst)
455 {
456     const struct ble_att_read_group_type_req *src;
457 
458     src = ble_att_init_parse(BLE_ATT_OP_READ_GROUP_TYPE_REQ, payload,
459                              BLE_ATT_READ_GROUP_TYPE_REQ_BASE_SZ, len);
460 
461     dst->bagq_start_handle = le16toh(src->bagq_start_handle);
462     dst->bagq_end_handle = le16toh(src->bagq_end_handle);
463 }
464 
465 void
ble_att_read_group_type_req_write(void * payload,int len,const struct ble_att_read_group_type_req * src)466 ble_att_read_group_type_req_write(
467     void *payload, int len, const struct ble_att_read_group_type_req *src)
468 {
469     struct ble_att_read_group_type_req *dst;
470 
471     dst = ble_att_init_write(BLE_ATT_OP_READ_GROUP_TYPE_REQ, payload,
472                              BLE_ATT_READ_GROUP_TYPE_REQ_BASE_SZ, len);
473 
474     dst->bagq_start_handle = htole16(src->bagq_start_handle);
475     dst->bagq_end_handle = htole16(src->bagq_end_handle);
476 }
477 
478 void
ble_att_read_group_type_req_log(const struct ble_att_read_group_type_req * cmd)479 ble_att_read_group_type_req_log(const struct ble_att_read_group_type_req *cmd)
480 {
481     BLE_HS_LOG(DEBUG, "start_handle=0x%04x end_handle=0x%04x",
482                cmd->bagq_start_handle, cmd->bagq_end_handle);
483 }
484 
485 void
ble_att_read_group_type_rsp_parse(const void * payload,int len,struct ble_att_read_group_type_rsp * dst)486 ble_att_read_group_type_rsp_parse(const void *payload, int len,
487                                   struct ble_att_read_group_type_rsp *dst)
488 {
489     const struct ble_att_read_group_type_rsp *src;
490 
491     src = ble_att_init_parse(BLE_ATT_OP_READ_GROUP_TYPE_RSP, payload,
492                              BLE_ATT_READ_GROUP_TYPE_RSP_BASE_SZ, len);
493 
494     dst->bagp_length = src->bagp_length;
495 }
496 
497 void
ble_att_read_group_type_rsp_write(void * payload,int len,const struct ble_att_read_group_type_rsp * src)498 ble_att_read_group_type_rsp_write(
499     void *payload, int len, const struct ble_att_read_group_type_rsp *src)
500 {
501     struct ble_att_read_group_type_rsp *dst;
502 
503     dst = ble_att_init_write(BLE_ATT_OP_READ_GROUP_TYPE_RSP, payload,
504                              BLE_ATT_READ_GROUP_TYPE_RSP_BASE_SZ, len);
505 
506     dst->bagp_length = src->bagp_length;
507 }
508 
509 void
ble_att_read_group_type_rsp_log(const struct ble_att_read_group_type_rsp * cmd)510 ble_att_read_group_type_rsp_log(const struct ble_att_read_group_type_rsp *cmd)
511 {
512     BLE_HS_LOG(DEBUG, "length=%d", cmd->bagp_length);
513 }
514 
515 void
ble_att_write_req_parse(const void * payload,int len,struct ble_att_write_req * dst)516 ble_att_write_req_parse(const void *payload, int len,
517                         struct ble_att_write_req *dst)
518 {
519     const struct ble_att_write_req *src;
520 
521     src = ble_att_init_parse(BLE_ATT_OP_WRITE_REQ, payload,
522                              BLE_ATT_WRITE_REQ_BASE_SZ, len);
523 
524     dst->bawq_handle = le16toh(src->bawq_handle);
525 }
526 
527 void
ble_att_write_cmd_parse(const void * payload,int len,struct ble_att_write_req * dst)528 ble_att_write_cmd_parse(const void *payload, int len,
529                         struct ble_att_write_req *dst)
530 {
531     const struct ble_att_write_req *src;
532 
533     src = ble_att_init_parse(BLE_ATT_OP_WRITE_CMD, payload,
534                              BLE_ATT_WRITE_REQ_BASE_SZ, len);
535     dst->bawq_handle = le16toh(src->bawq_handle);
536 }
537 
538 void
ble_att_write_req_write(void * payload,int len,const struct ble_att_write_req * src)539 ble_att_write_req_write(void *payload, int len,
540                         const struct ble_att_write_req *src)
541 {
542     struct ble_att_write_req *dst;
543 
544     dst = ble_att_init_write(BLE_ATT_OP_WRITE_REQ, payload,
545                              BLE_ATT_WRITE_REQ_BASE_SZ, len);
546     dst->bawq_handle = htole16(src->bawq_handle);
547 }
548 
549 void
ble_att_write_cmd_write(void * payload,int len,const struct ble_att_write_req * src)550 ble_att_write_cmd_write(void *payload, int len,
551                         const struct ble_att_write_req *src)
552 {
553     struct ble_att_write_req *dst;
554 
555     dst = ble_att_init_write(BLE_ATT_OP_WRITE_CMD, payload,
556                              BLE_ATT_WRITE_REQ_BASE_SZ, len);
557     dst->bawq_handle = htole16(src->bawq_handle);
558 }
559 
560 void
ble_att_write_cmd_log(const struct ble_att_write_cmd * cmd)561 ble_att_write_cmd_log(const struct ble_att_write_cmd *cmd)
562 {
563     BLE_HS_LOG(DEBUG, "handle=0x%04x", cmd->handle);
564 }
565 
566 void
ble_att_write_req_log(const struct ble_att_write_req * req)567 ble_att_write_req_log(const struct ble_att_write_req *req)
568 {
569     BLE_HS_LOG(DEBUG, "handle=0x%04x", req->bawq_handle);
570 }
571 
572 void
ble_att_prep_write_req_parse(const void * payload,int len,struct ble_att_prep_write_cmd * dst)573 ble_att_prep_write_req_parse(const void *payload, int len,
574                              struct ble_att_prep_write_cmd *dst)
575 {
576     const struct ble_att_prep_write_cmd *src;
577 
578     src = ble_att_init_parse(BLE_ATT_OP_PREP_WRITE_REQ, payload,
579                              BLE_ATT_PREP_WRITE_CMD_BASE_SZ, len);
580 
581     dst->bapc_handle = le16toh(src->bapc_handle);
582     dst->bapc_offset = le16toh(src->bapc_offset);
583 }
584 
585 void
ble_att_prep_write_req_write(void * payload,int len,const struct ble_att_prep_write_cmd * src)586 ble_att_prep_write_req_write(void *payload, int len,
587                              const struct ble_att_prep_write_cmd *src)
588 {
589     struct ble_att_prep_write_cmd *dst;
590 
591     dst = ble_att_init_write(BLE_ATT_OP_PREP_WRITE_REQ, payload,
592                              BLE_ATT_PREP_WRITE_CMD_BASE_SZ, len);
593 
594     dst->bapc_handle = htole16(src->bapc_handle);
595     dst->bapc_offset = htole16(src->bapc_offset);
596 }
597 
598 void
ble_att_prep_write_rsp_parse(const void * payload,int len,struct ble_att_prep_write_cmd * dst)599 ble_att_prep_write_rsp_parse(const void *payload, int len,
600                              struct ble_att_prep_write_cmd *dst)
601 {
602     const struct ble_att_prep_write_cmd *src;
603 
604     src = ble_att_init_parse(BLE_ATT_OP_PREP_WRITE_RSP, payload,
605                              BLE_ATT_PREP_WRITE_CMD_BASE_SZ, len);
606 
607     dst->bapc_handle = le16toh(src->bapc_handle);
608     dst->bapc_offset = le16toh(src->bapc_offset);
609 }
610 
611 void
ble_att_prep_write_rsp_write(void * payload,int len,const struct ble_att_prep_write_cmd * src)612 ble_att_prep_write_rsp_write(void *payload, int len,
613                              const struct ble_att_prep_write_cmd *src)
614 {
615     struct ble_att_prep_write_cmd *dst;
616 
617     dst = ble_att_init_write(BLE_ATT_OP_PREP_WRITE_RSP, payload,
618                              BLE_ATT_PREP_WRITE_CMD_BASE_SZ, len);
619 
620     dst->bapc_handle = htole16(src->bapc_handle);
621     dst->bapc_offset = htole16(src->bapc_offset);
622 }
623 
624 void
ble_att_prep_write_cmd_log(const struct ble_att_prep_write_cmd * cmd)625 ble_att_prep_write_cmd_log(const struct ble_att_prep_write_cmd *cmd)
626 {
627     BLE_HS_LOG(DEBUG, "handle=0x%04x offset=%d", cmd->bapc_handle,
628                cmd->bapc_offset);
629 }
630 
631 void
ble_att_exec_write_req_parse(const void * payload,int len,struct ble_att_exec_write_req * dst)632 ble_att_exec_write_req_parse(const void *payload, int len,
633                              struct ble_att_exec_write_req *dst)
634 {
635     const struct ble_att_exec_write_req *src;
636 
637     src = ble_att_init_parse(BLE_ATT_OP_EXEC_WRITE_REQ, payload,
638                              BLE_ATT_EXEC_WRITE_REQ_SZ, len);
639 
640     dst->baeq_flags = src->baeq_flags;
641 }
642 
643 void
ble_att_exec_write_req_write(void * payload,int len,const struct ble_att_exec_write_req * src)644 ble_att_exec_write_req_write(void *payload, int len,
645                              const struct ble_att_exec_write_req *src)
646 {
647     struct ble_att_exec_write_req *dst;
648 
649     dst = ble_att_init_write(BLE_ATT_OP_EXEC_WRITE_REQ, payload,
650                              BLE_ATT_EXEC_WRITE_REQ_SZ, len);
651 
652     dst->baeq_flags = src->baeq_flags;
653 }
654 
655 void
ble_att_exec_write_req_log(const struct ble_att_exec_write_req * cmd)656 ble_att_exec_write_req_log(const struct ble_att_exec_write_req *cmd)
657 {
658     BLE_HS_LOG(DEBUG, "flags=0x%02x", cmd->baeq_flags);
659 }
660 
661 void
ble_att_exec_write_rsp_parse(const void * payload,int len)662 ble_att_exec_write_rsp_parse(const void *payload, int len)
663 {
664     ble_att_init_parse(BLE_ATT_OP_EXEC_WRITE_RSP, payload,
665                        BLE_ATT_EXEC_WRITE_RSP_SZ, len);
666 }
667 
668 void
ble_att_exec_write_rsp_write(void * payload,int len)669 ble_att_exec_write_rsp_write(void *payload, int len)
670 {
671     ble_att_init_write(BLE_ATT_OP_EXEC_WRITE_RSP, payload,
672                        BLE_ATT_EXEC_WRITE_RSP_SZ, len);
673 }
674 
675 void
ble_att_notify_req_parse(const void * payload,int len,struct ble_att_notify_req * dst)676 ble_att_notify_req_parse(const void *payload, int len,
677                          struct ble_att_notify_req *dst)
678 {
679     const struct ble_att_notify_req *src;
680 
681     src = ble_att_init_parse(BLE_ATT_OP_NOTIFY_REQ, payload,
682                              BLE_ATT_NOTIFY_REQ_BASE_SZ, len);
683 
684     dst->banq_handle = le16toh(src->banq_handle);
685 }
686 
687 void
ble_att_notify_req_write(void * payload,int len,const struct ble_att_notify_req * src)688 ble_att_notify_req_write(void *payload, int len,
689                          const struct ble_att_notify_req *src)
690 {
691     struct ble_att_notify_req *dst;
692 
693     dst = ble_att_init_write(BLE_ATT_OP_NOTIFY_REQ, payload,
694                              BLE_ATT_NOTIFY_REQ_BASE_SZ, len);
695 
696     dst->banq_handle = htole16(src->banq_handle);
697 }
698 
699 void
ble_att_notify_req_log(const struct ble_att_notify_req * cmd)700 ble_att_notify_req_log(const struct ble_att_notify_req *cmd)
701 {
702     BLE_HS_LOG(DEBUG, "handle=0x%04x", cmd->banq_handle);
703 }
704 
705 void
ble_att_indicate_req_parse(const void * payload,int len,struct ble_att_indicate_req * dst)706 ble_att_indicate_req_parse(const void *payload, int len,
707                            struct ble_att_indicate_req *dst)
708 {
709     const struct ble_att_indicate_req *src;
710 
711     src = ble_att_init_parse(BLE_ATT_OP_INDICATE_REQ, payload,
712                              BLE_ATT_INDICATE_REQ_BASE_SZ, len);
713 
714     dst->baiq_handle = le16toh(src->baiq_handle);
715 }
716 
717 void
ble_att_indicate_req_write(void * payload,int len,const struct ble_att_indicate_req * src)718 ble_att_indicate_req_write(void *payload, int len,
719                            const struct ble_att_indicate_req *src)
720 {
721     struct ble_att_indicate_req *dst;
722 
723     dst = ble_att_init_write(BLE_ATT_OP_INDICATE_REQ, payload,
724                              BLE_ATT_INDICATE_REQ_BASE_SZ, len);
725 
726     dst->baiq_handle = htole16(src->baiq_handle);
727 }
728 
729 void
ble_att_indicate_req_log(const struct ble_att_indicate_req * cmd)730 ble_att_indicate_req_log(const struct ble_att_indicate_req *cmd)
731 {
732     BLE_HS_LOG(DEBUG, "handle=0x%04x", cmd->baiq_handle);
733 }
734 
735 void
ble_att_indicate_rsp_parse(const void * payload,int len)736 ble_att_indicate_rsp_parse(const void *payload, int len)
737 {
738     ble_att_init_parse(BLE_ATT_OP_INDICATE_RSP, payload,
739                        BLE_ATT_INDICATE_RSP_SZ, len);
740 }
741 
742 void
ble_att_indicate_rsp_write(void * payload,int len)743 ble_att_indicate_rsp_write(void *payload, int len)
744 {
745     ble_att_init_write(BLE_ATT_OP_INDICATE_RSP, payload,
746                        BLE_ATT_INDICATE_RSP_SZ, len);
747 }
748