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