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
ble_att_cmd_prepare(uint8_t opcode,size_t len,struct os_mbuf * txom)29 void *ble_att_cmd_prepare(uint8_t opcode, size_t len, struct os_mbuf *txom)
30 {
31 struct ble_att_hdr *hdr;
32
33 if (os_mbuf_extend(txom, sizeof(*hdr) + len) == NULL) {
34 os_mbuf_free_chain(txom);
35 return NULL;
36 }
37
38 hdr = (struct ble_att_hdr *)(txom)->om_data;
39 hdr->opcode = opcode;
40 return hdr->data;
41 }
42
ble_att_cmd_get(uint8_t opcode,size_t len,struct os_mbuf ** txom)43 void *ble_att_cmd_get(uint8_t opcode, size_t len, struct os_mbuf **txom)
44 {
45 *txom = ble_hs_mbuf_l2cap_pkt();
46 if (*txom == NULL) {
47 return NULL;
48 }
49
50 return ble_att_cmd_prepare(opcode, len, *txom);
51 }
52
ble_att_tx(uint16_t conn_handle,struct os_mbuf * txom)53 int ble_att_tx(uint16_t conn_handle, struct os_mbuf *txom)
54 {
55 struct ble_l2cap_chan *chan;
56 struct ble_hs_conn *conn;
57 int rc;
58 BLE_HS_DBG_ASSERT_EVAL(txom->om_len >= 1);
59 ble_att_inc_tx_stat(txom->om_data[0]);
60 ble_hs_lock();
61 ble_hs_misc_conn_chan_find_reqd(conn_handle, BLE_L2CAP_CID_ATT, &conn,
62 &chan);
63
64 if (chan == NULL) {
65 os_mbuf_free_chain(txom);
66 rc = BLE_HS_ENOTCONN;
67 } else {
68 ble_att_truncate_to_mtu(chan, txom);
69 rc = ble_l2cap_tx(conn, chan, txom);
70 }
71
72 ble_hs_unlock();
73 return rc;
74 }
75
ble_att_init_parse(uint8_t op,const void * payload,int min_len,int actual_len)76 static const void *ble_att_init_parse(uint8_t op, const void *payload, int min_len, int actual_len)
77 {
78 const uint8_t *u8ptr;
79 BLE_HS_DBG_ASSERT(actual_len >= min_len);
80 u8ptr = payload;
81 BLE_HS_DBG_ASSERT(u8ptr[0] == op);
82 return u8ptr + 1;
83 }
84
ble_att_init_write(uint8_t op,void * payload,int min_len,int actual_len)85 static void *ble_att_init_write(uint8_t op, void *payload, int min_len, int actual_len)
86 {
87 uint8_t *u8ptr;
88 BLE_HS_DBG_ASSERT(actual_len >= min_len);
89 u8ptr = payload;
90 u8ptr[0] = op;
91 return u8ptr + 1;
92 }
93
ble_att_error_rsp_parse(const void * payload,int len,struct ble_att_error_rsp * dst)94 void ble_att_error_rsp_parse(const void *payload, int len, struct ble_att_error_rsp *dst)
95 {
96 const struct ble_att_error_rsp *src;
97 src = ble_att_init_parse(BLE_ATT_OP_ERROR_RSP, payload,
98 BLE_ATT_ERROR_RSP_SZ, len);
99 dst->baep_req_op = src->baep_req_op;
100 dst->baep_handle = le16toh(src->baep_handle);
101 dst->baep_error_code = src->baep_error_code;
102 }
103
ble_att_error_rsp_write(void * payload,int len,const struct ble_att_error_rsp * src)104 void ble_att_error_rsp_write(void *payload, int len, const struct ble_att_error_rsp *src)
105 {
106 struct ble_att_error_rsp *dst;
107 dst = ble_att_init_write(BLE_ATT_OP_ERROR_RSP, payload,
108 BLE_ATT_ERROR_RSP_SZ, len);
109 dst->baep_req_op = src->baep_req_op;
110 dst->baep_handle = htole16(src->baep_handle);
111 dst->baep_error_code = src->baep_error_code;
112 }
113
ble_att_mtu_req_parse(const void * payload,int len,struct ble_att_mtu_cmd * dst)114 void ble_att_mtu_req_parse(const void *payload, int len, struct ble_att_mtu_cmd *dst)
115 {
116 const struct ble_att_mtu_cmd *src;
117 src = ble_att_init_parse(BLE_ATT_OP_MTU_REQ, payload, BLE_ATT_MTU_CMD_SZ, len);
118 dst->bamc_mtu = le16toh(src->bamc_mtu);
119 }
120
ble_att_mtu_rsp_parse(const void * payload,int len,struct ble_att_mtu_cmd * dst)121 void ble_att_mtu_rsp_parse(const void *payload, int len, struct ble_att_mtu_cmd *dst)
122 {
123 const struct ble_att_mtu_cmd *src;
124 src = ble_att_init_parse(BLE_ATT_OP_MTU_RSP, payload, BLE_ATT_MTU_CMD_SZ, len);
125 dst->bamc_mtu = le16toh(src->bamc_mtu);
126 }
127
ble_att_mtu_req_write(void * payload,int len,const struct ble_att_mtu_cmd * src)128 void ble_att_mtu_req_write(void *payload, int len, const struct ble_att_mtu_cmd *src)
129 {
130 struct ble_att_mtu_cmd *dst;
131 dst = ble_att_init_write(BLE_ATT_OP_MTU_REQ, payload,
132 BLE_ATT_MTU_CMD_SZ, len);
133 dst->bamc_mtu = htole16(src->bamc_mtu);
134 }
135
ble_att_mtu_rsp_write(void * payload,int len,const struct ble_att_mtu_cmd * src)136 void ble_att_mtu_rsp_write(void *payload, int len, const struct ble_att_mtu_cmd *src)
137 {
138 struct ble_att_mtu_cmd *dst;
139 dst = ble_att_init_write(BLE_ATT_OP_MTU_RSP, payload,
140 BLE_ATT_MTU_CMD_SZ, len);
141 dst->bamc_mtu = htole16(src->bamc_mtu);
142 }
143
ble_att_find_info_req_parse(const void * payload,int len,struct ble_att_find_info_req * dst)144 void ble_att_find_info_req_parse(const void *payload, int len, struct ble_att_find_info_req *dst)
145 {
146 const struct ble_att_find_info_req *src;
147 src = ble_att_init_parse(BLE_ATT_OP_FIND_INFO_REQ, payload,
148 BLE_ATT_FIND_INFO_REQ_SZ, len);
149 dst->bafq_start_handle = le16toh(src->bafq_start_handle);
150 dst->bafq_end_handle = le16toh(src->bafq_end_handle);
151 }
152
ble_att_find_info_req_write(void * payload,int len,const struct ble_att_find_info_req * src)153 void ble_att_find_info_req_write(void *payload, int len, const struct ble_att_find_info_req *src)
154 {
155 struct ble_att_find_info_req *dst;
156 dst = ble_att_init_write(BLE_ATT_OP_FIND_INFO_REQ, payload,
157 BLE_ATT_FIND_INFO_REQ_SZ, len);
158 dst->bafq_start_handle = htole16(src->bafq_start_handle);
159 dst->bafq_end_handle = htole16(src->bafq_end_handle);
160 }
161
ble_att_find_info_rsp_parse(const void * payload,int len,struct ble_att_find_info_rsp * dst)162 void ble_att_find_info_rsp_parse(const void *payload, int len, struct ble_att_find_info_rsp *dst)
163 {
164 const struct ble_att_find_info_rsp *src;
165 src = ble_att_init_parse(BLE_ATT_OP_FIND_INFO_RSP, payload,
166 BLE_ATT_FIND_INFO_RSP_BASE_SZ, len);
167 dst->bafp_format = src->bafp_format;
168 }
169
ble_att_find_info_rsp_write(void * payload,int len,const struct ble_att_find_info_rsp * src)170 void ble_att_find_info_rsp_write(void *payload, int len, const struct ble_att_find_info_rsp *src)
171 {
172 struct ble_att_find_info_rsp *dst;
173 dst = ble_att_init_write(BLE_ATT_OP_FIND_INFO_RSP, payload,
174 BLE_ATT_FIND_INFO_RSP_BASE_SZ, len);
175 dst->bafp_format = src->bafp_format;
176 }
177
ble_att_find_type_value_req_parse(const void * payload,int len,struct ble_att_find_type_value_req * dst)178 void ble_att_find_type_value_req_parse(const void *payload, int len, struct ble_att_find_type_value_req *dst)
179 {
180 const struct ble_att_find_type_value_req *src;
181 src = ble_att_init_parse(BLE_ATT_OP_FIND_TYPE_VALUE_REQ, payload,
182 BLE_ATT_FIND_TYPE_VALUE_REQ_BASE_SZ, len);
183 dst->bavq_start_handle = le16toh(src->bavq_start_handle);
184 dst->bavq_end_handle = le16toh(src->bavq_end_handle);
185 dst->bavq_attr_type = le16toh(src->bavq_attr_type);
186 }
187
ble_att_find_type_value_req_write(void * payload,int len,const struct ble_att_find_type_value_req * src)188 void ble_att_find_type_value_req_write(void *payload, int len, const struct ble_att_find_type_value_req *src)
189 {
190 struct ble_att_find_type_value_req *dst;
191 dst = ble_att_init_write(BLE_ATT_OP_FIND_TYPE_VALUE_REQ, payload,
192 BLE_ATT_FIND_TYPE_VALUE_REQ_BASE_SZ, len);
193 dst->bavq_start_handle = htole16(src->bavq_start_handle);
194 dst->bavq_end_handle = htole16(src->bavq_end_handle);
195 dst->bavq_attr_type = htole16(src->bavq_attr_type);
196 }
197
ble_att_read_type_req_parse(const void * payload,int len,struct ble_att_read_type_req * dst)198 void ble_att_read_type_req_parse(const void *payload, int len, struct ble_att_read_type_req *dst)
199 {
200 const struct ble_att_read_type_req *src;
201 src = ble_att_init_parse(BLE_ATT_OP_READ_TYPE_REQ, payload,
202 BLE_ATT_READ_TYPE_REQ_BASE_SZ, len);
203 dst->batq_start_handle = le16toh(src->batq_start_handle);
204 dst->batq_end_handle = le16toh(src->batq_end_handle);
205 }
206
ble_att_read_type_req_write(void * payload,int len,const struct ble_att_read_type_req * src)207 void ble_att_read_type_req_write(void *payload, int len, const struct ble_att_read_type_req *src)
208 {
209 struct ble_att_read_type_req *dst;
210 dst = ble_att_init_write(BLE_ATT_OP_READ_TYPE_REQ, payload,
211 BLE_ATT_READ_TYPE_REQ_BASE_SZ, len);
212 dst->batq_start_handle = htole16(src->batq_start_handle);
213 dst->batq_end_handle = htole16(src->batq_end_handle);
214 }
215
ble_att_read_type_rsp_parse(const void * payload,int len,struct ble_att_read_type_rsp * dst)216 void ble_att_read_type_rsp_parse(const void *payload, int len, struct ble_att_read_type_rsp *dst)
217 {
218 const struct ble_att_read_type_rsp *src;
219 src = ble_att_init_parse(BLE_ATT_OP_READ_TYPE_RSP, payload,
220 BLE_ATT_READ_TYPE_RSP_BASE_SZ, len);
221 dst->batp_length = src->batp_length;
222 }
223
ble_att_read_type_rsp_write(void * payload,int len,const struct ble_att_read_type_rsp * src)224 void ble_att_read_type_rsp_write(void *payload, int len, const struct ble_att_read_type_rsp *src)
225 {
226 struct ble_att_read_type_rsp *dst;
227 dst = ble_att_init_write(BLE_ATT_OP_READ_TYPE_RSP, payload,
228 BLE_ATT_READ_TYPE_RSP_BASE_SZ, len);
229 dst->batp_length = src->batp_length;
230 }
231
ble_att_read_req_parse(const void * payload,int len,struct ble_att_read_req * dst)232 void ble_att_read_req_parse(const void *payload, int len, struct ble_att_read_req *dst)
233 {
234 const struct ble_att_read_req *src;
235 src = ble_att_init_parse(BLE_ATT_OP_READ_REQ, payload,
236 BLE_ATT_READ_REQ_SZ, len);
237 dst->barq_handle = le16toh(src->barq_handle);
238 }
239
ble_att_read_req_write(void * payload,int len,const struct ble_att_read_req * src)240 void ble_att_read_req_write(void *payload, int len, const struct ble_att_read_req *src)
241 {
242 struct ble_att_read_req *dst;
243 dst = ble_att_init_write(BLE_ATT_OP_READ_REQ, payload,
244 BLE_ATT_READ_REQ_SZ, len);
245 dst->barq_handle = htole16(src->barq_handle);
246 }
247
ble_att_read_blob_req_parse(const void * payload,int len,struct ble_att_read_blob_req * dst)248 void ble_att_read_blob_req_parse(const void *payload, int len, struct ble_att_read_blob_req *dst)
249 {
250 const struct ble_att_read_blob_req *src;
251 src = ble_att_init_parse(BLE_ATT_OP_READ_BLOB_REQ, payload,
252 BLE_ATT_READ_BLOB_REQ_SZ, len);
253 dst->babq_handle = le16toh(src->babq_handle);
254 dst->babq_offset = le16toh(src->babq_offset);
255 }
256
ble_att_read_blob_req_write(void * payload,int len,const struct ble_att_read_blob_req * src)257 void ble_att_read_blob_req_write(void *payload, int len, const struct ble_att_read_blob_req *src)
258 {
259 struct ble_att_read_blob_req *dst;
260 dst = ble_att_init_write(BLE_ATT_OP_READ_BLOB_REQ, payload,
261 BLE_ATT_READ_BLOB_REQ_SZ, len);
262 dst->babq_handle = htole16(src->babq_handle);
263 dst->babq_offset = htole16(src->babq_offset);
264 }
265
ble_att_read_mult_req_parse(const void * payload,int len)266 void ble_att_read_mult_req_parse(const void *payload, int len)
267 {
268 ble_att_init_parse(BLE_ATT_OP_READ_MULT_REQ, payload,
269 BLE_ATT_READ_MULT_REQ_BASE_SZ, len);
270 }
271
ble_att_read_mult_req_write(void * payload,int len)272 void ble_att_read_mult_req_write(void *payload, int len)
273 {
274 ble_att_init_write(BLE_ATT_OP_READ_MULT_REQ, payload,
275 BLE_ATT_READ_MULT_REQ_BASE_SZ, len);
276 }
277
ble_att_read_mult_rsp_parse(const void * payload,int len)278 void ble_att_read_mult_rsp_parse(const void *payload, int len)
279 {
280 ble_att_init_parse(BLE_ATT_OP_READ_MULT_RSP, payload,
281 BLE_ATT_READ_MULT_RSP_BASE_SZ, len);
282 }
283
ble_att_read_mult_rsp_write(void * payload,int len)284 void ble_att_read_mult_rsp_write(void *payload, int len)
285 {
286 ble_att_init_write(BLE_ATT_OP_READ_MULT_RSP, payload,
287 BLE_ATT_READ_MULT_RSP_BASE_SZ, len);
288 }
289
ble_att_read_group_type_req_parse(const void * payload,int len,struct ble_att_read_group_type_req * dst)290 void ble_att_read_group_type_req_parse(const void *payload, int len, struct ble_att_read_group_type_req *dst)
291 {
292 const struct ble_att_read_group_type_req *src;
293 src = ble_att_init_parse(BLE_ATT_OP_READ_GROUP_TYPE_REQ, payload,
294 BLE_ATT_READ_GROUP_TYPE_REQ_BASE_SZ, len);
295 dst->bagq_start_handle = le16toh(src->bagq_start_handle);
296 dst->bagq_end_handle = le16toh(src->bagq_end_handle);
297 }
298
ble_att_read_group_type_req_write(void * payload,int len,const struct ble_att_read_group_type_req * src)299 void ble_att_read_group_type_req_write(void *payload, int len, const struct ble_att_read_group_type_req *src)
300 {
301 struct ble_att_read_group_type_req *dst;
302 dst = ble_att_init_write(BLE_ATT_OP_READ_GROUP_TYPE_REQ, payload,
303 BLE_ATT_READ_GROUP_TYPE_REQ_BASE_SZ, len);
304 dst->bagq_start_handle = htole16(src->bagq_start_handle);
305 dst->bagq_end_handle = htole16(src->bagq_end_handle);
306 }
307
ble_att_read_group_type_rsp_parse(const void * payload,int len,struct ble_att_read_group_type_rsp * dst)308 void ble_att_read_group_type_rsp_parse(const void *payload, int len, struct ble_att_read_group_type_rsp *dst)
309 {
310 const struct ble_att_read_group_type_rsp *src;
311 src = ble_att_init_parse(BLE_ATT_OP_READ_GROUP_TYPE_RSP, payload,
312 BLE_ATT_READ_GROUP_TYPE_RSP_BASE_SZ, len);
313 dst->bagp_length = src->bagp_length;
314 }
315
ble_att_read_group_type_rsp_write(void * payload,int len,const struct ble_att_read_group_type_rsp * src)316 void ble_att_read_group_type_rsp_write(void *payload, int len, const struct ble_att_read_group_type_rsp *src)
317 {
318 struct ble_att_read_group_type_rsp *dst;
319 dst = ble_att_init_write(BLE_ATT_OP_READ_GROUP_TYPE_RSP, payload,
320 BLE_ATT_READ_GROUP_TYPE_RSP_BASE_SZ, len);
321 dst->bagp_length = src->bagp_length;
322 }
323
ble_att_write_req_parse(const void * payload,int len,struct ble_att_write_req * dst)324 void ble_att_write_req_parse(const void *payload, int len, struct ble_att_write_req *dst)
325 {
326 const struct ble_att_write_req *src;
327 src = ble_att_init_parse(BLE_ATT_OP_WRITE_REQ, payload,
328 BLE_ATT_WRITE_REQ_BASE_SZ, len);
329 dst->bawq_handle = le16toh(src->bawq_handle);
330 }
331
ble_att_write_cmd_parse(const void * payload,int len,struct ble_att_write_req * dst)332 void ble_att_write_cmd_parse(const void *payload, int len, struct ble_att_write_req *dst)
333 {
334 const struct ble_att_write_req *src;
335 src = ble_att_init_parse(BLE_ATT_OP_WRITE_CMD, payload,
336 BLE_ATT_WRITE_REQ_BASE_SZ, len);
337 dst->bawq_handle = le16toh(src->bawq_handle);
338 }
339
ble_att_write_req_write(void * payload,int len,const struct ble_att_write_req * src)340 void ble_att_write_req_write(void *payload, int len, const struct ble_att_write_req *src)
341 {
342 struct ble_att_write_req *dst;
343 dst = ble_att_init_write(BLE_ATT_OP_WRITE_REQ, payload,
344 BLE_ATT_WRITE_REQ_BASE_SZ, len);
345 dst->bawq_handle = htole16(src->bawq_handle);
346 }
347
ble_att_write_cmd_write(void * payload,int len,const struct ble_att_write_req * src)348 void ble_att_write_cmd_write(void *payload, int len,
349 const struct ble_att_write_req *src)
350 {
351 struct ble_att_write_req *dst;
352 dst = ble_att_init_write(BLE_ATT_OP_WRITE_CMD, payload,
353 BLE_ATT_WRITE_REQ_BASE_SZ, len);
354 dst->bawq_handle = htole16(src->bawq_handle);
355 }
356
ble_att_prep_write_req_parse(const void * payload,int len,struct ble_att_prep_write_cmd * dst)357 void ble_att_prep_write_req_parse(const void *payload, int len, struct ble_att_prep_write_cmd *dst)
358 {
359 const struct ble_att_prep_write_cmd *src;
360 src = ble_att_init_parse(BLE_ATT_OP_PREP_WRITE_REQ, payload,
361 BLE_ATT_PREP_WRITE_CMD_BASE_SZ, len);
362 dst->bapc_handle = le16toh(src->bapc_handle);
363 dst->bapc_offset = le16toh(src->bapc_offset);
364 }
365
ble_att_prep_write_req_write(void * payload,int len,const struct ble_att_prep_write_cmd * src)366 void ble_att_prep_write_req_write(void *payload, int len, const struct ble_att_prep_write_cmd *src)
367 {
368 struct ble_att_prep_write_cmd *dst;
369 dst = ble_att_init_write(BLE_ATT_OP_PREP_WRITE_REQ, payload,
370 BLE_ATT_PREP_WRITE_CMD_BASE_SZ, len);
371 dst->bapc_handle = htole16(src->bapc_handle);
372 dst->bapc_offset = htole16(src->bapc_offset);
373 }
374
ble_att_prep_write_rsp_parse(const void * payload,int len,struct ble_att_prep_write_cmd * dst)375 void ble_att_prep_write_rsp_parse(const void *payload, int len, struct ble_att_prep_write_cmd *dst)
376 {
377 const struct ble_att_prep_write_cmd *src;
378 src = ble_att_init_parse(BLE_ATT_OP_PREP_WRITE_RSP, payload,
379 BLE_ATT_PREP_WRITE_CMD_BASE_SZ, len);
380 dst->bapc_handle = le16toh(src->bapc_handle);
381 dst->bapc_offset = le16toh(src->bapc_offset);
382 }
383
ble_att_prep_write_rsp_write(void * payload,int len,const struct ble_att_prep_write_cmd * src)384 void ble_att_prep_write_rsp_write(void *payload, int len, const struct ble_att_prep_write_cmd *src)
385 {
386 struct ble_att_prep_write_cmd *dst;
387 dst = ble_att_init_write(BLE_ATT_OP_PREP_WRITE_RSP, payload,
388 BLE_ATT_PREP_WRITE_CMD_BASE_SZ, len);
389 dst->bapc_handle = htole16(src->bapc_handle);
390 dst->bapc_offset = htole16(src->bapc_offset);
391 }
392
ble_att_exec_write_req_parse(const void * payload,int len,struct ble_att_exec_write_req * dst)393 void ble_att_exec_write_req_parse(const void *payload, int len, struct ble_att_exec_write_req *dst)
394 {
395 const struct ble_att_exec_write_req *src;
396 src = ble_att_init_parse(BLE_ATT_OP_EXEC_WRITE_REQ, payload,
397 BLE_ATT_EXEC_WRITE_REQ_SZ, len);
398 dst->baeq_flags = src->baeq_flags;
399 }
400
ble_att_exec_write_req_write(void * payload,int len,const struct ble_att_exec_write_req * src)401 void ble_att_exec_write_req_write(void *payload, int len, const struct ble_att_exec_write_req *src)
402 {
403 struct ble_att_exec_write_req *dst;
404 dst = ble_att_init_write(BLE_ATT_OP_EXEC_WRITE_REQ, payload,
405 BLE_ATT_EXEC_WRITE_REQ_SZ, len);
406 dst->baeq_flags = src->baeq_flags;
407 }
408
ble_att_exec_write_rsp_parse(const void * payload,int len)409 void ble_att_exec_write_rsp_parse(const void *payload, int len)
410 {
411 ble_att_init_parse(BLE_ATT_OP_EXEC_WRITE_RSP, payload,
412 BLE_ATT_EXEC_WRITE_RSP_SZ, len);
413 }
414
ble_att_exec_write_rsp_write(void * payload,int len)415 void ble_att_exec_write_rsp_write(void *payload, int len)
416 {
417 ble_att_init_write(BLE_ATT_OP_EXEC_WRITE_RSP, payload,
418 BLE_ATT_EXEC_WRITE_RSP_SZ, len);
419 }
420
ble_att_notify_req_parse(const void * payload,int len,struct ble_att_notify_req * dst)421 void ble_att_notify_req_parse(const void *payload, int len, struct ble_att_notify_req *dst)
422 {
423 const struct ble_att_notify_req *src;
424 src = ble_att_init_parse(BLE_ATT_OP_NOTIFY_REQ, payload,
425 BLE_ATT_NOTIFY_REQ_BASE_SZ, len);
426 dst->banq_handle = le16toh(src->banq_handle);
427 }
428
ble_att_notify_req_write(void * payload,int len,const struct ble_att_notify_req * src)429 void ble_att_notify_req_write(void *payload, int len, const struct ble_att_notify_req *src)
430 {
431 struct ble_att_notify_req *dst;
432 dst = ble_att_init_write(BLE_ATT_OP_NOTIFY_REQ, payload,
433 BLE_ATT_NOTIFY_REQ_BASE_SZ, len);
434 dst->banq_handle = htole16(src->banq_handle);
435 }
436
ble_att_indicate_req_parse(const void * payload,int len,struct ble_att_indicate_req * dst)437 void ble_att_indicate_req_parse(const void *payload, int len, struct ble_att_indicate_req *dst)
438 {
439 const struct ble_att_indicate_req *src;
440 src = ble_att_init_parse(BLE_ATT_OP_INDICATE_REQ, payload,
441 BLE_ATT_INDICATE_REQ_BASE_SZ, len);
442 dst->baiq_handle = le16toh(src->baiq_handle);
443 }
444
ble_att_indicate_req_write(void * payload,int len,const struct ble_att_indicate_req * src)445 void ble_att_indicate_req_write(void *payload, int len, const struct ble_att_indicate_req *src)
446 {
447 struct ble_att_indicate_req *dst;
448 dst = ble_att_init_write(BLE_ATT_OP_INDICATE_REQ, payload,
449 BLE_ATT_INDICATE_REQ_BASE_SZ, len);
450 dst->baiq_handle = htole16(src->baiq_handle);
451 }
452
ble_att_indicate_rsp_parse(const void * payload,int len)453 void ble_att_indicate_rsp_parse(const void *payload, int len)
454 {
455 ble_att_init_parse(BLE_ATT_OP_INDICATE_RSP, payload,
456 BLE_ATT_INDICATE_RSP_SZ, len);
457 }
458
ble_att_indicate_rsp_write(void * payload,int len)459 void ble_att_indicate_rsp_write(void *payload, int len)
460 {
461 ble_att_init_write(BLE_ATT_OP_INDICATE_RSP, payload,
462 BLE_ATT_INDICATE_RSP_SZ, len);
463 }