xref: /nrf52832-nimble/packages/NimBLE-latest/nimble/host/src/ble_att_priv.h (revision 042d53a763ad75cb1465103098bb88c245d95138)
1*042d53a7SEvalZero /*
2*042d53a7SEvalZero  * Licensed to the Apache Software Foundation (ASF) under one
3*042d53a7SEvalZero  * or more contributor license agreements.  See the NOTICE file
4*042d53a7SEvalZero  * distributed with this work for additional information
5*042d53a7SEvalZero  * regarding copyright ownership.  The ASF licenses this file
6*042d53a7SEvalZero  * to you under the Apache License, Version 2.0 (the
7*042d53a7SEvalZero  * "License"); you may not use this file except in compliance
8*042d53a7SEvalZero  * with the License.  You may obtain a copy of the License at
9*042d53a7SEvalZero  *
10*042d53a7SEvalZero  *  http://www.apache.org/licenses/LICENSE-2.0
11*042d53a7SEvalZero  *
12*042d53a7SEvalZero  * Unless required by applicable law or agreed to in writing,
13*042d53a7SEvalZero  * software distributed under the License is distributed on an
14*042d53a7SEvalZero  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15*042d53a7SEvalZero  * KIND, either express or implied.  See the License for the
16*042d53a7SEvalZero  * specific language governing permissions and limitations
17*042d53a7SEvalZero  * under the License.
18*042d53a7SEvalZero  */
19*042d53a7SEvalZero 
20*042d53a7SEvalZero #ifndef H_BLE_ATT_PRIV_
21*042d53a7SEvalZero #define H_BLE_ATT_PRIV_
22*042d53a7SEvalZero 
23*042d53a7SEvalZero #include <inttypes.h>
24*042d53a7SEvalZero #include "stats/stats.h"
25*042d53a7SEvalZero #include "host/ble_att.h"
26*042d53a7SEvalZero #include "host/ble_uuid.h"
27*042d53a7SEvalZero #include "nimble/nimble_npl.h"
28*042d53a7SEvalZero 
29*042d53a7SEvalZero #ifdef __cplusplus
30*042d53a7SEvalZero extern "C" {
31*042d53a7SEvalZero #endif
32*042d53a7SEvalZero 
33*042d53a7SEvalZero struct os_mbuf;
34*042d53a7SEvalZero struct ble_hs_conn;
35*042d53a7SEvalZero struct ble_l2cap_chan;
36*042d53a7SEvalZero struct ble_att_find_info_req;
37*042d53a7SEvalZero struct ble_att_error_rsp;
38*042d53a7SEvalZero struct ble_att_mtu_cmd;
39*042d53a7SEvalZero struct ble_att_read_req;
40*042d53a7SEvalZero struct ble_att_read_blob_req;
41*042d53a7SEvalZero struct ble_att_read_type_req;
42*042d53a7SEvalZero struct ble_att_read_group_type_req;
43*042d53a7SEvalZero struct ble_att_read_group_type_rsp;
44*042d53a7SEvalZero struct ble_att_find_type_value_req;
45*042d53a7SEvalZero struct ble_att_write_req;
46*042d53a7SEvalZero struct ble_att_prep_write_cmd;
47*042d53a7SEvalZero struct ble_att_exec_write_req;
48*042d53a7SEvalZero struct ble_att_notify_req;
49*042d53a7SEvalZero struct ble_att_indicate_req;
50*042d53a7SEvalZero 
51*042d53a7SEvalZero STATS_SECT_START(ble_att_stats)
52*042d53a7SEvalZero     STATS_SECT_ENTRY(error_rsp_rx)
53*042d53a7SEvalZero     STATS_SECT_ENTRY(error_rsp_tx)
54*042d53a7SEvalZero     STATS_SECT_ENTRY(mtu_req_rx)
55*042d53a7SEvalZero     STATS_SECT_ENTRY(mtu_req_tx)
56*042d53a7SEvalZero     STATS_SECT_ENTRY(mtu_rsp_rx)
57*042d53a7SEvalZero     STATS_SECT_ENTRY(mtu_rsp_tx)
58*042d53a7SEvalZero     STATS_SECT_ENTRY(find_info_req_rx)
59*042d53a7SEvalZero     STATS_SECT_ENTRY(find_info_req_tx)
60*042d53a7SEvalZero     STATS_SECT_ENTRY(find_info_rsp_rx)
61*042d53a7SEvalZero     STATS_SECT_ENTRY(find_info_rsp_tx)
62*042d53a7SEvalZero     STATS_SECT_ENTRY(find_type_value_req_rx)
63*042d53a7SEvalZero     STATS_SECT_ENTRY(find_type_value_req_tx)
64*042d53a7SEvalZero     STATS_SECT_ENTRY(find_type_value_rsp_rx)
65*042d53a7SEvalZero     STATS_SECT_ENTRY(find_type_value_rsp_tx)
66*042d53a7SEvalZero     STATS_SECT_ENTRY(read_type_req_rx)
67*042d53a7SEvalZero     STATS_SECT_ENTRY(read_type_req_tx)
68*042d53a7SEvalZero     STATS_SECT_ENTRY(read_type_rsp_rx)
69*042d53a7SEvalZero     STATS_SECT_ENTRY(read_type_rsp_tx)
70*042d53a7SEvalZero     STATS_SECT_ENTRY(read_req_rx)
71*042d53a7SEvalZero     STATS_SECT_ENTRY(read_req_tx)
72*042d53a7SEvalZero     STATS_SECT_ENTRY(read_rsp_rx)
73*042d53a7SEvalZero     STATS_SECT_ENTRY(read_rsp_tx)
74*042d53a7SEvalZero     STATS_SECT_ENTRY(read_blob_req_rx)
75*042d53a7SEvalZero     STATS_SECT_ENTRY(read_blob_req_tx)
76*042d53a7SEvalZero     STATS_SECT_ENTRY(read_blob_rsp_rx)
77*042d53a7SEvalZero     STATS_SECT_ENTRY(read_blob_rsp_tx)
78*042d53a7SEvalZero     STATS_SECT_ENTRY(read_mult_req_rx)
79*042d53a7SEvalZero     STATS_SECT_ENTRY(read_mult_req_tx)
80*042d53a7SEvalZero     STATS_SECT_ENTRY(read_mult_rsp_rx)
81*042d53a7SEvalZero     STATS_SECT_ENTRY(read_mult_rsp_tx)
82*042d53a7SEvalZero     STATS_SECT_ENTRY(read_group_type_req_rx)
83*042d53a7SEvalZero     STATS_SECT_ENTRY(read_group_type_req_tx)
84*042d53a7SEvalZero     STATS_SECT_ENTRY(read_group_type_rsp_rx)
85*042d53a7SEvalZero     STATS_SECT_ENTRY(read_group_type_rsp_tx)
86*042d53a7SEvalZero     STATS_SECT_ENTRY(write_req_rx)
87*042d53a7SEvalZero     STATS_SECT_ENTRY(write_req_tx)
88*042d53a7SEvalZero     STATS_SECT_ENTRY(write_rsp_rx)
89*042d53a7SEvalZero     STATS_SECT_ENTRY(write_rsp_tx)
90*042d53a7SEvalZero     STATS_SECT_ENTRY(prep_write_req_rx)
91*042d53a7SEvalZero     STATS_SECT_ENTRY(prep_write_req_tx)
92*042d53a7SEvalZero     STATS_SECT_ENTRY(prep_write_rsp_rx)
93*042d53a7SEvalZero     STATS_SECT_ENTRY(prep_write_rsp_tx)
94*042d53a7SEvalZero     STATS_SECT_ENTRY(exec_write_req_rx)
95*042d53a7SEvalZero     STATS_SECT_ENTRY(exec_write_req_tx)
96*042d53a7SEvalZero     STATS_SECT_ENTRY(exec_write_rsp_rx)
97*042d53a7SEvalZero     STATS_SECT_ENTRY(exec_write_rsp_tx)
98*042d53a7SEvalZero     STATS_SECT_ENTRY(notify_req_rx)
99*042d53a7SEvalZero     STATS_SECT_ENTRY(notify_req_tx)
100*042d53a7SEvalZero     STATS_SECT_ENTRY(indicate_req_rx)
101*042d53a7SEvalZero     STATS_SECT_ENTRY(indicate_req_tx)
102*042d53a7SEvalZero     STATS_SECT_ENTRY(indicate_rsp_rx)
103*042d53a7SEvalZero     STATS_SECT_ENTRY(indicate_rsp_tx)
104*042d53a7SEvalZero     STATS_SECT_ENTRY(write_cmd_rx)
105*042d53a7SEvalZero     STATS_SECT_ENTRY(write_cmd_tx)
106*042d53a7SEvalZero STATS_SECT_END
107*042d53a7SEvalZero extern STATS_SECT_DECL(ble_att_stats) ble_att_stats;
108*042d53a7SEvalZero 
109*042d53a7SEvalZero struct ble_att_prep_entry {
110*042d53a7SEvalZero     SLIST_ENTRY(ble_att_prep_entry) bape_next;
111*042d53a7SEvalZero     uint16_t bape_handle;
112*042d53a7SEvalZero     uint16_t bape_offset;
113*042d53a7SEvalZero 
114*042d53a7SEvalZero     /* XXX: This is wasteful; we should use one mbuf chain for the entire
115*042d53a7SEvalZero      * prepared write, and compress the data into as few mbufs as possible.
116*042d53a7SEvalZero      */
117*042d53a7SEvalZero     struct os_mbuf *bape_value;
118*042d53a7SEvalZero };
119*042d53a7SEvalZero 
120*042d53a7SEvalZero SLIST_HEAD(ble_att_prep_entry_list, ble_att_prep_entry);
121*042d53a7SEvalZero 
122*042d53a7SEvalZero struct ble_att_svr_conn {
123*042d53a7SEvalZero     /** This list is sorted by attribute handle ID. */
124*042d53a7SEvalZero     struct ble_att_prep_entry_list basc_prep_list;
125*042d53a7SEvalZero     ble_npl_time_t basc_prep_timeout_at;
126*042d53a7SEvalZero };
127*042d53a7SEvalZero 
128*042d53a7SEvalZero /**
129*042d53a7SEvalZero  * Handles a host attribute request.
130*042d53a7SEvalZero  *
131*042d53a7SEvalZero  * @param entry                 The host attribute being requested.
132*042d53a7SEvalZero  * @param op                    The operation being performed on the attribute.
133*042d53a7SEvalZero  * @param arg                   The request data associated with that host
134*042d53a7SEvalZero  *                                  attribute.
135*042d53a7SEvalZero  *
136*042d53a7SEvalZero  * @return                      0 on success;
137*042d53a7SEvalZero  *                              One of the BLE_ATT_ERR_[...] codes on
138*042d53a7SEvalZero  *                                  failure.
139*042d53a7SEvalZero  */
140*042d53a7SEvalZero typedef int ble_att_svr_access_fn(uint16_t conn_handle, uint16_t attr_handle,
141*042d53a7SEvalZero                                   uint8_t op, uint16_t offset,
142*042d53a7SEvalZero                                   struct os_mbuf **om, void *arg);
143*042d53a7SEvalZero 
144*042d53a7SEvalZero int ble_att_svr_register(const ble_uuid_t *uuid, uint8_t flags,
145*042d53a7SEvalZero                          uint8_t min_key_size, uint16_t *handle_id,
146*042d53a7SEvalZero                          ble_att_svr_access_fn *cb, void *cb_arg);
147*042d53a7SEvalZero 
148*042d53a7SEvalZero struct ble_att_svr_entry {
149*042d53a7SEvalZero     STAILQ_ENTRY(ble_att_svr_entry) ha_next;
150*042d53a7SEvalZero 
151*042d53a7SEvalZero     const ble_uuid_t *ha_uuid;
152*042d53a7SEvalZero     uint8_t ha_flags;
153*042d53a7SEvalZero     uint8_t ha_min_key_size;
154*042d53a7SEvalZero     uint16_t ha_handle_id;
155*042d53a7SEvalZero     ble_att_svr_access_fn *ha_cb;
156*042d53a7SEvalZero     void *ha_cb_arg;
157*042d53a7SEvalZero };
158*042d53a7SEvalZero 
159*042d53a7SEvalZero SLIST_HEAD(ble_att_clt_entry_list, ble_att_clt_entry);
160*042d53a7SEvalZero 
161*042d53a7SEvalZero /*** @gen */
162*042d53a7SEvalZero 
163*042d53a7SEvalZero struct ble_l2cap_chan *ble_att_create_chan(uint16_t conn_handle);
164*042d53a7SEvalZero int ble_att_conn_chan_find(uint16_t conn_handle, struct ble_hs_conn **out_conn,
165*042d53a7SEvalZero                            struct ble_l2cap_chan **out_chan);
166*042d53a7SEvalZero void ble_att_inc_tx_stat(uint8_t att_op);
167*042d53a7SEvalZero void ble_att_truncate_to_mtu(const struct ble_l2cap_chan *att_chan,
168*042d53a7SEvalZero                              struct os_mbuf *txom);
169*042d53a7SEvalZero void ble_att_set_peer_mtu(struct ble_l2cap_chan *chan, uint16_t peer_mtu);
170*042d53a7SEvalZero uint16_t ble_att_chan_mtu(const struct ble_l2cap_chan *chan);
171*042d53a7SEvalZero int ble_att_init(void);
172*042d53a7SEvalZero 
173*042d53a7SEvalZero #define BLE_ATT_LOG_CMD(is_tx, cmd_name, conn_handle, log_cb, cmd) \
174*042d53a7SEvalZero     BLE_HS_LOG_CMD((is_tx), "att", (cmd_name), (conn_handle), (log_cb), (cmd))
175*042d53a7SEvalZero 
176*042d53a7SEvalZero #define BLE_ATT_LOG_EMPTY_CMD(is_tx, cmd_name, conn_handle) \
177*042d53a7SEvalZero     BLE_HS_LOG_EMPTY_CMD((is_tx), "att", (cmd_name), (conn_handle))
178*042d53a7SEvalZero 
179*042d53a7SEvalZero /*** @svr */
180*042d53a7SEvalZero 
181*042d53a7SEvalZero int ble_att_svr_start(void);
182*042d53a7SEvalZero 
183*042d53a7SEvalZero struct ble_att_svr_entry *
184*042d53a7SEvalZero ble_att_svr_find_by_uuid(struct ble_att_svr_entry *start_at,
185*042d53a7SEvalZero                          const ble_uuid_t *uuid,
186*042d53a7SEvalZero                          uint16_t end_handle);
187*042d53a7SEvalZero uint16_t ble_att_svr_prev_handle(void);
188*042d53a7SEvalZero int ble_att_svr_rx_mtu(uint16_t conn_handle, struct os_mbuf **rxom);
189*042d53a7SEvalZero struct ble_att_svr_entry *ble_att_svr_find_by_handle(uint16_t handle_id);
190*042d53a7SEvalZero int32_t ble_att_svr_ticks_until_tmo(const struct ble_att_svr_conn *svr,
191*042d53a7SEvalZero                                     ble_npl_time_t now);
192*042d53a7SEvalZero int ble_att_svr_rx_find_info(uint16_t conn_handle, struct os_mbuf **rxom);
193*042d53a7SEvalZero int ble_att_svr_rx_find_type_value(uint16_t conn_handle,
194*042d53a7SEvalZero                                    struct os_mbuf **rxom);
195*042d53a7SEvalZero int ble_att_svr_rx_read_type(uint16_t conn_handle,
196*042d53a7SEvalZero                              struct os_mbuf **rxom);
197*042d53a7SEvalZero int ble_att_svr_rx_read_group_type(uint16_t conn_handle,
198*042d53a7SEvalZero                                    struct os_mbuf **rxom);
199*042d53a7SEvalZero int ble_att_svr_rx_read(uint16_t conn_handle,
200*042d53a7SEvalZero                         struct os_mbuf **rxom);
201*042d53a7SEvalZero int ble_att_svr_rx_read_blob(uint16_t conn_handle,
202*042d53a7SEvalZero                              struct os_mbuf **rxom);
203*042d53a7SEvalZero int ble_att_svr_rx_read_mult(uint16_t conn_handle,
204*042d53a7SEvalZero                              struct os_mbuf **rxom);
205*042d53a7SEvalZero int ble_att_svr_rx_write(uint16_t conn_handle,
206*042d53a7SEvalZero                          struct os_mbuf **rxom);
207*042d53a7SEvalZero int ble_att_svr_rx_write_no_rsp(uint16_t conn_handle, struct os_mbuf **rxom);
208*042d53a7SEvalZero int ble_att_svr_rx_prep_write(uint16_t conn_handle,
209*042d53a7SEvalZero                               struct os_mbuf **rxom);
210*042d53a7SEvalZero int ble_att_svr_rx_exec_write(uint16_t conn_handle,
211*042d53a7SEvalZero                               struct os_mbuf **rxom);
212*042d53a7SEvalZero int ble_att_svr_rx_notify(uint16_t conn_handle,
213*042d53a7SEvalZero                           struct os_mbuf **rxom);
214*042d53a7SEvalZero int ble_att_svr_rx_indicate(uint16_t conn_handle,
215*042d53a7SEvalZero                             struct os_mbuf **rxom);
216*042d53a7SEvalZero void ble_att_svr_prep_clear(struct ble_att_prep_entry_list *prep_list);
217*042d53a7SEvalZero int ble_att_svr_read_handle(uint16_t conn_handle, uint16_t attr_handle,
218*042d53a7SEvalZero                             uint16_t offset, struct os_mbuf *om,
219*042d53a7SEvalZero                             uint8_t *out_att_err);
220*042d53a7SEvalZero void ble_att_svr_reset(void);
221*042d53a7SEvalZero int ble_att_svr_init(void);
222*042d53a7SEvalZero 
223*042d53a7SEvalZero void ble_att_svr_hide_range(uint16_t start_handle, uint16_t end_handle);
224*042d53a7SEvalZero void ble_att_svr_restore_range(uint16_t start_handle, uint16_t end_handle);
225*042d53a7SEvalZero 
226*042d53a7SEvalZero int ble_att_svr_tx_error_rsp(uint16_t conn_handle, struct os_mbuf *txom,
227*042d53a7SEvalZero                              uint8_t req_op, uint16_t handle,
228*042d53a7SEvalZero                              uint8_t error_code);
229*042d53a7SEvalZero /*** $clt */
230*042d53a7SEvalZero 
231*042d53a7SEvalZero /** An information-data entry in a find information response. */
232*042d53a7SEvalZero struct ble_att_find_info_idata {
233*042d53a7SEvalZero     uint16_t attr_handle;
234*042d53a7SEvalZero     ble_uuid_any_t uuid;
235*042d53a7SEvalZero };
236*042d53a7SEvalZero 
237*042d53a7SEvalZero /** A handles-information entry in a find by type value response. */
238*042d53a7SEvalZero struct ble_att_find_type_value_hinfo {
239*042d53a7SEvalZero     uint16_t attr_handle;
240*042d53a7SEvalZero     uint16_t group_end_handle;
241*042d53a7SEvalZero };
242*042d53a7SEvalZero 
243*042d53a7SEvalZero /** An attribute-data entry in a read by type response. */
244*042d53a7SEvalZero struct ble_att_read_type_adata {
245*042d53a7SEvalZero     uint16_t att_handle;
246*042d53a7SEvalZero     int value_len;
247*042d53a7SEvalZero     uint8_t *value;
248*042d53a7SEvalZero 
249*042d53a7SEvalZero };
250*042d53a7SEvalZero 
251*042d53a7SEvalZero /** An attribute-data entry in a read by group type response. */
252*042d53a7SEvalZero struct ble_att_read_group_type_adata {
253*042d53a7SEvalZero     uint16_t att_handle;
254*042d53a7SEvalZero     uint16_t end_group_handle;
255*042d53a7SEvalZero     int value_len;
256*042d53a7SEvalZero     uint8_t *value;
257*042d53a7SEvalZero };
258*042d53a7SEvalZero 
259*042d53a7SEvalZero int ble_att_clt_rx_error(uint16_t conn_handle, struct os_mbuf **rxom);
260*042d53a7SEvalZero int ble_att_clt_tx_mtu(uint16_t conn_handle, uint16_t mtu);
261*042d53a7SEvalZero int ble_att_clt_rx_mtu(uint16_t conn_handle, struct os_mbuf **rxom);
262*042d53a7SEvalZero int ble_att_clt_tx_read(uint16_t conn_handle, uint16_t handle);
263*042d53a7SEvalZero int ble_att_clt_rx_read(uint16_t conn_handle, struct os_mbuf **rxom);
264*042d53a7SEvalZero int ble_att_clt_tx_read_blob(uint16_t conn_handle, uint16_t handle,
265*042d53a7SEvalZero                              uint16_t offset);
266*042d53a7SEvalZero int ble_att_clt_rx_read_blob(uint16_t conn_handle, struct os_mbuf **rxom);
267*042d53a7SEvalZero int ble_att_clt_tx_read_mult(uint16_t conn_handle,
268*042d53a7SEvalZero                              const uint16_t *handles, int num_handles);
269*042d53a7SEvalZero int ble_att_clt_rx_read_mult(uint16_t conn_handle, struct os_mbuf **rxom);
270*042d53a7SEvalZero int ble_att_clt_tx_read_type(uint16_t conn_handle, uint16_t start_handle,
271*042d53a7SEvalZero                              uint16_t end_handle, const ble_uuid_t *uuid);
272*042d53a7SEvalZero int ble_att_clt_rx_read_type(uint16_t conn_handle, struct os_mbuf **rxom);
273*042d53a7SEvalZero int ble_att_clt_tx_read_group_type(uint16_t conn_handle,
274*042d53a7SEvalZero                                    uint16_t start_handle, uint16_t end_handle,
275*042d53a7SEvalZero                                    const ble_uuid_t *uuid128);
276*042d53a7SEvalZero int ble_att_clt_rx_read_group_type(uint16_t conn_handle,
277*042d53a7SEvalZero                                    struct os_mbuf **rxom);
278*042d53a7SEvalZero int ble_att_clt_tx_find_info(uint16_t conn_handle, uint16_t start_handle,
279*042d53a7SEvalZero                              uint16_t end_handle);
280*042d53a7SEvalZero int ble_att_clt_rx_find_info(uint16_t conn_handle, struct os_mbuf **rxom);
281*042d53a7SEvalZero int ble_att_clt_tx_find_type_value(uint16_t conn_handle, uint16_t start_handle,
282*042d53a7SEvalZero                                    uint16_t end_handle, uint16_t attribute_type,
283*042d53a7SEvalZero                                    const void *attribute_value, int value_len);
284*042d53a7SEvalZero int ble_att_clt_rx_find_type_value(uint16_t conn_handle,
285*042d53a7SEvalZero                                    struct os_mbuf **rxom);
286*042d53a7SEvalZero int ble_att_clt_tx_write_req(uint16_t conn_handle, uint16_t handle,
287*042d53a7SEvalZero                              struct os_mbuf *txom);
288*042d53a7SEvalZero int ble_att_clt_tx_write_cmd(uint16_t conn_handle, uint16_t handle,
289*042d53a7SEvalZero                              struct os_mbuf *txom);
290*042d53a7SEvalZero int ble_att_clt_tx_prep_write(uint16_t conn_handle, uint16_t handle,
291*042d53a7SEvalZero                               uint16_t offset, struct os_mbuf *txom);
292*042d53a7SEvalZero int ble_att_clt_rx_prep_write(uint16_t conn_handle, struct os_mbuf **rxom);
293*042d53a7SEvalZero int ble_att_clt_tx_exec_write(uint16_t conn_handle, uint8_t flags);
294*042d53a7SEvalZero int ble_att_clt_rx_exec_write(uint16_t conn_handle, struct os_mbuf **rxom);
295*042d53a7SEvalZero int ble_att_clt_rx_write(uint16_t conn_handle, struct os_mbuf **rxom);
296*042d53a7SEvalZero int ble_att_clt_tx_notify(uint16_t conn_handle, uint16_t handle,
297*042d53a7SEvalZero                           struct os_mbuf *txom);
298*042d53a7SEvalZero int ble_att_clt_tx_indicate(uint16_t conn_handle, uint16_t handle,
299*042d53a7SEvalZero                             struct os_mbuf *txom);
300*042d53a7SEvalZero int ble_att_clt_rx_indicate(uint16_t conn_handle, struct os_mbuf **rxom);
301*042d53a7SEvalZero 
302*042d53a7SEvalZero #ifdef __cplusplus
303*042d53a7SEvalZero }
304*042d53a7SEvalZero #endif
305*042d53a7SEvalZero 
306*042d53a7SEvalZero #endif
307