/****************************************************************************** * * Copyright 2003-2012 Broadcom Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ /****************************************************************************** * * This is the private file for the file transfer client (FTC). * ******************************************************************************/ #ifndef BTA_GATTC_INT_H #define BTA_GATTC_INT_H #include #include "bt_target.h" // Must be first to define build configuration #include "bta/gatt/database.h" #include "bta/gatt/database_builder.h" #include "bta/include/bta_gatt_api.h" #include "bta/sys/bta_sys.h" #include "stack/include/gatt_api.h" #include "types/bt_transport.h" /***************************************************************************** * Constants and data types ****************************************************************************/ enum { BTA_GATTC_API_OPEN_EVT = BTA_SYS_EVT_START(BTA_ID_GATTC), BTA_GATTC_INT_OPEN_FAIL_EVT, BTA_GATTC_API_CANCEL_OPEN_EVT, BTA_GATTC_INT_CANCEL_OPEN_OK_EVT, BTA_GATTC_API_READ_EVT, BTA_GATTC_API_WRITE_EVT, BTA_GATTC_API_EXEC_EVT, BTA_GATTC_API_CFG_MTU_EVT, BTA_GATTC_API_CLOSE_EVT, BTA_GATTC_API_SEARCH_EVT, BTA_GATTC_API_CONFIRM_EVT, BTA_GATTC_API_READ_MULTI_EVT, BTA_GATTC_INT_CONN_EVT, BTA_GATTC_INT_DISCOVER_EVT, BTA_GATTC_DISCOVER_CMPL_EVT, BTA_GATTC_OP_CMPL_EVT, BTA_GATTC_INT_DISCONN_EVT }; typedef uint16_t tBTA_GATTC_INT_EVT; #define BTA_GATTC_SERVICE_CHANGED_LEN 4 /* max client application GATTC can support */ #ifndef BTA_GATTC_CL_MAX #define BTA_GATTC_CL_MAX 32 #endif /* max known devices GATTC can support in Bluetooth spec */ #ifndef BTA_GATTC_KNOWN_SR_MAX #define BTA_GATTC_KNOWN_SR_MAX 255 #endif #ifndef BTA_GATTC_CLCB_MAX #define BTA_GATTC_CLCB_MAX GATT_CL_MAX_LCB #endif #define BTA_GATTC_WRITE_PREPARE GATT_WRITE_PREPARE /* internal strucutre for GATTC register API */ typedef struct { BT_HDR_RIGID hdr; RawAddress remote_bda; tGATT_IF client_if; bool is_direct; tBT_TRANSPORT transport; uint8_t initiating_phys; bool opportunistic; } tBTA_GATTC_API_OPEN; typedef tBTA_GATTC_API_OPEN tBTA_GATTC_API_CANCEL_OPEN; typedef struct { BT_HDR_RIGID hdr; tGATT_AUTH_REQ auth_req; // read by handle data uint16_t handle; // read by UUID data bluetooth::Uuid uuid; uint16_t s_handle; uint16_t e_handle; tBTA_GATTC_EVT cmpl_evt; GATT_READ_OP_CB read_cb; void* read_cb_data; } tBTA_GATTC_API_READ; typedef struct { BT_HDR_RIGID hdr; tGATT_AUTH_REQ auth_req; uint16_t handle; tGATT_WRITE_TYPE write_type; uint16_t offset; uint16_t len; uint8_t* p_value; GATT_WRITE_OP_CB write_cb; void* write_cb_data; } tBTA_GATTC_API_WRITE; typedef struct { BT_HDR_RIGID hdr; bool is_execute; } tBTA_GATTC_API_EXEC; typedef struct { BT_HDR_RIGID hdr; uint16_t cid; } tBTA_GATTC_API_CONFIRM; typedef struct { BT_HDR_RIGID hdr; tGATTC_OPTYPE op_code; tGATT_STATUS status; tGATT_CL_COMPLETE* p_cmpl; } tBTA_GATTC_OP_CMPL; typedef struct { BT_HDR_RIGID hdr; bluetooth::Uuid* p_srvc_uuid; } tBTA_GATTC_API_SEARCH; typedef struct { BT_HDR_RIGID hdr; tGATT_AUTH_REQ auth_req; uint8_t num_attr; uint16_t handles[GATT_MAX_READ_MULTI_HANDLES]; } tBTA_GATTC_API_READ_MULTI; typedef struct { BT_HDR_RIGID hdr; uint16_t mtu; GATT_CONFIGURE_MTU_OP_CB mtu_cb; void* mtu_cb_data; } tBTA_GATTC_API_CFG_MTU; typedef struct { BT_HDR_RIGID hdr; RawAddress remote_bda; tGATT_IF client_if; uint8_t role; tBT_TRANSPORT transport; tGATT_DISCONN_REASON reason; } tBTA_GATTC_INT_CONN; typedef union { BT_HDR_RIGID hdr; tBTA_GATTC_API_OPEN api_conn; tBTA_GATTC_API_CANCEL_OPEN api_cancel_conn; tBTA_GATTC_API_READ api_read; tBTA_GATTC_API_SEARCH api_search; tBTA_GATTC_API_WRITE api_write; tBTA_GATTC_API_CONFIRM api_confirm; tBTA_GATTC_API_EXEC api_exec; tBTA_GATTC_API_READ_MULTI api_read_multi; tBTA_GATTC_API_CFG_MTU api_mtu; tBTA_GATTC_OP_CMPL op_cmpl; tBTA_GATTC_INT_CONN int_conn; } tBTA_GATTC_DATA; enum { BTA_GATTC_IDLE_ST = 0, /* Idle */ BTA_GATTC_W4_CONN_ST, /* Wait for connection - (optional) */ BTA_GATTC_CONN_ST, /* connected state */ BTA_GATTC_DISCOVER_ST /* discover is in progress */ }; typedef uint8_t tBTA_GATTC_STATE; typedef struct { bool in_use; RawAddress server_bda; bool connected; #define BTA_GATTC_SERV_IDLE 0 #define BTA_GATTC_SERV_LOAD 1 #define BTA_GATTC_SERV_SAVE 2 #define BTA_GATTC_SERV_DISC 3 #define BTA_GATTC_SERV_DISC_ACT 4 uint8_t state; gatt::Database gatt_database; uint8_t update_count; /* indication received */ uint8_t num_clcb; /* number of associated CLCB */ gatt::DatabaseBuilder pending_discovery; /* used only during service discovery, when reading Extended Characteristic * Properties */ bool read_multiple_not_supported; uint8_t srvc_hdl_chg; /* service handle change indication pending */ bool srvc_hdl_db_hash; /* read db hash pending */ uint8_t srvc_disc_count; /* current discovery retry count */ uint16_t attr_index; /* cahce NV saving/loading attribute index */ uint16_t mtu; } tBTA_GATTC_SERV; #ifndef BTA_GATTC_NOTIF_REG_MAX #define BTA_GATTC_NOTIF_REG_MAX 64 #endif typedef struct { bool in_use; RawAddress remote_bda; uint16_t handle; } tBTA_GATTC_NOTIF_REG; typedef struct { tBTA_GATTC_CBACK* p_cback; bool in_use; tGATT_IF client_if; /* client interface with BTE stack for this application */ uint8_t num_clcb; /* number of associated CLCB */ bool dereg_pending; bluetooth::Uuid app_uuid; tBTA_GATTC_NOTIF_REG notif_reg[BTA_GATTC_NOTIF_REG_MAX]; } tBTA_GATTC_RCB; /* client channel is a mapping between a BTA client(cl_id) and a remote BD * address */ typedef struct { uint16_t bta_conn_id; /* client channel ID, unique for clcb */ RawAddress bda; tBT_TRANSPORT transport; /* channel transport */ tBTA_GATTC_RCB* p_rcb; /* pointer to the registration CB */ tBTA_GATTC_SERV* p_srcb; /* server cache CB */ const tBTA_GATTC_DATA* p_q_cmd; /* command in queue waiting for execution */ // request during discover state #define BTA_GATTC_DISCOVER_REQ_NONE 0 #define BTA_GATTC_DISCOVER_REQ_READ_EXT_PROP_DESC 1 #define BTA_GATTC_DISCOVER_REQ_READ_DB_HASH 2 uint8_t request_during_discovery; /* request during discover state */ #define BTA_GATTC_NO_SCHEDULE 0 #define BTA_GATTC_DISC_WAITING 0x01 #define BTA_GATTC_REQ_WAITING 0x10 uint8_t auto_update; /* auto update is waiting */ bool disc_active; bool in_use; tBTA_GATTC_STATE state; tGATT_STATUS status; } tBTA_GATTC_CLCB; /* back ground connection tracking information */ #if GATT_MAX_APPS <= 8 typedef uint8_t tBTA_GATTC_CIF_MASK; #elif GATT_MAX_APPS <= 16 typedef uint16_t tBTA_GATTC_CIF_MASK; #elif GATT_MAX_APPS <= 32 typedef uint32_t tBTA_GATTC_CIF_MASK; #endif typedef struct { bool in_use; RawAddress remote_bda; tBTA_GATTC_CIF_MASK cif_mask; } tBTA_GATTC_BG_TCK; typedef struct { bool in_use; RawAddress remote_bda; } tBTA_GATTC_CONN; enum { BTA_GATTC_STATE_DISABLED, BTA_GATTC_STATE_ENABLING, BTA_GATTC_STATE_ENABLED, BTA_GATTC_STATE_DISABLING }; typedef struct { uint8_t state; tBTA_GATTC_CONN conn_track[GATT_MAX_PHY_CHANNEL]; tBTA_GATTC_BG_TCK bg_track[BTA_GATTC_KNOWN_SR_MAX]; tBTA_GATTC_RCB cl_rcb[BTA_GATTC_CL_MAX]; tBTA_GATTC_CLCB clcb[BTA_GATTC_CLCB_MAX]; tBTA_GATTC_SERV known_server[BTA_GATTC_KNOWN_SR_MAX]; } tBTA_GATTC_CB; /***************************************************************************** * Global data ****************************************************************************/ /* GATTC control block */ extern tBTA_GATTC_CB bta_gattc_cb; /***************************************************************************** * Function prototypes ****************************************************************************/ extern bool bta_gattc_hdl_event(BT_HDR_RIGID* p_msg); extern bool bta_gattc_sm_execute(tBTA_GATTC_CLCB* p_clcb, uint16_t event, const tBTA_GATTC_DATA* p_data); /* function processed outside SM */ extern void bta_gattc_disable(); extern void bta_gattc_register(const bluetooth::Uuid& app_uuid, tBTA_GATTC_CBACK* p_data, BtaAppRegisterCallback cb, bool eatt_support); extern void bta_gattc_process_api_open(const tBTA_GATTC_DATA* p_msg); extern void bta_gattc_process_api_open_cancel(const tBTA_GATTC_DATA* p_msg); extern void bta_gattc_deregister(tBTA_GATTC_RCB* p_clreg); /* function within state machine */ extern void bta_gattc_open(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_open_fail(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_open_error(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_cancel_open(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_cancel_open_ok(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_cancel_open_error(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_conn(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_close(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_close_fail(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_disc_close(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_start_discover(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_start_discover_internal(tBTA_GATTC_CLCB* p_clcb); extern void bta_gattc_disc_cmpl(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_read(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_write(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_op_cmpl(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_q_cmd(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_search(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_fail(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_confirm(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_execute(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_read_multi(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_ci_open(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_ci_close(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_op_cmpl_during_discovery(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_restart_discover(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_msg); extern void bta_gattc_init_bk_conn(const tBTA_GATTC_API_OPEN* p_data, tBTA_GATTC_RCB* p_clreg); extern void bta_gattc_cancel_bk_conn(const tBTA_GATTC_API_CANCEL_OPEN* p_data); extern void bta_gattc_send_open_cback(tBTA_GATTC_RCB* p_clreg, tGATT_STATUS status, const RawAddress& remote_bda, uint16_t conn_id, tBT_TRANSPORT transport, uint16_t mtu); extern void bta_gattc_process_api_refresh(const RawAddress& remote_bda); extern void bta_gattc_cfg_mtu(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern void bta_gattc_listen(tBTA_GATTC_DATA* p_msg); extern void bta_gattc_broadcast(tBTA_GATTC_DATA* p_msg); /* utility functions */ extern tBTA_GATTC_CLCB* bta_gattc_find_clcb_by_cif(uint8_t client_if, const RawAddress& remote_bda, tBT_TRANSPORT transport); extern tBTA_GATTC_CLCB* bta_gattc_find_clcb_by_conn_id(uint16_t conn_id); extern tBTA_GATTC_CLCB* bta_gattc_clcb_alloc(tGATT_IF client_if, const RawAddress& remote_bda, tBT_TRANSPORT transport); extern void bta_gattc_clcb_dealloc(tBTA_GATTC_CLCB* p_clcb); extern tBTA_GATTC_CLCB* bta_gattc_find_alloc_clcb(tGATT_IF client_if, const RawAddress& remote_bda, tBT_TRANSPORT transport); extern tBTA_GATTC_RCB* bta_gattc_cl_get_regcb(uint8_t client_if); extern tBTA_GATTC_SERV* bta_gattc_find_srcb(const RawAddress& bda); extern tBTA_GATTC_SERV* bta_gattc_srcb_alloc(const RawAddress& bda); extern tBTA_GATTC_SERV* bta_gattc_find_scb_by_cid(uint16_t conn_id); extern tBTA_GATTC_CLCB* bta_gattc_find_int_conn_clcb(tBTA_GATTC_DATA* p_msg); extern tBTA_GATTC_CLCB* bta_gattc_find_int_disconn_clcb(tBTA_GATTC_DATA* p_msg); extern bool bta_gattc_enqueue(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data); extern bool bta_gattc_check_notif_registry(tBTA_GATTC_RCB* p_clreg, tBTA_GATTC_SERV* p_srcb, tBTA_GATTC_NOTIFY* p_notify); extern bool bta_gattc_mark_bg_conn(tGATT_IF client_if, const RawAddress& remote_bda, bool add); extern bool bta_gattc_check_bg_conn(tGATT_IF client_if, const RawAddress& remote_bda, uint8_t role); extern uint8_t bta_gattc_num_reg_app(void); extern void bta_gattc_clear_notif_registration(tBTA_GATTC_SERV* p_srcb, uint16_t conn_id, uint16_t start_handle, uint16_t end_handle); extern tBTA_GATTC_SERV* bta_gattc_find_srvr_cache(const RawAddress& bda); extern bool bta_gattc_is_robust_caching_enabled(); /* discovery functions */ extern void bta_gattc_disc_res_cback(uint16_t conn_id, tGATT_DISC_TYPE disc_type, tGATT_DISC_RES* p_data); extern void bta_gattc_disc_cmpl_cback(uint16_t conn_id, tGATT_DISC_TYPE disc_type, tGATT_STATUS status); extern tGATT_STATUS bta_gattc_discover_pri_service(uint16_t conn_id, tBTA_GATTC_SERV* p_server_cb, tGATT_DISC_TYPE disc_type); extern void bta_gattc_search_service(tBTA_GATTC_CLCB* p_clcb, bluetooth::Uuid* p_uuid); extern const std::list* bta_gattc_get_services(uint16_t conn_id); extern const gatt::Service* bta_gattc_get_service_for_handle(uint16_t conn_id, uint16_t handle); const gatt::Characteristic* bta_gattc_get_characteristic_srcb( tBTA_GATTC_SERV* p_srcb, uint16_t handle); extern const gatt::Service* bta_gattc_get_service_for_handle_srcb( tBTA_GATTC_SERV* p_srcb, uint16_t handle); extern const gatt::Characteristic* bta_gattc_get_characteristic( uint16_t conn_id, uint16_t handle); extern const gatt::Descriptor* bta_gattc_get_descriptor(uint16_t conn_id, uint16_t handle); extern const gatt::Characteristic* bta_gattc_get_owning_characteristic( uint16_t conn_id, uint16_t handle); extern void bta_gattc_get_gatt_db(uint16_t conn_id, uint16_t start_handle, uint16_t end_handle, btgatt_db_element_t** db, int* count); extern void bta_gattc_init_cache(tBTA_GATTC_SERV* p_srvc_cb); extern void bta_gattc_reset_discover_st(tBTA_GATTC_SERV* p_srcb, tGATT_STATUS status); extern tBTA_GATTC_CONN* bta_gattc_conn_alloc(const RawAddress& remote_bda); extern tBTA_GATTC_CONN* bta_gattc_conn_find(const RawAddress& remote_bda); extern tBTA_GATTC_CONN* bta_gattc_conn_find_alloc(const RawAddress& remote_bda); extern bool bta_gattc_conn_dealloc(const RawAddress& remote_bda); extern bool bta_gattc_cache_load(tBTA_GATTC_SERV* p_srcb); extern void bta_gattc_cache_reset(const RawAddress& server_bda); extern bool bta_gattc_read_db_hash(tBTA_GATTC_CLCB* p_clcb); #endif /* BTA_GATTC_INT_H */