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_LL_CONN_PRIV_ 21*042d53a7SEvalZero #define H_BLE_LL_CONN_PRIV_ 22*042d53a7SEvalZero 23*042d53a7SEvalZero #include "controller/ble_ll_conn.h" 24*042d53a7SEvalZero 25*042d53a7SEvalZero #ifdef __cplusplus 26*042d53a7SEvalZero extern "C" { 27*042d53a7SEvalZero #endif 28*042d53a7SEvalZero 29*042d53a7SEvalZero /* 30*042d53a7SEvalZero * Definitions for min/max RX/TX time/bytes values allowed for connections. 31*042d53a7SEvalZero * Source: Core 5.0 specification, Vol 6, Part B, section 4.5.10 32*042d53a7SEvalZero */ 33*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_TIME_MIN (328) /* usecs */ 34*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_TIME_MAX (17040) /* usecs */ 35*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_TIME_MIN_UNCODED (328) /* usecs */ 36*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_TIME_MAX_UNCODED (2120) /* usecs */ 37*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_TIME_MIN_CODED (2704) /* usecs */ 38*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_TIME_MAX_CODED (17040) /* usecs */ 39*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_BYTES_MIN (27) /* bytes */ 40*042d53a7SEvalZero #define BLE_LL_CONN_SUPP_BYTES_MAX (251) /* bytes */ 41*042d53a7SEvalZero 42*042d53a7SEvalZero /* Connection event timing */ 43*042d53a7SEvalZero #define BLE_LL_CONN_INITIAL_OFFSET (1250) 44*042d53a7SEvalZero #define BLE_LL_CONN_ITVL_USECS (1250) 45*042d53a7SEvalZero #define BLE_LL_CONN_TX_WIN_USECS (1250) 46*042d53a7SEvalZero #define BLE_LL_CONN_TX_OFF_USECS (1250) 47*042d53a7SEvalZero #define BLE_LL_CONN_CE_USECS (625) 48*042d53a7SEvalZero #define BLE_LL_CONN_TX_WIN_MIN (1) /* in tx win units */ 49*042d53a7SEvalZero #define BLE_LL_CONN_SLAVE_LATENCY_MAX (499) 50*042d53a7SEvalZero 51*042d53a7SEvalZero /* Connection handle range */ 52*042d53a7SEvalZero #define BLE_LL_CONN_MAX_CONN_HANDLE (0x0EFF) 53*042d53a7SEvalZero 54*042d53a7SEvalZero /* Offset (in bytes) of advertising address in connect request */ 55*042d53a7SEvalZero #define BLE_LL_CONN_REQ_ADVA_OFF (BLE_LL_PDU_HDR_LEN + BLE_DEV_ADDR_LEN) 56*042d53a7SEvalZero 57*042d53a7SEvalZero /* Default authenticated payload timeout (30 seconds; in 10 msecs increments) */ 58*042d53a7SEvalZero #define BLE_LL_CONN_DEF_AUTH_PYLD_TMO (3000) 59*042d53a7SEvalZero #define BLE_LL_CONN_AUTH_PYLD_OS_TMO(x) ble_npl_time_ms_to_ticks32((x) * 10) 60*042d53a7SEvalZero 61*042d53a7SEvalZero 62*042d53a7SEvalZero typedef void (*ble_ll_hci_post_cmd_complete_cb)(void); 63*042d53a7SEvalZero 64*042d53a7SEvalZero /* Global Link Layer connection parameters */ 65*042d53a7SEvalZero struct ble_ll_conn_global_params 66*042d53a7SEvalZero { 67*042d53a7SEvalZero uint8_t master_chan_map[BLE_LL_CONN_CHMAP_LEN]; 68*042d53a7SEvalZero uint8_t num_used_chans; 69*042d53a7SEvalZero uint8_t supp_max_tx_octets; 70*042d53a7SEvalZero uint8_t supp_max_rx_octets; 71*042d53a7SEvalZero uint8_t conn_init_max_tx_octets; 72*042d53a7SEvalZero uint8_t sugg_tx_octets; 73*042d53a7SEvalZero uint16_t sugg_tx_time; 74*042d53a7SEvalZero uint16_t conn_init_max_tx_time; 75*042d53a7SEvalZero uint16_t conn_init_max_tx_time_uncoded; 76*042d53a7SEvalZero uint16_t conn_init_max_tx_time_coded; 77*042d53a7SEvalZero uint16_t supp_max_tx_time; 78*042d53a7SEvalZero uint16_t supp_max_rx_time; 79*042d53a7SEvalZero }; 80*042d53a7SEvalZero extern struct ble_ll_conn_global_params g_ble_ll_conn_params; 81*042d53a7SEvalZero 82*042d53a7SEvalZero /* Some data structures used by other LL routines */ 83*042d53a7SEvalZero SLIST_HEAD(ble_ll_conn_active_list, ble_ll_conn_sm); 84*042d53a7SEvalZero STAILQ_HEAD(ble_ll_conn_free_list, ble_ll_conn_sm); 85*042d53a7SEvalZero extern struct ble_ll_conn_active_list g_ble_ll_conn_active_list; 86*042d53a7SEvalZero extern struct ble_ll_conn_free_list g_ble_ll_conn_free_list; 87*042d53a7SEvalZero 88*042d53a7SEvalZero /* Pointer to connection state machine we are trying to create */ 89*042d53a7SEvalZero extern struct ble_ll_conn_sm *g_ble_ll_conn_create_sm; 90*042d53a7SEvalZero 91*042d53a7SEvalZero /* Generic interface */ 92*042d53a7SEvalZero struct ble_ll_len_req; 93*042d53a7SEvalZero struct hci_create_conn; 94*042d53a7SEvalZero struct ble_mbuf_hdr; 95*042d53a7SEvalZero struct ble_ll_adv_sm; 96*042d53a7SEvalZero 97*042d53a7SEvalZero void ble_ll_conn_sm_new(struct ble_ll_conn_sm *connsm); 98*042d53a7SEvalZero void ble_ll_conn_end(struct ble_ll_conn_sm *connsm, uint8_t ble_err); 99*042d53a7SEvalZero void ble_ll_conn_enqueue_pkt(struct ble_ll_conn_sm *connsm, struct os_mbuf *om, 100*042d53a7SEvalZero uint8_t hdr_byte, uint8_t length); 101*042d53a7SEvalZero struct ble_ll_conn_sm *ble_ll_conn_sm_get(void); 102*042d53a7SEvalZero void ble_ll_conn_master_init(struct ble_ll_conn_sm *connsm, 103*042d53a7SEvalZero struct hci_create_conn *hcc); 104*042d53a7SEvalZero #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) 105*042d53a7SEvalZero void ble_ll_conn_ext_master_init(struct ble_ll_conn_sm *connsm, 106*042d53a7SEvalZero struct hci_ext_create_conn *hcc); 107*042d53a7SEvalZero 108*042d53a7SEvalZero void ble_ll_conn_ext_set_params(struct ble_ll_conn_sm *connsm, 109*042d53a7SEvalZero struct hci_ext_conn_params *hcc_params, 110*042d53a7SEvalZero int phy); 111*042d53a7SEvalZero #endif 112*042d53a7SEvalZero 113*042d53a7SEvalZero struct ble_ll_conn_sm *ble_ll_conn_find_active_conn(uint16_t handle); 114*042d53a7SEvalZero void ble_ll_conn_datalen_update(struct ble_ll_conn_sm *connsm, 115*042d53a7SEvalZero struct ble_ll_len_req *req); 116*042d53a7SEvalZero 117*042d53a7SEvalZero /* Advertising interface */ 118*042d53a7SEvalZero int ble_ll_conn_slave_start(uint8_t *rxbuf, uint8_t pat, 119*042d53a7SEvalZero struct ble_mbuf_hdr *rxhdr, bool force_csa2); 120*042d53a7SEvalZero 121*042d53a7SEvalZero /* Link Layer interface */ 122*042d53a7SEvalZero void ble_ll_conn_module_init(void); 123*042d53a7SEvalZero void ble_ll_conn_set_global_chanmap(uint8_t num_used_chans, uint8_t *chanmap); 124*042d53a7SEvalZero void ble_ll_conn_module_reset(void); 125*042d53a7SEvalZero void ble_ll_conn_tx_pkt_in(struct os_mbuf *om, uint16_t handle, uint16_t len); 126*042d53a7SEvalZero int ble_ll_conn_rx_isr_start(struct ble_mbuf_hdr *rxhdr, uint32_t aa); 127*042d53a7SEvalZero int ble_ll_conn_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr); 128*042d53a7SEvalZero void ble_ll_conn_rx_data_pdu(struct os_mbuf *rxpdu, struct ble_mbuf_hdr *hdr); 129*042d53a7SEvalZero void ble_ll_init_rx_pkt_in(uint8_t pdu_type, uint8_t *rxbuf, 130*042d53a7SEvalZero struct ble_mbuf_hdr *ble_hdr); 131*042d53a7SEvalZero int ble_ll_init_rx_isr_start(uint8_t pdu_type, struct ble_mbuf_hdr *ble_hdr); 132*042d53a7SEvalZero int ble_ll_init_rx_isr_end(uint8_t *rxbuf, uint8_t crcok, 133*042d53a7SEvalZero struct ble_mbuf_hdr *ble_hdr); 134*042d53a7SEvalZero void ble_ll_conn_wfr_timer_exp(void); 135*042d53a7SEvalZero void ble_ll_conn_init_wfr_timer_exp(void); 136*042d53a7SEvalZero int ble_ll_conn_is_lru(struct ble_ll_conn_sm *s1, struct ble_ll_conn_sm *s2); 137*042d53a7SEvalZero uint32_t ble_ll_conn_get_ce_end_time(void); 138*042d53a7SEvalZero void ble_ll_conn_event_halt(void); 139*042d53a7SEvalZero uint8_t ble_ll_conn_calc_used_chans(uint8_t *chmap); 140*042d53a7SEvalZero void ble_ll_conn_reset_pending_aux_conn_rsp(void); 141*042d53a7SEvalZero bool ble_ll_conn_init_pending_aux_conn_rsp(void); 142*042d53a7SEvalZero /* HCI */ 143*042d53a7SEvalZero void ble_ll_disconn_comp_event_send(struct ble_ll_conn_sm *connsm, 144*042d53a7SEvalZero uint8_t reason); 145*042d53a7SEvalZero void ble_ll_auth_pyld_tmo_event_send(struct ble_ll_conn_sm *connsm); 146*042d53a7SEvalZero int ble_ll_conn_hci_disconnect_cmd(uint8_t *cmdbuf); 147*042d53a7SEvalZero int ble_ll_conn_hci_rd_rem_ver_cmd(uint8_t *cmdbuf); 148*042d53a7SEvalZero int ble_ll_conn_create(uint8_t *cmdbuf); 149*042d53a7SEvalZero int ble_ll_conn_hci_update(uint8_t *cmdbuf); 150*042d53a7SEvalZero int ble_ll_conn_hci_set_chan_class(uint8_t *cmdbuf); 151*042d53a7SEvalZero int ble_ll_conn_hci_param_reply(uint8_t *cmdbuf, int negative_reply, 152*042d53a7SEvalZero uint8_t *rspbuf, uint8_t *rsplen); 153*042d53a7SEvalZero int ble_ll_conn_create_cancel(ble_ll_hci_post_cmd_complete_cb *post_cmd_cb); 154*042d53a7SEvalZero void ble_ll_conn_num_comp_pkts_event_send(struct ble_ll_conn_sm *connsm); 155*042d53a7SEvalZero void ble_ll_conn_comp_event_send(struct ble_ll_conn_sm *connsm, uint8_t status, 156*042d53a7SEvalZero uint8_t *evbuf, struct ble_ll_adv_sm *advsm); 157*042d53a7SEvalZero void ble_ll_conn_timeout(struct ble_ll_conn_sm *connsm, uint8_t ble_err); 158*042d53a7SEvalZero int ble_ll_conn_hci_chk_conn_params(uint16_t itvl_min, uint16_t itvl_max, 159*042d53a7SEvalZero uint16_t latency, uint16_t spvn_tmo); 160*042d53a7SEvalZero int ble_ll_conn_hci_read_rem_features(uint8_t *cmdbuf); 161*042d53a7SEvalZero int ble_ll_conn_hci_read_rem_features_complete(void); 162*042d53a7SEvalZero int ble_ll_conn_hci_rd_rssi(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen); 163*042d53a7SEvalZero int ble_ll_conn_hci_rd_chan_map(uint8_t *cmdbuf, uint8_t *rspbuf, 164*042d53a7SEvalZero uint8_t *rsplen); 165*042d53a7SEvalZero int ble_ll_conn_hci_set_data_len(uint8_t *cmdbuf, uint8_t *rspbuf, 166*042d53a7SEvalZero uint8_t *rsplen); 167*042d53a7SEvalZero int ble_ll_conn_hci_le_start_encrypt(uint8_t *cmdbuf); 168*042d53a7SEvalZero int ble_ll_conn_hci_le_ltk_reply(uint8_t *cmdbuf, uint8_t *rspbuf, 169*042d53a7SEvalZero uint8_t *rsplen); 170*042d53a7SEvalZero int ble_ll_conn_hci_le_ltk_neg_reply(uint8_t *cmdbuf, uint8_t *rspbuf, 171*042d53a7SEvalZero uint8_t *rsplen); 172*042d53a7SEvalZero int ble_ll_conn_hci_wr_auth_pyld_tmo(uint8_t *cmdbuf, uint8_t *rsp, 173*042d53a7SEvalZero uint8_t *rsplen); 174*042d53a7SEvalZero int ble_ll_conn_hci_rd_auth_pyld_tmo(uint8_t *cmdbuf, uint8_t *rsp, 175*042d53a7SEvalZero uint8_t *rsplen); 176*042d53a7SEvalZero #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) == 1) 177*042d53a7SEvalZero void ble_ll_conn_auth_pyld_timer_start(struct ble_ll_conn_sm *connsm); 178*042d53a7SEvalZero #else 179*042d53a7SEvalZero #define ble_ll_conn_auth_pyld_timer_start(x) 180*042d53a7SEvalZero #endif 181*042d53a7SEvalZero 182*042d53a7SEvalZero int ble_ll_hci_cmd_rx(uint8_t *cmd, void *arg); 183*042d53a7SEvalZero int ble_ll_hci_acl_rx(struct os_mbuf *om, void *arg); 184*042d53a7SEvalZero 185*042d53a7SEvalZero int ble_ll_conn_hci_le_rd_phy(uint8_t *cmdbuf, uint8_t *rsp, uint8_t *rsplen); 186*042d53a7SEvalZero int ble_ll_conn_hci_le_set_phy(uint8_t *cmdbuf); 187*042d53a7SEvalZero int ble_ll_conn_chk_phy_upd_start(struct ble_ll_conn_sm *connsm); 188*042d53a7SEvalZero #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) 189*042d53a7SEvalZero int ble_ll_ext_conn_create(uint8_t *cmdbuf, uint8_t cmdlen); 190*042d53a7SEvalZero #endif 191*042d53a7SEvalZero #ifdef __cplusplus 192*042d53a7SEvalZero } 193*042d53a7SEvalZero #endif 194*042d53a7SEvalZero 195*042d53a7SEvalZero #endif /* H_BLE_LL_CONN_PRIV_ */ 196