• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }