1 /* 2 * Copyright (c) 2018-2019 Nordic Semiconductor ASA 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 #if defined(CONFIG_BT_CTLR_CONN_META) 7 #include "lll_conn_meta.h" 8 #endif /* CONFIG_BT_CTLR_CONN_META */ 9 10 #define LLL_CONN_RSSI_SAMPLE_COUNT 10 11 #define LLL_CONN_RSSI_THRESHOLD 4 12 13 #define LLL_CONN_MIC_NONE 0 14 #define LLL_CONN_MIC_PASS 1 15 #define LLL_CONN_MIC_FAIL 2 16 17 18 struct path_loss_params { 19 uint16_t min_time_spent; 20 uint8_t enabled; 21 uint8_t high_threshold; 22 uint8_t high_hysteresis; 23 uint8_t low_threshold; 24 uint8_t low_hysteresis; 25 } __packed; 26 27 struct path_loss_state { 28 uint16_t conn_handle; 29 uint16_t min_time_counter; 30 uint8_t new_zone; 31 } __packed; 32 33 struct lll_tx { 34 uint16_t handle; 35 void *node; 36 }; 37 38 struct node_tx { 39 union { 40 void *next; 41 memq_link_t *link; 42 }; 43 44 uint8_t pdu[]; 45 }; 46 47 #if defined(CONFIG_BT_CTLR_DATA_LENGTH) 48 struct data_pdu_length { 49 uint16_t max_tx_octets; 50 uint16_t max_rx_octets; 51 uint16_t max_tx_time; 52 uint16_t max_rx_time; 53 }; 54 #endif /* CONFIG_BT_CTLR_DATA_LENGTH */ 55 56 struct lll_conn { 57 struct lll_hdr hdr; 58 59 uint8_t access_addr[4]; 60 uint8_t crc_init[3]; 61 62 uint16_t tifs_tx_us; 63 uint16_t tifs_rx_us; 64 uint16_t tifs_hcto_us; 65 uint16_t tifs_cis_us; 66 67 uint16_t handle; 68 uint16_t interval; 69 70 uint16_t latency; 71 uint16_t latency_prepare; 72 uint16_t lazy_prepare; 73 uint16_t latency_event; 74 uint16_t event_counter; 75 76 uint8_t data_chan_map[PDU_CHANNEL_MAP_SIZE]; 77 uint8_t data_chan_count:6; 78 uint8_t data_chan_sel:1; 79 uint8_t role:1; 80 81 union { 82 struct { 83 uint8_t data_chan_hop; 84 uint8_t data_chan_use; 85 }; 86 87 uint16_t data_chan_id; 88 }; 89 90 union { 91 struct { 92 uint8_t initiated:1; 93 uint8_t cancelled:1; 94 uint8_t forced:1; 95 }; 96 97 struct { 98 uint8_t initiated:1; 99 uint8_t cancelled:1; 100 uint8_t forced:1; 101 } central; 102 103 #if defined(CONFIG_BT_PERIPHERAL) 104 struct { 105 uint8_t initiated:1; 106 uint8_t cancelled:1; 107 uint8_t forced:1; 108 uint8_t latency_enabled:1; 109 110 #if defined(CONFIG_BT_CTLR_PHY) 111 uint8_t phy_rx_event:3; 112 #endif /* CONFIG_BT_CTLR_PHY */ 113 114 uint32_t window_widening_periodic_us; 115 uint32_t window_widening_max_us; 116 uint32_t window_widening_prepare_us; 117 uint32_t window_widening_event_us; 118 uint32_t window_size_prepare_us; 119 uint32_t window_size_event_us; 120 } periph; 121 #endif /* CONFIG_BT_PERIPHERAL */ 122 }; 123 124 #if defined(CONFIG_BT_CTLR_DATA_LENGTH) 125 struct { 126 struct data_pdu_length local; 127 struct data_pdu_length remote; 128 struct data_pdu_length eff; 129 #if defined(CONFIG_BT_CTLR_PHY) 130 uint16_t default_tx_time; 131 #endif 132 uint16_t default_tx_octets; 133 uint8_t update; 134 } dle; 135 #endif /* CONFIG_BT_CTLR_DATA_LENGTH */ 136 137 #if defined(CONFIG_BT_CTLR_PHY) 138 uint8_t phy_tx:3; 139 uint8_t phy_flags:1; 140 uint8_t phy_tx_time:3; 141 uint8_t phy_rx:3; 142 #endif /* CONFIG_BT_CTLR_PHY */ 143 144 MEMQ_DECLARE(tx); 145 memq_link_t link_tx; 146 memq_link_t *link_tx_free; 147 uint8_t packet_tx_head_len; 148 uint8_t packet_tx_head_offset; 149 150 uint8_t sn:1; 151 uint8_t nesn:1; 152 uint8_t empty:1; 153 154 #if defined(CONFIG_BT_CTLR_LE_ENC) 155 uint8_t enc_rx:1; 156 uint8_t enc_tx:1; 157 158 struct ccm ccm_rx; 159 struct ccm ccm_tx; 160 #endif /* CONFIG_BT_CTLR_LE_ENC */ 161 162 #if defined(CONFIG_BT_CTLR_SLOT_RESERVATION_UPDATE) 163 #if defined(CONFIG_BT_CTLR_DATA_LENGTH) || defined(CONFIG_BT_CTLR_PHY) 164 uint8_t evt_len_upd:1; 165 uint8_t evt_len_upd_delayed:1; 166 #endif /* CONFIG_BT_CTLR_DATA_LENGTH || CONFIG_BT_CTLR_PHY */ 167 #endif /* CONFIG_BT_CTLR_SLOT_RESERVATION_UPDATE */ 168 169 #if defined(CONFIG_BT_CTLR_CONN_RSSI) 170 uint8_t rssi_latest; 171 #if defined(CONFIG_BT_CTLR_CONN_RSSI_EVENT) 172 uint8_t rssi_reported; 173 uint8_t rssi_sample_count; 174 #endif /* CONFIG_BT_CTLR_CONN_RSSI_EVENT */ 175 #endif /* CONFIG_BT_CTLR_CONN_RSSI */ 176 #if defined(CONFIG_BT_CTLR_LE_PATH_LOSS_MONITORING) 177 struct path_loss_params pl_params; 178 struct path_loss_state pl_state; 179 uint8_t pl_current_zone; 180 #endif /* CONFIG_BT_CTLR_LE_PATH_LOSS_MONITORING */ 181 182 #if defined(CONFIG_BT_CTLR_CONN_META) 183 struct lll_conn_meta conn_meta; 184 #endif /* CONFIG_BT_CTLR_CONN_META */ 185 186 #if defined(CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL) 187 int8_t tx_pwr_lvl; 188 #endif 189 190 #if defined(CONFIG_BT_CTLR_DF_CONN_CTE_RX) 191 struct lll_df_conn_rx_cfg df_rx_cfg; 192 #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_RX */ 193 #if defined(CONFIG_BT_CTLR_DF_CONN_CTE_TX) 194 struct lll_df_conn_tx_cfg df_tx_cfg; 195 #endif /* CONFIG_BT_CTLR_DF_CONN_CTE_TX */ 196 }; 197 198 int lll_conn_init(void); 199 int lll_conn_reset(void); 200 void lll_conn_flush(uint16_t handle, struct lll_conn *lll); 201 202 void lll_conn_prepare_reset(void); 203 int lll_conn_central_is_abort_cb(void *next, void *curr, 204 lll_prepare_cb_t *resume_cb); 205 int lll_conn_peripheral_is_abort_cb(void *next, void *curr, 206 lll_prepare_cb_t *resume_cb); 207 void lll_conn_abort_cb(struct lll_prepare_param *prepare_param, void *param); 208 void lll_conn_isr_rx(void *param); 209 void lll_conn_isr_tx(void *param); 210 void lll_conn_rx_pkt_set(struct lll_conn *lll); 211 void lll_conn_tx_pkt_set(struct lll_conn *lll, struct pdu_data *pdu_data_tx); 212 void lll_conn_pdu_tx_prep(struct lll_conn *lll, struct pdu_data **pdu_data_tx); 213 uint8_t lll_conn_force_md_cnt_set(uint8_t force_md_cnt); 214 215 extern struct lll_conn *ull_conn_lll_get(uint16_t handle); 216 extern void ull_conn_lll_tx_demux_sched(struct lll_conn *lll); 217 extern void ull_conn_lll_ack_enqueue(uint16_t handle, struct node_tx *tx); 218 extern uint16_t ull_conn_lll_max_tx_octets_get(struct lll_conn *lll); 219