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_HS_PRIV_ 21*042d53a7SEvalZero #define H_BLE_HS_PRIV_ 22*042d53a7SEvalZero 23*042d53a7SEvalZero #include <assert.h> 24*042d53a7SEvalZero #include <inttypes.h> 25*042d53a7SEvalZero #include "ble_att_cmd_priv.h" 26*042d53a7SEvalZero #include "ble_att_priv.h" 27*042d53a7SEvalZero #include "ble_gap_priv.h" 28*042d53a7SEvalZero #include "ble_gatt_priv.h" 29*042d53a7SEvalZero #include "ble_hs_dbg_priv.h" 30*042d53a7SEvalZero #include "ble_hs_hci_priv.h" 31*042d53a7SEvalZero #include "ble_hs_atomic_priv.h" 32*042d53a7SEvalZero #include "ble_hs_conn_priv.h" 33*042d53a7SEvalZero #include "ble_hs_atomic_priv.h" 34*042d53a7SEvalZero #include "ble_hs_mbuf_priv.h" 35*042d53a7SEvalZero #include "ble_hs_startup_priv.h" 36*042d53a7SEvalZero #include "ble_l2cap_priv.h" 37*042d53a7SEvalZero #include "ble_l2cap_sig_priv.h" 38*042d53a7SEvalZero #include "ble_l2cap_coc_priv.h" 39*042d53a7SEvalZero #include "ble_sm_priv.h" 40*042d53a7SEvalZero #include "ble_hs_adv_priv.h" 41*042d53a7SEvalZero #include "ble_hs_flow_priv.h" 42*042d53a7SEvalZero #include "ble_hs_pvcy_priv.h" 43*042d53a7SEvalZero #include "ble_hs_id_priv.h" 44*042d53a7SEvalZero #include "ble_uuid_priv.h" 45*042d53a7SEvalZero #include "host/ble_hs.h" 46*042d53a7SEvalZero #include "host/ble_monitor.h" 47*042d53a7SEvalZero #include "nimble/nimble_opt.h" 48*042d53a7SEvalZero #include "stats/stats.h" 49*042d53a7SEvalZero #ifdef __cplusplus 50*042d53a7SEvalZero extern "C" { 51*042d53a7SEvalZero #endif 52*042d53a7SEvalZero 53*042d53a7SEvalZero struct ble_hs_conn; 54*042d53a7SEvalZero struct ble_l2cap_chan; 55*042d53a7SEvalZero struct os_mbuf; 56*042d53a7SEvalZero struct os_mempool; 57*042d53a7SEvalZero struct os_event; 58*042d53a7SEvalZero 59*042d53a7SEvalZero #define BLE_HS_SYNC_STATE_BAD 0 60*042d53a7SEvalZero #define BLE_HS_SYNC_STATE_BRINGUP 1 61*042d53a7SEvalZero #define BLE_HS_SYNC_STATE_GOOD 2 62*042d53a7SEvalZero 63*042d53a7SEvalZero #define BLE_HS_ENABLED_STATE_OFF 0 64*042d53a7SEvalZero #define BLE_HS_ENABLED_STATE_STOPPING 1 65*042d53a7SEvalZero #define BLE_HS_ENABLED_STATE_ON 2 66*042d53a7SEvalZero 67*042d53a7SEvalZero #if NIMBLE_BLE_CONNECT 68*042d53a7SEvalZero #define BLE_HS_MAX_CONNECTIONS MYNEWT_VAL(BLE_MAX_CONNECTIONS) 69*042d53a7SEvalZero #else 70*042d53a7SEvalZero #define BLE_HS_MAX_CONNECTIONS 0 71*042d53a7SEvalZero #endif 72*042d53a7SEvalZero 73*042d53a7SEvalZero #if !MYNEWT_VAL(BLE_ATT_SVR_QUEUED_WRITE) 74*042d53a7SEvalZero #define BLE_HS_ATT_SVR_QUEUED_WRITE_TMO 0 75*042d53a7SEvalZero #else 76*042d53a7SEvalZero #define BLE_HS_ATT_SVR_QUEUED_WRITE_TMO \ 77*042d53a7SEvalZero MYNEWT_VAL(BLE_ATT_SVR_QUEUED_WRITE_TMO) 78*042d53a7SEvalZero #endif 79*042d53a7SEvalZero 80*042d53a7SEvalZero STATS_SECT_START(ble_hs_stats) 81*042d53a7SEvalZero STATS_SECT_ENTRY(conn_create) 82*042d53a7SEvalZero STATS_SECT_ENTRY(conn_delete) 83*042d53a7SEvalZero STATS_SECT_ENTRY(hci_cmd) 84*042d53a7SEvalZero STATS_SECT_ENTRY(hci_event) 85*042d53a7SEvalZero STATS_SECT_ENTRY(hci_invalid_ack) 86*042d53a7SEvalZero STATS_SECT_ENTRY(hci_unknown_event) 87*042d53a7SEvalZero STATS_SECT_ENTRY(hci_timeout) 88*042d53a7SEvalZero STATS_SECT_ENTRY(reset) 89*042d53a7SEvalZero STATS_SECT_ENTRY(sync) 90*042d53a7SEvalZero STATS_SECT_ENTRY(pvcy_add_entry) 91*042d53a7SEvalZero STATS_SECT_ENTRY(pvcy_add_entry_fail) 92*042d53a7SEvalZero STATS_SECT_END 93*042d53a7SEvalZero extern STATS_SECT_DECL(ble_hs_stats) ble_hs_stats; 94*042d53a7SEvalZero 95*042d53a7SEvalZero extern struct os_mbuf_pool ble_hs_mbuf_pool; 96*042d53a7SEvalZero extern uint8_t ble_hs_sync_state; 97*042d53a7SEvalZero extern uint8_t ble_hs_enabled_state; 98*042d53a7SEvalZero 99*042d53a7SEvalZero extern const uint8_t ble_hs_misc_null_addr[6]; 100*042d53a7SEvalZero 101*042d53a7SEvalZero extern uint16_t ble_hs_max_attrs; 102*042d53a7SEvalZero extern uint16_t ble_hs_max_services; 103*042d53a7SEvalZero extern uint16_t ble_hs_max_client_configs; 104*042d53a7SEvalZero 105*042d53a7SEvalZero void ble_hs_process_rx_data_queue(void); 106*042d53a7SEvalZero int ble_hs_tx_data(struct os_mbuf *om); 107*042d53a7SEvalZero void ble_hs_wakeup_tx(void); 108*042d53a7SEvalZero void ble_hs_enqueue_hci_event(uint8_t *hci_evt); 109*042d53a7SEvalZero void ble_hs_event_enqueue(struct os_event *ev); 110*042d53a7SEvalZero 111*042d53a7SEvalZero int ble_hs_hci_rx_evt(uint8_t *hci_ev, void *arg); 112*042d53a7SEvalZero int ble_hs_hci_evt_acl_process(struct os_mbuf *om); 113*042d53a7SEvalZero 114*042d53a7SEvalZero int ble_hs_misc_conn_chan_find(uint16_t conn_handle, uint16_t cid, 115*042d53a7SEvalZero struct ble_hs_conn **out_conn, 116*042d53a7SEvalZero struct ble_l2cap_chan **out_chan); 117*042d53a7SEvalZero void ble_hs_misc_conn_chan_find_reqd(uint16_t conn_handle, uint16_t cid, 118*042d53a7SEvalZero struct ble_hs_conn **out_conn, 119*042d53a7SEvalZero struct ble_l2cap_chan **out_chan); 120*042d53a7SEvalZero uint8_t ble_hs_misc_addr_type_to_id(uint8_t addr_type); 121*042d53a7SEvalZero int ble_hs_misc_restore_irks(void); 122*042d53a7SEvalZero 123*042d53a7SEvalZero int ble_hs_locked_by_cur_task(void); 124*042d53a7SEvalZero int ble_hs_is_parent_task(void); 125*042d53a7SEvalZero void ble_hs_lock_nested(void); 126*042d53a7SEvalZero void ble_hs_unlock_nested(void); 127*042d53a7SEvalZero void ble_hs_lock(void); 128*042d53a7SEvalZero void ble_hs_unlock(void); 129*042d53a7SEvalZero void ble_hs_hw_error(uint8_t hw_code); 130*042d53a7SEvalZero void ble_hs_timer_resched(void); 131*042d53a7SEvalZero void ble_hs_notifications_sched(void); 132*042d53a7SEvalZero struct ble_npl_eventq *ble_hs_evq_get(void); 133*042d53a7SEvalZero void ble_hs_stop_init(void); 134*042d53a7SEvalZero 135*042d53a7SEvalZero struct ble_mqueue { 136*042d53a7SEvalZero STAILQ_HEAD(, os_mbuf_pkthdr) head; 137*042d53a7SEvalZero struct ble_npl_event ev; 138*042d53a7SEvalZero }; 139*042d53a7SEvalZero 140*042d53a7SEvalZero int ble_mqueue_init(struct ble_mqueue *mq, ble_npl_event_fn *ev_fn, void *ev_arg); 141*042d53a7SEvalZero struct os_mbuf *ble_mqueue_get(struct ble_mqueue *mq); 142*042d53a7SEvalZero int ble_mqueue_put(struct ble_mqueue *mq, struct ble_npl_eventq *evq, struct os_mbuf *om); 143*042d53a7SEvalZero 144*042d53a7SEvalZero #if MYNEWT_VAL(LOG_LEVEL) <= LOG_LEVEL_DEBUG && !BLE_MONITOR 145*042d53a7SEvalZero 146*042d53a7SEvalZero #define BLE_HS_LOG_CMD(is_tx, cmd_type, cmd_name, conn_handle, \ 147*042d53a7SEvalZero log_cb, cmd) do \ 148*042d53a7SEvalZero { \ 149*042d53a7SEvalZero BLE_HS_LOG(DEBUG, "%sed %s command: %s; conn=%d ", \ 150*042d53a7SEvalZero (is_tx) ? "tx" : "rx", (cmd_type), (cmd_name), (conn_handle)); \ 151*042d53a7SEvalZero (log_cb)(cmd); \ 152*042d53a7SEvalZero BLE_HS_LOG(DEBUG, "\n"); \ 153*042d53a7SEvalZero } while (0) 154*042d53a7SEvalZero 155*042d53a7SEvalZero #define BLE_HS_LOG_EMPTY_CMD(is_tx, cmd_type, cmd_name, conn_handle) do \ 156*042d53a7SEvalZero { \ 157*042d53a7SEvalZero BLE_HS_LOG(DEBUG, "%sed %s command: %s; conn=%d ", \ 158*042d53a7SEvalZero (is_tx) ? "tx" : "rx", (cmd_type), (cmd_name), (conn_handle)); \ 159*042d53a7SEvalZero BLE_HS_LOG(DEBUG, "\n"); \ 160*042d53a7SEvalZero } while (0) 161*042d53a7SEvalZero 162*042d53a7SEvalZero #else 163*042d53a7SEvalZero 164*042d53a7SEvalZero #define BLE_HS_LOG_CMD(is_tx, cmd_type, cmd_name, conn_handle, log_cb, cmd) 165*042d53a7SEvalZero #define BLE_HS_LOG_EMPTY_CMD(is_tx, cmd_type, cmd_name, conn_handle) 166*042d53a7SEvalZero 167*042d53a7SEvalZero #endif 168*042d53a7SEvalZero 169*042d53a7SEvalZero #if MYNEWT_VAL(BLE_HS_DEBUG) 170*042d53a7SEvalZero #define BLE_HS_DBG_ASSERT(x) assert(x) 171*042d53a7SEvalZero #define BLE_HS_DBG_ASSERT_EVAL(x) assert(x) 172*042d53a7SEvalZero #else 173*042d53a7SEvalZero #define BLE_HS_DBG_ASSERT(x) 174*042d53a7SEvalZero #define BLE_HS_DBG_ASSERT_EVAL(x) ((void)(x)) 175*042d53a7SEvalZero #endif 176*042d53a7SEvalZero 177*042d53a7SEvalZero #ifdef __cplusplus 178*042d53a7SEvalZero } 179*042d53a7SEvalZero #endif 180*042d53a7SEvalZero 181*042d53a7SEvalZero #endif 182