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