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