xref: /btstack/src/l2cap.c (revision f05358500e612946f8c340b1f11e5703dafd65f8)
1 /*
2  * Copyright (C) 2014 BlueKitchen GmbH
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the copyright holders nor the names of
14  *    contributors may be used to endorse or promote products derived
15  *    from this software without specific prior written permission.
16  * 4. Any redistribution, use, or modification is done solely for
17  *    personal benefit and not for any commercial purpose or for
18  *    monetary gain.
19  *
20  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
24  * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * Please inquire about commercial licensing options at
34  * [email protected]
35  *
36  */
37 
38 #define BTSTACK_FILE__ "l2cap.c"
39 
40 /*
41  *  l2cap.c
42  *  Logical Link Control and Adaption Protocol (L2CAP)
43  */
44 
45 #include "l2cap.h"
46 #include "hci.h"
47 #include "hci_dump.h"
48 #include "bluetooth_sdp.h"
49 #include "bluetooth_psm.h"
50 #include "btstack_bool.h"
51 #include "btstack_debug.h"
52 #include "btstack_event.h"
53 #include "btstack_memory.h"
54 
55 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
56 // TODO avoid dependency on higher layer: used to trigger pairing for outgoing connections
57 #include "ble/sm.h"
58 #endif
59 
60 #include <stdarg.h>
61 #include <string.h>
62 
63 /*
64  * @brief L2CAP Supervisory function in S-Frames
65  */
66 typedef enum {
67     L2CAP_SUPERVISORY_FUNCTION_RR_RECEIVER_READY = 0,
68     L2CAP_SUPERVISORY_FUNCTION_REJ_REJECT,
69     L2CAP_SUPERVISORY_FUNCTION_RNR_RECEIVER_NOT_READY,
70     L2CAP_SUPERVISORY_FUNCTION_SREJ_SELECTIVE_REJECT
71 } l2cap_supervisory_function_t;
72 
73 /**
74  * @brief L2CAP Information Types used in Information Request & Response
75  */
76 typedef enum {
77   L2CAP_INFO_TYPE_CONNECTIONLESS_MTU = 1,
78   L2CAP_INFO_TYPE_EXTENDED_FEATURES_SUPPORTED,
79   L2CAP_INFO_TYPE_FIXED_CHANNELS_SUPPORTED,
80 } l2cap_info_type_t;
81 
82 /**
83  * @brief L2CAP Configuration Option Types used in Configurateion Request & Response
84  */
85 typedef enum {
86   L2CAP_CONFIG_OPTION_TYPE_MAX_TRANSMISSION_UNIT = 1,
87   L2CAP_CONFIG_OPTION_TYPE_FLUSH_TIMEOUT,
88   L2CAP_CONFIG_OPTION_TYPE_QUALITY_OF_SERVICE,
89   L2CAP_CONFIG_OPTION_TYPE_RETRANSMISSION_AND_FLOW_CONTROL,
90   L2CAP_CONFIG_OPTION_TYPE_FRAME_CHECK_SEQUENCE,
91   L2CAP_CONFIG_OPTION_TYPE_EXTENDED_FLOW_SPECIFICATION,
92   L2CAP_CONFIG_OPTION_TYPE_EXTENDED_WINDOW_SIZE,
93 } l2cap_config_option_type_t;
94 
95 
96 #define L2CAP_SIG_ID_INVALID 0
97 
98 // size of HCI ACL + L2CAP Header for regular data packets (8)
99 #define COMPLETE_L2CAP_HEADER (HCI_ACL_HEADER_SIZE + L2CAP_HEADER_SIZE)
100 
101 // L2CAP Configuration Result Codes
102 #define L2CAP_CONF_RESULT_SUCCESS                  0x0000
103 #define L2CAP_CONF_RESULT_UNACCEPTABLE_PARAMETERS  0x0001
104 #define L2CAP_CONF_RESULT_REJECT                   0x0002
105 #define L2CAP_CONF_RESULT_UNKNOWN_OPTIONS          0x0003
106 #define L2CAP_CONF_RESULT_PENDING                  0x0004
107 #define L2CAP_CONF_RESULT_FLOW_SPEC_REJECTED       0x0005
108 
109 // L2CAP Reject Result Codes
110 #define L2CAP_REJ_CMD_UNKNOWN                      0x0000
111 #define L2CAP_REJ_MTU_EXCEEDED                     0x0001
112 #define L2CAP_REJ_INVALID_CID                      0x0002
113 
114 // Response Timeout eXpired
115 #define L2CAP_RTX_TIMEOUT_MS   10000
116 
117 // Extended Response Timeout eXpired
118 #define L2CAP_ERTX_TIMEOUT_MS 120000
119 
120 // nr of buffered acl packets in outgoing queue to get max performance
121 #define NR_BUFFERED_ACL_PACKETS 3
122 
123 // used to cache l2cap rejects, echo, and informational requests
124 #define NR_PENDING_SIGNALING_RESPONSES 3
125 
126 // nr of credits provided to remote if credits fall below watermark
127 #define L2CAP_CREDIT_BASED_FLOW_CONTROL_MODE_AUTOMATIC_CREDITS_WATERMARK 5
128 #define L2CAP_CREDIT_BASED_FLOW_CONTROL_MODE_AUTOMATIC_CREDITS_INCREMENT 5
129 
130 // offsets for L2CAP SIGNALING COMMANDS
131 #define L2CAP_SIGNALING_COMMAND_CODE_OFFSET   0
132 #define L2CAP_SIGNALING_COMMAND_SIGID_OFFSET  1
133 #define L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET 2
134 #define L2CAP_SIGNALING_COMMAND_DATA_OFFSET   4
135 
136 #if defined(ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE) && !defined(ENABLE_CLASSIC)
137 #error "ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE depends on ENABLE_CLASSIC."
138 #error "Please remove ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE or add ENABLE_CLASSIC in btstack_config.h"
139 #endif
140 
141 
142 #ifdef ENABLE_LE_DATA_CHANNELS
143 #warning "ENABLE_LE_DATA_CHANNELS has been deprecated."
144 #warning "Please use ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE instead in btstack_config.h"
145 #define ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
146 #endif
147 
148 #if defined(ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE) || defined(ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE)
149 #define L2CAP_USES_CREDIT_BASED_CHANNELS
150 #endif
151 
152 #if defined(L2CAP_USES_CREDIT_BASED_CHANNELS) || defined(ENABLE_CLASSIC)
153 #define L2CAP_USES_CHANNELS
154 #endif
155 
156 // prototypes
157 static void l2cap_run(void);
158 static void l2cap_hci_event_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
159 static void l2cap_acl_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size );
160 static void l2cap_notify_channel_can_send(void);
161 static void l2cap_emit_can_send_now(btstack_packet_handler_t packet_handler, uint16_t channel);
162 static uint8_t  l2cap_next_sig_id(void);
163 static l2cap_fixed_channel_t * l2cap_fixed_channel_for_channel_id(uint16_t local_cid);
164 #ifdef ENABLE_CLASSIC
165 static void l2cap_handle_security_level_incoming_sufficient(l2cap_channel_t * channel);
166 static int l2cap_security_level_0_allowed_for_PSM(uint16_t psm);
167 static void l2cap_handle_remote_supported_features_received(l2cap_channel_t * channel);
168 static void l2cap_handle_connection_complete(hci_con_handle_t con_handle, l2cap_channel_t * channel);
169 static void l2cap_handle_information_request_complete(hci_connection_t * connection);
170 static inline l2cap_service_t * l2cap_get_service(uint16_t psm);
171 static void l2cap_emit_channel_opened(l2cap_channel_t *channel, uint8_t status);
172 static void l2cap_emit_channel_closed(l2cap_channel_t *channel);
173 static void l2cap_emit_incoming_connection(l2cap_channel_t *channel);
174 static int  l2cap_channel_ready_for_open(l2cap_channel_t *channel);
175 static uint8_t l2cap_classic_send(l2cap_channel_t * channel, const uint8_t *data, uint16_t len);
176 #endif
177 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
178 static void l2cap_cbm_emit_channel_opened(l2cap_channel_t *channel, uint8_t status);
179 static void l2cap_cbm_emit_incoming_connection(l2cap_channel_t *channel);
180 static void l2cap_credit_based_notify_channel_can_send(l2cap_channel_t *channel);
181 static void l2cap_cbm_finialize_channel_close(l2cap_channel_t *channel);
182 static inline l2cap_service_t * l2cap_cbm_get_service(uint16_t le_psm);
183 #endif
184 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
185 static uint8_t l2cap_credit_based_send_data(l2cap_channel_t * channel, const uint8_t * data, uint16_t size);
186 static void l2cap_credit_based_send_pdu(l2cap_channel_t *channel);
187 static void l2cap_credit_based_send_credits(l2cap_channel_t *channel);
188 static bool l2cap_credit_based_handle_credit_indication(hci_con_handle_t handle, const uint8_t * command, uint16_t len);
189 static void l2cap_credit_based_handle_pdu(l2cap_channel_t * l2cap_channel, const uint8_t * packet, uint16_t size);
190 #endif
191 #ifdef L2CAP_USES_CHANNELS
192 static uint16_t l2cap_next_local_cid(void);
193 static l2cap_channel_t * l2cap_get_channel_for_local_cid(uint16_t local_cid);
194 static void l2cap_emit_simple_event_with_cid(l2cap_channel_t * channel, uint8_t event_code);
195 static void l2cap_dispatch_to_channel(l2cap_channel_t *channel, uint8_t type, uint8_t * data, uint16_t size);
196 static l2cap_channel_t * l2cap_create_channel_entry(btstack_packet_handler_t packet_handler, l2cap_channel_type_t channel_type, bd_addr_t address, bd_addr_type_t address_type,
197         uint16_t psm, uint16_t local_mtu, gap_security_level_t security_level);
198 static void l2cap_finalize_channel_close(l2cap_channel_t *channel);
199 static void l2cap_free_channel_entry(l2cap_channel_t * channel);
200 #endif
201 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
202 static void l2cap_ertm_notify_channel_can_send(l2cap_channel_t * channel);
203 static void l2cap_ertm_monitor_timeout_callback(btstack_timer_source_t * ts);
204 static void l2cap_ertm_retransmission_timeout_callback(btstack_timer_source_t * ts);
205 #endif
206 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
207 static void l2cap_ecbm_handle_security_level_incoming(l2cap_channel_t *channel);
208 static int l2cap_ecbm_signaling_handler_dispatch(hci_con_handle_t handle, uint16_t signaling_cid, uint8_t * command, uint8_t sig_id);
209 static void l2cap_run_trigger_callback(void * context);
210 #endif
211 
212 // l2cap_fixed_channel_t entries
213 #ifdef ENABLE_BLE
214 static l2cap_fixed_channel_t l2cap_fixed_channel_le_att;
215 static l2cap_fixed_channel_t l2cap_fixed_channel_le_sm;
216 #endif
217 #ifdef ENABLE_CLASSIC
218 static l2cap_fixed_channel_t l2cap_fixed_channel_classic_connectionless;
219 static l2cap_fixed_channel_t l2cap_fixed_channel_classic_sm;
220 #endif
221 
222 #ifdef ENABLE_CLASSIC
223 static btstack_linked_list_t l2cap_services;
224 static uint8_t l2cap_require_security_level2_for_outgoing_sdp;
225 static bd_addr_t l2cap_outgoing_classic_addr;
226 #endif
227 
228 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
229 static btstack_linked_list_t l2cap_le_services;
230 #endif
231 
232 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
233 static btstack_linked_list_t l2cap_enhanced_services;
234 static uint16_t l2cap_enhanced_mps_min;
235 static uint16_t l2cap_enhanced_mps_max;
236 static btstack_context_callback_registration_t l2cap_trigger_run_registration;
237 #endif
238 
239 // single list of channels for connection-oriented channels (basic, ertm, cbm, ecbf) Classic Connectionless, ATT, and SM
240 static btstack_linked_list_t l2cap_channels;
241 #ifdef L2CAP_USES_CHANNELS
242 // next channel id for new connections
243 static uint16_t  l2cap_local_source_cid;
244 #endif
245 // next signaling sequence number
246 static uint8_t   l2cap_sig_seq_nr;
247 
248 // used to cache l2cap rejects, echo, and informational requests
249 static l2cap_signaling_response_t l2cap_signaling_responses[NR_PENDING_SIGNALING_RESPONSES];
250 static int l2cap_signaling_responses_pending;
251 static btstack_packet_callback_registration_t l2cap_hci_event_callback_registration;
252 
253 static bool l2cap_call_notify_channel_in_run;
254 
255 #ifdef ENABLE_BLE
256 // only used for connection parameter update events
257 static uint16_t l2cap_le_custom_max_mtu;
258 #endif
259 
260 /* callbacks for events */
261 static btstack_linked_list_t l2cap_event_handlers;
262 
263 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
264 
265 // enable for testing
266 // #define L2CAP_ERTM_SIMULATE_FCS_ERROR_INTERVAL 16
267 
268 /*
269  * CRC lookup table for generator polynom D^16 + D^15 + D^2 + 1
270  */
271 static const uint16_t crc16_table[256] = {
272     0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
273     0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40, 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
274     0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
275     0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
276     0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240, 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
277     0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
278     0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
279     0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
280     0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
281     0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
282     0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
283     0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
284     0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
285     0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
286     0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
287     0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040,
288 };
289 
290 static uint16_t crc16_calc(uint8_t * data, uint16_t len){
291     uint16_t crc = 0;   // initial value = 0
292     while (len--){
293         crc = (crc >> 8) ^ crc16_table[ (crc ^ ((uint16_t) *data++)) & 0x00FF ];
294     }
295     return crc;
296 }
297 
298 static inline uint16_t l2cap_encanced_control_field_for_information_frame(uint8_t tx_seq, int final, uint8_t req_seq, l2cap_segmentation_and_reassembly_t sar){
299     return (((uint16_t) sar) << 14) | (req_seq << 8) | (final << 7) | (tx_seq << 1) | 0;
300 }
301 
302 static inline uint16_t l2cap_encanced_control_field_for_supevisor_frame(l2cap_supervisory_function_t supervisory_function, int poll, int final, uint8_t req_seq){
303     return (req_seq << 8) | (final << 7) | (poll << 4) | (((int) supervisory_function) << 2) | 1;
304 }
305 
306 static int l2cap_next_ertm_seq_nr(int seq_nr){
307     return (seq_nr + 1) & 0x3f;
308 }
309 
310 static bool l2cap_ertm_can_store_packet_now(l2cap_channel_t * channel){
311     // get num free tx buffers
312     int num_free_tx_buffers = channel->num_tx_buffers - channel->num_stored_tx_frames;
313     // calculate num tx buffers for remote MTU
314     int num_tx_buffers_for_max_remote_mtu;
315     uint16_t effective_mps = btstack_min(channel->remote_mps, channel->local_mps);
316     if (channel->remote_mtu <= effective_mps){
317         // MTU fits into single packet
318         num_tx_buffers_for_max_remote_mtu = 1;
319     } else {
320         // include SDU Length
321         num_tx_buffers_for_max_remote_mtu = (channel->remote_mtu + 2 + (effective_mps - 1)) / effective_mps;
322     }
323     log_debug("num_free_tx_buffers %u, num_tx_buffers_for_max_remote_mtu %u", num_free_tx_buffers, num_tx_buffers_for_max_remote_mtu);
324     return num_tx_buffers_for_max_remote_mtu <= num_free_tx_buffers;
325 }
326 
327 static void l2cap_ertm_retransmit_unacknowleded_frames(l2cap_channel_t * l2cap_channel){
328     log_info("Retransmit unacknowleged frames");
329     l2cap_channel->unacked_frames = 0;;
330     l2cap_channel->tx_send_index  = l2cap_channel->tx_read_index;
331 }
332 
333 static void l2cap_ertm_next_tx_write_index(l2cap_channel_t * channel){
334     channel->tx_write_index++;
335     if (channel->tx_write_index < channel->num_tx_buffers) return;
336     channel->tx_write_index = 0;
337 }
338 
339 static void l2cap_ertm_start_monitor_timer(l2cap_channel_t * channel){
340     log_info("Start Monitor timer");
341     btstack_run_loop_remove_timer(&channel->monitor_timer);
342     btstack_run_loop_set_timer_handler(&channel->monitor_timer, &l2cap_ertm_monitor_timeout_callback);
343     btstack_run_loop_set_timer_context(&channel->monitor_timer, channel);
344     btstack_run_loop_set_timer(&channel->monitor_timer, channel->local_monitor_timeout_ms);
345     btstack_run_loop_add_timer(&channel->monitor_timer);
346 }
347 
348 static void l2cap_ertm_stop_monitor_timer(l2cap_channel_t * channel){
349     log_info("Stop Monitor timer");
350     btstack_run_loop_remove_timer(&channel->monitor_timer);
351 }
352 
353 static void l2cap_ertm_start_retransmission_timer(l2cap_channel_t * channel){
354     log_info("Start Retransmission timer");
355     btstack_run_loop_remove_timer(&channel->retransmission_timer);
356     btstack_run_loop_set_timer_handler(&channel->retransmission_timer, &l2cap_ertm_retransmission_timeout_callback);
357     btstack_run_loop_set_timer_context(&channel->retransmission_timer, channel);
358     btstack_run_loop_set_timer(&channel->retransmission_timer, channel->local_retransmission_timeout_ms);
359     btstack_run_loop_add_timer(&channel->retransmission_timer);
360 }
361 
362 static void l2cap_ertm_stop_retransmission_timer(l2cap_channel_t * l2cap_channel){
363     log_info("Stop Retransmission timer");
364     btstack_run_loop_remove_timer(&l2cap_channel->retransmission_timer);
365 }
366 
367 static void l2cap_ertm_monitor_timeout_callback(btstack_timer_source_t * ts){
368     log_info("Monitor timeout");
369     l2cap_channel_t * l2cap_channel = (l2cap_channel_t *) btstack_run_loop_get_timer_context(ts);
370 
371     // TODO: we assume that it's the oldest packet
372     l2cap_ertm_tx_packet_state_t * tx_state;
373     tx_state = &l2cap_channel->tx_packets_state[l2cap_channel->tx_read_index];
374 
375     // check retry count
376     if (tx_state->retry_count < l2cap_channel->remote_max_transmit){
377         // increment retry count
378         tx_state->retry_count++;
379 
380         // start retransmit
381         l2cap_ertm_retransmit_unacknowleded_frames(l2cap_channel);
382 
383         // start monitor timer
384         l2cap_ertm_start_monitor_timer(l2cap_channel);
385 
386         // send RR/P=1
387         l2cap_channel->send_supervisor_frame_receiver_ready_poll = 1;
388     } else {
389         log_info("Monitor timer expired & retry count >= max transmit -> disconnect");
390         l2cap_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
391     }
392     l2cap_run();
393 }
394 
395 static void l2cap_ertm_retransmission_timeout_callback(btstack_timer_source_t * ts){
396     log_info("Retransmission timeout");
397     l2cap_channel_t * l2cap_channel = (l2cap_channel_t *) btstack_run_loop_get_timer_context(ts);
398 
399     // TODO: we assume that it's the oldest packet
400     l2cap_ertm_tx_packet_state_t * tx_state;
401     tx_state = &l2cap_channel->tx_packets_state[l2cap_channel->tx_read_index];
402 
403     // set retry count = 1
404     tx_state->retry_count = 1;
405 
406     // start retransmit
407     l2cap_ertm_retransmit_unacknowleded_frames(l2cap_channel);
408 
409     // start monitor timer
410     l2cap_ertm_start_monitor_timer(l2cap_channel);
411 
412     // send RR/P=1
413     l2cap_channel->send_supervisor_frame_receiver_ready_poll = 1;
414     l2cap_run();
415 }
416 
417 static int l2cap_ertm_send_information_frame(l2cap_channel_t * channel, int index, int final){
418     l2cap_ertm_tx_packet_state_t * tx_state = &channel->tx_packets_state[index];
419     hci_reserve_packet_buffer();
420     uint8_t *acl_buffer = hci_get_outgoing_packet_buffer();
421     uint16_t control = l2cap_encanced_control_field_for_information_frame(tx_state->tx_seq, final, channel->req_seq, tx_state->sar);
422     log_info("I-Frame: control 0x%04x", control);
423     little_endian_store_16(acl_buffer, 8, control);
424     (void)memcpy(&acl_buffer[8 + 2],
425                  &channel->tx_packets_data[index * channel->local_mps],
426                  tx_state->len);
427     // (re-)start retransmission timer on
428     l2cap_ertm_start_retransmission_timer(channel);
429     // send
430     return l2cap_send_prepared(channel->local_cid, 2 + tx_state->len);
431 }
432 
433 static void l2cap_ertm_store_fragment(l2cap_channel_t * channel, l2cap_segmentation_and_reassembly_t sar, uint16_t sdu_length, const uint8_t * data, uint16_t len){
434     // get next index for storing packets
435     int index = channel->tx_write_index;
436 
437     l2cap_ertm_tx_packet_state_t * tx_state = &channel->tx_packets_state[index];
438     tx_state->tx_seq = channel->next_tx_seq;
439     tx_state->sar = sar;
440     tx_state->retry_count = 0;
441 
442     uint8_t * tx_packet = &channel->tx_packets_data[index * channel->local_mps];
443     log_debug("index %u, local mps %u, remote mps %u, packet tx %p, len %u", index, channel->local_mps, channel->remote_mps, tx_packet, len);
444     int pos = 0;
445     if (sar == L2CAP_SEGMENTATION_AND_REASSEMBLY_START_OF_L2CAP_SDU){
446         little_endian_store_16(tx_packet, 0, sdu_length);
447         pos += 2;
448     }
449     (void)memcpy(&tx_packet[pos], data, len);
450     tx_state->len = pos + len;
451 
452     // update
453     channel->num_stored_tx_frames++;
454     channel->next_tx_seq = l2cap_next_ertm_seq_nr(channel->next_tx_seq);
455     l2cap_ertm_next_tx_write_index(channel);
456 
457     log_info("l2cap_ertm_store_fragment: tx_read_index %u, tx_write_index %u, num stored %u", channel->tx_read_index, channel->tx_write_index, channel->num_stored_tx_frames);
458 
459 }
460 
461 static uint8_t l2cap_ertm_send(l2cap_channel_t * channel, const uint8_t * data, uint16_t len){
462     if (len > channel->remote_mtu){
463         log_error("l2cap_ertm_send cid 0x%02x, data length exceeds remote MTU.", channel->local_cid);
464         return L2CAP_DATA_LEN_EXCEEDS_REMOTE_MTU;
465     }
466 
467     if (!l2cap_ertm_can_store_packet_now(channel)){
468         log_error("l2cap_ertm_send cid 0x%02x, fragment store full", channel->local_cid);
469         return BTSTACK_ACL_BUFFERS_FULL;
470     }
471 
472     // check if it needs to get fragmented
473     uint16_t effective_mps = btstack_min(channel->remote_mps, channel->local_mps);
474     if (len > effective_mps){
475         // fragmentation needed.
476         l2cap_segmentation_and_reassembly_t sar =  L2CAP_SEGMENTATION_AND_REASSEMBLY_START_OF_L2CAP_SDU;
477         uint16_t chunk_len = 0;
478         while (len){
479             switch (sar){
480                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_START_OF_L2CAP_SDU:
481                     chunk_len = effective_mps - 2;    // sdu_length
482                     l2cap_ertm_store_fragment(channel, sar, len, data, chunk_len);
483                     sar = L2CAP_SEGMENTATION_AND_REASSEMBLY_CONTINUATION_OF_L2CAP_SDU;
484                     break;
485                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_CONTINUATION_OF_L2CAP_SDU:
486                     chunk_len = effective_mps;
487                     if (chunk_len >= len){
488                         sar = L2CAP_SEGMENTATION_AND_REASSEMBLY_END_OF_L2CAP_SDU;
489                         chunk_len = len;
490                     }
491                     l2cap_ertm_store_fragment(channel, sar, len, data, chunk_len);
492                     break;
493                 default:
494                     btstack_unreachable();
495                     break;
496             }
497             len  -= chunk_len;
498             data += chunk_len;
499         }
500 
501     } else {
502         l2cap_ertm_store_fragment(channel, L2CAP_SEGMENTATION_AND_REASSEMBLY_UNSEGMENTED_L2CAP_SDU, 0, data, len);
503     }
504 
505     // try to send
506     l2cap_notify_channel_can_send();
507     return ERROR_CODE_SUCCESS;
508 }
509 
510 static uint16_t l2cap_setup_options_ertm_request(l2cap_channel_t * channel, uint8_t * config_options){
511     int pos = 0;
512     config_options[pos++] = L2CAP_CONFIG_OPTION_TYPE_RETRANSMISSION_AND_FLOW_CONTROL;
513     config_options[pos++] = 9;      // length
514     config_options[pos++] = (uint8_t) channel->mode;
515     config_options[pos++] = channel->num_rx_buffers;    // == TxWindows size
516     config_options[pos++] = channel->local_max_transmit;
517     little_endian_store_16( config_options, pos, channel->local_retransmission_timeout_ms);
518     pos += 2;
519     little_endian_store_16( config_options, pos, channel->local_monitor_timeout_ms);
520     pos += 2;
521     little_endian_store_16( config_options, pos, channel->local_mps);
522     pos += 2;
523     //
524     config_options[pos++] = L2CAP_CONFIG_OPTION_TYPE_MAX_TRANSMISSION_UNIT;
525     config_options[pos++] = 2;     // length
526     little_endian_store_16(config_options, pos, channel->local_mtu);
527     pos += 2;
528 
529     // Issue: iOS (e.g. 10.2) uses "No FCS" as default while Core 5.0 specifies "FCS" as default
530     // Workaround: try to actively negotiate FCS option
531     config_options[pos++] = L2CAP_CONFIG_OPTION_TYPE_FRAME_CHECK_SEQUENCE;
532     config_options[pos++] = 1;     // length
533     config_options[pos++] = channel->fcs_option;
534     return pos; // 11+4+3=18
535 }
536 
537 static uint16_t l2cap_setup_options_ertm_response(l2cap_channel_t * channel, uint8_t * config_options){
538     int pos = 0;
539     config_options[pos++] = L2CAP_CONFIG_OPTION_TYPE_RETRANSMISSION_AND_FLOW_CONTROL;
540     config_options[pos++] = 9;      // length
541     config_options[pos++] = (uint8_t) channel->mode;
542     // less or equal to remote tx window size
543     config_options[pos++] = btstack_min(channel->num_tx_buffers, channel->remote_tx_window_size);
544     // max transmit in response shall be ignored -> use sender values
545     config_options[pos++] = channel->remote_max_transmit;
546     // A value for the Retransmission time-out shall be sent in a positive Configuration Response
547     // and indicates the value that will be used by the sender of the Configuration Response -> use our value
548     little_endian_store_16( config_options, pos, channel->local_retransmission_timeout_ms);
549     pos += 2;
550     // A value for the Monitor time-out shall be sent in a positive Configuration Response
551     // and indicates the value that will be used by the sender of the Configuration Response -> use our value
552     little_endian_store_16( config_options, pos, channel->local_monitor_timeout_ms);
553     pos += 2;
554     // less or equal to remote mps
555     uint16_t effective_mps = btstack_min(channel->remote_mps, channel->local_mps);
556     little_endian_store_16( config_options, pos, effective_mps);
557     pos += 2;
558     //
559     config_options[pos++] = L2CAP_CONFIG_OPTION_TYPE_MAX_TRANSMISSION_UNIT; // MTU
560     config_options[pos++] = 2;     // length
561     little_endian_store_16(config_options, pos, channel->remote_mtu);
562     pos += 2;
563 #if 0
564     //
565     config_options[pos++] = L2CAP_CONFIG_OPTION_TYPE_FRAME_CHECK_SEQUENCE;
566     config_options[pos++] = 1;     // length
567     config_options[pos++] = channel->fcs_option;
568 #endif
569     return pos; // 11+4=15
570 }
571 
572 static int l2cap_ertm_send_supervisor_frame(l2cap_channel_t * channel, uint16_t control){
573     hci_reserve_packet_buffer();
574     uint8_t *acl_buffer = hci_get_outgoing_packet_buffer();
575     log_info("S-Frame: control 0x%04x", control);
576     little_endian_store_16(acl_buffer, 8, control);
577     return l2cap_send_prepared(channel->local_cid, 2);
578 }
579 
580 static uint8_t l2cap_ertm_validate_local_config(l2cap_ertm_config_t * ertm_config){
581 
582     uint8_t result = ERROR_CODE_SUCCESS;
583     if (ertm_config->max_transmit < 1){
584         log_error("max_transmit must be >= 1");
585         result = ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS;
586     }
587     if (ertm_config->retransmission_timeout_ms < 2000){
588         log_error("retransmission_timeout_ms must be >= 2000 ms");
589         result = ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS;
590     }
591     if (ertm_config->monitor_timeout_ms < 12000){
592         log_error("monitor_timeout_ms must be >= 12000 ms");
593         result = ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS;
594     }
595     if (ertm_config->local_mtu < 48){
596         log_error("local_mtu must be >= 48");
597         result = ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS;
598     }
599     if (ertm_config->num_rx_buffers < 1){
600         log_error("num_rx_buffers must be >= 1");
601         result = ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS;
602     }
603     if (ertm_config->num_tx_buffers < 1){
604         log_error("num_rx_buffers must be >= 1");
605         result = ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS;
606     }
607     return result;
608 }
609 
610 static void l2cap_ertm_setup_buffers(l2cap_channel_t * channel, uint8_t * buffer, uint32_t size){
611     btstack_assert( (((uintptr_t) buffer) & 0x0f) == 0);
612 
613     // setup state buffers - use void cast to avoid -Wcast-align warning
614     uint32_t pos = 0;
615     channel->rx_packets_state = (l2cap_ertm_rx_packet_state_t *) (void *) &buffer[pos];
616     pos += channel->num_rx_buffers * sizeof(l2cap_ertm_rx_packet_state_t);
617     channel->tx_packets_state = (l2cap_ertm_tx_packet_state_t *) (void *) &buffer[pos];
618     pos += channel->num_tx_buffers * sizeof(l2cap_ertm_tx_packet_state_t);
619 
620     // setup reassembly buffer
621     channel->reassembly_buffer = &buffer[pos];
622     pos += channel->local_mtu;
623 
624     // setup rx buffers
625     channel->rx_packets_data = &buffer[pos];
626     pos += channel->num_rx_buffers * channel->local_mps;
627 
628     // setup tx buffers
629     channel->tx_packets_data = &buffer[pos];
630     pos += channel->num_rx_buffers * channel->remote_mps;
631 
632     btstack_assert(pos <= size);
633     UNUSED(pos);
634 }
635 
636 static void l2cap_ertm_configure_channel(l2cap_channel_t * channel, l2cap_ertm_config_t * ertm_config, uint8_t * buffer, uint32_t size){
637 
638     channel->mode  = L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION;
639     channel->ertm_mandatory = ertm_config->ertm_mandatory;
640     channel->local_max_transmit = ertm_config->max_transmit;
641     channel->local_retransmission_timeout_ms = ertm_config->retransmission_timeout_ms;
642     channel->local_monitor_timeout_ms = ertm_config->monitor_timeout_ms;
643     channel->local_mtu = ertm_config->local_mtu;
644     channel->num_rx_buffers = ertm_config->num_rx_buffers;
645     channel->num_tx_buffers = ertm_config->num_tx_buffers;
646     channel->fcs_option = ertm_config->fcs_option;
647 
648     // align buffer to 16-byte boundary to assert l2cap_ertm_rx_packet_state_t is aligned
649     int bytes_till_alignment = 16 - (((uintptr_t) buffer) & 0x0f);
650     buffer += bytes_till_alignment;
651     size   -= bytes_till_alignment;
652 
653     // calculate space for rx and tx buffers
654     uint32_t state_len = channel->num_rx_buffers * sizeof(l2cap_ertm_rx_packet_state_t) + channel->num_tx_buffers * sizeof(l2cap_ertm_tx_packet_state_t);
655     uint32_t buffer_space = size - state_len - channel->local_mtu;
656 
657     // divide rest of data equally for initial config
658     uint16_t mps = buffer_space / (ertm_config->num_rx_buffers + ertm_config->num_tx_buffers);
659     channel->local_mps  = mps;
660     channel->remote_mps = mps;
661     l2cap_ertm_setup_buffers(channel, buffer, size);
662 
663     log_info("Local MPS: %u", channel->local_mps);
664 }
665 
666 uint8_t l2cap_ertm_create_channel(btstack_packet_handler_t packet_handler, bd_addr_t address, uint16_t psm,
667     l2cap_ertm_config_t * ertm_config, uint8_t * buffer, uint32_t size, uint16_t * out_local_cid){
668 
669     log_info("l2cap_ertm_create_channel addr %s, psm 0x%x, local mtu %u", bd_addr_to_str(address), psm, ertm_config->local_mtu);
670 
671     // validate local config
672     uint8_t result = l2cap_ertm_validate_local_config(ertm_config);
673     if (result) return result;
674 
675     // determine security level based on psm
676     const gap_security_level_t security_level = l2cap_security_level_0_allowed_for_PSM(psm) ? LEVEL_0 : gap_get_security_level();
677 
678     l2cap_channel_t * channel = l2cap_create_channel_entry(packet_handler, L2CAP_CHANNEL_TYPE_CLASSIC, address, BD_ADDR_TYPE_ACL, psm, ertm_config->local_mtu, security_level);
679     if (!channel) {
680         return BTSTACK_MEMORY_ALLOC_FAILED;
681     }
682 
683     // configure ERTM
684     l2cap_ertm_configure_channel(channel, ertm_config, buffer, size);
685 
686     // add to connections list
687     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
688 
689     // store local_cid
690     if (out_local_cid){
691        *out_local_cid = channel->local_cid;
692     }
693 
694     // check if hci connection is already usable
695     hci_connection_t * conn = hci_connection_for_bd_addr_and_type(address, BD_ADDR_TYPE_ACL);
696     if (conn){
697         log_info("l2cap_create_channel, hci connection already exists");
698         l2cap_handle_connection_complete(conn->con_handle, channel);
699         // check if remote supported fearures are already received
700         if (hci_remote_features_available(conn->con_handle)) {
701             l2cap_handle_remote_supported_features_received(channel);
702         } else {
703             hci_remote_features_query(conn->con_handle);
704         };
705     }
706 
707     l2cap_run();
708 
709     return 0;
710 }
711 
712 static void l2cap_ertm_notify_channel_can_send(l2cap_channel_t * channel){
713     if (l2cap_ertm_can_store_packet_now(channel)){
714         channel->waiting_for_can_send_now = 0;
715         l2cap_emit_can_send_now(channel->packet_handler, channel->local_cid);
716     }
717 }
718 
719 uint8_t l2cap_ertm_accept_connection(uint16_t local_cid, l2cap_ertm_config_t * ertm_config, uint8_t * buffer, uint32_t size){
720 
721     log_info("l2cap_ertm_accept_connection local_cid 0x%x", local_cid);
722     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
723     if (!channel) {
724         log_error("l2cap_accept_connection called but local_cid 0x%x not found", local_cid);
725         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
726     }
727 
728     // validate local config
729     uint8_t result = l2cap_ertm_validate_local_config(ertm_config);
730     if (result) return result;
731 
732     // configure L2CAP ERTM
733     l2cap_ertm_configure_channel(channel, ertm_config, buffer, size);
734 
735     // we need to know if ERTM is supported before sending a config response
736     channel->state = L2CAP_STATE_WAIT_INCOMING_EXTENDED_FEATURES;
737     hci_connection_t * connection = hci_connection_for_handle(channel->con_handle);
738     btstack_assert(connection != NULL);
739     switch (connection->l2cap_state.information_state){
740         case L2CAP_INFORMATION_STATE_IDLE:
741             connection->l2cap_state.information_state = L2CAP_INFORMATION_STATE_W2_SEND_EXTENDED_FEATURE_REQUEST;
742             break;
743         case L2CAP_INFORMATION_STATE_DONE:
744             l2cap_handle_information_request_complete(connection);
745             break;
746         default:
747             break;
748     }
749 
750     l2cap_run();
751 
752     return ERROR_CODE_SUCCESS;
753 }
754 
755 uint8_t l2cap_ertm_decline_connection(uint16_t local_cid){
756     l2cap_decline_connection(local_cid);
757     return ERROR_CODE_SUCCESS;
758 }
759 
760 uint8_t l2cap_ertm_set_busy(uint16_t local_cid){
761     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid( local_cid);
762     if (!channel) {
763         log_error( "l2cap_decline_connection called but local_cid 0x%x not found", local_cid);
764         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
765     }
766     if (!channel->local_busy){
767         channel->local_busy = 1;
768         channel->send_supervisor_frame_receiver_not_ready = 1;
769         l2cap_run();
770     }
771     return ERROR_CODE_SUCCESS;
772 }
773 
774 uint8_t l2cap_ertm_set_ready(uint16_t local_cid){
775     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid( local_cid);
776     if (!channel) {
777         log_error( "l2cap_decline_connection called but local_cid 0x%x not found", local_cid);
778         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
779     }
780     if (channel->local_busy){
781         channel->local_busy = 0;
782         channel->send_supervisor_frame_receiver_ready_poll = 1;
783         l2cap_run();
784     }
785     return ERROR_CODE_SUCCESS;
786 }
787 
788 // Process-ReqSeq
789 static void l2cap_ertm_process_req_seq(l2cap_channel_t * l2cap_channel, uint8_t req_seq){
790     int num_buffers_acked = 0;
791     l2cap_ertm_tx_packet_state_t * tx_state;
792     log_info("l2cap_ertm_process_req_seq: tx_read_index %u, tx_write_index %u, req_seq %u", l2cap_channel->tx_read_index, l2cap_channel->tx_write_index, req_seq);
793     while (true){
794 
795         // no unack packets left
796         if (l2cap_channel->unacked_frames == 0) {
797             // stop retransmission timer
798             l2cap_ertm_stop_retransmission_timer(l2cap_channel);
799             break;
800         }
801 
802         tx_state = &l2cap_channel->tx_packets_state[l2cap_channel->tx_read_index];
803         // calc delta
804         int delta = (req_seq - tx_state->tx_seq) & 0x03f;
805         if (delta == 0) break;  // all packets acknowledged
806         if (delta > l2cap_channel->remote_tx_window_size) break;
807 
808         num_buffers_acked++;
809         l2cap_channel->num_stored_tx_frames--;
810         l2cap_channel->unacked_frames--;
811         log_info("RR seq %u => packet with tx_seq %u done", req_seq, tx_state->tx_seq);
812 
813         l2cap_channel->tx_read_index++;
814         if (l2cap_channel->tx_read_index >= l2cap_channel->num_rx_buffers){
815             l2cap_channel->tx_read_index = 0;
816         }
817     }
818     if (num_buffers_acked){
819         log_info("num_buffers_acked %u", num_buffers_acked);
820     l2cap_ertm_notify_channel_can_send(l2cap_channel);
821 }
822 }
823 
824 static l2cap_ertm_tx_packet_state_t * l2cap_ertm_get_tx_state(l2cap_channel_t * l2cap_channel, uint8_t tx_seq){
825     int i;
826     for (i=0;i<l2cap_channel->num_tx_buffers;i++){
827         l2cap_ertm_tx_packet_state_t * tx_state = &l2cap_channel->tx_packets_state[i];
828         if (tx_state->tx_seq == tx_seq) return tx_state;
829     }
830     return NULL;
831 }
832 
833 // @param delta number of frames in the future, >= 1
834 // @assumption size <= l2cap_channel->local_mps (checked in l2cap_acl_classic_handler)
835 static void l2cap_ertm_handle_out_of_sequence_sdu(l2cap_channel_t * l2cap_channel, l2cap_segmentation_and_reassembly_t sar, int delta, const uint8_t * payload, uint16_t size){
836     log_info("Store SDU with delta %u", delta);
837     // get rx state for packet to store
838     int index = l2cap_channel->rx_store_index + delta - 1;
839     if (index > l2cap_channel->num_rx_buffers){
840         index -= l2cap_channel->num_rx_buffers;
841     }
842     log_info("Index of packet to store %u", index);
843     l2cap_ertm_rx_packet_state_t * rx_state = &l2cap_channel->rx_packets_state[index];
844     // check if buffer is free
845     if (rx_state->valid){
846         log_error("Packet buffer already used");
847         return;
848     }
849     rx_state->valid = 1;
850     rx_state->sar = sar;
851     rx_state->len = size;
852     uint8_t * rx_buffer = &l2cap_channel->rx_packets_data[index];
853     (void)memcpy(rx_buffer, payload, size);
854 }
855 
856 // @assumption size <= l2cap_channel->local_mps (checked in l2cap_acl_classic_handler)
857 static void l2cap_ertm_handle_in_sequence_sdu(l2cap_channel_t * l2cap_channel, l2cap_segmentation_and_reassembly_t sar, const uint8_t * payload, uint16_t size){
858     uint16_t reassembly_sdu_length;
859     switch (sar){
860         case L2CAP_SEGMENTATION_AND_REASSEMBLY_UNSEGMENTED_L2CAP_SDU:
861             // assert total packet size <= our mtu
862             if (size > l2cap_channel->local_mtu) break;
863             // packet complete -> disapatch
864             l2cap_dispatch_to_channel(l2cap_channel, L2CAP_DATA_PACKET, (uint8_t*) payload, size);
865             break;
866         case L2CAP_SEGMENTATION_AND_REASSEMBLY_START_OF_L2CAP_SDU:
867             // read SDU len
868             reassembly_sdu_length = little_endian_read_16(payload, 0);
869             payload += 2;
870             size    -= 2;
871             // assert reassembled size <= our mtu
872             if (reassembly_sdu_length > l2cap_channel->local_mtu) break;
873             // store start segment
874             l2cap_channel->reassembly_sdu_length = reassembly_sdu_length;
875             (void)memcpy(&l2cap_channel->reassembly_buffer[0], payload, size);
876             l2cap_channel->reassembly_pos = size;
877             break;
878         case L2CAP_SEGMENTATION_AND_REASSEMBLY_CONTINUATION_OF_L2CAP_SDU:
879             // assert size of reassembled data <= our mtu
880             if (l2cap_channel->reassembly_pos + size > l2cap_channel->local_mtu) break;
881             // store continuation segment
882             (void)memcpy(&l2cap_channel->reassembly_buffer[l2cap_channel->reassembly_pos],
883                          payload, size);
884             l2cap_channel->reassembly_pos += size;
885             break;
886         case L2CAP_SEGMENTATION_AND_REASSEMBLY_END_OF_L2CAP_SDU:
887             // assert size of reassembled data <= our mtu
888             if (l2cap_channel->reassembly_pos + size > l2cap_channel->local_mtu) break;
889             // store continuation segment
890             (void)memcpy(&l2cap_channel->reassembly_buffer[l2cap_channel->reassembly_pos],
891                          payload, size);
892             l2cap_channel->reassembly_pos += size;
893             // assert size of reassembled data matches announced sdu length
894             if (l2cap_channel->reassembly_pos != l2cap_channel->reassembly_sdu_length) break;
895             // packet complete -> disapatch
896             l2cap_dispatch_to_channel(l2cap_channel, L2CAP_DATA_PACKET, l2cap_channel->reassembly_buffer, l2cap_channel->reassembly_pos);
897             l2cap_channel->reassembly_pos = 0;
898             break;
899         default:
900             btstack_assert(false);
901             break;
902     }
903 }
904 
905 static void l2cap_ertm_channel_send_information_frame(l2cap_channel_t * channel){
906     channel->unacked_frames++;
907     int index = channel->tx_send_index;
908     channel->tx_send_index++;
909     if (channel->tx_send_index >= channel->num_tx_buffers){
910         channel->tx_send_index = 0;
911     }
912     l2cap_ertm_send_information_frame(channel, index, 0);   // final = 0
913 }
914 
915 #endif
916 
917 #ifdef L2CAP_USES_CHANNELS
918 static uint16_t l2cap_next_local_cid(void){
919     do {
920         if (l2cap_local_source_cid == 0xfffeu) {
921             l2cap_local_source_cid = 0x40;
922         } else {
923             l2cap_local_source_cid++;
924         }
925     } while (l2cap_get_channel_for_local_cid(l2cap_local_source_cid) != NULL);
926     return l2cap_local_source_cid;
927 }
928 #endif
929 
930 static uint8_t l2cap_next_sig_id(void){
931     if (l2cap_sig_seq_nr == 0xffu) {
932         l2cap_sig_seq_nr = 1;
933     } else {
934         l2cap_sig_seq_nr++;
935     }
936     return l2cap_sig_seq_nr;
937 }
938 
939 void l2cap_init(void){
940 #ifdef L2CAP_USES_CHANNELS
941     l2cap_local_source_cid  = 0x40;
942 #endif
943     l2cap_sig_seq_nr  = 0xff;
944 
945 #ifdef ENABLE_CLASSIC
946     // Setup Connectionless Channel
947     l2cap_fixed_channel_classic_connectionless.local_cid     = L2CAP_CID_CONNECTIONLESS_CHANNEL;
948     l2cap_fixed_channel_classic_connectionless.channel_type  = L2CAP_CHANNEL_TYPE_CONNECTIONLESS;
949     btstack_linked_list_add(&l2cap_channels, (btstack_linked_item_t *) &l2cap_fixed_channel_classic_connectionless);
950 #endif
951 
952 #ifdef ENABLE_BLE
953     // Setup fixed ATT Channel
954     l2cap_fixed_channel_le_att.local_cid    = L2CAP_CID_ATTRIBUTE_PROTOCOL;
955     l2cap_fixed_channel_le_att.channel_type = L2CAP_CHANNEL_TYPE_FIXED_LE;
956     btstack_linked_list_add(&l2cap_channels, (btstack_linked_item_t *) &l2cap_fixed_channel_le_att);
957 
958     // Setup fixed SM Channel
959     l2cap_fixed_channel_le_sm.local_cid     = L2CAP_CID_SECURITY_MANAGER_PROTOCOL;
960     l2cap_fixed_channel_le_sm.channel_type  = L2CAP_CHANNEL_TYPE_FIXED_LE;
961     btstack_linked_list_add(&l2cap_channels, (btstack_linked_item_t *) &l2cap_fixed_channel_le_sm);
962 #endif
963 #ifdef ENABLE_CLASSIC
964     // Setup fixed SM Channel
965     l2cap_fixed_channel_classic_sm.local_cid     = L2CAP_CID_BR_EDR_SECURITY_MANAGER;
966     l2cap_fixed_channel_classic_sm.channel_type  = L2CAP_CHANNEL_TYPE_FIXED_CLASSIC;
967     btstack_linked_list_add(&l2cap_channels, (btstack_linked_item_t *) &l2cap_fixed_channel_classic_sm);
968 #endif
969 
970 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
971     l2cap_enhanced_mps_min = 0x0001;
972     l2cap_enhanced_mps_max = 0xffff;
973     l2cap_trigger_run_registration.callback = &l2cap_run_trigger_callback;
974 #endif
975 
976     //
977     // register callback with HCI
978     //
979     l2cap_hci_event_callback_registration.callback = &l2cap_hci_event_handler;
980     hci_add_event_handler(&l2cap_hci_event_callback_registration);
981 
982     hci_register_acl_packet_handler(&l2cap_acl_handler);
983 
984 #ifndef ENABLE_EXPLICIT_CONNECTABLE_MODE_CONTROL
985 #ifdef ENABLE_CLASSIC
986     gap_connectable_control(0); // no services yet
987 #endif
988 #endif
989 }
990 
991 /**
992  * @brief De-Init L2CAP
993  */
994 void l2cap_deinit(void){
995     l2cap_channels = NULL;
996     l2cap_signaling_responses_pending = 0;
997 #ifdef ENABLE_CLASSIC
998     l2cap_require_security_level2_for_outgoing_sdp = 0;
999     (void)memset(&l2cap_fixed_channel_classic_connectionless, 0, sizeof(l2cap_fixed_channel_classic_connectionless));
1000     l2cap_services = NULL;
1001     (void)memset(l2cap_outgoing_classic_addr, 0, 6);
1002     (void)memset(&l2cap_fixed_channel_classic_sm, 0, sizeof(l2cap_fixed_channel_classic_sm));
1003 #endif
1004 #ifdef ENABLE_BLE
1005     l2cap_le_custom_max_mtu = 0;
1006     (void)memset(&l2cap_fixed_channel_le_att, 0, sizeof(l2cap_fixed_channel_le_att));
1007     (void)memset(&l2cap_fixed_channel_le_sm, 0, sizeof(l2cap_fixed_channel_le_sm));
1008 #endif
1009 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
1010     l2cap_le_services = NULL;
1011 #endif
1012 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
1013     l2cap_enhanced_services = NULL;
1014 #endif
1015     l2cap_event_handlers = NULL;
1016 }
1017 
1018 void l2cap_add_event_handler(btstack_packet_callback_registration_t * callback_handler){
1019     btstack_linked_list_add_tail(&l2cap_event_handlers, (btstack_linked_item_t*) callback_handler);
1020 }
1021 
1022 void l2cap_remove_event_handler(btstack_packet_callback_registration_t * callback_handler){
1023     btstack_linked_list_remove(&l2cap_event_handlers, (btstack_linked_item_t*) callback_handler);
1024 }
1025 
1026 static void l2cap_emit_event(uint8_t *event, uint16_t size) {
1027     hci_dump_packet( HCI_EVENT_PACKET, 1, event, size);
1028     // dispatch to all event handlers
1029     btstack_linked_list_iterator_t it;
1030     btstack_linked_list_iterator_init(&it, &l2cap_event_handlers);
1031     while (btstack_linked_list_iterator_has_next(&it)){
1032         btstack_packet_callback_registration_t * entry = (btstack_packet_callback_registration_t*) btstack_linked_list_iterator_next(&it);
1033         entry->callback(HCI_EVENT_PACKET, 0, event, size);
1034     }
1035 }
1036 
1037 void l2cap_request_can_send_fix_channel_now_event(hci_con_handle_t con_handle, uint16_t channel_id){
1038     UNUSED(con_handle);  // ok: there is no con handle
1039 
1040     l2cap_fixed_channel_t * channel = l2cap_fixed_channel_for_channel_id(channel_id);
1041     if (!channel) return;
1042     channel->waiting_for_can_send_now = 1;
1043     l2cap_notify_channel_can_send();
1044 }
1045 
1046 bool l2cap_can_send_fixed_channel_packet_now(hci_con_handle_t con_handle, uint16_t channel_id){
1047     UNUSED(channel_id); // ok: only depends on Controller LE buffers
1048 
1049     return hci_can_send_acl_packet_now(con_handle);
1050 }
1051 
1052 uint8_t *l2cap_get_outgoing_buffer(void){
1053     return hci_get_outgoing_packet_buffer() + COMPLETE_L2CAP_HEADER; // 8 bytes
1054 }
1055 
1056 // only for L2CAP Basic Channels
1057 void l2cap_reserve_packet_buffer(void){
1058     hci_reserve_packet_buffer();
1059 }
1060 
1061 // only for L2CAP Basic Channels
1062 void l2cap_release_packet_buffer(void){
1063     hci_release_packet_buffer();
1064 }
1065 
1066 static void l2cap_setup_header(uint8_t * acl_buffer, hci_con_handle_t con_handle, uint8_t packet_boundary, uint16_t remote_cid, uint16_t len){
1067     // 0 - Connection handle : PB=pb : BC=00
1068     little_endian_store_16(acl_buffer, 0u, con_handle | (packet_boundary << 12u) | (0u << 14u));
1069     // 2 - ACL length
1070     little_endian_store_16(acl_buffer, 2u,  len + 4u);
1071     // 4 - L2CAP packet length
1072     little_endian_store_16(acl_buffer, 4u,  len + 0u);
1073     // 6 - L2CAP channel DEST
1074     little_endian_store_16(acl_buffer, 6,  remote_cid);
1075 }
1076 
1077 // assumption - only on LE connections
1078 uint8_t l2cap_send_prepared_connectionless(hci_con_handle_t con_handle, uint16_t cid, uint16_t len){
1079 
1080     if (!hci_is_packet_buffer_reserved()){
1081         log_error("l2cap_send_prepared_connectionless called without reserving packet first");
1082         return BTSTACK_ACL_BUFFERS_FULL;
1083     }
1084 
1085     if (!hci_can_send_prepared_acl_packet_now(con_handle)){
1086         log_info("l2cap_send_prepared_connectionless handle 0x%02x, cid 0x%02x, cannot send", con_handle, cid);
1087         return BTSTACK_ACL_BUFFERS_FULL;
1088     }
1089 
1090     log_debug("l2cap_send_prepared_connectionless handle %u, cid 0x%02x", con_handle, cid);
1091 
1092     uint8_t *acl_buffer = hci_get_outgoing_packet_buffer();
1093     l2cap_setup_header(acl_buffer, con_handle, 0, cid, len);
1094     // send
1095     return hci_send_acl_packet_buffer(len+8u);
1096 }
1097 
1098 // assumption - only on LE connections
1099 uint8_t l2cap_send_connectionless(hci_con_handle_t con_handle, uint16_t cid, uint8_t *data, uint16_t len){
1100 
1101     if (!hci_can_send_acl_packet_now(con_handle)){
1102         log_info("l2cap_send cid 0x%02x, cannot send", cid);
1103         return BTSTACK_ACL_BUFFERS_FULL;
1104     }
1105 
1106     hci_reserve_packet_buffer();
1107     uint8_t *acl_buffer = hci_get_outgoing_packet_buffer();
1108 
1109     (void)memcpy(&acl_buffer[8], data, len);
1110 
1111     return l2cap_send_prepared_connectionless(con_handle, cid, len);
1112 }
1113 
1114 static void l2cap_emit_can_send_now(btstack_packet_handler_t packet_handler, uint16_t channel) {
1115     log_debug("L2CAP_EVENT_CHANNEL_CAN_SEND_NOW local_cid 0x%x", channel);
1116     uint8_t event[4];
1117     event[0] = L2CAP_EVENT_CAN_SEND_NOW;
1118     event[1] = sizeof(event) - 2u;
1119     little_endian_store_16(event, 2, channel);
1120     hci_dump_packet( HCI_EVENT_PACKET, 1, event, sizeof(event));
1121     packet_handler(HCI_EVENT_PACKET, channel, event, sizeof(event));
1122 }
1123 
1124 #ifdef L2CAP_USES_CHANNELS
1125 static void l2cap_dispatch_to_channel(l2cap_channel_t *channel, uint8_t type, uint8_t * data, uint16_t size){
1126     (* (channel->packet_handler))(type, channel->local_cid, data, size);
1127 }
1128 
1129 static void l2cap_emit_simple_event_with_cid(l2cap_channel_t * channel, uint8_t event_code){
1130     uint8_t event[4];
1131     event[0] = event_code;
1132     event[1] = sizeof(event) - 2u;
1133     little_endian_store_16(event, 2, channel->local_cid);
1134     hci_dump_packet( HCI_EVENT_PACKET, 1, event, sizeof(event));
1135     l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
1136 }
1137 #endif
1138 
1139 #ifdef ENABLE_CLASSIC
1140 void l2cap_emit_channel_opened(l2cap_channel_t *channel, uint8_t status) {
1141     log_info("L2CAP_EVENT_CHANNEL_OPENED status 0x%x addr %s handle 0x%x psm 0x%x local_cid 0x%x remote_cid 0x%x local_mtu %u, remote_mtu %u, flush_timeout %u",
1142              status, bd_addr_to_str(channel->address), channel->con_handle, channel->psm,
1143              channel->local_cid, channel->remote_cid, channel->local_mtu, channel->remote_mtu, channel->flush_timeout);
1144     uint8_t event[26];
1145     event[0] = L2CAP_EVENT_CHANNEL_OPENED;
1146     event[1] = sizeof(event) - 2;
1147     event[2] = status;
1148     reverse_bd_addr(channel->address, &event[3]);
1149     little_endian_store_16(event,  9, channel->con_handle);
1150     little_endian_store_16(event, 11, channel->psm);
1151     little_endian_store_16(event, 13, channel->local_cid);
1152     little_endian_store_16(event, 15, channel->remote_cid);
1153     little_endian_store_16(event, 17, channel->local_mtu);
1154     little_endian_store_16(event, 19, channel->remote_mtu);
1155     little_endian_store_16(event, 21, channel->flush_timeout);
1156     event[23] = (channel->state_var & L2CAP_CHANNEL_STATE_VAR_INCOMING) ? 1 : 0;
1157 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1158     log_info("ERTM mode %u, fcs enabled %u", channel->mode, channel->fcs_option);
1159     event[24] = channel->mode;
1160     event[25] = channel->fcs_option;
1161 
1162 #else
1163     event[24] = L2CAP_CHANNEL_MODE_BASIC;
1164     event[25] = 0;
1165 #endif
1166     hci_dump_packet( HCI_EVENT_PACKET, 1, event, sizeof(event));
1167     l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
1168 }
1169 
1170 static void l2cap_emit_incoming_connection(l2cap_channel_t *channel) {
1171     log_info("L2CAP_EVENT_INCOMING_CONNECTION addr %s handle 0x%x psm 0x%x local_cid 0x%x remote_cid 0x%x",
1172              bd_addr_to_str(channel->address), channel->con_handle,  channel->psm, channel->local_cid, channel->remote_cid);
1173     uint8_t event[16];
1174     event[0] = L2CAP_EVENT_INCOMING_CONNECTION;
1175     event[1] = sizeof(event) - 2;
1176     reverse_bd_addr(channel->address, &event[2]);
1177     little_endian_store_16(event,  8, channel->con_handle);
1178     little_endian_store_16(event, 10, channel->psm);
1179     little_endian_store_16(event, 12, channel->local_cid);
1180     little_endian_store_16(event, 14, channel->remote_cid);
1181     hci_dump_packet( HCI_EVENT_PACKET, 1, event, sizeof(event));
1182     l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
1183 }
1184 
1185 static void l2cap_handle_channel_open_failed(l2cap_channel_t * channel, uint8_t status){
1186 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1187     // emit ertm buffer released, as it's not needed. if in basic mode, it was either not allocated or already released
1188     if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
1189         l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_ERTM_BUFFER_RELEASED);
1190     }
1191 #endif
1192     l2cap_emit_channel_opened(channel, status);
1193 }
1194 
1195 #endif
1196 
1197 #ifdef L2CAP_USES_CHANNELS
1198 
1199 static void l2cap_emit_channel_closed(l2cap_channel_t *channel) {
1200     log_info("L2CAP_EVENT_CHANNEL_CLOSED local_cid 0x%x", channel->local_cid);
1201     l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_CHANNEL_CLOSED);
1202 }
1203 
1204 static void l2cap_handle_channel_closed(l2cap_channel_t * channel){
1205 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1206     // emit ertm buffer released, as it's not needed anymore. if in basic mode, it was either not allocated or already released
1207     if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
1208         l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_ERTM_BUFFER_RELEASED);
1209     }
1210 #endif
1211     l2cap_emit_channel_closed(channel);
1212 }
1213 #endif
1214 
1215 static l2cap_fixed_channel_t * l2cap_channel_item_by_cid(uint16_t cid){
1216     btstack_linked_list_iterator_t it;
1217     btstack_linked_list_iterator_init(&it, &l2cap_channels);
1218     while (btstack_linked_list_iterator_has_next(&it)){
1219         l2cap_fixed_channel_t * channel = (l2cap_fixed_channel_t*) btstack_linked_list_iterator_next(&it);
1220         if (channel->local_cid == cid) {
1221             return channel;
1222         }
1223     }
1224     return NULL;
1225 }
1226 
1227 // used for fixed channels in LE (ATT/SM) and Classic (Connectionless Channel). CID < 0x04
1228 static l2cap_fixed_channel_t * l2cap_fixed_channel_for_channel_id(uint16_t local_cid){
1229     if (local_cid >= 0x40u) return NULL;
1230     return (l2cap_fixed_channel_t*) l2cap_channel_item_by_cid(local_cid);
1231 }
1232 
1233 #ifdef L2CAP_USES_CHANNELS
1234 
1235 static int l2cap_is_dynamic_channel_type(l2cap_channel_type_t channel_type) {
1236     switch (channel_type) {
1237         case L2CAP_CHANNEL_TYPE_CLASSIC:
1238         case L2CAP_CHANNEL_TYPE_CHANNEL_CBM:
1239         case L2CAP_CHANNEL_TYPE_CHANNEL_ECBM:
1240             return 1;
1241         default:
1242             return 0;
1243     }
1244 }
1245 
1246 static l2cap_channel_t * l2cap_get_channel_for_local_cid(uint16_t local_cid){
1247     if (local_cid < 0x40u) return NULL;
1248     return (l2cap_channel_t*) l2cap_channel_item_by_cid(local_cid);
1249 }
1250 
1251 static l2cap_channel_t * l2cap_get_channel_for_local_cid_and_handle(uint16_t local_cid, hci_con_handle_t con_handle){
1252     if (local_cid < 0x40u) return NULL;
1253     l2cap_channel_t * l2cap_channel = (l2cap_channel_t*) l2cap_channel_item_by_cid(local_cid);
1254     if (l2cap_channel == NULL)  return NULL;
1255     if (l2cap_channel->con_handle != con_handle) return NULL;
1256     return l2cap_channel;
1257 }
1258 #endif
1259 
1260 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
1261 static l2cap_channel_t * l2cap_get_channel_for_remote_handle_and_cid(hci_con_handle_t con_handle, uint16_t remote_cid){
1262     btstack_linked_list_iterator_t it;
1263     btstack_linked_list_iterator_init(&it, &l2cap_channels);
1264     while (btstack_linked_list_iterator_has_next(&it)){
1265         l2cap_fixed_channel_t * channel = (l2cap_fixed_channel_t*) btstack_linked_list_iterator_next(&it);
1266         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
1267         l2cap_channel_t * dynamic_channel = (l2cap_channel_t *) channel;
1268         if (dynamic_channel->con_handle != con_handle) continue;
1269         if (dynamic_channel->remote_cid != remote_cid) continue;
1270         return dynamic_channel;
1271     }
1272     return NULL;
1273 }
1274 #endif
1275 
1276 #ifdef L2CAP_USES_CHANNELS
1277 uint8_t l2cap_request_can_send_now_event(uint16_t local_cid){
1278     l2cap_channel_t *channel = l2cap_get_channel_for_local_cid(local_cid);
1279     if (!channel) return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
1280     channel->waiting_for_can_send_now = 1;
1281     switch (channel->channel_type){
1282         case L2CAP_CHANNEL_TYPE_CLASSIC:
1283 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1284             if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
1285                 l2cap_ertm_notify_channel_can_send(channel);
1286                 return ERROR_CODE_SUCCESS;
1287             }
1288 #endif
1289             l2cap_notify_channel_can_send();
1290             break;
1291 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
1292         case L2CAP_CHANNEL_TYPE_CHANNEL_CBM:
1293             l2cap_credit_based_notify_channel_can_send(channel);
1294             break;
1295 #endif
1296 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
1297         case L2CAP_CHANNEL_TYPE_CHANNEL_ECBM:
1298             l2cap_credit_based_notify_channel_can_send(channel);
1299             break;
1300 #endif
1301         default:
1302             break;
1303     }
1304     return ERROR_CODE_SUCCESS;
1305 }
1306 
1307 bool l2cap_can_send_packet_now(uint16_t local_cid){
1308     l2cap_channel_t *channel = l2cap_get_channel_for_local_cid(local_cid);
1309     if (!channel) return false;
1310     if (channel->state != L2CAP_STATE_OPEN) return false;
1311     switch (channel->channel_type){
1312         case L2CAP_CHANNEL_TYPE_CLASSIC:
1313 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1314             if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
1315                 return l2cap_ertm_can_store_packet_now(channel);
1316             }
1317 #endif
1318             return hci_can_send_acl_packet_now(channel->con_handle);
1319 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
1320         case L2CAP_CHANNEL_TYPE_CHANNEL_CBM:
1321             return channel->send_sdu_buffer == NULL;
1322 #endif
1323 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
1324         case L2CAP_CHANNEL_TYPE_CHANNEL_ECBM:
1325             return channel->send_sdu_buffer == NULL;
1326 #endif
1327         default:
1328             return false;
1329     }
1330 }
1331 
1332 uint8_t l2cap_send(uint16_t local_cid, const uint8_t *data, uint16_t len){
1333     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
1334     if (!channel) {
1335         log_error("l2cap_send no channel for cid 0x%02x", local_cid);
1336         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
1337     }
1338     switch (channel->channel_type){
1339 #ifdef ENABLE_CLASSIC
1340         case L2CAP_CHANNEL_TYPE_CLASSIC:
1341             return l2cap_classic_send(channel, data, len);
1342 #endif
1343 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
1344         case L2CAP_CHANNEL_TYPE_CHANNEL_CBM:
1345             return l2cap_credit_based_send_data(channel, data, len);
1346 #endif
1347 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
1348         case L2CAP_CHANNEL_TYPE_CHANNEL_ECBM:
1349             return l2cap_credit_based_send_data(channel, data, len);
1350 #endif
1351         default:
1352             return ERROR_CODE_UNSPECIFIED_ERROR;
1353     }
1354 }
1355 #endif
1356 
1357 #ifdef ENABLE_CLASSIC
1358 bool l2cap_can_send_prepared_packet_now(uint16_t local_cid){
1359     l2cap_channel_t *channel = l2cap_get_channel_for_local_cid(local_cid);
1360     if (!channel) return false;
1361 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1362     if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
1363         return false;
1364     }
1365 #endif
1366     return hci_can_send_prepared_acl_packet_now(channel->con_handle);
1367 }
1368 
1369 #endif
1370 
1371 #ifdef L2CAP_USES_CHANNELS
1372 uint16_t l2cap_get_remote_mtu_for_local_cid(uint16_t local_cid){
1373     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
1374     if (channel) {
1375         return channel->remote_mtu;
1376     }
1377     return 0;
1378 }
1379 #endif
1380 
1381 #ifdef ENABLE_CLASSIC
1382 // RTX Timer only exist for dynamic channels
1383 static l2cap_channel_t * l2cap_channel_for_rtx_timer(btstack_timer_source_t * ts){
1384     btstack_linked_list_iterator_t it;
1385     btstack_linked_list_iterator_init(&it, &l2cap_channels);
1386     while (btstack_linked_list_iterator_has_next(&it)){
1387         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
1388         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
1389         if (&channel->rtx == ts) {
1390             return channel;
1391         }
1392     }
1393     return NULL;
1394 }
1395 
1396 static void l2cap_rtx_timeout(btstack_timer_source_t * ts){
1397     l2cap_channel_t * channel = l2cap_channel_for_rtx_timer(ts);
1398     if (!channel) return;
1399 
1400     log_info("l2cap_rtx_timeout for local cid 0x%02x", channel->local_cid);
1401 
1402     // "When terminating the channel, it is not necessary to send a L2CAP_DisconnectReq
1403     //  and enter WAIT_DISCONNECT state. Channels can be transitioned directly to the CLOSED state."
1404     // notify client
1405     l2cap_handle_channel_open_failed(channel, L2CAP_CONNECTION_RESPONSE_RESULT_RTX_TIMEOUT);
1406 
1407     // discard channel
1408     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
1409     l2cap_free_channel_entry(channel);
1410 }
1411 
1412 static uint8_t l2cap_classic_packet_boundary_flag(void){
1413     return (hci_non_flushable_packet_boundary_flag_supported() && (hci_automatic_flush_timeout() == 0)) ? 0x00 : 0x02;
1414 }
1415 #endif
1416 
1417 #ifdef L2CAP_USES_CHANNELS
1418 static void l2cap_stop_rtx(l2cap_channel_t * channel){
1419     log_info("l2cap_stop_rtx for local cid 0x%02x", channel->local_cid);
1420     btstack_run_loop_remove_timer(&channel->rtx);
1421 }
1422 #endif
1423 
1424 static uint8_t l2cap_send_signaling_packet(hci_con_handle_t handle, uint8_t pb_flags, uint16_t cid, L2CAP_SIGNALING_COMMANDS cmd, int identifier, va_list argptr){
1425     if (!hci_can_send_acl_packet_now(handle)){
1426         log_info("l2cap_send_classic_signaling_packet, cannot send");
1427         return BTSTACK_ACL_BUFFERS_FULL;
1428     }
1429     hci_reserve_packet_buffer();
1430     uint8_t *acl_buffer = hci_get_outgoing_packet_buffer();
1431     uint16_t len = l2cap_create_signaling_packet(acl_buffer, handle, pb_flags, cid, cmd, identifier, argptr);
1432     va_end(argptr);
1433     return hci_send_acl_packet_buffer(len);
1434 }
1435 
1436 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
1437 static int l2cap_send_general_signaling_packet(hci_con_handle_t handle, uint16_t signaling_cid, L2CAP_SIGNALING_COMMANDS cmd, int identifier, ...){
1438     va_list argptr;
1439     va_start(argptr, identifier);
1440     uint8_t pb_flags = 0x00;
1441 #ifdef ENABLE_CLASSIC
1442     if (signaling_cid == L2CAP_CID_SIGNALING){
1443         pb_flags = l2cap_classic_packet_boundary_flag();
1444     }
1445 #endif
1446 uint8_t result = l2cap_send_signaling_packet(handle, pb_flags, signaling_cid, cmd, identifier, argptr);
1447     va_end(argptr);
1448     return result;
1449 }
1450 #endif
1451 
1452 #ifdef ENABLE_CLASSIC
1453 
1454 static void l2cap_start_rtx(l2cap_channel_t * channel){
1455     l2cap_stop_rtx(channel);
1456     log_info("l2cap_start_rtx for local cid 0x%02x", channel->local_cid);
1457     btstack_run_loop_set_timer_handler(&channel->rtx, l2cap_rtx_timeout);
1458     btstack_run_loop_set_timer(&channel->rtx, L2CAP_RTX_TIMEOUT_MS);
1459     btstack_run_loop_add_timer(&channel->rtx);
1460 }
1461 
1462 static void l2cap_start_ertx(l2cap_channel_t * channel){
1463     log_info("l2cap_start_ertx for local cid 0x%02x", channel->local_cid);
1464     l2cap_stop_rtx(channel);
1465     btstack_run_loop_set_timer_handler(&channel->rtx, l2cap_rtx_timeout);
1466     btstack_run_loop_set_timer(&channel->rtx, L2CAP_ERTX_TIMEOUT_MS);
1467     btstack_run_loop_add_timer(&channel->rtx);
1468 }
1469 
1470 void l2cap_require_security_level_2_for_outgoing_sdp(void){
1471     l2cap_require_security_level2_for_outgoing_sdp = 1;
1472 }
1473 
1474 static int l2cap_security_level_0_allowed_for_PSM(uint16_t psm){
1475     return (psm == BLUETOOTH_PSM_SDP) && (!l2cap_require_security_level2_for_outgoing_sdp);
1476 }
1477 
1478 static int l2cap_send_classic_signaling_packet(hci_con_handle_t handle, L2CAP_SIGNALING_COMMANDS cmd, int identifier, ...){
1479     va_list argptr;
1480     va_start(argptr, identifier);
1481     uint8_t pb_flag = l2cap_classic_packet_boundary_flag();
1482     uint8_t result = l2cap_send_signaling_packet(handle, pb_flag, L2CAP_CID_SIGNALING, cmd, identifier, argptr);
1483     va_end(argptr);
1484     return result;
1485 }
1486 
1487 // assumption - only on Classic connections
1488 // cannot be used for L2CAP ERTM
1489 uint8_t l2cap_send_prepared(uint16_t local_cid, uint16_t len){
1490 
1491     if (!hci_is_packet_buffer_reserved()){
1492         log_error("l2cap_send_prepared called without reserving packet first");
1493         return BTSTACK_ACL_BUFFERS_FULL;
1494     }
1495 
1496     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
1497     if (!channel) {
1498         log_error("l2cap_send_prepared no channel for cid 0x%02x", local_cid);
1499         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
1500     }
1501 
1502     if (!hci_can_send_prepared_acl_packet_now(channel->con_handle)){
1503         log_info("l2cap_send_prepared cid 0x%02x, cannot send", local_cid);
1504         return BTSTACK_ACL_BUFFERS_FULL;
1505     }
1506 
1507     log_debug("l2cap_send_prepared cid 0x%02x, handle %u, 1 credit used", local_cid, channel->con_handle);
1508 
1509     int fcs_size = 0;
1510 
1511 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1512     if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION && channel->fcs_option){
1513         fcs_size = 2;
1514     }
1515 #endif
1516 
1517     // set non-flushable packet boundary flag if supported on Controller
1518     uint8_t *acl_buffer = hci_get_outgoing_packet_buffer();
1519     uint8_t packet_boundary_flag = l2cap_classic_packet_boundary_flag();
1520     l2cap_setup_header(acl_buffer, channel->con_handle, packet_boundary_flag, channel->remote_cid, len + fcs_size);
1521 
1522 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1523     if (fcs_size){
1524         // calculate FCS over l2cap data
1525         uint16_t fcs = crc16_calc(acl_buffer + 4, 4 + len);
1526         log_info("I-Frame: fcs 0x%04x", fcs);
1527         little_endian_store_16(acl_buffer, 8 + len, fcs);
1528     }
1529 #endif
1530 
1531     // send
1532     return hci_send_acl_packet_buffer(len+8+fcs_size);
1533 }
1534 
1535 // assumption - only on Classic connections
1536 static uint8_t l2cap_classic_send(l2cap_channel_t * channel, const uint8_t *data, uint16_t len){
1537 
1538 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1539     // send in ERTM
1540     if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
1541         return l2cap_ertm_send(channel, data, len);
1542     }
1543 #endif
1544 
1545     if (len > channel->remote_mtu){
1546         log_error("l2cap_send cid 0x%02x, data length exceeds remote MTU.", channel->local_cid);
1547         return L2CAP_DATA_LEN_EXCEEDS_REMOTE_MTU;
1548     }
1549 
1550     if (!hci_can_send_acl_packet_now(channel->con_handle)){
1551         log_info("l2cap_send cid 0x%02x, cannot send", channel->local_cid);
1552         return BTSTACK_ACL_BUFFERS_FULL;
1553     }
1554 
1555     hci_reserve_packet_buffer();
1556     uint8_t *acl_buffer = hci_get_outgoing_packet_buffer();
1557     (void)memcpy(&acl_buffer[8], data, len);
1558     return l2cap_send_prepared(channel->local_cid, len);
1559 }
1560 
1561 int l2cap_send_echo_request(hci_con_handle_t con_handle, uint8_t *data, uint16_t len){
1562     return l2cap_send_classic_signaling_packet(con_handle, ECHO_REQUEST, l2cap_next_sig_id(), len, data);
1563 }
1564 
1565 static inline void channelStateVarSetFlag(l2cap_channel_t *channel, uint16_t flag){
1566     channel->state_var = channel->state_var | flag;
1567 }
1568 
1569 static inline void channelStateVarClearFlag(l2cap_channel_t *channel, uint16_t flag){
1570     channel->state_var = channel->state_var & ~flag;
1571 }
1572 #endif
1573 
1574 
1575 #ifdef ENABLE_BLE
1576 static int l2cap_send_le_signaling_packet(hci_con_handle_t handle, L2CAP_SIGNALING_COMMANDS cmd, int identifier, ...){
1577     va_list argptr;
1578     va_start(argptr, identifier);
1579     uint8_t pb_flags = 0x00;  // First non-automatically-flushable packet of a higher layer message
1580     uint8_t result = l2cap_send_signaling_packet(handle, pb_flags, L2CAP_CID_SIGNALING_LE, cmd, identifier, argptr);
1581     va_end(argptr);
1582     return result;
1583 }
1584 #endif
1585 
1586 uint16_t l2cap_max_mtu(void){
1587     return HCI_ACL_PAYLOAD_SIZE - L2CAP_HEADER_SIZE;
1588 }
1589 
1590 #ifdef ENABLE_BLE
1591 uint16_t l2cap_max_le_mtu(void){
1592     if (l2cap_le_custom_max_mtu != 0u) return l2cap_le_custom_max_mtu;
1593     return l2cap_max_mtu();
1594 }
1595 
1596 void l2cap_set_max_le_mtu(uint16_t max_mtu){
1597     if (max_mtu < l2cap_max_mtu()){
1598         l2cap_le_custom_max_mtu = max_mtu;
1599     }
1600 }
1601 #endif
1602 
1603 #ifdef ENABLE_CLASSIC
1604 
1605 static uint16_t l2cap_setup_options_mtu(uint8_t * config_options, uint16_t mtu){
1606     config_options[0] = L2CAP_CONFIG_OPTION_TYPE_MAX_TRANSMISSION_UNIT; // MTU
1607     config_options[1] = 2; // len param
1608     little_endian_store_16(config_options, 2, mtu);
1609     return 4;
1610 }
1611 
1612 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1613 static int l2cap_ertm_mode(l2cap_channel_t * channel){
1614     hci_connection_t * connection = hci_connection_for_handle(channel->con_handle);
1615     return ((connection->l2cap_state.information_state == L2CAP_INFORMATION_STATE_DONE)
1616         &&  (connection->l2cap_state.extended_feature_mask & 0x08));
1617 }
1618 #endif
1619 
1620 static uint16_t l2cap_setup_options_request(l2cap_channel_t * channel, uint8_t * config_options){
1621 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1622     // use ERTM options if supported by remote and channel ready to use it
1623     if (l2cap_ertm_mode(channel) && channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
1624         return l2cap_setup_options_ertm_request(channel, config_options);
1625     }
1626 #endif
1627     uint16_t mtu = channel->local_mtu;
1628     return l2cap_setup_options_mtu(config_options, mtu);
1629 }
1630 
1631 static uint16_t l2cap_setup_options_mtu_response(l2cap_channel_t * channel, uint8_t * config_options){
1632     uint16_t mtu = btstack_min(channel->local_mtu, channel->remote_mtu);
1633     return l2cap_setup_options_mtu(config_options, mtu);
1634 }
1635 
1636 static uint32_t l2cap_extended_features_mask(void){
1637     // extended features request supported, features: fixed channels, unicast connectionless data reception
1638     uint32_t features = 0x280;
1639 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1640     features |= 0x0028;
1641 #endif
1642     return features;
1643 }
1644 #endif
1645 
1646 //
1647 #ifdef ENABLE_CLASSIC
1648 
1649 // returns true if channel was finalized
1650 static bool l2cap_run_for_classic_channel(l2cap_channel_t * channel){
1651 
1652 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1653     uint8_t  config_options[18];
1654 #else
1655     uint8_t  config_options[10];
1656 #endif
1657 
1658     switch (channel->state){
1659 
1660         case L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE:
1661         case L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT:
1662             if (!hci_can_send_acl_packet_now(channel->con_handle)) return false;
1663             if (channel->state_var & L2CAP_CHANNEL_STATE_VAR_SEND_CONN_RESP_PEND) {
1664                 channelStateVarClearFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONN_RESP_PEND);
1665                 channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SENT_CONN_RESP_PEND);
1666                 l2cap_send_classic_signaling_packet(channel->con_handle, CONNECTION_RESPONSE, channel->remote_sig_id,
1667                                                     channel->local_cid, channel->remote_cid, 1, 0);
1668             }
1669             break;
1670 
1671         case L2CAP_STATE_WILL_SEND_CREATE_CONNECTION:
1672             if (!hci_can_send_command_packet_now()) break;
1673             // send connection request - set state first
1674             channel->state = L2CAP_STATE_WAIT_CONNECTION_COMPLETE;
1675             // BD_ADDR, Packet_Type, Page_Scan_Repetition_Mode, Reserved, Clock_Offset, Allow_Role_Switch
1676             (void)memcpy(l2cap_outgoing_classic_addr, channel->address, 6);
1677             hci_send_cmd(&hci_create_connection, channel->address, hci_usable_acl_packet_types(), 0, 0, 0, hci_get_allow_role_switch());
1678             break;
1679 
1680         case L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_DECLINE:
1681             if (!hci_can_send_acl_packet_now(channel->con_handle)) return false;
1682             channel->state = L2CAP_STATE_INVALID;
1683             l2cap_send_classic_signaling_packet(channel->con_handle, CONNECTION_RESPONSE, channel->remote_sig_id,
1684                                                 channel->local_cid, channel->remote_cid, channel->reason, 0);
1685             // discard channel - l2cap_finialize_channel_close without sending l2cap close event
1686             btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
1687             l2cap_free_channel_entry(channel);
1688             channel = NULL;
1689             break;
1690 
1691         case L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_ACCEPT:
1692             if (!hci_can_send_acl_packet_now(channel->con_handle)) return false;
1693             channel->state = L2CAP_STATE_CONFIG;
1694             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_REQ);
1695             l2cap_send_classic_signaling_packet(channel->con_handle, CONNECTION_RESPONSE, channel->remote_sig_id,
1696                                                 channel->local_cid, channel->remote_cid, 0, 0);
1697             break;
1698 
1699         case L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST:
1700             if (!hci_can_send_acl_packet_now(channel->con_handle)) return false;
1701             // success, start l2cap handshake
1702             channel->local_sig_id = l2cap_next_sig_id();
1703             channel->state = L2CAP_STATE_WAIT_CONNECT_RSP;
1704             l2cap_send_classic_signaling_packet(channel->con_handle, CONNECTION_REQUEST, channel->local_sig_id,
1705                                                 channel->psm, channel->local_cid);
1706             l2cap_start_rtx(channel);
1707             break;
1708 
1709         case L2CAP_STATE_CONFIG:
1710             if (!hci_can_send_acl_packet_now(channel->con_handle)) return false;
1711 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1712             // fallback to basic mode if ERTM requested but not not supported by remote
1713             if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
1714                 if (!l2cap_ertm_mode(channel)){
1715                     l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_ERTM_BUFFER_RELEASED);
1716                     channel->mode = L2CAP_CHANNEL_MODE_BASIC;
1717                 }
1718             }
1719 #endif
1720             if (channel->state_var & L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP){
1721                 uint16_t flags = 0;
1722                 channelStateVarClearFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP);
1723                 if (channel->state_var & L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_CONT) {
1724                     flags = 1;
1725                 } else {
1726                     channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SENT_CONF_RSP);
1727                 }
1728                 if (channel->state_var & L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_INVALID){
1729                     channelStateVarClearFlag(channel, L2CAP_CHANNEL_STATE_VAR_SENT_CONF_RSP);
1730                     l2cap_send_classic_signaling_packet(channel->con_handle, CONFIGURE_RESPONSE, channel->remote_sig_id,
1731                                                         channel->remote_cid, flags, L2CAP_CONF_RESULT_UNKNOWN_OPTIONS,
1732                                                         1, &channel->unknown_option);
1733 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1734                 } else if (channel->state_var & L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_REJECTED){
1735                     channelStateVarClearFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_REJECTED);
1736                     channelStateVarClearFlag(channel, L2CAP_CHANNEL_STATE_VAR_SENT_CONF_RSP);
1737                     uint16_t options_size = l2cap_setup_options_ertm_response(channel, config_options);
1738                     l2cap_send_classic_signaling_packet(channel->con_handle, CONFIGURE_RESPONSE, channel->remote_sig_id,
1739                                                         channel->remote_cid, flags,
1740                                                         L2CAP_CONF_RESULT_UNACCEPTABLE_PARAMETERS, options_size,
1741                                                         &config_options);
1742                 } else if (channel->state_var & L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_ERTM){
1743                     channelStateVarClearFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_ERTM);
1744                     channelStateVarClearFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_MTU);
1745                     uint16_t options_size = l2cap_setup_options_ertm_response(channel, config_options);
1746                     l2cap_send_classic_signaling_packet(channel->con_handle, CONFIGURE_RESPONSE, channel->remote_sig_id,
1747                                                         channel->remote_cid, flags, L2CAP_CONF_RESULT_SUCCESS,
1748                                                         options_size, &config_options);
1749 #endif
1750                 } else if (channel->state_var & L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_MTU){
1751                     channelStateVarClearFlag(channel,L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_MTU);
1752                     uint16_t options_size = l2cap_setup_options_mtu_response(channel, config_options);
1753                     l2cap_send_classic_signaling_packet(channel->con_handle, CONFIGURE_RESPONSE, channel->remote_sig_id,
1754                                                         channel->remote_cid, flags, L2CAP_CONF_RESULT_SUCCESS,
1755                                                         options_size, &config_options);
1756                 } else {
1757                     l2cap_send_classic_signaling_packet(channel->con_handle, CONFIGURE_RESPONSE, channel->remote_sig_id,
1758                                                         channel->remote_cid, flags, L2CAP_CONF_RESULT_SUCCESS, 0, NULL);
1759                 }
1760                 channelStateVarClearFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_CONT);
1761             }
1762             else if (channel->state_var & L2CAP_CHANNEL_STATE_VAR_SEND_CONF_REQ){
1763                 channelStateVarClearFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_REQ);
1764                 channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SENT_CONF_REQ);
1765                 channel->local_sig_id = l2cap_next_sig_id();
1766                 uint16_t options_size = l2cap_setup_options_request(channel, config_options);
1767                 l2cap_send_classic_signaling_packet(channel->con_handle, CONFIGURE_REQUEST, channel->local_sig_id,
1768                                                     channel->remote_cid, 0, options_size, &config_options);
1769                 l2cap_start_rtx(channel);
1770             }
1771             if (l2cap_channel_ready_for_open(channel)){
1772                 channel->state = L2CAP_STATE_OPEN;
1773                 l2cap_emit_channel_opened(channel, 0);  // success
1774             }
1775             break;
1776 
1777         case L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE:
1778             if (!hci_can_send_acl_packet_now(channel->con_handle)) return false;
1779             channel->state = L2CAP_STATE_INVALID;
1780             l2cap_send_classic_signaling_packet(channel->con_handle, DISCONNECTION_RESPONSE, channel->remote_sig_id,
1781                                                 channel->local_cid, channel->remote_cid);
1782             // we don't start an RTX timer for a disconnect - there's no point in closing the channel if the other side doesn't respond :)
1783             l2cap_finalize_channel_close(channel);  // -- remove from list
1784             channel = NULL;
1785             break;
1786 
1787         case L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST:
1788             if (!hci_can_send_acl_packet_now(channel->con_handle)) return false;
1789             channel->local_sig_id = l2cap_next_sig_id();
1790             channel->state = L2CAP_STATE_WAIT_DISCONNECT;
1791             l2cap_send_classic_signaling_packet(channel->con_handle, DISCONNECTION_REQUEST, channel->local_sig_id,
1792                                                 channel->remote_cid, channel->local_cid);
1793             break;
1794         default:
1795             break;
1796     }
1797 
1798     // handle channel finalize on L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE and L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_DECLINE
1799     return channel == NULL;
1800 }
1801 
1802 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
1803 static void l2cap_run_for_classic_channel_ertm(l2cap_channel_t * channel){
1804 
1805     // ERTM mode
1806     if (channel->mode != L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION) return;
1807 
1808     // check if we can still send
1809     if (channel->con_handle == HCI_CON_HANDLE_INVALID) return;
1810     if (!hci_can_send_acl_packet_now(channel->con_handle)) return;
1811 
1812     if (channel->send_supervisor_frame_receiver_ready){
1813         channel->send_supervisor_frame_receiver_ready = 0;
1814         log_info("Send S-Frame: RR %u, final %u", channel->req_seq, channel->set_final_bit_after_packet_with_poll_bit_set);
1815         uint16_t control = l2cap_encanced_control_field_for_supevisor_frame( L2CAP_SUPERVISORY_FUNCTION_RR_RECEIVER_READY, 0,  channel->set_final_bit_after_packet_with_poll_bit_set, channel->req_seq);
1816         channel->set_final_bit_after_packet_with_poll_bit_set = 0;
1817         l2cap_ertm_send_supervisor_frame(channel, control);
1818         return;
1819     }
1820     if (channel->send_supervisor_frame_receiver_ready_poll){
1821         channel->send_supervisor_frame_receiver_ready_poll = 0;
1822         log_info("Send S-Frame: RR %u with poll=1 ", channel->req_seq);
1823         uint16_t control = l2cap_encanced_control_field_for_supevisor_frame( L2CAP_SUPERVISORY_FUNCTION_RR_RECEIVER_READY, 1, 0, channel->req_seq);
1824         l2cap_ertm_send_supervisor_frame(channel, control);
1825         return;
1826     }
1827     if (channel->send_supervisor_frame_receiver_not_ready){
1828         channel->send_supervisor_frame_receiver_not_ready = 0;
1829         log_info("Send S-Frame: RNR %u", channel->req_seq);
1830         uint16_t control = l2cap_encanced_control_field_for_supevisor_frame( L2CAP_SUPERVISORY_FUNCTION_RNR_RECEIVER_NOT_READY, 0, 0, channel->req_seq);
1831         l2cap_ertm_send_supervisor_frame(channel, control);
1832         return;
1833     }
1834     if (channel->send_supervisor_frame_reject){
1835         channel->send_supervisor_frame_reject = 0;
1836         log_info("Send S-Frame: REJ %u", channel->req_seq);
1837         uint16_t control = l2cap_encanced_control_field_for_supevisor_frame( L2CAP_SUPERVISORY_FUNCTION_REJ_REJECT, 0, 0, channel->req_seq);
1838         l2cap_ertm_send_supervisor_frame(channel, control);
1839         return;
1840     }
1841     if (channel->send_supervisor_frame_selective_reject){
1842         channel->send_supervisor_frame_selective_reject = 0;
1843         log_info("Send S-Frame: SREJ %u", channel->expected_tx_seq);
1844         uint16_t control = l2cap_encanced_control_field_for_supevisor_frame( L2CAP_SUPERVISORY_FUNCTION_SREJ_SELECTIVE_REJECT, 0, channel->set_final_bit_after_packet_with_poll_bit_set, channel->expected_tx_seq);
1845         channel->set_final_bit_after_packet_with_poll_bit_set = 0;
1846         l2cap_ertm_send_supervisor_frame(channel, control);
1847         return;
1848     }
1849 
1850     if (channel->srej_active){
1851         int i;
1852         for (i=0;i<channel->num_tx_buffers;i++){
1853             l2cap_ertm_tx_packet_state_t * tx_state = &channel->tx_packets_state[i];
1854             if (tx_state->retransmission_requested) {
1855                 tx_state->retransmission_requested = 0;
1856                 uint8_t final = channel->set_final_bit_after_packet_with_poll_bit_set;
1857                 channel->set_final_bit_after_packet_with_poll_bit_set = 0;
1858                 l2cap_ertm_send_information_frame(channel, i, final);
1859                 break;
1860             }
1861         }
1862         if (i == channel->num_tx_buffers){
1863             // no retransmission request found
1864             channel->srej_active = 0;
1865         } else {
1866             // packet was sent
1867             return;
1868         }
1869     }
1870 }
1871 #endif /* ERTM */
1872 #endif /* Classic */
1873 
1874 static void l2cap_run_signaling_response(void) {
1875 
1876     // check pending signaling responses
1877     while (l2cap_signaling_responses_pending){
1878 
1879         hci_con_handle_t handle = l2cap_signaling_responses[0].handle;
1880 
1881         if (!hci_can_send_acl_packet_now(handle)) break;
1882 
1883         uint8_t  sig_id        = l2cap_signaling_responses[0].sig_id;
1884         uint8_t  response_code = l2cap_signaling_responses[0].code;
1885         uint16_t result        = l2cap_signaling_responses[0].data;  // CONNECTION_REQUEST, COMMAND_REJECT, REJECT_SM_PAIRING, L2CAP_CREDIT_BASED_CONNECTION_REQUEST
1886         uint8_t  buffer[4];                                          // REJECT_SM_PAIRING, CONFIGURE_REQUEST
1887         uint16_t source_cid    = l2cap_signaling_responses[0].cid;   // CONNECTION_REQUEST, REJECT_SM_PAIRING, DISCONNECT_REQUEST, CONFIGURE_REQUEST, DISCONNECT_REQUEST
1888 #ifdef ENABLE_CLASSIC
1889         uint16_t dest_cid      = l2cap_signaling_responses[0].data;  // DISCONNECT_REQUEST
1890         uint16_t info_type     = l2cap_signaling_responses[0].data;  // INFORMATION_REQUEST
1891 #endif
1892 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
1893         uint8_t num_channels = l2cap_signaling_responses[0].cid >> 8;                 // L2CAP_CREDIT_BASED_CONNECTION_REQUEST
1894         uint16_t signaling_cid = (uint16_t) l2cap_signaling_responses[0].cid & 0xff;  // L2CAP_CREDIT_BASED_CONNECTION_REQUEST, L2CAP_CREDIT_BASED_CONNECTION_REQUEST
1895 #endif
1896 
1897         // remove first item before sending (to avoid sending response mutliple times)
1898         l2cap_signaling_responses_pending--;
1899         int i;
1900         for (i=0; i < l2cap_signaling_responses_pending; i++){
1901             (void)memcpy(&l2cap_signaling_responses[i],
1902                          &l2cap_signaling_responses[i + 1],
1903                          sizeof(l2cap_signaling_response_t));
1904         }
1905 
1906         switch (response_code){
1907 #ifdef ENABLE_CLASSIC
1908             case CONNECTION_REQUEST:
1909                 l2cap_send_classic_signaling_packet(handle, CONNECTION_RESPONSE, sig_id, source_cid, 0, result, 0);
1910                 break;
1911             case CONFIGURE_REQUEST:
1912                 little_endian_store_16(buffer, 0, source_cid);
1913                 little_endian_store_16(buffer, 2, 0);
1914                 l2cap_send_classic_signaling_packet(handle, COMMAND_REJECT, sig_id, result, 4, buffer);
1915                 break;
1916             case DISCONNECTION_RESPONSE:
1917                 l2cap_send_classic_signaling_packet(handle, DISCONNECTION_RESPONSE, sig_id, dest_cid, source_cid);
1918                 break;
1919             case ECHO_REQUEST:
1920                 l2cap_send_classic_signaling_packet(handle, ECHO_RESPONSE, sig_id, 0, NULL);
1921                 break;
1922             case INFORMATION_REQUEST:
1923                 switch (info_type){
1924                     case L2CAP_INFO_TYPE_CONNECTIONLESS_MTU: {
1925                             uint16_t connectionless_mtu = hci_max_acl_data_packet_length();
1926                         l2cap_send_classic_signaling_packet(handle, INFORMATION_RESPONSE, sig_id, info_type, 0,
1927                                                             sizeof(connectionless_mtu), &connectionless_mtu);
1928                         }
1929                         break;
1930                     case L2CAP_INFO_TYPE_EXTENDED_FEATURES_SUPPORTED: {
1931                             uint32_t features = l2cap_extended_features_mask();
1932                         l2cap_send_classic_signaling_packet(handle, INFORMATION_RESPONSE, sig_id, info_type, 0,
1933                                                             sizeof(features), &features);
1934                         }
1935                         break;
1936                     case L2CAP_INFO_TYPE_FIXED_CHANNELS_SUPPORTED: {
1937                             uint8_t map[8];
1938                             memset(map, 0, 8);
1939                             // L2CAP Signaling Channel + Connectionless reception
1940                             map[0] = (1 << L2CAP_CID_SIGNALING) | (1 << L2CAP_CID_CONNECTIONLESS_CHANNEL);
1941 #if defined (ENABLE_EXPLICIT_BR_EDR_SECURITY_MANAGER) || (defined(ENABLE_BLE) && defined(ENABLE_CROSS_TRANSPORT_KEY_DERIVATION))
1942                             // BR/EDR Security Manager (bit 7) if BR/EDR Secure Connections possible
1943                             if (gap_secure_connections_active()){
1944                                 map[0] |= (1 << L2CAP_CID_BR_EDR_SECURITY_MANAGER);
1945                             }
1946 #endif
1947                             l2cap_send_classic_signaling_packet(handle, INFORMATION_RESPONSE, sig_id, info_type, 0,
1948                                                             sizeof(map), &map);
1949                         }
1950                         break;
1951                     default:
1952                         // all other types are not supported
1953                         l2cap_send_classic_signaling_packet(handle, INFORMATION_RESPONSE, sig_id, info_type, 1, 0, NULL);
1954                         break;
1955                 }
1956                 break;
1957             case COMMAND_REJECT:
1958                 l2cap_send_classic_signaling_packet(handle, COMMAND_REJECT, sig_id, result, 0, NULL);
1959                 break;
1960 #endif
1961 #ifdef ENABLE_BLE
1962             case LE_CREDIT_BASED_CONNECTION_REQUEST:
1963                 l2cap_send_le_signaling_packet(handle, LE_CREDIT_BASED_CONNECTION_RESPONSE, sig_id, 0, 0, 0, 0, result);
1964                 break;
1965             case DISCONNECTION_REQUEST:
1966                 // Invalid CID, local cid, remote cid
1967                 little_endian_store_16(buffer, 0, result);
1968                 little_endian_store_16(buffer, 2, source_cid);
1969                 l2cap_send_le_signaling_packet(handle, COMMAND_REJECT, sig_id, 0x0002, 4, buffer);
1970                 break;
1971             case COMMAND_REJECT_LE:
1972                 l2cap_send_le_signaling_packet(handle, COMMAND_REJECT, sig_id, result, 0, NULL);
1973                 break;
1974 #endif
1975 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
1976             case L2CAP_CREDIT_BASED_CONNECTION_REQUEST: {
1977                 // send variable size array or cids with each cid being zero
1978                 uint16_t cids[6];
1979                 (void) memset(cids, 0xff, sizeof(cids));
1980                 (void) memset(cids, 0x00, num_channels * sizeof(uint16_t));
1981                 l2cap_send_general_signaling_packet(handle, signaling_cid, L2CAP_CREDIT_BASED_CONNECTION_RESPONSE,
1982                                                     sig_id, 0, 0, 0, result, cids);
1983                 break;
1984             }
1985 
1986             case L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST:
1987                 l2cap_send_general_signaling_packet(handle, signaling_cid, L2CAP_CREDIT_BASED_RECONFIGURE_RESPONSE,
1988                                                     sig_id, result);
1989                 break;
1990 #endif
1991             case SM_PAIRING_FAILED:
1992                 buffer[0] = SM_CODE_PAIRING_FAILED;
1993                 buffer[1] = (uint8_t) result;
1994                 l2cap_send_connectionless(handle, source_cid, buffer, 2);
1995                 break;
1996             default:
1997                 // should not happen
1998                 break;
1999         }
2000     }
2001 }
2002 
2003 #ifdef ENABLE_CLASSIC
2004 static bool l2ap_run_information_requests(void){
2005     // send l2cap information request if requested
2006     btstack_linked_list_iterator_t it;
2007     hci_connections_get_iterator(&it);
2008     uint8_t info_type;
2009     l2cap_information_state_t new_state;
2010     while(btstack_linked_list_iterator_has_next(&it)){
2011         hci_connection_t * connection = (hci_connection_t *) btstack_linked_list_iterator_next(&it);
2012         switch (connection->l2cap_state.information_state){
2013             case L2CAP_INFORMATION_STATE_W2_SEND_EXTENDED_FEATURE_REQUEST:
2014                 info_type = L2CAP_INFO_TYPE_EXTENDED_FEATURES_SUPPORTED;
2015                 new_state = L2CAP_INFORMATION_STATE_W4_EXTENDED_FEATURE_RESPONSE;
2016                 break;
2017             case L2CAP_INFORMATION_STATE_W2_SEND_FIXED_CHANNELS_REQUEST:
2018                 info_type = L2CAP_INFO_TYPE_FIXED_CHANNELS_SUPPORTED;
2019                 new_state = L2CAP_INFORMATION_STATE_W4_FIXED_CHANNELS_RESPONSE;
2020                 break;
2021             default:
2022                 continue;
2023         }
2024         if (!hci_can_send_acl_packet_now(connection->con_handle)) break;
2025 
2026         connection->l2cap_state.information_state = new_state;
2027         uint8_t sig_id = l2cap_next_sig_id();
2028         l2cap_send_classic_signaling_packet(connection->con_handle, INFORMATION_REQUEST, sig_id, info_type);
2029     }
2030     return false;
2031 }
2032 #endif
2033 
2034 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
2035 // returns true if channel has been closed
2036 static bool l2cap_cbm_run_channel(l2cap_channel_t * channel) {
2037     uint16_t mps;
2038     bool channel_closed = false;
2039     // log_info("l2cap_run: channel %p, state %u, var 0x%02x", channel, channel->state, channel->state_var);
2040     switch (channel->state){
2041         case L2CAP_STATE_WILL_SEND_LE_CONNECTION_REQUEST:
2042             channel->state = L2CAP_STATE_WAIT_LE_CONNECTION_RESPONSE;
2043             // le psm, source cid, mtu, mps, initial credits
2044             channel->local_sig_id = l2cap_next_sig_id();
2045             channel->credits_incoming =  channel->new_credits_incoming;
2046             channel->new_credits_incoming = 0;
2047             channel->local_mps = btstack_min(l2cap_max_le_mtu(), channel->local_mtu);
2048             l2cap_send_le_signaling_packet( channel->con_handle, LE_CREDIT_BASED_CONNECTION_REQUEST,
2049                                             channel->local_sig_id, channel->psm, channel->local_cid, channel->local_mtu,
2050                                             channel->local_mps, channel->credits_incoming);
2051             break;
2052         case L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_ACCEPT:
2053             // TODO: support larger MPS
2054             channel->state = L2CAP_STATE_OPEN;
2055             channel->credits_incoming =  channel->new_credits_incoming;
2056             channel->new_credits_incoming = 0;
2057             mps = btstack_min(l2cap_max_le_mtu(), channel->local_mtu);
2058             l2cap_send_le_signaling_packet(channel->con_handle, LE_CREDIT_BASED_CONNECTION_RESPONSE, channel->remote_sig_id, channel->local_cid, channel->local_mtu, mps, channel->credits_incoming, 0);
2059             // notify client
2060             l2cap_cbm_emit_channel_opened(channel, ERROR_CODE_SUCCESS);
2061             break;
2062         case L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_DECLINE:
2063             channel->state = L2CAP_STATE_INVALID;
2064             l2cap_send_le_signaling_packet(channel->con_handle, LE_CREDIT_BASED_CONNECTION_RESPONSE, channel->remote_sig_id, 0, 0, 0, 0, channel->reason);
2065             channel_closed = true;
2066             break;
2067         case L2CAP_STATE_OPEN:
2068             if (channel->new_credits_incoming){
2069                 l2cap_credit_based_send_credits(channel);
2070             }
2071             break;
2072         case L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST:
2073             channel->local_sig_id = l2cap_next_sig_id();
2074             channel->state = L2CAP_STATE_WAIT_DISCONNECT;
2075             l2cap_send_le_signaling_packet( channel->con_handle, DISCONNECTION_REQUEST, channel->local_sig_id, channel->remote_cid, channel->local_cid);
2076             break;
2077         case L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE:
2078             channel->state = L2CAP_STATE_INVALID;
2079             l2cap_send_le_signaling_packet( channel->con_handle, DISCONNECTION_RESPONSE, channel->remote_sig_id, channel->local_cid, channel->remote_cid);
2080             l2cap_cbm_finialize_channel_close(channel);  // -- remove from list
2081             break;
2082         default:
2083             break;
2084     }
2085     return channel_closed;
2086 }
2087 
2088 static void l2cap_cbm_run_channels(void){
2089     btstack_linked_list_iterator_t it;
2090     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2091     while (btstack_linked_list_iterator_has_next(&it)){
2092         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2093 
2094         if (channel->channel_type != L2CAP_CHANNEL_TYPE_CHANNEL_CBM) continue;
2095         if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2096 
2097         bool channel_closed = l2cap_cbm_run_channel(channel);
2098         if (channel_closed) {
2099             // discard channel - l2cap_finialize_channel_close without sending l2cap close event
2100             btstack_linked_list_iterator_remove(&it);
2101             l2cap_free_channel_entry(channel);
2102         }
2103     }
2104 }
2105 
2106 static inline uint8_t l2cap_cbm_status_for_result(uint16_t result) {
2107     switch (result) {
2108         case L2CAP_CBM_CONNECTION_RESULT_SUCCESS:
2109             return ERROR_CODE_SUCCESS;
2110         case L2CAP_CBM_CONNECTION_RESULT_SPSM_NOT_SUPPORTED:
2111             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_PSM;
2112         case L2CAP_CBM_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE:
2113             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_RESOURCES;
2114         case L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_AUTHENTICATION:
2115         case L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_AUTHORIZATION:
2116         case L2CAP_CBM_CONNECTION_RESULT_ENCYRPTION_KEY_SIZE_TOO_SHORT:
2117         case L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_ENCRYPTION:
2118             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_SECURITY;
2119         default:
2120             // invalid Source CID, Source CID already allocated, unacceptable parameters
2121             return L2CAP_CONNECTION_RESPONSE_UNKNOWN_ERROR;
2122     }
2123 }
2124 
2125 #endif
2126 
2127 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
2128 
2129 static void l2cap_run_trigger_callback(void * context){
2130     UNUSED(context);
2131     l2cap_run();
2132 }
2133 
2134 static void l2cap_run_trigger(void){
2135     btstack_run_loop_execute_on_main_thread(&l2cap_trigger_run_registration);
2136 }
2137 
2138 // 11BH22222
2139 static void l2cap_ecbm_emit_channel_opened(l2cap_channel_t *channel, uint8_t status) {
2140     log_info("opened ecbm channel status 0x%x addr_type %u addr %s handle 0x%x psm 0x%x local_cid 0x%x remote_cid 0x%x local_mtu %u, remote_mtu %u",
2141             status, channel->address_type, bd_addr_to_str(channel->address), channel->con_handle, channel->psm,
2142             channel->local_cid, channel->remote_cid, channel->local_mtu, channel->remote_mtu);
2143     uint8_t event[23];
2144     event[0] = L2CAP_EVENT_ECBM_CHANNEL_OPENED;
2145     event[1] = sizeof(event) - 2u;
2146     event[2] = status;
2147     event[3] = channel->address_type;
2148     reverse_bd_addr(channel->address, &event[4]);
2149     little_endian_store_16(event, 10, channel->con_handle);
2150     event[12] = (channel->state_var & L2CAP_CHANNEL_STATE_VAR_INCOMING) ? 1 : 0;
2151     little_endian_store_16(event, 13, channel->psm);
2152     little_endian_store_16(event, 15, channel->local_cid);
2153     little_endian_store_16(event, 17, channel->remote_cid);
2154     little_endian_store_16(event, 19, channel->local_mtu);
2155     little_endian_store_16(event, 21, channel->remote_mtu);
2156     hci_dump_packet(HCI_EVENT_PACKET, 1, event, sizeof(event));
2157     l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
2158 }
2159 
2160 static void l2cap_ecbm_emit_reconfigure_complete(l2cap_channel_t *channel, uint16_t result) {
2161     // emit event
2162     uint8_t event[6];
2163     event[0] = L2CAP_EVENT_ECBM_RECONFIGURATION_COMPLETE;
2164     event[1] = sizeof(event) - 2;
2165     little_endian_store_16(event, 2, channel->local_cid);
2166     little_endian_store_16(event, 4, result);
2167     l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
2168 }
2169 
2170 static void l2cap_ecbm_run_channels(void) {
2171     hci_con_handle_t con_handle = HCI_CON_HANDLE_INVALID;
2172     // num max channels + 1 for signaling pdu generator
2173     uint16_t cids[L2CAP_ECBM_MAX_CID_ARRAY_SIZE + 1];
2174     uint8_t num_cids = 0;
2175     uint8_t sig_id;
2176     uint16_t spsm;
2177     L2CAP_STATE matching_state;
2178     bool match_remote_sig_cid;
2179     uint8_t result = 0;
2180     uint16_t local_mtu;
2181     uint16_t initial_credits;
2182     uint16_t signaling_cid;
2183     L2CAP_STATE new_state;
2184     uint16_t local_mps;
2185 
2186     // pick first channel that needs to send a combined signaling pdu and setup collection via break
2187     // then collect all others that belong to the same pdu
2188     btstack_linked_list_iterator_t it;
2189     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2190     while (btstack_linked_list_iterator_has_next(&it)) {
2191         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2192         if (channel->channel_type != L2CAP_CHANNEL_TYPE_CHANNEL_ECBM) continue;
2193         if (con_handle == HCI_CON_HANDLE_INVALID) {
2194             switch (channel->state) {
2195                 case L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_REQUEST:
2196                     if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2197                     local_mtu = channel->local_mtu;
2198                     local_mps = channel->local_mps;
2199                     spsm = channel->psm;
2200                     result = channel->reason;
2201                     initial_credits = channel->credits_incoming;
2202                     sig_id = channel->local_sig_id;
2203                     new_state = L2CAP_STATE_WAIT_ENHANCED_CONNECTION_RESPONSE;
2204                     match_remote_sig_cid = false;
2205                     break;
2206                 case L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE:
2207                     if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2208                     local_mtu = channel->local_mtu;
2209                     local_mps = channel->local_mps;
2210                     initial_credits = channel->credits_incoming;
2211                     sig_id = channel->remote_sig_id;
2212                     new_state = L2CAP_STATE_OPEN;
2213                     match_remote_sig_cid = true;
2214                     break;
2215                 case L2CAP_STATE_WILL_SEND_EHNANCED_RENEGOTIATION_REQUEST:
2216                     if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2217                     sig_id = channel->local_sig_id;
2218                     local_mtu = channel->renegotiate_mtu;
2219                     local_mps = channel->local_mps;
2220                     new_state = L2CAP_STATE_WAIT_ENHANCED_RENEGOTIATION_RESPONSE;
2221                     match_remote_sig_cid = false;
2222                     break;
2223                 case L2CAP_STATE_OPEN:
2224                     if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2225                     if (channel->new_credits_incoming) {
2226                         l2cap_credit_based_send_credits(channel);
2227                     }
2228                     continue;
2229                 case L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST:
2230                     if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2231                     channel->local_sig_id = l2cap_next_sig_id();
2232                     channel->state = L2CAP_STATE_WAIT_DISCONNECT;
2233                     signaling_cid = channel->address_type == BD_ADDR_TYPE_ACL ? L2CAP_CID_SIGNALING : L2CAP_CID_SIGNALING_LE;
2234                     l2cap_send_general_signaling_packet(channel->con_handle, signaling_cid, DISCONNECTION_REQUEST,
2235                                                         channel->local_sig_id, channel->remote_cid, channel->local_cid);
2236                     continue;
2237                 case L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE:
2238                     if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2239                     channel->state = L2CAP_STATE_INVALID;
2240                     signaling_cid = channel->address_type == BD_ADDR_TYPE_ACL ? L2CAP_CID_SIGNALING : L2CAP_CID_SIGNALING_LE;
2241                     l2cap_send_general_signaling_packet(channel->con_handle, signaling_cid, DISCONNECTION_RESPONSE,
2242                                                         channel->remote_sig_id, channel->local_cid,
2243                                                         channel->remote_cid);
2244                     l2cap_cbm_finialize_channel_close(channel);  // -- remove from list
2245                     continue;
2246                 default:
2247                     continue;
2248             }
2249 
2250             // channel picked - setup cid array and collect info
2251             (void) memset(cids, 0xff, sizeof(cids));
2252             (void) memset(cids, 0, channel->num_cids * sizeof(uint16_t));
2253             matching_state = channel->state;
2254             con_handle = channel->con_handle;
2255             signaling_cid = channel->address_type == BD_ADDR_TYPE_ACL ? L2CAP_CID_SIGNALING : L2CAP_CID_SIGNALING_LE;
2256             num_cids = channel->num_cids;
2257 
2258         } else {
2259             // check if it matches first channel by state, con_handle, and signaling id
2260             if (matching_state != channel->state) continue;
2261             if (channel->con_handle != con_handle) continue;
2262             if (match_remote_sig_cid) {
2263                 if (channel->remote_sig_id != sig_id) continue;
2264             } else {
2265                 if (channel->local_sig_id != sig_id) continue;
2266             }
2267         }
2268 
2269         // add this cid
2270         cids[channel->cid_index] = channel->local_cid;
2271 
2272         // set new state
2273         channel->state = new_state;
2274 
2275         // handle open for L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE
2276         if (matching_state == L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE) {
2277             if (channel->reason == L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS) {
2278                 l2cap_ecbm_emit_channel_opened(channel, ERROR_CODE_SUCCESS);
2279             } else {
2280                 result = channel->reason;
2281                 btstack_linked_list_iterator_remove(&it);
2282                 btstack_memory_l2cap_channel_free(channel);
2283             }
2284         }
2285     }
2286 
2287     if (con_handle != HCI_CON_HANDLE_INVALID) {
2288         switch (matching_state) {
2289             case L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_REQUEST:
2290                 log_info("send combined connection request for %u cids", num_cids);
2291                 l2cap_send_general_signaling_packet(con_handle, signaling_cid, L2CAP_CREDIT_BASED_CONNECTION_REQUEST,
2292                                                     sig_id, spsm, local_mtu, local_mps, initial_credits, cids);
2293                 break;
2294             case L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE:
2295                 log_info("send combined connection response for %u cids", num_cids);
2296                 l2cap_send_general_signaling_packet(con_handle, signaling_cid, L2CAP_CREDIT_BASED_CONNECTION_RESPONSE,
2297                                                     sig_id, local_mtu, local_mps, initial_credits, result, cids);
2298                 break;
2299             case L2CAP_STATE_WILL_SEND_EHNANCED_RENEGOTIATION_REQUEST:
2300                 log_info("send combined renegotiation request for %u cids", num_cids);
2301                 l2cap_send_general_signaling_packet(con_handle, signaling_cid, L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST,
2302                                                     sig_id, local_mtu, local_mps, cids);
2303                 break;
2304             default:
2305                 break;
2306         }
2307     }
2308 }
2309 #endif
2310 
2311 // MARK: L2CAP_RUN
2312 // process outstanding signaling tasks
2313 static void l2cap_run(void){
2314 
2315     // log_info("l2cap_run: entered");
2316     l2cap_run_signaling_response();
2317 
2318 #ifdef ENABLE_CLASSIC
2319     bool done = l2ap_run_information_requests();
2320     if (done) return;
2321 #endif
2322 
2323 #if defined(ENABLE_CLASSIC) || defined(ENABLE_BLE)
2324     btstack_linked_list_iterator_t it;
2325 #endif
2326 
2327 #ifdef ENABLE_CLASSIC
2328     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2329     while (btstack_linked_list_iterator_has_next(&it)){
2330 
2331         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2332 
2333         if (channel->channel_type != L2CAP_CHANNEL_TYPE_CLASSIC) continue;
2334 
2335         // log_info("l2cap_run: channel %p, state %u, var 0x%02x", channel, channel->state, channel->state_var);
2336         bool finalized = l2cap_run_for_classic_channel(channel);
2337 
2338         if (!finalized) {
2339 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
2340             l2cap_run_for_classic_channel_ertm(channel);
2341 #endif
2342         }
2343     }
2344 #endif
2345 
2346 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
2347     l2cap_cbm_run_channels();
2348 #endif
2349 
2350 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
2351     l2cap_ecbm_run_channels();
2352 #endif
2353 
2354 #ifdef ENABLE_BLE
2355     // send l2cap con paramter update if necessary
2356     hci_connections_get_iterator(&it);
2357     while(btstack_linked_list_iterator_has_next(&it)){
2358         hci_connection_t * connection = (hci_connection_t *) btstack_linked_list_iterator_next(&it);
2359         if (!hci_is_le_connection_type(connection->address_type)) continue;
2360         if (!hci_can_send_acl_packet_now(connection->con_handle)) continue;
2361         switch (connection->le_con_parameter_update_state){
2362             case CON_PARAMETER_UPDATE_SEND_REQUEST:
2363                 connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_NONE;
2364                 l2cap_send_le_signaling_packet(connection->con_handle, CONNECTION_PARAMETER_UPDATE_REQUEST, l2cap_next_sig_id(),
2365                                                connection->le_conn_interval_min, connection->le_conn_interval_max, connection->le_conn_latency, connection->le_supervision_timeout);
2366                 break;
2367             case CON_PARAMETER_UPDATE_SEND_RESPONSE:
2368                 connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_CHANGE_HCI_CON_PARAMETERS;
2369                 l2cap_send_le_signaling_packet(connection->con_handle, CONNECTION_PARAMETER_UPDATE_RESPONSE, connection->le_con_param_update_identifier, 0);
2370                 break;
2371             case CON_PARAMETER_UPDATE_DENY:
2372                 connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_NONE;
2373                 l2cap_send_le_signaling_packet(connection->con_handle, CONNECTION_PARAMETER_UPDATE_RESPONSE, connection->le_con_param_update_identifier, 1);
2374                 break;
2375             default:
2376                 break;
2377         }
2378     }
2379 #endif
2380 
2381     if (l2cap_call_notify_channel_in_run){
2382         l2cap_call_notify_channel_in_run = false;
2383         l2cap_notify_channel_can_send();
2384     }
2385 
2386     // log_info("l2cap_run: exit");
2387 }
2388 
2389 #ifdef ENABLE_CLASSIC
2390 static void l2cap_ready_to_connect(l2cap_channel_t * channel){
2391 
2392 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
2393     // assumption: outgoing connection
2394     if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
2395         // ERTM requested: trigger information request if not already started then wait for response
2396         hci_connection_t * connection = hci_connection_for_handle(channel->con_handle);
2397         switch (connection->l2cap_state.information_state){
2398             case L2CAP_INFORMATION_STATE_DONE:
2399                 break;
2400             case L2CAP_INFORMATION_STATE_IDLE:
2401                 connection->l2cap_state.information_state = L2CAP_INFORMATION_STATE_W2_SEND_EXTENDED_FEATURE_REQUEST;
2402                 /* fall through */
2403             default:
2404                 channel->state = L2CAP_STATE_WAIT_OUTGOING_EXTENDED_FEATURES;
2405                 return;
2406         }
2407     }
2408 #endif
2409 
2410     // fine, go ahead
2411     channel->state = L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST;
2412 }
2413 
2414 static void l2cap_handle_connection_complete(hci_con_handle_t con_handle, l2cap_channel_t * channel){
2415     if ((channel->state == L2CAP_STATE_WAIT_CONNECTION_COMPLETE) || (channel->state == L2CAP_STATE_WILL_SEND_CREATE_CONNECTION)) {
2416         log_info("connection complete con_handle %04x - for channel %p cid 0x%04x", (int) con_handle, channel, channel->local_cid);
2417         channel->con_handle = con_handle;
2418         // query remote features if pairing is required
2419         if (channel->required_security_level > LEVEL_0){
2420             channel->state = L2CAP_STATE_WAIT_REMOTE_SUPPORTED_FEATURES;
2421             hci_remote_features_query(con_handle);
2422         } else {
2423             l2cap_ready_to_connect(channel);
2424         }
2425     }
2426 }
2427 
2428 static void l2cap_handle_remote_supported_features_received(l2cap_channel_t * channel){
2429     if (channel->state != L2CAP_STATE_WAIT_REMOTE_SUPPORTED_FEATURES) return;
2430 
2431     bool security_required = channel->required_security_level > LEVEL_0;
2432 
2433     if ((channel->state_var & L2CAP_CHANNEL_STATE_VAR_INCOMING) != 0){
2434 
2435         // Core V5.2, Vol 3, Part C, 5.2.2.2 - Security Mode 4
2436         //   When a remote device attempts to access a service offered by a Bluetooth device that is in security mode 4
2437         //   and a sufficient link key exists and authentication has not been performed the local device shall authenticate
2438         //   the remote device and enable encryption after the channel establishment request is received but before a channel
2439         //   establishment confirmation (L2CAP_ConnectRsp with result code of 0x0000 or a higher-level channel establishment
2440         //   confirmation such as that of RFCOMM) is sent.
2441 
2442         //   If the remote device has indicated support for Secure Simple Pairing, a channel establishment request is
2443         //   received for a service other than SDP, and encryption has not yet been enabled, then the local device shall
2444         //   disconnect the ACL link with error code 0x05 - Authentication Failure.
2445 
2446         // => Disconnect if l2cap request received in mode 4 and ssp supported, non-sdp psm, not encrypted, no link key available
2447         if ((gap_get_security_mode() == GAP_SECURITY_MODE_4)
2448         && gap_ssp_supported_on_both_sides(channel->con_handle)
2449         && (channel->psm != PSM_SDP)
2450         && (gap_encryption_key_size(channel->con_handle) == 0)){
2451             hci_disconnect_security_block(channel->con_handle);
2452             return;
2453         }
2454 
2455         // incoming: assert security requirements
2456         channel->state = L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE;
2457         if (channel->required_security_level <= gap_security_level(channel->con_handle)){
2458             l2cap_handle_security_level_incoming_sufficient(channel);
2459         } else {
2460             // send connection pending if not already done
2461             if ((channel->state_var & L2CAP_CHANNEL_STATE_VAR_SENT_CONN_RESP_PEND) == 0){
2462                 channel->state_var |= L2CAP_CHANNEL_STATE_VAR_SEND_CONN_RESP_PEND;
2463             }
2464             gap_request_security_level(channel->con_handle, channel->required_security_level);
2465         }
2466     } else {
2467         // outgoing: we have been waiting for remote supported features
2468         if (security_required){
2469             // request security level
2470             channel->state = L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE;
2471             gap_request_security_level(channel->con_handle, channel->required_security_level);
2472         } else {
2473             l2cap_ready_to_connect(channel);
2474         }
2475     }
2476 }
2477 #endif
2478 
2479 #ifdef L2CAP_USES_CHANNELS
2480 static l2cap_channel_t * l2cap_create_channel_entry(btstack_packet_handler_t packet_handler, l2cap_channel_type_t channel_type, bd_addr_t address, bd_addr_type_t address_type,
2481     uint16_t psm, uint16_t local_mtu, gap_security_level_t security_level){
2482 
2483     l2cap_channel_t * channel = btstack_memory_l2cap_channel_get();
2484     if (!channel) {
2485         return NULL;
2486     }
2487 
2488     // fill in
2489     channel->packet_handler = packet_handler;
2490     channel->channel_type   = channel_type;
2491     bd_addr_copy(channel->address, address);
2492     channel->address_type = address_type;
2493     channel->psm = psm;
2494     channel->local_mtu  = local_mtu;
2495     channel->remote_mtu = L2CAP_DEFAULT_MTU;
2496     channel->required_security_level = security_level;
2497 
2498     //
2499     channel->local_cid = l2cap_next_local_cid();
2500     channel->con_handle = HCI_CON_HANDLE_INVALID;
2501 
2502     // set initial state
2503     channel->state = L2CAP_STATE_WILL_SEND_CREATE_CONNECTION;
2504     channel->state_var = L2CAP_CHANNEL_STATE_VAR_NONE;
2505     channel->remote_sig_id = L2CAP_SIG_ID_INVALID;
2506     channel->local_sig_id = L2CAP_SIG_ID_INVALID;
2507 
2508     log_info("create channel %p, local_cid 0x%04x", channel, channel->local_cid);
2509 
2510     return channel;
2511 }
2512 
2513 static void l2cap_free_channel_entry(l2cap_channel_t * channel){
2514     log_info("free channel %p, local_cid 0x%04x", channel, channel->local_cid);
2515     // assert all timers are stopped
2516     l2cap_stop_rtx(channel);
2517 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
2518     l2cap_ertm_stop_retransmission_timer(channel);
2519     l2cap_ertm_stop_monitor_timer(channel);
2520 #endif
2521     // free  memory
2522     btstack_memory_l2cap_channel_free(channel);
2523 }
2524 #endif
2525 
2526 #ifdef ENABLE_CLASSIC
2527 
2528 /**
2529  * @brief Creates L2CAP channel to the PSM of a remote device with baseband address. A new baseband connection will be initiated if necessary.
2530  * @param packet_handler
2531  * @param address
2532  * @param psm
2533  * @param mtu
2534  * @param local_cid
2535  */
2536 
2537 uint8_t l2cap_create_channel(btstack_packet_handler_t channel_packet_handler, bd_addr_t address, uint16_t psm, uint16_t mtu, uint16_t * out_local_cid){
2538     // limit MTU to the size of our outgoing HCI buffer
2539     uint16_t local_mtu = btstack_min(mtu, l2cap_max_mtu());
2540 
2541 	// determine security level based on psm
2542 	const gap_security_level_t security_level = l2cap_security_level_0_allowed_for_PSM(psm) ? LEVEL_0 : gap_get_security_level();
2543 	log_info("create channel addr %s psm 0x%x mtu %u -> local mtu %u, sec level %u", bd_addr_to_str(address), psm, mtu, local_mtu, (int) security_level);
2544 
2545     l2cap_channel_t * channel = l2cap_create_channel_entry(channel_packet_handler, L2CAP_CHANNEL_TYPE_CLASSIC, address, BD_ADDR_TYPE_ACL, psm, local_mtu, security_level);
2546     if (!channel) {
2547         return BTSTACK_MEMORY_ALLOC_FAILED;
2548     }
2549 
2550 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
2551     channel->mode = L2CAP_CHANNEL_MODE_BASIC;
2552 #endif
2553 
2554     // add to connections list
2555     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
2556 
2557     // store local_cid
2558     if (out_local_cid){
2559        *out_local_cid = channel->local_cid;
2560     }
2561 
2562 	// state: L2CAP_STATE_WILL_SEND_CREATE_CONNECTION
2563 
2564     // check if hci connection is already usable,
2565     hci_connection_t * conn = hci_connection_for_bd_addr_and_type(address, BD_ADDR_TYPE_ACL);
2566     if (conn && conn->state == OPEN){
2567     	// simulate connection complete
2568 	    l2cap_handle_connection_complete(conn->con_handle, channel);
2569 
2570 	    // state: L2CAP_STATE_WAIT_REMOTE_SUPPORTED_FEATURES or L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST
2571 
2572         // simulate if remote supported features if requested and already received
2573         if ((channel->state == L2CAP_STATE_WAIT_REMOTE_SUPPORTED_FEATURES) && hci_remote_features_available(conn->con_handle)) {
2574         	// simulate remote features received
2575             l2cap_handle_remote_supported_features_received(channel);
2576         }
2577     }
2578 
2579     l2cap_run();
2580 
2581     return ERROR_CODE_SUCCESS;
2582 }
2583 
2584 static void l2cap_handle_connection_failed_for_addr(bd_addr_t address, uint8_t status){
2585     // mark all channels before emitting open events as these could trigger new connetion requests to the same device
2586     btstack_linked_list_iterator_t it;
2587     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2588     while (btstack_linked_list_iterator_has_next(&it)){
2589         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2590         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2591         if (bd_addr_cmp( channel->address, address) != 0) continue;
2592         // channel for this address found
2593         switch (channel->state){
2594             case L2CAP_STATE_WAIT_CONNECTION_COMPLETE:
2595             case L2CAP_STATE_WILL_SEND_CREATE_CONNECTION:
2596                 channel->state = L2CAP_STATE_EMIT_OPEN_FAILED_AND_DISCARD;
2597                 break;
2598             default:
2599                 break;
2600         }
2601     }
2602     // emit and free marked entries. restart loop to deal with list changes
2603     int done = 0;
2604     while (!done) {
2605         done = 1;
2606         btstack_linked_list_iterator_init(&it, &l2cap_channels);
2607         while (btstack_linked_list_iterator_has_next(&it)){
2608             l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2609             if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2610             if (channel->state == L2CAP_STATE_EMIT_OPEN_FAILED_AND_DISCARD){
2611                 done = 0;
2612                 // failure, forward error code
2613                 l2cap_handle_channel_open_failed(channel, status);
2614                 // discard channel
2615                 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
2616                 l2cap_free_channel_entry(channel);
2617                 break;
2618             }
2619         }
2620     }
2621 
2622 }
2623 
2624 static void l2cap_handle_connection_success_for_addr(bd_addr_t address, hci_con_handle_t handle){
2625     btstack_linked_list_iterator_t it;
2626     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2627     while (btstack_linked_list_iterator_has_next(&it)){
2628         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2629         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2630         if ( ! bd_addr_cmp( channel->address, address) ){
2631             l2cap_handle_connection_complete(handle, channel);
2632         }
2633     }
2634 
2635 #ifdef ENABLE_L2CAP_INFORMATION_REQUESTS_ON_CONNECT
2636     // trigger query of extended features and fixed channels right away (instead of later)
2637     hci_connection_t * hci_connection = hci_connection_for_handle(handle);
2638     btstack_assert(hci_connection != NULL);
2639     hci_connection->l2cap_state.information_state = L2CAP_INFORMATION_STATE_W2_SEND_EXTENDED_FEATURE_REQUEST;
2640 #endif
2641 
2642     // process
2643     l2cap_run();
2644 }
2645 #endif
2646 
2647 static bool l2cap_channel_ready_to_send(l2cap_channel_t * channel){
2648     switch (channel->channel_type){
2649 #ifdef ENABLE_CLASSIC
2650         case L2CAP_CHANNEL_TYPE_CLASSIC:
2651             if (channel->state != L2CAP_STATE_OPEN) return false;
2652 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
2653             // send if we have more data and remote windows isn't full yet
2654             if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION) {
2655                 if (channel->unacked_frames >= btstack_min(channel->num_stored_tx_frames, channel->remote_tx_window_size)) return false;
2656                 return hci_can_send_acl_packet_now(channel->con_handle);
2657             }
2658 #endif
2659             if (!channel->waiting_for_can_send_now) return false;
2660             return hci_can_send_acl_packet_now(channel->con_handle);
2661         case L2CAP_CHANNEL_TYPE_FIXED_CLASSIC:
2662         case L2CAP_CHANNEL_TYPE_CONNECTIONLESS:
2663             if (!channel->waiting_for_can_send_now) return false;
2664             return hci_can_send_acl_classic_packet_now();
2665 #endif
2666 #ifdef ENABLE_BLE
2667         case L2CAP_CHANNEL_TYPE_FIXED_LE:
2668             if (!channel->waiting_for_can_send_now) return false;
2669             return hci_can_send_acl_le_packet_now();
2670 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
2671         case L2CAP_CHANNEL_TYPE_CHANNEL_CBM:
2672             if (channel->state != L2CAP_STATE_OPEN) return false;
2673             if (channel->send_sdu_buffer == NULL) return false;
2674             if (channel->credits_outgoing == 0u) return false;
2675             return hci_can_send_acl_packet_now(channel->con_handle);
2676 #endif
2677 #endif
2678 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
2679         case L2CAP_CHANNEL_TYPE_CHANNEL_ECBM:
2680             if (channel->state != L2CAP_STATE_OPEN) return false;
2681             if (channel->send_sdu_buffer == NULL) return false;
2682             if (channel->credits_outgoing == 0u) return false;
2683             return hci_can_send_acl_packet_now(channel->con_handle);
2684 #endif
2685         default:
2686             return false;
2687     }
2688 }
2689 
2690 static void l2cap_channel_trigger_send(l2cap_channel_t * channel){
2691     switch (channel->channel_type){
2692 #ifdef ENABLE_CLASSIC
2693         case L2CAP_CHANNEL_TYPE_CLASSIC:
2694 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
2695             if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION) {
2696                 l2cap_ertm_channel_send_information_frame(channel);
2697                 return;
2698             }
2699 #endif
2700             channel->waiting_for_can_send_now = 0;
2701             l2cap_emit_can_send_now(channel->packet_handler, channel->local_cid);
2702             break;
2703         case L2CAP_CHANNEL_TYPE_CONNECTIONLESS:
2704         case L2CAP_CHANNEL_TYPE_FIXED_CLASSIC:
2705             channel->waiting_for_can_send_now = 0;
2706             l2cap_emit_can_send_now(channel->packet_handler, channel->local_cid);
2707             break;
2708 #endif
2709 #ifdef ENABLE_BLE
2710         case L2CAP_CHANNEL_TYPE_FIXED_LE:
2711             channel->waiting_for_can_send_now = 0;
2712             l2cap_emit_can_send_now(channel->packet_handler, channel->local_cid);
2713             break;
2714 #endif
2715 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
2716         case L2CAP_CHANNEL_TYPE_CHANNEL_CBM:
2717             l2cap_credit_based_send_pdu(channel);
2718             break;
2719 #endif
2720 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
2721         case L2CAP_CHANNEL_TYPE_CHANNEL_ECBM:
2722             l2cap_credit_based_send_pdu(channel);
2723             break;
2724 #endif
2725         default:
2726             btstack_unreachable();
2727             break;
2728     }
2729 }
2730 
2731 static void l2cap_notify_channel_can_send(void){
2732     bool done = false;
2733     while (!done){
2734         done = true;
2735         btstack_linked_list_iterator_t it;
2736         btstack_linked_list_iterator_init(&it, &l2cap_channels);
2737         while (btstack_linked_list_iterator_has_next(&it)){
2738             l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2739             bool ready = l2cap_channel_ready_to_send(channel);
2740             if (!ready) continue;
2741 
2742             // requeue channel for fairness
2743             btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
2744             btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
2745 
2746             // trigger sending
2747             l2cap_channel_trigger_send(channel);
2748 
2749             // exit inner loop as we just broke the iterator, but try again
2750             done = false;
2751             break;
2752         }
2753     }
2754 }
2755 
2756 #ifdef L2CAP_USES_CHANNELS
2757 
2758 uint8_t l2cap_disconnect(uint16_t local_cid){
2759     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
2760     if (!channel) {
2761         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
2762     }
2763     channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
2764     l2cap_run();
2765     return ERROR_CODE_SUCCESS;
2766 }
2767 
2768 static int l2cap_send_open_failed_on_hci_disconnect(l2cap_channel_t * channel){
2769     // open cannot fail for for incoming connections
2770     if (channel->state_var & L2CAP_CHANNEL_STATE_VAR_INCOMING) return 0;
2771 
2772     // check state
2773     switch (channel->state){
2774         case L2CAP_STATE_WILL_SEND_CREATE_CONNECTION:
2775         case L2CAP_STATE_WAIT_CONNECTION_COMPLETE:
2776         case L2CAP_STATE_WAIT_REMOTE_SUPPORTED_FEATURES:
2777         case L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE:
2778         case L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT:
2779         case L2CAP_STATE_WAIT_OUTGOING_EXTENDED_FEATURES:
2780         case L2CAP_STATE_WAIT_CONNECT_RSP:
2781         case L2CAP_STATE_CONFIG:
2782         case L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST:
2783         case L2CAP_STATE_WILL_SEND_LE_CONNECTION_REQUEST:
2784         case L2CAP_STATE_WAIT_LE_CONNECTION_RESPONSE:
2785         case L2CAP_STATE_EMIT_OPEN_FAILED_AND_DISCARD:
2786             return 1;
2787 
2788         case L2CAP_STATE_OPEN:
2789         case L2CAP_STATE_CLOSED:
2790         case L2CAP_STATE_WAIT_INCOMING_EXTENDED_FEATURES:
2791         case L2CAP_STATE_WAIT_DISCONNECT:
2792         case L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_INSUFFICIENT_SECURITY:
2793         case L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_DECLINE:
2794         case L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_ACCEPT:
2795         case L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST:
2796         case L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE:
2797         case L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_DECLINE:
2798         case L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_ACCEPT:
2799         case L2CAP_STATE_INVALID:
2800         case L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE:
2801             return 0;
2802 
2803         default:
2804             // get a "warning" about new states
2805             btstack_assert(false);
2806             return 0;
2807     }
2808 }
2809 #endif
2810 
2811 #ifdef ENABLE_CLASSIC
2812 static void l2cap_handle_hci_disconnect_event(l2cap_channel_t * channel){
2813     if (l2cap_send_open_failed_on_hci_disconnect(channel)){
2814         l2cap_handle_channel_open_failed(channel, L2CAP_CONNECTION_BASEBAND_DISCONNECT);
2815     } else {
2816         l2cap_handle_channel_closed(channel);
2817     }
2818     l2cap_free_channel_entry(channel);
2819 }
2820 #endif
2821 
2822 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
2823 static void l2cap_handle_hci_le_disconnect_event(l2cap_channel_t * channel){
2824     if (l2cap_send_open_failed_on_hci_disconnect(channel)){
2825         l2cap_cbm_emit_channel_opened(channel, L2CAP_CONNECTION_BASEBAND_DISCONNECT);
2826     } else {
2827         l2cap_emit_channel_closed(channel);
2828     }
2829     l2cap_free_channel_entry(channel);
2830 }
2831 #endif
2832 
2833 #ifdef ENABLE_CLASSIC
2834 static void l2cap_check_classic_timeout(hci_con_handle_t handle){
2835     if (gap_get_connection_type(handle) != GAP_CONNECTION_ACL) {
2836         return;
2837     }
2838     if (hci_authentication_active_for_handle(handle)) {
2839         return;
2840     }
2841     bool hci_con_used = false;
2842     btstack_linked_list_iterator_t it;
2843     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2844     while (btstack_linked_list_iterator_has_next(&it)){
2845         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2846         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2847         if (channel->con_handle != handle) continue;
2848         hci_con_used = true;
2849         break;
2850     }
2851     if (hci_con_used) {
2852         return;
2853     }
2854     if (!hci_can_send_command_packet_now()) {
2855         return;
2856     }
2857     hci_send_cmd(&hci_disconnect, handle, 0x13); // remote closed connection
2858 }
2859 
2860 static void l2cap_handle_features_complete(hci_con_handle_t handle){
2861     if (hci_remote_features_available(handle) == false){
2862         return;
2863     }
2864     btstack_linked_list_iterator_t it;
2865     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2866     while (btstack_linked_list_iterator_has_next(&it)){
2867         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2868         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2869         if (channel->con_handle != handle) continue;
2870         log_info("remote supported features, channel %p, cid %04x - state %u", channel, channel->local_cid, channel->state);
2871         l2cap_handle_remote_supported_features_received(channel);
2872     }
2873 }
2874 
2875 static void l2cap_handle_security_level_incoming_sufficient(l2cap_channel_t * channel){
2876     channel->state = L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT;
2877     l2cap_emit_incoming_connection(channel);
2878 }
2879 
2880 static void l2cap_handle_security_level(hci_con_handle_t handle, gap_security_level_t actual_level){
2881     log_info("security level update for handle 0x%04x", handle);
2882 
2883     // trigger l2cap information requests
2884     if (actual_level > LEVEL_0){
2885         hci_connection_t * hci_connection = hci_connection_for_handle(handle);
2886         btstack_assert(hci_connection != NULL);
2887         if (hci_connection->l2cap_state.information_state == L2CAP_INFORMATION_STATE_IDLE){
2888             hci_connection->l2cap_state.information_state = L2CAP_INFORMATION_STATE_W2_SEND_EXTENDED_FEATURE_REQUEST;
2889         }
2890     }
2891 
2892     bool done = false;
2893     while (!done){
2894         done = true;
2895         btstack_linked_list_iterator_t it;
2896         btstack_linked_list_iterator_init(&it, &l2cap_channels);
2897         while (btstack_linked_list_iterator_has_next(&it)){
2898             l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2899             if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2900             if (channel->con_handle != handle) continue;
2901 
2902             gap_security_level_t required_level = channel->required_security_level;
2903 
2904             log_info("channel %p, cid %04x - state %u: actual %u >= required %u?", channel, channel->local_cid, channel->state, actual_level, required_level);
2905 
2906             switch (channel->state){
2907                 case L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE:
2908                     if (actual_level >= required_level){
2909                         l2cap_handle_security_level_incoming_sufficient(channel);
2910                     } else {
2911                         channel->reason = L2CAP_CONNECTION_RESULT_SECURITY_BLOCK;
2912                         channel->state = L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_DECLINE;
2913                     }
2914                     break;
2915 
2916                 case L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE:
2917                     if (actual_level >= required_level){
2918                         l2cap_ready_to_connect(channel);
2919                     } else {
2920                         // security level insufficient, report error and free channel
2921                         l2cap_handle_channel_open_failed(channel, L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_SECURITY);
2922                         btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t  *) channel);
2923                         l2cap_free_channel_entry(channel);
2924                     }
2925                     break;
2926 
2927                 default:
2928                     break;
2929             }
2930         }
2931     }
2932 }
2933 #endif
2934 
2935 #ifdef L2CAP_USES_CHANNELS
2936 static void l2cap_handle_disconnection_complete(hci_con_handle_t handle){
2937     // collect channels to close
2938     btstack_linked_list_t channels_to_close = NULL;
2939     btstack_linked_list_iterator_t it;
2940     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2941     while (btstack_linked_list_iterator_has_next(&it)) {
2942         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2943         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2944         if (channel->con_handle != handle) continue;
2945         btstack_linked_list_iterator_remove(&it);
2946         btstack_linked_list_add(&channels_to_close, (btstack_linked_item_t *) channel);
2947     }
2948     // send l2cap open failed or closed events for all channels on this handle and free them
2949     btstack_linked_list_iterator_init(&it, &channels_to_close);
2950     while (btstack_linked_list_iterator_has_next(&it)) {
2951         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2952         btstack_linked_list_iterator_remove(&it);
2953         switch(channel->channel_type){
2954 #ifdef ENABLE_CLASSIC
2955             case L2CAP_CHANNEL_TYPE_CLASSIC:
2956                 l2cap_handle_hci_disconnect_event(channel);
2957                 break;
2958 #endif
2959 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
2960             case L2CAP_CHANNEL_TYPE_CHANNEL_CBM:
2961                 l2cap_handle_hci_le_disconnect_event(channel);
2962                 break;
2963 #endif
2964 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
2965             case L2CAP_CHANNEL_TYPE_CHANNEL_ECBM:
2966                 switch (channel->state) {
2967                     case L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_REQUEST:
2968                     case L2CAP_STATE_WAIT_ENHANCED_CONNECTION_RESPONSE:
2969                         // emit open failed if disconnected before connection complete
2970                         l2cap_ecbm_emit_channel_opened(channel, L2CAP_CONNECTION_BASEBAND_DISCONNECT);
2971                         break;
2972                     case L2CAP_STATE_WILL_SEND_EHNANCED_RENEGOTIATION_REQUEST:
2973                     case L2CAP_STATE_WAIT_ENHANCED_RENEGOTIATION_RESPONSE:
2974                         // emit reconfigure failure - result = 0xffff
2975                         l2cap_ecbm_emit_reconfigure_complete(channel, 0xffff);
2976                         break;
2977                     default:
2978                         l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_CHANNEL_CLOSED);
2979                         break;
2980                 }
2981                 l2cap_free_channel_entry(channel);
2982                 break;
2983 #endif
2984             default:
2985                 break;
2986         }
2987     }
2988 }
2989 #endif
2990 
2991 static void l2cap_hci_event_handler(uint8_t packet_type, uint16_t cid, uint8_t *packet, uint16_t size){
2992 
2993     UNUSED(packet_type); // ok: registered with hci_event_callback_registration
2994     UNUSED(cid);         // ok: there is no channel
2995     UNUSED(size);        // ok: fixed format events read from HCI buffer
2996 
2997 #ifdef ENABLE_CLASSIC
2998     bd_addr_t address;
2999     gap_security_level_t security_level;
3000 #endif
3001 #ifdef L2CAP_USES_CHANNELS
3002     hci_con_handle_t handle;
3003 #endif
3004 
3005     switch(hci_event_packet_get_type(packet)){
3006 
3007         // Notify channel packet handler if they can send now
3008         case HCI_EVENT_TRANSPORT_PACKET_SENT:
3009         case HCI_EVENT_NUMBER_OF_COMPLETED_PACKETS:
3010         case BTSTACK_EVENT_NR_CONNECTIONS_CHANGED:
3011 #ifdef ENABLE_TESTING_SUPPORT
3012         case HCI_EVENT_NOP:
3013 #endif
3014             l2cap_call_notify_channel_in_run = true;
3015             break;
3016 
3017         case HCI_EVENT_COMMAND_STATUS:
3018 #ifdef ENABLE_CLASSIC
3019             // check command status for create connection for errors
3020             if (hci_event_command_status_get_command_opcode(packet) == HCI_OPCODE_HCI_CREATE_CONNECTION){
3021                 // cache outgoing address and reset
3022                 (void)memcpy(address, l2cap_outgoing_classic_addr, 6);
3023                 memset(l2cap_outgoing_classic_addr, 0, 6);
3024                 // error => outgoing connection failed
3025                 uint8_t status = hci_event_command_status_get_status(packet);
3026                 if (status){
3027                     l2cap_handle_connection_failed_for_addr(address, status);
3028                 }
3029             }
3030 #endif
3031             l2cap_run();    // try sending signaling packets first
3032             break;
3033 
3034 #ifdef ENABLE_CLASSIC
3035         // handle connection complete events
3036         case HCI_EVENT_CONNECTION_COMPLETE:
3037             reverse_bd_addr(&packet[5], address);
3038             if (packet[2] == 0){
3039                 handle = little_endian_read_16(packet, 3);
3040                 l2cap_handle_connection_success_for_addr(address, handle);
3041             } else {
3042                 l2cap_handle_connection_failed_for_addr(address, packet[2]);
3043             }
3044             break;
3045 
3046         // handle successful create connection cancel command
3047         case HCI_EVENT_COMMAND_COMPLETE:
3048             if (hci_event_command_complete_get_command_opcode(packet) == HCI_OPCODE_HCI_CREATE_CONNECTION_CANCEL) {
3049                 if (packet[5] == 0){
3050                     reverse_bd_addr(&packet[6], address);
3051                     // CONNECTION TERMINATED BY LOCAL HOST (0X16)
3052                     l2cap_handle_connection_failed_for_addr(address, 0x16);
3053                 }
3054             }
3055             l2cap_run();    // try sending signaling packets first
3056             break;
3057 #endif
3058 
3059 #ifdef L2CAP_USES_CHANNELS
3060         // handle disconnection complete events
3061         case HCI_EVENT_DISCONNECTION_COMPLETE:
3062             handle = little_endian_read_16(packet, 3);
3063             l2cap_handle_disconnection_complete(handle);
3064             break;
3065 #endif
3066 
3067         // HCI Connection Timeouts
3068 #ifdef ENABLE_CLASSIC
3069         case L2CAP_EVENT_TIMEOUT_CHECK:
3070             handle = little_endian_read_16(packet, 2);
3071             l2cap_check_classic_timeout(handle);
3072             break;
3073 
3074         case HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE:
3075         case HCI_EVENT_READ_REMOTE_EXTENDED_FEATURES_COMPLETE:
3076             handle = little_endian_read_16(packet, 3);
3077             l2cap_handle_features_complete(handle);
3078             break;
3079 
3080         case GAP_EVENT_SECURITY_LEVEL:
3081             handle = little_endian_read_16(packet, 2);
3082             security_level = (gap_security_level_t) packet[4];
3083             l2cap_handle_security_level(handle, security_level);
3084             break;
3085 #endif
3086         default:
3087             break;
3088     }
3089 
3090     l2cap_run();
3091 }
3092 
3093 static void l2cap_register_signaling_response(hci_con_handle_t handle, uint8_t code, uint8_t sig_id, uint16_t cid, uint16_t data){
3094     // Vol 3, Part A, 4.3: "The DCID and SCID fields shall be ignored when the result field indicates the connection was refused."
3095     if (l2cap_signaling_responses_pending < NR_PENDING_SIGNALING_RESPONSES) {
3096         l2cap_signaling_responses[l2cap_signaling_responses_pending].handle = handle;
3097         l2cap_signaling_responses[l2cap_signaling_responses_pending].code = code;
3098         l2cap_signaling_responses[l2cap_signaling_responses_pending].sig_id = sig_id;
3099         l2cap_signaling_responses[l2cap_signaling_responses_pending].cid = cid;
3100         l2cap_signaling_responses[l2cap_signaling_responses_pending].data = data;
3101         l2cap_signaling_responses_pending++;
3102         l2cap_run();
3103     }
3104 }
3105 
3106 #ifdef ENABLE_CLASSIC
3107 static void l2cap_handle_disconnect_request(l2cap_channel_t *channel, uint8_t identifier){
3108     switch (channel->state){
3109         case L2CAP_STATE_CONFIG:
3110         case L2CAP_STATE_OPEN:
3111         case L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST:
3112         case L2CAP_STATE_WAIT_DISCONNECT:
3113             break;
3114         default:
3115             // ignore in other states
3116             return;
3117     }
3118 
3119     channel->remote_sig_id = identifier;
3120     channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE;
3121     l2cap_run();
3122 }
3123 
3124 static void l2cap_handle_connection_request(hci_con_handle_t handle, uint8_t sig_id, uint16_t psm, uint16_t source_cid){
3125 
3126     // log_info("l2cap_handle_connection_request for handle %u, psm %u cid 0x%02x", handle, psm, source_cid);
3127     l2cap_service_t *service = l2cap_get_service(psm);
3128     if (!service) {
3129         l2cap_register_signaling_response(handle, CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CONNECTION_RESULT_PSM_NOT_SUPPORTED);
3130         return;
3131     }
3132 
3133     hci_connection_t * hci_connection = hci_connection_for_handle( handle );
3134     if (!hci_connection) {
3135         //
3136         log_error("no hci_connection for handle %u", handle);
3137         return;
3138     }
3139 
3140     // if SC only mode is active and service requires encryption, reject connection if SC not active or use security level
3141     gap_security_level_t required_level = service->required_security_level;
3142     if (gap_get_secure_connections_only_mode() && (required_level != LEVEL_0)){
3143         if (gap_secure_connection(handle)){
3144             required_level = LEVEL_4;
3145         } else {
3146             l2cap_register_signaling_response(handle, CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CONNECTION_RESULT_SECURITY_BLOCK);
3147             return;
3148         }
3149     }
3150 
3151     // alloc structure
3152     l2cap_channel_t * channel = l2cap_create_channel_entry(service->packet_handler, L2CAP_CHANNEL_TYPE_CLASSIC, hci_connection->address, BD_ADDR_TYPE_ACL,
3153     psm, service->mtu, required_level);
3154     if (!channel){
3155         l2cap_register_signaling_response(handle, CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE);
3156         return;
3157     }
3158 
3159     channel->con_handle = handle;
3160     channel->remote_cid = source_cid;
3161     channel->remote_sig_id = sig_id;
3162 
3163     // limit local mtu to max acl packet length - l2cap header
3164     if (channel->local_mtu > l2cap_max_mtu()) {
3165         channel->local_mtu = l2cap_max_mtu();
3166     }
3167 
3168     // set initial state
3169     channel->state =     L2CAP_STATE_WAIT_REMOTE_SUPPORTED_FEATURES;
3170     channel->state_var = L2CAP_CHANNEL_STATE_VAR_INCOMING;
3171 
3172     // add to connections list
3173     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
3174 
3175     //
3176     if (required_level > LEVEL_0){
3177         // send conn resp pending if remote supported features have not been received yet
3178         if (hci_remote_features_available(handle)) {
3179             l2cap_handle_remote_supported_features_received(channel);
3180         } else {
3181             channel->state_var |= L2CAP_CHANNEL_STATE_VAR_SEND_CONN_RESP_PEND;
3182             hci_remote_features_query(handle);
3183         }
3184     } else {
3185         l2cap_handle_security_level_incoming_sufficient(channel);
3186     }
3187 }
3188 
3189 void l2cap_accept_connection(uint16_t local_cid){
3190     log_info("L2CAP_ACCEPT_CONNECTION local_cid 0x%x", local_cid);
3191     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
3192     if (!channel) {
3193         log_error("accept called but local_cid 0x%x not found", local_cid);
3194         return;
3195     }
3196 
3197 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3198     // configure L2CAP Basic mode
3199     channel->mode  = L2CAP_CHANNEL_MODE_BASIC;
3200 #endif
3201 
3202     channel->state = L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_ACCEPT;
3203 
3204     // process
3205     l2cap_run();
3206 }
3207 
3208 void l2cap_decline_connection(uint16_t local_cid){
3209     log_info("decline local_cid 0x%x", local_cid);
3210     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid( local_cid);
3211     if (!channel) {
3212         log_error( "l2cap_decline_connection called but local_cid 0x%x not found", local_cid);
3213         return;
3214     }
3215     channel->state  = L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_DECLINE;
3216     channel->reason = L2CAP_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE;
3217     l2cap_run();
3218 }
3219 
3220 // @pre command len is valid, see check in l2cap_signaling_handler_channel
3221 static void l2cap_signaling_handle_configure_request(l2cap_channel_t *channel, uint8_t *command){
3222 
3223 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3224     uint8_t use_fcs = 1;
3225 #endif
3226 
3227     channel->remote_sig_id = command[L2CAP_SIGNALING_COMMAND_SIGID_OFFSET];
3228 
3229     uint16_t flags = little_endian_read_16(command, 6);
3230     if (flags & 1) {
3231         channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_CONT);
3232     }
3233 
3234     // accept the other's configuration options
3235     uint16_t end_pos = 4 + little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
3236     uint16_t pos     = 8;
3237     while (pos < end_pos){
3238         uint8_t option_hint = command[pos] >> 7;
3239         uint8_t option_type = command[pos] & 0x7f;
3240         // log_info("l2cap cid %u, hint %u, type %u", channel->local_cid, option_hint, option_type);
3241         pos++;
3242         uint8_t length = command[pos++];
3243         // MTU { type(8): 1, len(8):2, MTU(16) }
3244         if ((option_type == L2CAP_CONFIG_OPTION_TYPE_MAX_TRANSMISSION_UNIT) && (length == 2)){
3245             channel->remote_mtu = little_endian_read_16(command, pos);
3246             log_info("Remote MTU %u", channel->remote_mtu);
3247             if (channel->remote_mtu > l2cap_max_mtu()){
3248                 log_info("Remote MTU %u larger than outgoing buffer, only using MTU = %u", channel->remote_mtu, l2cap_max_mtu());
3249                 channel->remote_mtu = l2cap_max_mtu();
3250             }
3251             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_MTU);
3252         }
3253         // Flush timeout { type(8):2, len(8): 2, Flush Timeout(16)}
3254         if ((option_type == L2CAP_CONFIG_OPTION_TYPE_FLUSH_TIMEOUT) && (length == 2)){
3255             channel->flush_timeout = little_endian_read_16(command, pos);
3256             log_info("Flush timeout: %u ms", channel->flush_timeout);
3257         }
3258 
3259 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3260         // Retransmission and Flow Control Option
3261         if (option_type == L2CAP_CONFIG_OPTION_TYPE_RETRANSMISSION_AND_FLOW_CONTROL && length == 9){
3262             l2cap_channel_mode_t mode = (l2cap_channel_mode_t) command[pos];
3263             switch(channel->mode){
3264                 case L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION:
3265                     // Store remote config
3266                     channel->remote_tx_window_size = command[pos+1];
3267                     channel->remote_max_transmit   = command[pos+2];
3268                     channel->remote_retransmission_timeout_ms = little_endian_read_16(command, pos + 3);
3269                     channel->remote_monitor_timeout_ms = little_endian_read_16(command, pos + 5);
3270                     {
3271                         uint16_t remote_mps = little_endian_read_16(command, pos + 7);
3272                         // optimize our tx buffer configuration based on actual remote mps if remote mps is smaller than planned
3273                         if (remote_mps < channel->remote_mps){
3274                             // get current tx storage
3275                             uint16_t num_bytes_per_tx_buffer_before = sizeof(l2cap_ertm_tx_packet_state_t) + channel->remote_mps;
3276                             uint16_t tx_storage = channel->num_tx_buffers * num_bytes_per_tx_buffer_before;
3277 
3278                             channel->remote_mps = remote_mps;
3279                             uint16_t num_bytes_per_tx_buffer_now = sizeof(l2cap_ertm_tx_packet_state_t) + channel->remote_mps;
3280                             channel->num_tx_buffers = tx_storage / num_bytes_per_tx_buffer_now;
3281                             uint32_t total_storage = (sizeof(l2cap_ertm_rx_packet_state_t) + channel->local_mps) * channel->num_rx_buffers + tx_storage + channel->local_mtu;
3282                             l2cap_ertm_setup_buffers(channel, (uint8_t *) channel->rx_packets_state, total_storage);
3283                         }
3284                         // limit remote mtu by our tx buffers. Include 2 bytes SDU Length
3285                         uint16_t effective_mtu = channel->remote_mps * channel->num_tx_buffers - 2;
3286                         channel->remote_mtu    = btstack_min( effective_mtu, channel->remote_mtu);
3287                     }
3288                     log_info("FC&C config: tx window: %u, max transmit %u, retrans timeout %u, monitor timeout %u, mps %u",
3289                         channel->remote_tx_window_size,
3290                         channel->remote_max_transmit,
3291                         channel->remote_retransmission_timeout_ms,
3292                         channel->remote_monitor_timeout_ms,
3293                         channel->remote_mps);
3294                     // If ERTM mandatory, but remote doens't offer ERTM -> disconnect
3295                     if (channel->ertm_mandatory && mode != L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
3296                         channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
3297                     } else {
3298                         channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_ERTM);
3299                     }
3300                     break;
3301                 case L2CAP_CHANNEL_MODE_BASIC:
3302                     switch (mode){
3303                         case L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION:
3304                             // remote asks for ERTM, but we want basic mode. disconnect if this happens a second time
3305                             if (channel->state_var & L2CAP_CHANNEL_STATE_VAR_BASIC_FALLBACK_TRIED){
3306                                 channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
3307                             }
3308                             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_BASIC_FALLBACK_TRIED);
3309                             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_REJECTED);
3310                             break;
3311                         default: // case L2CAP_CHANNEL_MODE_BASIC:
3312                             // TODO store and evaluate configuration
3313                             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_ERTM);
3314                             break;
3315                     }
3316                     break;
3317                 default:
3318                     break;
3319             }
3320         }
3321         if (option_type == L2CAP_CONFIG_OPTION_TYPE_FRAME_CHECK_SEQUENCE && length == 1){
3322             use_fcs = command[pos];
3323         }
3324 #endif
3325         // check for unknown options
3326         if ((option_hint == 0) && ((option_type < L2CAP_CONFIG_OPTION_TYPE_MAX_TRANSMISSION_UNIT) || (option_type > L2CAP_CONFIG_OPTION_TYPE_EXTENDED_WINDOW_SIZE))){
3327             log_info("l2cap cid %u, unknown option 0x%02x", channel->local_cid, option_type);
3328             channel->unknown_option = option_type;
3329             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_INVALID);
3330         }
3331         pos += length;
3332     }
3333 
3334 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3335         // "FCS" has precedence over "No FCS"
3336         uint8_t update = channel->fcs_option || use_fcs;
3337         log_info("local fcs: %u, remote fcs: %u -> %u", channel->fcs_option, use_fcs, update);
3338         channel->fcs_option = update;
3339         // If ERTM mandatory, but remote didn't send Retransmission and Flowcontrol options -> disconnect
3340         if (((channel->state_var & L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_ERTM) == 0) & (channel->ertm_mandatory)){
3341             channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
3342         }
3343 #endif
3344 }
3345 
3346 // @pre command len is valid, see check in l2cap_signaling_handler_channel
3347 static void l2cap_signaling_handle_configure_response(l2cap_channel_t *channel, uint16_t result, uint8_t *command){
3348     log_info("l2cap_signaling_handle_configure_response");
3349 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3350     uint16_t end_pos = 4 + little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
3351     uint16_t pos     = 10;
3352     while (pos < end_pos){
3353         uint8_t option_hint = command[pos] >> 7;
3354         uint8_t option_type = command[pos] & 0x7f;
3355         // log_info("l2cap cid %u, hint %u, type %u", channel->local_cid, option_hint, option_type);
3356         pos++;
3357         uint8_t length = command[pos++];
3358 
3359         // Retransmission and Flow Control Option
3360         if (option_type == L2CAP_CONFIG_OPTION_TYPE_RETRANSMISSION_AND_FLOW_CONTROL && length == 9){
3361             switch (channel->mode){
3362                 case L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION:
3363                     if (channel->ertm_mandatory){
3364                         // ??
3365                     } else {
3366                         // On 'Reject - Unacceptable Parameters' to our optional ERTM request, fall back to BASIC mode
3367                         if (result == L2CAP_CONF_RESULT_UNACCEPTABLE_PARAMETERS){
3368                             l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_ERTM_BUFFER_RELEASED);
3369                             channel->mode = L2CAP_CHANNEL_MODE_BASIC;
3370                         }
3371                     }
3372                     break;
3373                 case L2CAP_CHANNEL_MODE_BASIC:
3374                     if (result == L2CAP_CONF_RESULT_UNACCEPTABLE_PARAMETERS){
3375                         // On 'Reject - Unacceptable Parameters' to our Basic mode request, disconnect
3376                         channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
3377                     }
3378                     break;
3379                 default:
3380                     break;
3381             }
3382         }
3383 
3384         // check for unknown options
3385         if (option_hint == 0 && (option_type < L2CAP_CONFIG_OPTION_TYPE_MAX_TRANSMISSION_UNIT || option_type > L2CAP_CONFIG_OPTION_TYPE_EXTENDED_WINDOW_SIZE)){
3386             log_info("l2cap cid %u, unknown option 0x%02x", channel->local_cid, option_type);
3387             channel->unknown_option = option_type;
3388             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_INVALID);
3389         }
3390 
3391         pos += length;
3392     }
3393 #else
3394     UNUSED(channel);  // ok: no code
3395     UNUSED(result);   // ok: no code
3396     UNUSED(command);  // ok: no code
3397 #endif
3398 }
3399 
3400 static int l2cap_channel_ready_for_open(l2cap_channel_t *channel){
3401     // log_info("l2cap_channel_ready_for_open 0x%02x", channel->state_var);
3402     if ((channel->state_var & L2CAP_CHANNEL_STATE_VAR_RCVD_CONF_RSP) == 0) return 0;
3403     if ((channel->state_var & L2CAP_CHANNEL_STATE_VAR_SENT_CONF_RSP) == 0) return 0;
3404     // addition check that fixes re-entrance issue causing l2cap event channel opened twice
3405     if (channel->state == L2CAP_STATE_OPEN) return 0;
3406     return 1;
3407 }
3408 
3409 
3410 // @pre command len is valid, see check in l2cap_signaling_handler_dispatch
3411 static void l2cap_signaling_handler_channel(l2cap_channel_t *channel, uint8_t *command){
3412 
3413     uint8_t  code       = command[L2CAP_SIGNALING_COMMAND_CODE_OFFSET];
3414     uint8_t  identifier = command[L2CAP_SIGNALING_COMMAND_SIGID_OFFSET];
3415     uint16_t cmd_len    = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
3416     uint16_t result = 0;
3417 
3418     log_info("L2CAP signaling handler code %u, state %u", code, channel->state);
3419 
3420     // handle DISCONNECT REQUESTS seperately
3421     if (code == DISCONNECTION_REQUEST){
3422         l2cap_handle_disconnect_request(channel, identifier);
3423         return;
3424     }
3425 
3426     // @STATEMACHINE(l2cap)
3427     switch (channel->state) {
3428 
3429         case L2CAP_STATE_WAIT_CONNECT_RSP:
3430             switch (code){
3431                 case CONNECTION_RESPONSE:
3432                     if (cmd_len < 8){
3433                         // command imcomplete
3434                         l2cap_register_signaling_response(channel->con_handle, COMMAND_REJECT, identifier, 0, L2CAP_REJ_CMD_UNKNOWN);
3435                         break;
3436                     }
3437                     l2cap_stop_rtx(channel);
3438                     result = little_endian_read_16 (command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+4);
3439                     switch (result) {
3440                         case 0:
3441                             // successful connection
3442                             channel->remote_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3443                             channel->state = L2CAP_STATE_CONFIG;
3444                             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_REQ);
3445                             break;
3446                         case 1:
3447                             // connection pending. get some coffee, but start the ERTX
3448                             l2cap_start_ertx(channel);
3449                             break;
3450                         default:
3451                             // channel closed
3452                             channel->state = L2CAP_STATE_CLOSED;
3453                             // map l2cap connection response result to BTstack status enumeration
3454                             l2cap_handle_channel_open_failed(channel, L2CAP_CONNECTION_RESPONSE_RESULT_SUCCESSFUL + result);
3455 
3456                             // drop link key if security block
3457                             if ((L2CAP_CONNECTION_RESPONSE_RESULT_SUCCESSFUL + result) == L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_SECURITY){
3458                                 gap_drop_link_key_for_bd_addr(channel->address);
3459                             }
3460 
3461                             // discard channel
3462                             btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
3463                             l2cap_free_channel_entry(channel);
3464                             break;
3465                     }
3466                     break;
3467 
3468                 default:
3469                     //@TODO: implement other signaling packets
3470                     break;
3471             }
3472             break;
3473 
3474         case L2CAP_STATE_CONFIG:
3475             switch (code) {
3476                 case CONFIGURE_REQUEST:
3477                     if (cmd_len < 4){
3478                         // command incomplete
3479                         l2cap_register_signaling_response(channel->con_handle, COMMAND_REJECT, identifier, 0, L2CAP_REJ_CMD_UNKNOWN);
3480                         break;
3481                     }
3482                     channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP);
3483                     l2cap_signaling_handle_configure_request(channel, command);
3484                     if (!(channel->state_var & L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_CONT)){
3485                         // only done if continuation not set
3486                         channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_RCVD_CONF_REQ);
3487                     }
3488                     break;
3489                 case CONFIGURE_RESPONSE:
3490                     if (cmd_len < 6){
3491                         // command incomplete
3492                         l2cap_register_signaling_response(channel->con_handle, COMMAND_REJECT, identifier, 0, L2CAP_REJ_CMD_UNKNOWN);
3493                         break;
3494                     }
3495                     result = little_endian_read_16 (command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+4);
3496                     l2cap_stop_rtx(channel);
3497                     l2cap_signaling_handle_configure_response(channel, result, command);
3498                     switch (result){
3499                         case 0: // success
3500                             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_RCVD_CONF_RSP);
3501                             break;
3502                         case 4: // pending
3503                             l2cap_start_ertx(channel);
3504                             break;
3505                         default:
3506 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3507                             if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION && channel->ertm_mandatory){
3508                                 // remote does not offer ertm but it's required
3509                                 channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
3510                                 break;
3511                             }
3512 #endif
3513                             // retry on negative result
3514                             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_REQ);
3515                             break;
3516                     }
3517                     break;
3518                 default:
3519                     break;
3520             }
3521             if (l2cap_channel_ready_for_open(channel)){
3522 
3523 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3524                 // assert that packet can be stored in fragment buffers in ertm
3525                 if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
3526                     uint16_t effective_mps = btstack_min(channel->remote_mps, channel->local_mps);
3527                     uint16_t usable_mtu = channel->num_tx_buffers == 1 ? effective_mps : channel->num_tx_buffers * effective_mps - 2;
3528                     if (usable_mtu < channel->remote_mtu){
3529                         log_info("Remote MTU %u > max storable ERTM packet, only using MTU = %u", channel->remote_mtu, usable_mtu);
3530                         channel->remote_mtu = usable_mtu;
3531                     }
3532                 }
3533 #endif
3534                 // for open:
3535                 channel->state = L2CAP_STATE_OPEN;
3536                 l2cap_emit_channel_opened(channel, 0);
3537             }
3538             break;
3539 
3540         case L2CAP_STATE_WAIT_DISCONNECT:
3541             switch (code) {
3542                 case DISCONNECTION_RESPONSE:
3543                     l2cap_finalize_channel_close(channel);
3544                     break;
3545                 default:
3546                     //@TODO: implement other signaling packets
3547                     break;
3548             }
3549             break;
3550 
3551         case L2CAP_STATE_CLOSED:
3552             // @TODO handle incoming requests
3553             break;
3554 
3555         case L2CAP_STATE_OPEN:
3556             //@TODO: implement other signaling packets, e.g. re-configure
3557             break;
3558         default:
3559             break;
3560     }
3561     // log_info("new state %u", channel->state);
3562 }
3563 
3564 #ifdef ENABLE_CLASSIC
3565 static void l2cap_handle_information_request_complete(hci_connection_t * connection){
3566 
3567     connection->l2cap_state.information_state = L2CAP_INFORMATION_STATE_DONE;
3568 
3569     // emit event
3570     uint8_t event[8];
3571     event[0] = L2CAP_EVENT_INFORMATION_RESPONSE;
3572     event[1] = sizeof(event) - 2;
3573     little_endian_store_16(event, 2, connection->con_handle);
3574     little_endian_store_16(event, 4, connection->l2cap_state.extended_feature_mask);
3575     little_endian_store_16(event, 6, connection->l2cap_state.fixed_channels_supported);
3576     l2cap_emit_event(event, sizeof(event));
3577 
3578     // trigger connection request
3579     btstack_linked_list_iterator_t it;
3580     btstack_linked_list_iterator_init(&it, &l2cap_channels);
3581     while (btstack_linked_list_iterator_has_next(&it)){
3582         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
3583         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
3584         if (channel->con_handle != connection->con_handle) continue;
3585 
3586         // incoming connection: information request was triggered after user has accepted connection,
3587         // now: verify channel configuration, esp. if ertm will be mandatory
3588         if (channel->state == L2CAP_STATE_WAIT_INCOMING_EXTENDED_FEATURES){
3589             // default: continue
3590             channel->state = L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_ACCEPT;
3591 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3592             if ((channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION) && ((connection->l2cap_state.extended_feature_mask & 0x08) == 0)){
3593                 // ERTM not possible, select basic mode and release buffer
3594                 channel->mode = L2CAP_CHANNEL_MODE_BASIC;
3595                 l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_ERTM_BUFFER_RELEASED);
3596 
3597                 // bail if ERTM is mandatory
3598                 if (channel->ertm_mandatory){
3599                     // We chose 'no resources available' for "ERTM mandatory but you don't even know ERTM exists"
3600                     log_info("ERTM mandatory -> reject connection");
3601                     channel->state  = L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_DECLINE;
3602                     channel->reason = L2CAP_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE;
3603                 }  else {
3604                     log_info("ERTM not supported by remote -> use Basic mode");
3605                 }
3606             }
3607 #endif
3608             continue;
3609         }
3610 
3611         // outgoing connection: information request is triggered before connection request
3612         if (channel->state == L2CAP_STATE_WAIT_OUTGOING_EXTENDED_FEATURES){
3613 
3614 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3615             // if ERTM was requested, but is not listed in extended feature mask:
3616             if ((channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION) && ((connection->l2cap_state.extended_feature_mask & 0x08) == 0)){
3617 
3618                 if (channel->ertm_mandatory){
3619                     // bail if ERTM is mandatory
3620                     channel->state = L2CAP_STATE_CLOSED;
3621                     // map l2cap connection response result to BTstack status enumeration
3622                     l2cap_handle_channel_open_failed(channel, L2CAP_CONNECTION_RESPONSE_RESULT_ERTM_NOT_SUPPORTED);
3623                     // discard channel
3624                     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
3625                     l2cap_free_channel_entry(channel);
3626                     continue;
3627 
3628                 } else {
3629                     // fallback to Basic mode
3630                     l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_ERTM_BUFFER_RELEASED);
3631                     channel->mode = L2CAP_CHANNEL_MODE_BASIC;
3632                 }
3633             }
3634 #endif
3635 
3636             // respond to connection request
3637             channel->state = L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST;
3638             continue;
3639         }
3640     }
3641 }
3642 #endif
3643 
3644 // @pre command len is valid, see check in l2cap_acl_classic_handler
3645 static void l2cap_signaling_handler_dispatch(hci_con_handle_t handle, uint8_t * command){
3646 
3647     hci_connection_t * connection;
3648     btstack_linked_list_iterator_t it;
3649 
3650     // get code, signal identifier and command len
3651     uint8_t code     = command[L2CAP_SIGNALING_COMMAND_CODE_OFFSET];
3652     uint8_t sig_id   = command[L2CAP_SIGNALING_COMMAND_SIGID_OFFSET];
3653     uint16_t cmd_len = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
3654 
3655     // general commands without an assigned channel
3656     switch(code) {
3657 
3658         case CONNECTION_REQUEST:
3659             if (cmd_len == 4){
3660                 uint16_t psm =        little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3661                 uint16_t source_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+2);
3662                 l2cap_handle_connection_request(handle, sig_id, psm, source_cid);
3663             } else {
3664                 l2cap_register_signaling_response(handle, COMMAND_REJECT, sig_id, 0, L2CAP_REJ_CMD_UNKNOWN);
3665             }
3666             return;
3667 
3668         case ECHO_REQUEST:
3669             l2cap_register_signaling_response(handle, code, sig_id, 0, 0);
3670             return;
3671 
3672         case INFORMATION_REQUEST:
3673             if (cmd_len == 2) {
3674                 uint16_t info_type = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3675                 l2cap_register_signaling_response(handle, code, sig_id, 0, info_type);
3676                 return;
3677             }
3678             break;
3679 
3680         case INFORMATION_RESPONSE:
3681             connection = hci_connection_for_handle(handle);
3682             if (!connection) return;
3683             switch (connection->l2cap_state.information_state){
3684                 case L2CAP_INFORMATION_STATE_W4_EXTENDED_FEATURE_RESPONSE:
3685                     // get extended features from response if valid
3686                     if (cmd_len >= 6) {
3687                         uint16_t info_type = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3688                         uint16_t result    = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+2);
3689                         if (result == 0 && info_type == L2CAP_INFO_TYPE_EXTENDED_FEATURES_SUPPORTED) {
3690                             connection->l2cap_state.extended_feature_mask = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+4);
3691                         }
3692                         log_info("extended features mask 0x%02x", connection->l2cap_state.extended_feature_mask);
3693                         if ((connection->l2cap_state.extended_feature_mask & 0x80) != 0){
3694                             connection->l2cap_state.information_state = L2CAP_INFORMATION_STATE_W2_SEND_FIXED_CHANNELS_REQUEST;
3695                         } else {
3696                             // information request complete
3697                             l2cap_handle_information_request_complete(connection);
3698                         }
3699                     }
3700                     break;
3701                 case L2CAP_INFORMATION_STATE_W4_FIXED_CHANNELS_RESPONSE:
3702                     if (cmd_len >= 12) {
3703                         uint16_t info_type = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3704                         uint16_t result    = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+2);
3705                         if (result == 0 && info_type == L2CAP_INFO_TYPE_FIXED_CHANNELS_SUPPORTED) {
3706                             connection->l2cap_state.fixed_channels_supported = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 4);
3707                         }
3708                         log_info("fixed channels mask 0x%02x", connection->l2cap_state.fixed_channels_supported);
3709                         // information request complete
3710                         l2cap_handle_information_request_complete(connection);
3711                     }
3712                     break;
3713                 default:
3714                     break;
3715             }
3716             return;
3717 
3718 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
3719         case L2CAP_CREDIT_BASED_CONNECTION_REQUEST:
3720         case L2CAP_CREDIT_BASED_CONNECTION_RESPONSE:
3721         case L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST:
3722         case L2CAP_CREDIT_BASED_RECONFIGURE_RESPONSE:
3723             l2cap_ecbm_signaling_handler_dispatch(handle, L2CAP_CID_SIGNALING, command, sig_id);
3724             return;
3725         case L2CAP_FLOW_CONTROL_CREDIT_INDICATION:
3726             // return if valid
3727             if (l2cap_credit_based_handle_credit_indication(handle, command, cmd_len)) return;
3728             break;
3729 
3730         case COMMAND_REJECT:
3731             btstack_linked_list_iterator_init(&it, &l2cap_channels);
3732             while (btstack_linked_list_iterator_has_next(&it)) {
3733                 l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
3734                 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
3735                 if (channel->con_handle != handle) continue;
3736                 if (channel->local_sig_id != sig_id) continue;
3737                 if (channel->state != L2CAP_STATE_WAIT_ENHANCED_CONNECTION_RESPONSE) continue;
3738 
3739                 // open failed
3740                 channel->state = L2CAP_STATE_CLOSED;
3741                 l2cap_ecbm_emit_channel_opened(channel,
3742                                                ERROR_CODE_CONNECTION_REJECTED_DUE_TO_LIMITED_RESOURCES);
3743                 // drop failed channel
3744                 btstack_linked_list_iterator_remove(&it);
3745                 l2cap_free_channel_entry(channel);
3746             }
3747             break;
3748 #endif
3749 
3750         default:
3751             break;
3752     }
3753 
3754     if (cmd_len >= 2){
3755         // Get potential destination CID
3756         uint16_t dest_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3757 
3758         // Find channel for this sig_id and connection handle
3759         btstack_linked_list_iterator_init(&it, &l2cap_channels);
3760         while (btstack_linked_list_iterator_has_next(&it)){
3761             l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
3762             if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
3763             if (channel->con_handle != handle) continue;
3764             if (code & 1) {
3765                 // match odd commands (responses) by previous signaling identifier
3766                 if (channel->local_sig_id == sig_id) {
3767                     l2cap_signaling_handler_channel(channel, command);
3768                     return;
3769                 }
3770             } else {
3771                 // match even commands (requests) by local channel id
3772                 if (channel->local_cid == dest_cid) {
3773                     l2cap_signaling_handler_channel(channel, command);
3774                     return;
3775                 }
3776             }
3777         }
3778     }
3779 
3780     // If dynamic channel cannot be found, either never set-up or already finalized, assume state CLOSED
3781     // Handle events as described in Core 5.4, Vol 3. Host, 6.1.1 CLOSED state
3782     switch (code){
3783         case CONNECTION_RESPONSE:
3784         case CONFIGURE_RESPONSE:
3785         case DISCONNECTION_RESPONSE:
3786             // Ignore request
3787             return;
3788         case DISCONNECTION_REQUEST:
3789             if (cmd_len == 4){
3790                 // send disconnect response for received dest and source cids
3791                 uint16_t dest_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3792                 uint16_t source_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+2);
3793                 l2cap_register_signaling_response(handle, DISCONNECTION_RESPONSE, sig_id, source_cid, dest_cid);
3794                 return;
3795             }
3796             break;
3797         case CONFIGURE_REQUEST:
3798             if (cmd_len >= 2){
3799                 // send command reject with reason invalid cid
3800                 uint16_t dest_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3801                 l2cap_register_signaling_response(handle, CONFIGURE_REQUEST, sig_id, dest_cid, L2CAP_REJ_INVALID_CID);
3802                 return;
3803             }
3804             break;
3805         default:
3806             break;
3807     }
3808     // otherwise send command reject with reason unknown command
3809     l2cap_register_signaling_response(handle, COMMAND_REJECT, sig_id, 0, L2CAP_REJ_CMD_UNKNOWN);
3810 }
3811 #endif
3812 
3813 #ifdef L2CAP_USES_CHANNELS
3814 static l2cap_service_t * l2cap_get_service_internal(btstack_linked_list_t * services, uint16_t psm){
3815     btstack_linked_list_iterator_t it;
3816     btstack_linked_list_iterator_init(&it, services);
3817     while (btstack_linked_list_iterator_has_next(&it)){
3818         l2cap_service_t * service = (l2cap_service_t *) btstack_linked_list_iterator_next(&it);
3819         if ( service->psm == psm){
3820             return service;
3821         };
3822     }
3823     return NULL;
3824 }
3825 #endif
3826 
3827 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
3828 
3829 static uint8_t l2cap_ecbm_setup_channels(btstack_linked_list_t * channels,
3830                                          btstack_packet_handler_t packet_handler, uint8_t num_channels,
3831                                          hci_connection_t * connection, uint16_t psm, uint16_t mtu, gap_security_level_t security_level){
3832     uint8_t i;
3833     uint8_t status = ERROR_CODE_SUCCESS;
3834     for (i=0;i<num_channels;i++){
3835         l2cap_channel_t * channel = l2cap_create_channel_entry(packet_handler, L2CAP_CHANNEL_TYPE_CHANNEL_ECBM, connection->address, connection->address_type, psm, mtu, security_level);
3836         if (!channel) {
3837             status = BTSTACK_MEMORY_ALLOC_FAILED;
3838             break;
3839         }
3840         channel->con_handle = connection->con_handle;
3841         btstack_linked_list_add_tail(channels, (btstack_linked_item_t *) channel);
3842     }
3843 
3844     // free channels if not all allocated
3845     if (status != ERROR_CODE_SUCCESS){
3846         while (true) {
3847             l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_pop(channels);
3848             if (channel == NULL) break;
3849             l2cap_free_channel_entry(channel);
3850         }
3851     }
3852 
3853     return status;
3854 }
3855 
3856 static inline l2cap_service_t * l2cap_ecbm_get_service(uint16_t spsm){
3857     return l2cap_get_service_internal(&l2cap_enhanced_services, spsm);
3858 }
3859 
3860 static inline uint8_t l2cap_ecbm_status_for_result(uint16_t result) {
3861     switch (result) {
3862         case L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS:
3863             return ERROR_CODE_SUCCESS;
3864         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_SPSM_NOT_SUPPORTED:
3865             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_PSM;
3866         case L2CAP_ECBM_CONNECTION_RESULT_SOME_REFUSED_INSUFFICIENT_RESOURCES_AVAILABLE:
3867             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_RESOURCES;
3868         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_AUTHENTICATION:
3869         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_AUTHORIZATION:
3870         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_ENCYRPTION_KEY_SIZE_TOO_SHORT:
3871         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_ENCRYPTION:
3872             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_SECURITY;
3873         default:
3874             // invalid Source CID, Source CID already allocated, unacceptable parameters
3875             return L2CAP_CONNECTION_RESPONSE_UNKNOWN_ERROR;
3876     }
3877 }
3878 
3879 static void
3880 l2cap_ecbm_emit_incoming_connection(l2cap_channel_t *channel, uint8_t num_channels) {
3881     uint8_t event[16];
3882     event[0] = L2CAP_EVENT_ECBM_INCOMING_CONNECTION;
3883     event[1] = sizeof(event) - 2;
3884     event[2] = channel->address_type;
3885     reverse_bd_addr(channel->address, &event[3]);
3886     little_endian_store_16(event, 9, channel->con_handle);
3887     little_endian_store_16(event, 11, channel->psm);
3888     event[13] = num_channels;
3889     little_endian_store_16(event, 14, channel->local_cid);
3890     hci_dump_packet(HCI_EVENT_PACKET, 1, event, sizeof(event));
3891     (*channel->packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
3892 }
3893 
3894 static uint8_t
3895 l2cap_ecbm_security_status_for_connection_request(hci_con_handle_t handle, gap_security_level_t required_security_level,
3896                                                   bool requires_authorization) {
3897     // check security in increasing error priority
3898     uint8_t security_status = L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS;
3899 
3900     // security: check encryption
3901     if (required_security_level >= LEVEL_2) {
3902         if (gap_encryption_key_size(handle) < 16) {
3903             security_status = L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_ENCYRPTION_KEY_SIZE_TOO_SHORT;
3904         }
3905         if (gap_encryption_key_size(handle) == 0){
3906             security_status = L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_ENCRYPTION;
3907         }
3908     }
3909 
3910     // security: check authentication
3911     if (required_security_level >= LEVEL_3) {
3912         if (!gap_authenticated(handle)) {
3913             security_status = requires_authorization ?
3914                     L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_AUTHORIZATION :
3915                     L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_AUTHENTICATION;
3916         }
3917     }
3918     return security_status;
3919 }
3920 
3921 static void l2cap_ecbm_handle_security_level_incoming(l2cap_channel_t * channel){
3922     // count number of l2cap_channels in state L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE with same remote_sig_id
3923     uint8_t sig_id = channel->remote_sig_id;
3924     hci_con_handle_t con_handle = channel->con_handle;
3925 
3926     uint8_t security_status = l2cap_ecbm_security_status_for_connection_request(channel->con_handle,
3927                                                                                 channel->required_security_level,
3928                                                                                 false);
3929     bool security_sufficient = security_status == L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS;
3930 
3931     uint8_t num_channels = 0;
3932     btstack_linked_list_iterator_t it;
3933     btstack_linked_list_iterator_init(&it, &l2cap_channels);
3934     while (btstack_linked_list_iterator_has_next(&it)) {
3935         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
3936         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
3937         if (channel->con_handle != con_handle) continue;
3938         if (channel->remote_sig_id != sig_id) continue;
3939         if (channel->state != L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE) continue;
3940         num_channels++;
3941 
3942         if (security_sufficient){
3943             channel->state = L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT;
3944         } else {
3945             btstack_linked_list_iterator_remove(&it);
3946             btstack_memory_l2cap_channel_free(channel);
3947         }
3948     }
3949 
3950     if (security_sufficient){
3951         l2cap_ecbm_emit_incoming_connection(channel, num_channels);
3952     } else {
3953         // combine signaling cid and number channels for l2cap_register_signaling_response
3954         uint16_t signaling_cid = L2CAP_CID_SIGNALING;
3955         uint16_t num_channels_and_signaling_cid = (num_channels << 8) | signaling_cid;
3956         l2cap_register_signaling_response(con_handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
3957                                           num_channels_and_signaling_cid, security_status);
3958     }
3959 }
3960 
3961 void l2cap_ecbm_trigger_pending_connection_responses(hci_con_handle_t con_handle){
3962     bool done = false;
3963     while (!done) {
3964         done = true;
3965         btstack_linked_list_iterator_t it;
3966         btstack_linked_list_iterator_init(&it, &l2cap_channels);
3967         while (btstack_linked_list_iterator_has_next(&it)) {
3968             l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
3969             if (channel->channel_type != L2CAP_CHANNEL_TYPE_CHANNEL_ECBM) continue;
3970             if (channel->con_handle != con_handle) continue;
3971             if  (channel->state == L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE) {
3972                 l2cap_ecbm_handle_security_level_incoming(channel);
3973                 done = false;
3974             };
3975         }
3976     }
3977 }
3978 
3979 static int l2cap_ecbm_signaling_handler_dispatch(hci_con_handle_t handle, uint16_t signaling_cid, uint8_t *command,
3980                                                  uint8_t sig_id) {
3981 
3982     hci_connection_t *connection;
3983     btstack_linked_list_iterator_t it;
3984     l2cap_service_t *service;
3985     uint16_t spsm;
3986     uint8_t num_channels;
3987     uint16_t num_channels_and_signaling_cid;
3988     uint8_t i;
3989     uint16_t new_mtu;
3990     uint16_t new_mps;
3991     uint16_t initial_credits;
3992     uint16_t result;
3993     uint8_t status;
3994 
3995     uint8_t code = command[L2CAP_SIGNALING_COMMAND_CODE_OFFSET];
3996     uint16_t len = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
3997     log_info("enhanced dispatch: command 0x%02x, sig id %u, len %u", code, sig_id, len);
3998 
3999     switch (code) {
4000         case L2CAP_CREDIT_BASED_CONNECTION_REQUEST:
4001             // check size
4002             if (len < 10u) return 0u;
4003 
4004             // get hci connection, bail if not found (must not happen)
4005             connection = hci_connection_for_handle(handle);
4006             btstack_assert(connection != NULL);
4007 
4008             // get num channels to establish
4009             num_channels = (len - 8) / sizeof(uint16_t);
4010 
4011             // combine signaling cid and number channels for l2cap_register_signaling_response
4012             num_channels_and_signaling_cid = (num_channels << 8) | signaling_cid;
4013 
4014             // check if service registered
4015             spsm = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
4016             service = l2cap_ecbm_get_service(spsm);
4017 
4018             if (service) {
4019 
4020                 uint16_t remote_mtu = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
4021                 uint16_t remote_mps = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 4);
4022                 uint16_t credits_outgoing = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 6);
4023 
4024                 // param: check remote mtu
4025                 if (service->mtu > remote_mtu) {
4026                     l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4027                                                       num_channels_and_signaling_cid, L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INVALID_PARAMETERS);
4028                     return 1;
4029                 }
4030 
4031                 // check if authentication is required and possible
4032                 bool send_pending = false;
4033                 uint8_t security_status = l2cap_ecbm_security_status_for_connection_request(handle,
4034                                                                                             service->required_security_level,
4035                                                                                             service->requires_authorization);
4036                 if (security_status != L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS) {
4037                     if (gap_get_bondable_mode() != 0) {
4038                         // if possible, send pending and continue
4039                         send_pending = true;
4040                     } else {
4041                         // otherwise, send refused and abort
4042                         l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4043                                                           num_channels_and_signaling_cid, security_status);
4044                         return 1;
4045                     }
4046                 }
4047 
4048                 // report the last result code != 0
4049                 result = 0;
4050                 // store one of the local channels for the event
4051                 l2cap_channel_t * a_channel = NULL;
4052                 for (i = 0; i < num_channels; i++) {
4053 
4054                     // check source cids
4055                     uint16_t source_cid = little_endian_read_16(command, 12 + (i * 2));
4056                     if (source_cid < 0x40u) {
4057                         result = L2CAP_ECBM_CONNECTION_RESULT_SOME_REFUSED_INVALID_SOURCE_CID;
4058                         continue;
4059                     }
4060 
4061                     // go through list of channels for this ACL connection and check if we get a match
4062                     btstack_linked_list_iterator_init(&it, &l2cap_channels);
4063                     bool source_cid_allocated = false;
4064                     while (btstack_linked_list_iterator_has_next(&it)) {
4065                         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4066                         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
4067                         if (channel->con_handle != handle) continue;
4068                         if (channel->remote_cid != source_cid) continue;
4069                         source_cid_allocated = true;
4070                         break;
4071                     }
4072                     if (source_cid_allocated) {
4073                         result = 0x00a;
4074                         continue;
4075                     }
4076 
4077                     // setup channel
4078                     l2cap_channel_t *channel = l2cap_create_channel_entry(service->packet_handler,
4079                                                                           L2CAP_CHANNEL_TYPE_CHANNEL_ECBM,
4080                                                                           connection->address,
4081                                                                           connection->address_type, spsm,
4082                                                                           service->mtu,
4083                                                                           service->required_security_level);
4084 
4085                     if (channel == NULL) {
4086                         // Some connections refused – insufficient resources available
4087                         result = 0x004;
4088                         continue;
4089                     }
4090 
4091                     // setup state
4092                     channel->state = L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE;
4093                     channel->state_var |= L2CAP_CHANNEL_STATE_VAR_INCOMING;
4094                     channel->con_handle = connection->con_handle;
4095                     channel->remote_sig_id = sig_id;
4096                     channel->remote_cid = source_cid;
4097                     channel->remote_mtu = remote_mtu;
4098                     channel->remote_mps = remote_mps;
4099                     channel->credits_outgoing = credits_outgoing;
4100                     channel->cid_index = i;
4101                     channel->num_cids = num_channels;
4102 
4103                     // if more than one error, we can report any of them
4104                     channel->reason = result;
4105 
4106                     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
4107 
4108                     a_channel = channel;
4109                 }
4110 
4111                 // if no channels have been created, all have been refused, and we can respond right away
4112                 if (a_channel == NULL) {
4113                     l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4114                                                       num_channels_and_signaling_cid, result);
4115                     return 1;
4116                 }
4117 
4118                 // if security is pending, send intermediate response, otherwise, ask user
4119                 if (send_pending){
4120                     l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4121                                                       num_channels_and_signaling_cid, L2CAP_ECBM_CONNECTION_RESULT_ALL_PENDING_AUTHENTICATION);
4122                 } else {
4123                     // if security is ok but authorization is required, send intermediate response and ask user
4124                     if (service->requires_authorization){
4125                         l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4126                                                           num_channels_and_signaling_cid, L2CAP_ECBM_CONNECTION_RESULT_ALL_PENDING_AUTHORIZATION);
4127                     }
4128                     l2cap_ecbm_handle_security_level_incoming(a_channel);
4129                 }
4130 
4131             } else {
4132                 l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4133                                                   num_channels_and_signaling_cid, L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_SPSM_NOT_SUPPORTED);
4134             }
4135             return 1;
4136 
4137         case L2CAP_CREDIT_BASED_CONNECTION_RESPONSE:
4138             // check size
4139             if (len < 10u) return 0u;
4140 
4141             // get hci connection, ignore if not found
4142             connection = hci_connection_for_handle(handle);
4143             if (connection == NULL) return 0;
4144 
4145             // get channel config: mtu, mps, initial credits, result
4146             new_mtu = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4147             new_mps = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
4148             initial_credits = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 4);
4149             result = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 6);
4150             status = l2cap_ecbm_status_for_result(result);
4151 
4152             // get num channels to modify
4153             num_channels = (len - 8) / sizeof(uint16_t);
4154             btstack_linked_list_iterator_init(&it, &l2cap_channels);
4155             while (btstack_linked_list_iterator_has_next(&it)) {
4156                 uint8_t channel_status = status;
4157                 l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4158                 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
4159                 if (channel->con_handle != handle) continue;
4160                 if (channel->local_sig_id != sig_id) continue;
4161                 if (channel->state != L2CAP_STATE_WAIT_ENHANCED_CONNECTION_RESPONSE) continue;
4162                 if (channel->cid_index < num_channels) {
4163                     uint16_t remote_cid = little_endian_read_16(command, 12 + channel->cid_index * sizeof(uint16_t));
4164                     if (remote_cid != 0) {
4165                         // check for duplicate remote CIDs
4166                         l2cap_channel_t * original_channel = l2cap_get_channel_for_remote_handle_and_cid(handle, remote_cid);
4167                         if (original_channel == NULL){
4168                             channel->state = L2CAP_STATE_OPEN;
4169                             channel->remote_cid = remote_cid;
4170                             channel->remote_mtu = new_mtu;
4171                             channel->remote_mps = new_mps;
4172                             channel->credits_outgoing = initial_credits;
4173                             l2cap_ecbm_emit_channel_opened(channel, ERROR_CODE_SUCCESS);
4174                             continue;
4175                         }
4176                         // close original channel
4177                         original_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
4178                         channel_status = ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS;
4179                     }
4180                 }
4181                 // open failed
4182                 l2cap_ecbm_emit_channel_opened(channel, channel_status);
4183                 // drop failed channel
4184                 btstack_linked_list_iterator_remove(&it);
4185                 btstack_memory_l2cap_channel_free(channel);
4186             }
4187             return 1;
4188 
4189         case L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST:
4190             // check minimal size
4191             if (len < 6) return 0u;
4192 
4193             // get hci connection, bail if not found (must not happen)
4194             connection = hci_connection_for_handle(handle);
4195             btstack_assert(connection != NULL);
4196 
4197             // get num channels to modify
4198             num_channels = (len - 4) / sizeof(uint16_t);
4199 
4200             // get new mtu and mps
4201             new_mtu = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4202             new_mps = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
4203 
4204             // validate request
4205             result = 0;
4206             for (i = 0; i < num_channels; i++) {
4207                 // check cid
4208                 uint16_t remote_cid = little_endian_read_16(command, 8 + (i * sizeof(uint16_t)));
4209                 l2cap_channel_t *channel = l2cap_get_channel_for_remote_handle_and_cid(handle, remote_cid);
4210                 if (channel == NULL) {
4211                     result = L2CAP_ECBM_RECONFIGURE_FAILED_DESTINATION_CID_INVALID;
4212                     break;
4213                 }
4214                 // check MTU is not reduced
4215                 if (channel->remote_mtu > new_mtu) {
4216                     result = L2CAP_ECBM_RECONFIGURE_FAILED_MTU_REDUCTION_NOT_ALLOWED;
4217                     break;
4218                 }
4219                 // check MPS reduction
4220                 if ((num_channels > 1) && (channel->remote_mps > new_mps)) {
4221                     result = L2CAP_ECBM_RECONFIGURE_FAILED_MPS_REDUCTION_MULTIPLE_CHANNELS;
4222                     break;
4223                 }
4224                 // check MPS valid
4225                 if (new_mps < l2cap_enhanced_mps_min) {
4226                     result = L2CAP_ECBM_RECONFIGURE_FAILED_UNACCEPTABLE_PARAMETERS;
4227                     break;
4228                 }
4229             }
4230 
4231             // send reject
4232             if (result != 0) {
4233                 l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST, sig_id, signaling_cid,
4234                                                   result);
4235                 return 1;
4236             }
4237 
4238             // update channels
4239             for (i = 0; i < num_channels; i++) {
4240                 uint16_t remote_cid = little_endian_read_16(command, 8 + (i * sizeof(uint16_t)));
4241                 l2cap_channel_t *channel = l2cap_get_channel_for_remote_handle_and_cid(handle, remote_cid);
4242                 channel->remote_mps = new_mps;
4243                 channel->remote_mtu = new_mtu;
4244                 // emit event
4245                 uint8_t event[8];
4246                 event[0] = L2CAP_EVENT_ECBM_RECONFIGURED;
4247                 event[1] = sizeof(event) - 2;
4248                 little_endian_store_16(event, 2, channel->local_cid);
4249                 little_endian_store_16(event, 4, new_mtu);
4250                 little_endian_store_16(event, 6, new_mps);
4251                 l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
4252             }
4253 
4254             // send accept
4255             l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST, sig_id, signaling_cid, 0);
4256             return 1;
4257 
4258         case L2CAP_CREDIT_BASED_RECONFIGURE_RESPONSE:
4259             // check size
4260             if (len < 2u) return 0u;
4261 
4262             result = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4263             btstack_linked_list_iterator_init(&it, &l2cap_channels);
4264             while (btstack_linked_list_iterator_has_next(&it)) {
4265                 l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4266                 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
4267                 if (channel->con_handle != handle) continue;
4268                 if (channel->local_sig_id != sig_id) continue;
4269                 if (channel->state != L2CAP_STATE_WAIT_ENHANCED_RENEGOTIATION_RESPONSE) continue;
4270                 // complete request
4271                 if (result == 0) {
4272                     channel->receive_sdu_buffer = channel->renegotiate_sdu_buffer;
4273                     channel->local_mtu = channel->renegotiate_mtu;
4274                 }
4275                 channel->state = L2CAP_STATE_OPEN;
4276                 // emit event
4277                 l2cap_ecbm_emit_reconfigure_complete(channel, result);
4278             }
4279             break;
4280 
4281         default:
4282             btstack_unreachable();
4283             break;
4284     }
4285     return 0;
4286 }
4287 
4288 #endif
4289 
4290 #ifdef ENABLE_BLE
4291 
4292 static void l2cap_emit_connection_parameter_update_response(hci_con_handle_t con_handle, uint16_t result){
4293     uint8_t event[6];
4294     event[0] = L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_RESPONSE;
4295     event[1] = 4;
4296     little_endian_store_16(event, 2, con_handle);
4297     little_endian_store_16(event, 4, result);
4298     l2cap_emit_event(event, sizeof(event));
4299 }
4300 
4301 // @return valid
4302 static int l2cap_le_signaling_handler_dispatch(hci_con_handle_t handle, uint8_t * command, uint8_t sig_id){
4303     hci_connection_t * connection;
4304     uint16_t result;
4305     uint8_t  event[12];
4306 
4307 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
4308     l2cap_channel_t * channel;
4309     btstack_linked_list_iterator_t it;
4310 #endif
4311 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4312     uint16_t local_cid;
4313     uint16_t le_psm;
4314     l2cap_service_t * service;
4315     uint16_t source_cid;
4316 #endif
4317 
4318     uint8_t code   = command[L2CAP_SIGNALING_COMMAND_CODE_OFFSET];
4319     uint16_t len   = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
4320     log_info("le dispatch: command 0x%02x, sig id %u, len %u", code, sig_id, len);
4321 
4322     switch (code){
4323 
4324         case CONNECTION_PARAMETER_UPDATE_REQUEST:
4325             // check size
4326             if (len < 8u) return 0u;
4327             connection = hci_connection_for_handle(handle);
4328             if (connection != NULL){
4329                 if (connection->role != HCI_ROLE_MASTER){
4330                     // reject command without notifying upper layer when not in master role
4331                     return 0;
4332                 }
4333                 le_connection_parameter_range_t existing_range;
4334                 gap_get_connection_parameter_range(&existing_range);
4335                 uint16_t le_conn_interval_min   = little_endian_read_16(command,L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
4336                 uint16_t le_conn_interval_max   = little_endian_read_16(command,L2CAP_SIGNALING_COMMAND_DATA_OFFSET+2);
4337                 uint16_t le_conn_latency        = little_endian_read_16(command,L2CAP_SIGNALING_COMMAND_DATA_OFFSET+4);
4338                 uint16_t le_supervision_timeout = little_endian_read_16(command,L2CAP_SIGNALING_COMMAND_DATA_OFFSET+6);
4339 
4340                 int update_parameter = gap_connection_parameter_range_included(&existing_range, le_conn_interval_min, le_conn_interval_max, le_conn_latency, le_supervision_timeout);
4341                 if (update_parameter){
4342                     connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_SEND_RESPONSE;
4343                     connection->le_conn_interval_min = le_conn_interval_min;
4344                     connection->le_conn_interval_max = le_conn_interval_max;
4345                     connection->le_conn_latency = le_conn_latency;
4346                     connection->le_supervision_timeout = le_supervision_timeout;
4347                 } else {
4348                     connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_DENY;
4349                 }
4350                 connection->le_con_param_update_identifier = sig_id;
4351             }
4352 
4353             event[0] = L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_REQUEST;
4354             event[1] = 10;
4355             little_endian_store_16(event, 2, handle);
4356             (void)memcpy(&event[4], &command[4], 8);
4357             l2cap_emit_event(event, sizeof(event));
4358             break;
4359 
4360         case CONNECTION_PARAMETER_UPDATE_RESPONSE:
4361             // check size
4362             if (len < 2u) return 0u;
4363             result = little_endian_read_16(command, 4);
4364             l2cap_emit_connection_parameter_update_response(handle, result);
4365             break;
4366 
4367 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
4368         case L2CAP_CREDIT_BASED_CONNECTION_REQUEST:
4369         case L2CAP_CREDIT_BASED_CONNECTION_RESPONSE:
4370         case L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST:
4371         case L2CAP_CREDIT_BASED_RECONFIGURE_RESPONSE:
4372             return l2cap_ecbm_signaling_handler_dispatch(handle, L2CAP_CID_SIGNALING_LE, command, sig_id);
4373 #endif
4374 
4375 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
4376         case COMMAND_REJECT:
4377             btstack_linked_list_iterator_init(&it, &l2cap_channels);
4378             while (btstack_linked_list_iterator_has_next(&it)){
4379                 channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4380                 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
4381                 if (channel->con_handle   != handle) continue;
4382                 if (channel->local_sig_id != sig_id) continue;
4383 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4384                 // if received while waiting for le connection response, assume legacy device
4385                 if (channel->state == L2CAP_STATE_WAIT_LE_CONNECTION_RESPONSE){
4386                     channel->state = L2CAP_STATE_CLOSED;
4387                     // no official value for this, use: Connection refused – LE_PSM not supported
4388                     l2cap_cbm_emit_channel_opened(channel, L2CAP_CBM_CONNECTION_RESULT_SPSM_NOT_SUPPORTED);
4389 
4390                     // discard channel
4391                     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
4392                     l2cap_free_channel_entry(channel);
4393                     continue;
4394                 }
4395 #endif
4396 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
4397                 // if received while waiting for le connection response, assume legacy device
4398                 if (channel->state == L2CAP_STATE_WAIT_ENHANCED_CONNECTION_RESPONSE){
4399                     channel->state = L2CAP_STATE_CLOSED;
4400                     // treat as SPSM not supported
4401                     l2cap_ecbm_emit_channel_opened(channel, L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_PSM);
4402 
4403                     // discard channel
4404                     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
4405                     l2cap_free_channel_entry(channel);
4406                     continue;
4407                 }
4408 #endif
4409             }
4410             break;
4411 #endif
4412 
4413 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4414         case LE_CREDIT_BASED_CONNECTION_REQUEST:
4415             // check size
4416             if (len < 10u) return 0u;
4417 
4418             // get hci connection, bail if not found (must not happen)
4419             connection = hci_connection_for_handle(handle);
4420             if (!connection) return 0;
4421 
4422             // check if service registered
4423             le_psm  = little_endian_read_16(command, 4);
4424             service = l2cap_cbm_get_service(le_psm);
4425             source_cid = little_endian_read_16(command, 6);
4426 
4427             if (service){
4428                 if (source_cid < 0x40u){
4429                     l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_INVALID_SOURCE_CID);
4430                     return 1;
4431                 }
4432 
4433                 // go through list of channels for this ACL connection and check if we get a match
4434                 btstack_linked_list_iterator_init(&it, &l2cap_channels);
4435                 while (btstack_linked_list_iterator_has_next(&it)){
4436                     l2cap_channel_t * a_channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4437                     if (!l2cap_is_dynamic_channel_type(a_channel->channel_type)) continue;
4438                     if (a_channel->con_handle != handle) continue;
4439                     if (a_channel->remote_cid != source_cid) continue;
4440                     l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_SOURCE_CID_ALREADY_ALLOCATED);
4441                     return 1;
4442                 }
4443 
4444                 // security: check encryption
4445                 if (service->required_security_level >= LEVEL_2){
4446                     if (gap_encryption_key_size(handle) == 0){
4447                         l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_ENCRYPTION);
4448                         return 1;
4449                     }
4450                     // anything less than 16 byte key size is insufficient
4451                     if (gap_encryption_key_size(handle) < 16){
4452                         l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_ENCYRPTION_KEY_SIZE_TOO_SHORT);
4453                         return 1;
4454                     }
4455                 }
4456 
4457                 // security: check authentication
4458                 if (service->required_security_level >= LEVEL_3){
4459                     if (!gap_authenticated(handle)){
4460                         l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_AUTHENTICATION);
4461                         return 1;
4462                     }
4463                 }
4464 
4465                 // security: check authorization
4466                 if (service->required_security_level >= LEVEL_4){
4467                     if (gap_authorization_state(handle) != AUTHORIZATION_GRANTED){
4468                         l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_AUTHORIZATION);
4469                         return 1;
4470                     }
4471                 }
4472 
4473                 // allocate channel
4474                 channel = l2cap_create_channel_entry(service->packet_handler, L2CAP_CHANNEL_TYPE_CHANNEL_CBM, connection->address,
4475                                                      connection->address_type, le_psm, service->mtu, service->required_security_level);
4476                 if (!channel){
4477                     l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE);
4478                     return 1;
4479                 }
4480 
4481                 channel->con_handle = handle;
4482                 channel->remote_cid = source_cid;
4483                 channel->remote_sig_id = sig_id;
4484                 channel->remote_mtu = little_endian_read_16(command, 8);
4485                 channel->remote_mps = little_endian_read_16(command, 10);
4486                 channel->credits_outgoing = little_endian_read_16(command, 12);
4487 
4488                 // set initial state
4489                 channel->state      = L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT;
4490                 channel->state_var |= L2CAP_CHANNEL_STATE_VAR_INCOMING;
4491 
4492                 // add to connections list
4493                 btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
4494 
4495                 // post connection request event
4496                 l2cap_cbm_emit_incoming_connection(channel);
4497 
4498             } else {
4499                 l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_SPSM_NOT_SUPPORTED);
4500             }
4501             break;
4502 
4503         case LE_CREDIT_BASED_CONNECTION_RESPONSE:
4504             // check size
4505             if (len < 10u) return 0u;
4506 
4507             // Find channel for this sig_id and connection handle
4508             channel = NULL;
4509             btstack_linked_list_iterator_init(&it, &l2cap_channels);
4510             while (btstack_linked_list_iterator_has_next(&it)){
4511                 l2cap_channel_t * a_channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4512                 if (!l2cap_is_dynamic_channel_type(a_channel->channel_type)) continue;
4513                 if (a_channel->con_handle   != handle) continue;
4514                 if (a_channel->local_sig_id != sig_id) continue;
4515                 channel = a_channel;
4516                 break;
4517             }
4518             if (!channel) break;
4519 
4520             // cid + 0
4521             result = little_endian_read_16 (command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+8);
4522             if (result){
4523                 channel->state = L2CAP_STATE_CLOSED;
4524                 uint8_t status = l2cap_cbm_status_for_result(result);
4525                 l2cap_cbm_emit_channel_opened(channel, status);
4526 
4527                 // discard channel
4528                 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
4529                 l2cap_free_channel_entry(channel);
4530                 break;
4531             }
4532 
4533             // success
4534             channel->remote_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4535             channel->remote_mtu = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
4536             channel->remote_mps = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 4);
4537             channel->credits_outgoing = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 6);
4538             channel->state = L2CAP_STATE_OPEN;
4539             l2cap_cbm_emit_channel_opened(channel, ERROR_CODE_SUCCESS);
4540             break;
4541 #endif
4542 
4543 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
4544         case L2CAP_FLOW_CONTROL_CREDIT_INDICATION:
4545             return l2cap_credit_based_handle_credit_indication(handle, command, len) ? 1 : 0;
4546 
4547         case DISCONNECTION_REQUEST:
4548             // check size
4549             if (len < 4u) return 0u;
4550 
4551             // find channel
4552             local_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4553             channel = l2cap_get_channel_for_local_cid_and_handle(local_cid, handle);
4554             if (!channel) {
4555                 l2cap_register_signaling_response(handle, DISCONNECTION_REQUEST, sig_id,
4556                                                   little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2), local_cid);
4557                 break;
4558             }
4559             channel->remote_sig_id = sig_id;
4560             channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE;
4561             break;
4562 
4563         case DISCONNECTION_RESPONSE:
4564             // check size
4565             if (len < 4u) return 0u;
4566 
4567             // find channel
4568             local_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4569             channel = l2cap_get_channel_for_local_cid_and_handle(local_cid, handle);
4570             if (!channel) break;
4571             if (channel->local_sig_id == sig_id) {
4572                 if (channel->state == L2CAP_STATE_WAIT_DISCONNECT){
4573                     l2cap_finalize_channel_close(channel);
4574                 }
4575             }
4576             break;
4577 #endif
4578 
4579         default:
4580             // command unknown -> reject command
4581             return 0;
4582     }
4583     return 1;
4584 }
4585 #endif
4586 
4587 #ifdef ENABLE_CLASSIC
4588 static void l2cap_acl_classic_handler_for_channel(l2cap_channel_t * l2cap_channel, uint8_t * packet, uint16_t size){
4589 
4590     // forward data only in OPEN state
4591     if (l2cap_channel->state != L2CAP_STATE_OPEN) return;
4592 
4593 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
4594     if (l2cap_channel->channel_type == L2CAP_CHANNEL_TYPE_CHANNEL_ECBM){
4595         l2cap_credit_based_handle_pdu(l2cap_channel, packet, size);
4596         return;
4597     }
4598 #endif
4599 
4600 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
4601     if (l2cap_channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
4602 
4603         int fcs_size = l2cap_channel->fcs_option ? 2 : 0;
4604 
4605         // assert control + FCS fields are inside
4606         if (size < COMPLETE_L2CAP_HEADER+2+fcs_size) return;
4607 
4608         if (l2cap_channel->fcs_option){
4609             // verify FCS (required if one side requested it)
4610             uint16_t fcs_calculated = crc16_calc(&packet[4], size - (4+2));
4611             uint16_t fcs_packet     = little_endian_read_16(packet, size-2);
4612 
4613 #ifdef L2CAP_ERTM_SIMULATE_FCS_ERROR_INTERVAL
4614             // simulate fcs error
4615             static int counter = 0;
4616             if (++counter == L2CAP_ERTM_SIMULATE_FCS_ERROR_INTERVAL) {
4617                 log_info("Simulate fcs error");
4618                 fcs_calculated++;
4619                 counter = 0;
4620             }
4621 #endif
4622 
4623             if (fcs_calculated == fcs_packet){
4624                 log_info("Packet FCS 0x%04x verified", fcs_packet);
4625             } else {
4626                 log_error("FCS mismatch! Packet 0x%04x, calculated 0x%04x", fcs_packet, fcs_calculated);
4627                 // ERTM State Machine in Bluetooth Spec does not handle 'I-Frame with invalid FCS'
4628                 return;
4629             }
4630         }
4631 
4632         // switch on packet type
4633         uint16_t control = little_endian_read_16(packet, COMPLETE_L2CAP_HEADER);
4634         uint8_t  req_seq = (control >> 8) & 0x3f;
4635         int final = (control >> 7) & 0x01;
4636         if (control & 1){
4637             // S-Frame
4638             int poll  = (control >> 4) & 0x01;
4639             l2cap_supervisory_function_t s = (l2cap_supervisory_function_t) ((control >> 2) & 0x03);
4640             log_info("Control: 0x%04x => Supervisory function %u, ReqSeq %02u", control, (int) s, req_seq);
4641             l2cap_ertm_tx_packet_state_t * tx_state;
4642             switch (s){
4643                 case L2CAP_SUPERVISORY_FUNCTION_RR_RECEIVER_READY:
4644                     log_info("L2CAP_SUPERVISORY_FUNCTION_RR_RECEIVER_READY");
4645                     l2cap_ertm_process_req_seq(l2cap_channel, req_seq);
4646                     if (poll && final){
4647                         // S-frames shall not be transmitted with both the F-bit and the P-bit set to 1 at the same time.
4648                         log_error("P=F=1 in S-Frame");
4649                         break;
4650                     }
4651                     if (poll){
4652                         // check if we did request selective retransmission before <==> we have stored SDU segments
4653                         int i;
4654                         int num_stored_out_of_order_packets = 0;
4655                         for (i=0;i<l2cap_channel->num_rx_buffers;i++){
4656                             int index = l2cap_channel->rx_store_index + i;
4657                             if (index >= l2cap_channel->num_rx_buffers){
4658                                 index -= l2cap_channel->num_rx_buffers;
4659                             }
4660                             l2cap_ertm_rx_packet_state_t * rx_state = &l2cap_channel->rx_packets_state[index];
4661                             if (!rx_state->valid) continue;
4662                             num_stored_out_of_order_packets++;
4663                         }
4664                         if (num_stored_out_of_order_packets){
4665                             l2cap_channel->send_supervisor_frame_selective_reject = 1;
4666                         } else {
4667                             l2cap_channel->send_supervisor_frame_receiver_ready   = 1;
4668                         }
4669                         l2cap_channel->set_final_bit_after_packet_with_poll_bit_set = 1;
4670                     }
4671                     if (final){
4672                         // Stop-MonitorTimer
4673                         l2cap_ertm_stop_monitor_timer(l2cap_channel);
4674                         // If UnackedFrames > 0 then Start-RetransTimer
4675                         if (l2cap_channel->unacked_frames){
4676                             l2cap_ertm_start_retransmission_timer(l2cap_channel);
4677                         }
4678                         // final bit set <- response to RR with poll bit set. All not acknowledged packets need to be retransmitted
4679                         l2cap_ertm_retransmit_unacknowleded_frames(l2cap_channel);
4680                     }
4681                     break;
4682                 case L2CAP_SUPERVISORY_FUNCTION_REJ_REJECT:
4683                     log_info("L2CAP_SUPERVISORY_FUNCTION_REJ_REJECT");
4684                     l2cap_ertm_process_req_seq(l2cap_channel, req_seq);
4685                     // restart transmittion from last unacknowledted packet (earlier packets already freed in l2cap_ertm_process_req_seq)
4686                     l2cap_ertm_retransmit_unacknowleded_frames(l2cap_channel);
4687                     break;
4688                 case L2CAP_SUPERVISORY_FUNCTION_RNR_RECEIVER_NOT_READY:
4689                     log_error("L2CAP_SUPERVISORY_FUNCTION_RNR_RECEIVER_NOT_READY");
4690                     break;
4691                 case L2CAP_SUPERVISORY_FUNCTION_SREJ_SELECTIVE_REJECT:
4692                     log_info("L2CAP_SUPERVISORY_FUNCTION_SREJ_SELECTIVE_REJECT");
4693                     if (poll){
4694                         l2cap_ertm_process_req_seq(l2cap_channel, req_seq);
4695                     }
4696                     // find requested i-frame
4697                     tx_state = l2cap_ertm_get_tx_state(l2cap_channel, req_seq);
4698                     if (tx_state){
4699                         log_info("Retransmission for tx_seq %u requested", req_seq);
4700                         l2cap_channel->set_final_bit_after_packet_with_poll_bit_set = poll;
4701                         tx_state->retransmission_requested = 1;
4702                         l2cap_channel->srej_active = 1;
4703                     }
4704                     break;
4705                 default:
4706                     break;
4707             }
4708         } else {
4709             // I-Frame
4710             // get control
4711             l2cap_segmentation_and_reassembly_t sar = (l2cap_segmentation_and_reassembly_t) (control >> 14);
4712             uint8_t tx_seq = (control >> 1) & 0x3f;
4713             log_info("Control: 0x%04x => SAR %u, ReqSeq %02u, R?, TxSeq %02u", control, (int) sar, req_seq, tx_seq);
4714             log_info("SAR: pos %u", l2cap_channel->reassembly_pos);
4715             log_info("State: expected_tx_seq %02u, req_seq %02u", l2cap_channel->expected_tx_seq, l2cap_channel->req_seq);
4716             l2cap_ertm_process_req_seq(l2cap_channel, req_seq);
4717             if (final){
4718                 // final bit set <- response to RR with poll bit set. All not acknowledged packets need to be retransmitted
4719                 l2cap_ertm_retransmit_unacknowleded_frames(l2cap_channel);
4720             }
4721 
4722             // get SDU
4723             const uint8_t * payload_data = &packet[COMPLETE_L2CAP_HEADER+2];
4724             uint16_t        payload_len  = size-(COMPLETE_L2CAP_HEADER+2+fcs_size);
4725 
4726             // assert SDU size is smaller or equal to our buffers
4727             uint16_t max_payload_size = 0;
4728             switch (sar){
4729                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_UNSEGMENTED_L2CAP_SDU:
4730                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_START_OF_L2CAP_SDU:
4731                     // SDU Length + MPS
4732                     max_payload_size = l2cap_channel->local_mps + 2;
4733                     break;
4734                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_CONTINUATION_OF_L2CAP_SDU:
4735                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_END_OF_L2CAP_SDU:
4736                     max_payload_size = l2cap_channel->local_mps;
4737                     break;
4738                 default:
4739                     btstack_assert(false);
4740                     break;
4741             }
4742             if (payload_len > max_payload_size){
4743                 log_info("payload len %u > max payload %u -> drop packet", payload_len, max_payload_size);
4744                 return;
4745             }
4746 
4747             // check ordering
4748             if (l2cap_channel->expected_tx_seq == tx_seq){
4749                 log_info("Received expected frame with TxSeq == ExpectedTxSeq == %02u", tx_seq);
4750                 l2cap_channel->expected_tx_seq = l2cap_next_ertm_seq_nr(l2cap_channel->expected_tx_seq);
4751                 l2cap_channel->req_seq         = l2cap_channel->expected_tx_seq;
4752 
4753                 // process SDU
4754                 l2cap_ertm_handle_in_sequence_sdu(l2cap_channel, sar, payload_data, payload_len);
4755 
4756                 // process stored segments
4757                 while (true){
4758                     int index = l2cap_channel->rx_store_index;
4759                     l2cap_ertm_rx_packet_state_t * rx_state = &l2cap_channel->rx_packets_state[index];
4760                     if (!rx_state->valid) break;
4761 
4762                     log_info("Processing stored frame with TxSeq == ExpectedTxSeq == %02u", l2cap_channel->expected_tx_seq);
4763                     l2cap_channel->expected_tx_seq = l2cap_next_ertm_seq_nr(l2cap_channel->expected_tx_seq);
4764                     l2cap_channel->req_seq         = l2cap_channel->expected_tx_seq;
4765 
4766                     rx_state->valid = 0;
4767                     l2cap_ertm_handle_in_sequence_sdu(l2cap_channel, rx_state->sar, &l2cap_channel->rx_packets_data[index], rx_state->len);
4768 
4769                     // update rx store index
4770                     index++;
4771                     if (index >= l2cap_channel->num_rx_buffers){
4772                         index = 0;
4773                     }
4774                     l2cap_channel->rx_store_index = index;
4775                 }
4776 
4777                 //
4778                 l2cap_channel->send_supervisor_frame_receiver_ready = 1;
4779 
4780             } else {
4781                 int delta = (tx_seq - l2cap_channel->expected_tx_seq) & 0x3f;
4782                 if (delta < 2){
4783                     // store segment
4784                     l2cap_ertm_handle_out_of_sequence_sdu(l2cap_channel, sar, delta, payload_data, payload_len);
4785 
4786                     log_info("Received unexpected frame TxSeq %u but expected %u -> send S-SREJ", tx_seq, l2cap_channel->expected_tx_seq);
4787                     l2cap_channel->send_supervisor_frame_selective_reject = 1;
4788                 } else {
4789                     log_info("Received unexpected frame TxSeq %u but expected %u -> send S-REJ", tx_seq, l2cap_channel->expected_tx_seq);
4790                     l2cap_channel->send_supervisor_frame_reject = 1;
4791                 }
4792             }
4793         }
4794         return;
4795     }
4796 #endif
4797 
4798     // check size
4799     uint16_t payload_size = size - COMPLETE_L2CAP_HEADER;
4800     if (l2cap_channel->local_mtu < payload_size) return;
4801 
4802     l2cap_dispatch_to_channel(l2cap_channel, L2CAP_DATA_PACKET, &packet[COMPLETE_L2CAP_HEADER], payload_size);
4803 }
4804 #endif
4805 
4806 static void l2cap_acl_classic_handler(hci_con_handle_t handle, uint8_t *packet, uint16_t size){
4807 #ifdef ENABLE_CLASSIC
4808     l2cap_channel_t * l2cap_channel;
4809     l2cap_fixed_channel_t * l2cap_fixed_channel;
4810 
4811     uint16_t channel_id = READ_L2CAP_CHANNEL_ID(packet);
4812     uint8_t  broadcast_flag = READ_ACL_FLAGS(packet) >> 2;
4813     switch (channel_id) {
4814 
4815         case L2CAP_CID_SIGNALING: {
4816             if (broadcast_flag != 0) break;
4817             uint32_t command_offset = 8;
4818             while ((command_offset + L2CAP_SIGNALING_COMMAND_DATA_OFFSET) <= size) {
4819                 // assert signaling command is fully inside packet
4820                 uint16_t data_len = little_endian_read_16(packet, command_offset + L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
4821                 uint32_t next_command_offset = command_offset + L2CAP_SIGNALING_COMMAND_DATA_OFFSET + data_len;
4822                 if (next_command_offset > size){
4823                     log_error("signaling command incomplete -> drop");
4824                     break;
4825                 }
4826                 // handle signaling command
4827                 l2cap_signaling_handler_dispatch(handle, &packet[command_offset]);
4828                 // go to next command
4829                 command_offset = next_command_offset;
4830             }
4831             // handle incomplete packet
4832             if (command_offset < size) {
4833                 log_error("signaling command incomplete -> reject");
4834                 l2cap_register_signaling_response(handle, COMMAND_REJECT, 0, 0, L2CAP_REJ_CMD_UNKNOWN);
4835             }
4836             break;
4837         }
4838 
4839         case L2CAP_CID_CONNECTIONLESS_CHANNEL:
4840             if (broadcast_flag == 0) break;
4841             l2cap_fixed_channel = l2cap_fixed_channel_for_channel_id(L2CAP_CID_CONNECTIONLESS_CHANNEL);
4842             if (!l2cap_fixed_channel) break;
4843             if (!l2cap_fixed_channel->packet_handler) break;
4844             (*l2cap_fixed_channel->packet_handler)(UCD_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
4845             break;
4846 
4847 #ifdef ENABLE_BLE
4848         case L2CAP_CID_BR_EDR_SECURITY_MANAGER:
4849             l2cap_fixed_channel = l2cap_fixed_channel_for_channel_id(L2CAP_CID_BR_EDR_SECURITY_MANAGER);
4850             if ((l2cap_fixed_channel == NULL) || (l2cap_fixed_channel->packet_handler == NULL)){
4851                 // Pairing Failed
4852                 l2cap_register_signaling_response(handle, (uint8_t) SM_PAIRING_FAILED, 0, L2CAP_CID_BR_EDR_SECURITY_MANAGER, SM_REASON_PAIRING_NOT_SUPPORTED);
4853             } else {
4854                 (*l2cap_fixed_channel->packet_handler)(SM_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
4855             }
4856             break;
4857 #endif
4858 
4859         default:
4860             if (broadcast_flag != 0) break;
4861             // Find channel for this channel_id and connection handle
4862             l2cap_channel = l2cap_get_channel_for_local_cid_and_handle(channel_id, handle);
4863             if (l2cap_channel != NULL){
4864                 l2cap_acl_classic_handler_for_channel(l2cap_channel, packet, size);
4865             }
4866             break;
4867     }
4868 #else
4869     UNUSED(handle); // ok: no code
4870     UNUSED(packet); // ok: no code
4871     UNUSED(size);   // ok: no code
4872 #endif
4873 }
4874 
4875 static void l2cap_acl_le_handler(hci_con_handle_t handle, uint8_t *packet, uint16_t size){
4876 #ifdef ENABLE_BLE
4877 
4878     l2cap_fixed_channel_t * l2cap_fixed_channel;
4879 
4880 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4881     l2cap_channel_t * l2cap_channel;
4882 #endif
4883     uint16_t channel_id = READ_L2CAP_CHANNEL_ID(packet);
4884     switch (channel_id) {
4885 
4886         case L2CAP_CID_SIGNALING_LE: {
4887             uint8_t sig_id = packet[COMPLETE_L2CAP_HEADER + 1];
4888             uint16_t len = little_endian_read_16(packet, COMPLETE_L2CAP_HEADER + 2);
4889             if ((COMPLETE_L2CAP_HEADER + 4u + len) > size) break;
4890             int      valid  = l2cap_le_signaling_handler_dispatch(handle, &packet[COMPLETE_L2CAP_HEADER], sig_id);
4891             if (!valid){
4892                 l2cap_register_signaling_response(handle, COMMAND_REJECT_LE, sig_id, 0, L2CAP_REJ_CMD_UNKNOWN);
4893             }
4894             break;
4895         }
4896 
4897         case L2CAP_CID_ATTRIBUTE_PROTOCOL:
4898             l2cap_fixed_channel = l2cap_fixed_channel_for_channel_id(L2CAP_CID_ATTRIBUTE_PROTOCOL);
4899             if (!l2cap_fixed_channel) break;
4900             if (!l2cap_fixed_channel->packet_handler) break;
4901             (*l2cap_fixed_channel->packet_handler)(ATT_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
4902             break;
4903 
4904         case L2CAP_CID_SECURITY_MANAGER_PROTOCOL:
4905             l2cap_fixed_channel = l2cap_fixed_channel_for_channel_id(L2CAP_CID_SECURITY_MANAGER_PROTOCOL);
4906             if ((l2cap_fixed_channel == NULL) || (l2cap_fixed_channel->packet_handler == NULL)){
4907                 // Pairing Failed
4908                 l2cap_register_signaling_response(handle, (uint8_t) SM_PAIRING_FAILED, 0, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, SM_REASON_PAIRING_NOT_SUPPORTED);
4909             } else {
4910                 (*l2cap_fixed_channel->packet_handler)(SM_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
4911             }
4912             break;
4913 
4914         default:
4915 
4916 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4917             l2cap_channel = l2cap_get_channel_for_local_cid_and_handle(channel_id, handle);
4918             if (l2cap_channel != NULL) {
4919                 l2cap_credit_based_handle_pdu(l2cap_channel, packet, size);
4920             }
4921 #endif
4922             break;
4923     }
4924 #else
4925     UNUSED(handle); // ok: no code
4926     UNUSED(packet); // ok: no code
4927     UNUSED(size);   // ok: no code
4928 #endif
4929 }
4930 
4931 static void l2cap_acl_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
4932     UNUSED(packet_type);    // ok: registered with hci_register_acl_packet_handler
4933     UNUSED(channel);        // ok: there is no channel
4934 
4935     // Assert full L2CAP header present
4936     if (size < COMPLETE_L2CAP_HEADER) return;
4937 
4938     // Dispatch to Classic or LE handler (SCO packets are not dispatched to L2CAP)
4939     hci_con_handle_t handle = READ_ACL_CONNECTION_HANDLE(packet);
4940     hci_connection_t *conn = hci_connection_for_handle(handle);
4941     if (!conn) return;
4942     if (conn->address_type == BD_ADDR_TYPE_ACL){
4943         l2cap_acl_classic_handler(handle, packet, size);
4944     } else {
4945         l2cap_acl_le_handler(handle, packet, size);
4946     }
4947 
4948     l2cap_run();
4949 }
4950 
4951 // Bluetooth 4.0 - allows to register handler for Attribute Protocol and Security Manager Protocol
4952 void l2cap_register_fixed_channel(btstack_packet_handler_t packet_handler, uint16_t channel_id) {
4953     l2cap_fixed_channel_t * channel = l2cap_fixed_channel_for_channel_id(channel_id);
4954     if (!channel) return;
4955     channel->packet_handler = packet_handler;
4956 }
4957 
4958 #ifdef L2CAP_USES_CHANNELS
4959 // finalize closed channel - l2cap_handle_disconnect_request & DISCONNECTION_RESPONSE
4960 void l2cap_finalize_channel_close(l2cap_channel_t * channel){
4961     channel->state = L2CAP_STATE_CLOSED;
4962     l2cap_handle_channel_closed(channel);
4963     // discard channel
4964     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
4965     l2cap_free_channel_entry(channel);
4966 }
4967 #endif
4968 
4969 #ifdef ENABLE_CLASSIC
4970 static inline l2cap_service_t * l2cap_get_service(uint16_t psm){
4971     return l2cap_get_service_internal(&l2cap_services, psm);
4972 }
4973 
4974 static void l2cap_update_minimal_security_level(void){
4975     // update minimal service security level
4976     gap_security_level_t minimal_level = LEVEL_1;
4977     btstack_linked_list_iterator_t it;
4978     btstack_linked_list_iterator_init(&it, &l2cap_services);
4979     while (btstack_linked_list_iterator_has_next(&it)){
4980         l2cap_service_t * service = (l2cap_service_t *) btstack_linked_list_iterator_next(&it);
4981         if (service->required_security_level > minimal_level){
4982             minimal_level = service->required_security_level;
4983         };
4984     }
4985     gap_set_minimal_service_security_level(minimal_level);
4986 }
4987 
4988 uint8_t l2cap_register_service(btstack_packet_handler_t service_packet_handler, uint16_t psm, uint16_t mtu, gap_security_level_t security_level){
4989 
4990     log_info("L2CAP_REGISTER_SERVICE psm 0x%x mtu %u", psm, mtu);
4991 
4992     // check for alread registered psm
4993     l2cap_service_t *service = l2cap_get_service(psm);
4994     if (service) {
4995         log_error("register: PSM %u already registered", psm);
4996         return L2CAP_SERVICE_ALREADY_REGISTERED;
4997     }
4998 
4999     // alloc structure
5000     service = btstack_memory_l2cap_service_get();
5001     if (!service) {
5002         log_error("register: no memory for l2cap_service_t");
5003         return BTSTACK_MEMORY_ALLOC_FAILED;
5004     }
5005 
5006     // fill in
5007     service->psm = psm;
5008     service->mtu = mtu;
5009     service->packet_handler = service_packet_handler;
5010     service->required_security_level = security_level;
5011 
5012     // add to services list
5013     btstack_linked_list_add(&l2cap_services, (btstack_linked_item_t *) service);
5014 
5015     l2cap_update_minimal_security_level();
5016 
5017 #ifndef ENABLE_EXPLICIT_CONNECTABLE_MODE_CONTROL
5018     // enable page scan
5019     gap_connectable_control(1);
5020 #endif
5021 
5022 
5023     return ERROR_CODE_SUCCESS;
5024 }
5025 
5026 uint8_t l2cap_unregister_service(uint16_t psm){
5027 
5028     log_info("unregister psm 0x%x", psm);
5029 
5030     l2cap_service_t *service = l2cap_get_service(psm);
5031     if (!service) return L2CAP_SERVICE_DOES_NOT_EXIST;
5032     btstack_linked_list_remove(&l2cap_services, (btstack_linked_item_t *) service);
5033     btstack_memory_l2cap_service_free(service);
5034 
5035     l2cap_update_minimal_security_level();
5036 
5037 #ifndef ENABLE_EXPLICIT_CONNECTABLE_MODE_CONTROL
5038     // disable page scan when no services registered
5039     if (btstack_linked_list_empty(&l2cap_services)) {
5040         gap_connectable_control(0);
5041     }
5042 #endif
5043 
5044     return ERROR_CODE_SUCCESS;
5045 }
5046 #endif
5047 
5048 
5049 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
5050 
5051 static void l2cap_credit_based_send_pdu(l2cap_channel_t *channel) {
5052     btstack_assert(channel != NULL);
5053     btstack_assert(channel->send_sdu_buffer != NULL);
5054     btstack_assert(channel->credits_outgoing > 0);
5055 
5056     // send part of SDU
5057     hci_reserve_packet_buffer();
5058     uint8_t *acl_buffer = hci_get_outgoing_packet_buffer();
5059     uint8_t *l2cap_payload = acl_buffer + 8;
5060     uint16_t pos = 0;
5061     if (!channel->send_sdu_pos) {
5062         // store SDU len
5063         channel->send_sdu_pos += 2u;
5064         little_endian_store_16(l2cap_payload, pos, channel->send_sdu_len);
5065         pos += 2u;
5066     }
5067     uint16_t payload_size = btstack_min(channel->send_sdu_len + 2u - channel->send_sdu_pos, channel->remote_mps - pos);
5068     log_info("len %u, pos %u => payload %u, credits %u", channel->send_sdu_len, channel->send_sdu_pos, payload_size,
5069              channel->credits_outgoing);
5070     (void) memcpy(&l2cap_payload[pos],
5071                   &channel->send_sdu_buffer[channel->send_sdu_pos - 2u],
5072                   payload_size); // -2 for virtual SDU len
5073     pos += payload_size;
5074     channel->send_sdu_pos += payload_size;
5075     l2cap_setup_header(acl_buffer, channel->con_handle, 0, channel->remote_cid, pos);
5076 
5077     channel->credits_outgoing--;
5078 
5079     // update state (mark SDU as done) before calling hci_send_acl_packet_buffer (trigger l2cap_le_send_pdu again)
5080     bool done = channel->send_sdu_pos >= (channel->send_sdu_len + 2u);
5081     if (done) {
5082         channel->send_sdu_buffer = NULL;
5083     }
5084 
5085     hci_send_acl_packet_buffer(8u + pos);
5086 
5087     if (done) {
5088         // send done event
5089         l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_PACKET_SENT);
5090         // inform about can send now
5091         l2cap_credit_based_notify_channel_can_send(channel);
5092     }
5093 }
5094 
5095 static uint8_t l2cap_credit_based_send_data(l2cap_channel_t * channel, const uint8_t * data, uint16_t size){
5096 
5097     if (size > channel->remote_mtu){
5098         log_error("l2cap send, cid 0x%02x, data length exceeds remote MTU.", channel->local_cid);
5099         return L2CAP_DATA_LEN_EXCEEDS_REMOTE_MTU;
5100     }
5101 
5102     if (channel->send_sdu_buffer){
5103         log_info("l2cap send, cid 0x%02x, cannot send", channel->local_cid);
5104         return BTSTACK_ACL_BUFFERS_FULL;
5105     }
5106 
5107     channel->send_sdu_buffer = data;
5108     channel->send_sdu_len    = size;
5109     channel->send_sdu_pos    = 0;
5110 
5111     l2cap_notify_channel_can_send();
5112     return ERROR_CODE_SUCCESS;
5113 }
5114 
5115 static uint8_t l2cap_credit_based_provide_credits(uint16_t local_cid, uint16_t credits){
5116     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5117     if (!channel) {
5118         log_error("le credits no channel for cid 0x%02x", local_cid);
5119         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5120     }
5121 
5122     // check state
5123     if (channel->state != L2CAP_STATE_OPEN){
5124         log_error("le credits but channel 0x%02x not open yet", local_cid);
5125     }
5126 
5127     // ignore if set to automatic credits
5128     if (channel->automatic_credits) return ERROR_CODE_SUCCESS;
5129 
5130     // assert incoming credits + credits <= 0xffff
5131     uint32_t total_credits = channel->credits_incoming;
5132     total_credits += channel->new_credits_incoming;
5133     total_credits += credits;
5134     if (total_credits > 0xffffu){
5135         log_error("le credits overrun: current %u, scheduled %u, additional %u", channel->credits_incoming,
5136                   channel->new_credits_incoming, credits);
5137     }
5138 
5139     // set credits_granted
5140     channel->new_credits_incoming += credits;
5141 
5142     // go
5143     l2cap_run();
5144     return ERROR_CODE_SUCCESS;
5145 }
5146 
5147 static void l2cap_credit_based_send_credits(l2cap_channel_t *channel) {
5148     log_info("l2cap: sending %u credits", channel->new_credits_incoming);
5149     channel->local_sig_id = l2cap_next_sig_id();
5150     uint16_t new_credits = channel->new_credits_incoming;
5151     channel->new_credits_incoming = 0;
5152     channel->credits_incoming += new_credits;
5153     uint16_t signaling_cid = channel->address_type == BD_ADDR_TYPE_ACL ? L2CAP_CID_SIGNALING : L2CAP_CID_SIGNALING_LE;
5154     l2cap_send_general_signaling_packet(channel->con_handle, signaling_cid, L2CAP_FLOW_CONTROL_CREDIT_INDICATION, channel->local_sig_id, channel->local_cid, new_credits);
5155 }
5156 
5157 // @return valid
5158 static bool l2cap_credit_based_handle_credit_indication(hci_con_handle_t handle, const uint8_t * command, uint16_t len){
5159     // check size
5160     if (len < 4u) return false;
5161 
5162     // find channel
5163     uint16_t remote_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
5164     l2cap_channel_t * channel = l2cap_get_channel_for_remote_handle_and_cid(handle, remote_cid);
5165     if (!channel) {
5166         log_error("credit: no channel for handle 0x%04x/cid 0x%02x", handle, remote_cid);
5167         return true;
5168     }
5169     uint16_t new_credits = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
5170     uint16_t credits_before = channel->credits_outgoing;
5171     channel->credits_outgoing += new_credits;
5172     // check for credit overrun
5173     if (credits_before > channel->credits_outgoing) {
5174         log_error("credit: new credits caused overrrun for cid 0x%02x, disconnecting", channel->local_cid);
5175         channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5176         return true;
5177     }
5178     log_info("credit: %u credits for 0x%02x, now %u", new_credits, channel->local_cid, channel->credits_outgoing);
5179     l2cap_call_notify_channel_in_run = true;
5180     return true;
5181 }
5182 
5183 static void l2cap_credit_based_handle_pdu(l2cap_channel_t * l2cap_channel, const uint8_t * packet, uint16_t size){
5184     // ignore empty packets
5185     if (size == COMPLETE_L2CAP_HEADER) return;
5186 
5187     // credit counting
5188     if (l2cap_channel->credits_incoming == 0u){
5189         log_info("(e)CBM: packet received but no incoming credits");
5190         l2cap_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5191         return;
5192     }
5193     l2cap_channel->credits_incoming--;
5194 
5195     // automatic credits
5196     if ((l2cap_channel->credits_incoming < L2CAP_CREDIT_BASED_FLOW_CONTROL_MODE_AUTOMATIC_CREDITS_WATERMARK) && l2cap_channel->automatic_credits){
5197         l2cap_channel->new_credits_incoming = L2CAP_CREDIT_BASED_FLOW_CONTROL_MODE_AUTOMATIC_CREDITS_INCREMENT;
5198     }
5199 
5200     // first fragment
5201     uint16_t pos = 0;
5202     if (!l2cap_channel->receive_sdu_len){
5203         if (size < (COMPLETE_L2CAP_HEADER + 2)) return;
5204         uint16_t sdu_len = little_endian_read_16(packet, COMPLETE_L2CAP_HEADER);
5205         if (sdu_len > l2cap_channel->local_mtu) {
5206             log_info("(e)CBM: packet received larger than MTU");
5207             l2cap_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5208             return;
5209         }
5210         l2cap_channel->receive_sdu_len = sdu_len;
5211         l2cap_channel->receive_sdu_pos = 0;
5212         pos  += 2u;
5213         size -= 2u;
5214     }
5215 
5216     uint16_t fragment_size   = size-COMPLETE_L2CAP_HEADER;
5217 
5218     // check fragment_size
5219     if (fragment_size > l2cap_channel->local_mps) {
5220         log_info("(e)CBM: fragment larger than local MPS");
5221         l2cap_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5222         return;
5223     }
5224 
5225     // check sdu overrun
5226     if ((l2cap_channel->receive_sdu_pos + fragment_size) > l2cap_channel->receive_sdu_len){
5227         log_info("(e)CBM: fragments larger than SDU");
5228         l2cap_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5229         return;
5230     }
5231 
5232     (void)memcpy(&l2cap_channel->receive_sdu_buffer[l2cap_channel->receive_sdu_pos],
5233                  &packet[COMPLETE_L2CAP_HEADER + pos],
5234                  fragment_size);
5235     l2cap_channel->receive_sdu_pos += fragment_size;
5236 
5237     // done?
5238     log_debug("le packet pos %u, len %u", l2cap_channel->receive_sdu_pos, l2cap_channel->receive_sdu_len);
5239     if (l2cap_channel->receive_sdu_pos >= l2cap_channel->receive_sdu_len){
5240         l2cap_dispatch_to_channel(l2cap_channel, L2CAP_DATA_PACKET, l2cap_channel->receive_sdu_buffer, l2cap_channel->receive_sdu_len);
5241         l2cap_channel->receive_sdu_len = 0;
5242     }
5243 }
5244 
5245 static void l2cap_credit_based_notify_channel_can_send(l2cap_channel_t *channel){
5246     if (!channel->waiting_for_can_send_now) return;
5247     if (channel->send_sdu_buffer) return;
5248     channel->waiting_for_can_send_now = 0;
5249     log_debug("le can send now, local_cid 0x%x", channel->local_cid);
5250     l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_CAN_SEND_NOW);
5251 }
5252 #endif
5253 
5254 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
5255 // 1BH2222
5256 static void l2cap_cbm_emit_incoming_connection(l2cap_channel_t *channel) {
5257     log_info("le incoming addr_type %u, addr %s handle 0x%x psm 0x%x local_cid 0x%x remote_cid 0x%x, remote_mtu %u",
5258              channel->address_type, bd_addr_to_str(channel->address), channel->con_handle,  channel->psm, channel->local_cid, channel->remote_cid, channel->remote_mtu);
5259     uint8_t event[19];
5260     event[0] = L2CAP_EVENT_CBM_INCOMING_CONNECTION;
5261     event[1] = sizeof(event) - 2u;
5262     event[2] = channel->address_type;
5263     reverse_bd_addr(channel->address, &event[3]);
5264     little_endian_store_16(event,  9, channel->con_handle);
5265     little_endian_store_16(event, 11, channel->psm);
5266     little_endian_store_16(event, 13, channel->local_cid);
5267     little_endian_store_16(event, 15, channel->remote_cid);
5268     little_endian_store_16(event, 17, channel->remote_mtu);
5269     hci_dump_packet( HCI_EVENT_PACKET, 1, event, sizeof(event));
5270     l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
5271 }
5272 // 11BH22222
5273 static void l2cap_cbm_emit_channel_opened(l2cap_channel_t *channel, uint8_t status) {
5274     log_info("opened le channel status 0x%x addr_type %u addr %s handle 0x%x psm 0x%x local_cid 0x%x remote_cid 0x%x local_mtu %u, remote_mtu %u",
5275              status, channel->address_type, bd_addr_to_str(channel->address), channel->con_handle, channel->psm,
5276              channel->local_cid, channel->remote_cid, channel->local_mtu, channel->remote_mtu);
5277     uint8_t event[23];
5278     event[0] = L2CAP_EVENT_CBM_CHANNEL_OPENED;
5279     event[1] = sizeof(event) - 2u;
5280     event[2] = status;
5281     event[3] = channel->address_type;
5282     reverse_bd_addr(channel->address, &event[4]);
5283     little_endian_store_16(event, 10, channel->con_handle);
5284     event[12] = (channel->state_var & L2CAP_CHANNEL_STATE_VAR_INCOMING) ? 1 : 0;
5285     little_endian_store_16(event, 13, channel->psm);
5286     little_endian_store_16(event, 15, channel->local_cid);
5287     little_endian_store_16(event, 17, channel->remote_cid);
5288     little_endian_store_16(event, 19, channel->local_mtu);
5289     little_endian_store_16(event, 21, channel->remote_mtu);
5290     hci_dump_packet( HCI_EVENT_PACKET, 1, event, sizeof(event));
5291     l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
5292 }
5293 
5294 // finalize closed channel - l2cap_handle_disconnect_request & DISCONNECTION_RESPONSE
5295 void l2cap_cbm_finialize_channel_close(l2cap_channel_t * channel){
5296     channel->state = L2CAP_STATE_CLOSED;
5297     l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_CHANNEL_CLOSED);
5298     // discard channel
5299     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
5300     l2cap_free_channel_entry(channel);
5301 }
5302 
5303 static inline l2cap_service_t * l2cap_cbm_get_service(uint16_t le_psm){
5304     return l2cap_get_service_internal(&l2cap_le_services, le_psm);
5305 }
5306 
5307 uint8_t l2cap_cbm_register_service(btstack_packet_handler_t packet_handler, uint16_t psm, gap_security_level_t security_level){
5308 
5309     log_info("l2cap_cbm_register_service psm 0x%x", psm);
5310 
5311     // check for alread registered psm
5312     l2cap_service_t *service = l2cap_cbm_get_service(psm);
5313     if (service) {
5314         return L2CAP_SERVICE_ALREADY_REGISTERED;
5315     }
5316 
5317     // alloc structure
5318     service = btstack_memory_l2cap_service_get();
5319     if (!service) {
5320         log_error("register: no memory for l2cap_service_t");
5321         return BTSTACK_MEMORY_ALLOC_FAILED;
5322     }
5323 
5324     // fill in
5325     service->psm = psm;
5326     service->mtu = 0;
5327     service->packet_handler = packet_handler;
5328     service->required_security_level = security_level;
5329     service->requires_authorization = false;
5330 
5331     // add to services list
5332     btstack_linked_list_add(&l2cap_le_services, (btstack_linked_item_t *) service);
5333 
5334     // done
5335     return ERROR_CODE_SUCCESS;
5336 }
5337 
5338 uint8_t l2cap_cbm_unregister_service(uint16_t psm) {
5339     log_info("l2cap_cbm_unregister_service psm 0x%x", psm);
5340     l2cap_service_t *service = l2cap_cbm_get_service(psm);
5341     if (!service) return L2CAP_SERVICE_DOES_NOT_EXIST;
5342 
5343     btstack_linked_list_remove(&l2cap_le_services, (btstack_linked_item_t *) service);
5344     btstack_memory_l2cap_service_free(service);
5345     return ERROR_CODE_SUCCESS;
5346 }
5347 
5348 uint8_t l2cap_cbm_accept_connection(uint16_t local_cid, uint8_t * receive_sdu_buffer, uint16_t mtu, uint16_t initial_credits){
5349     // get channel
5350     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5351     if (!channel) return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5352 
5353     // validate state
5354     if (channel->state != L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT){
5355         return ERROR_CODE_COMMAND_DISALLOWED;
5356     }
5357 
5358     // set state accept connection
5359     channel->state = L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_ACCEPT;
5360     channel->receive_sdu_buffer = receive_sdu_buffer;
5361     channel->local_mtu = mtu;
5362     channel->new_credits_incoming = initial_credits;
5363     channel->automatic_credits  = initial_credits == L2CAP_LE_AUTOMATIC_CREDITS;
5364 
5365     // go
5366     l2cap_run();
5367     return ERROR_CODE_SUCCESS;
5368 }
5369 
5370 uint8_t l2cap_cbm_decline_connection(uint16_t local_cid, uint16_t result) {
5371     // get channel
5372     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5373     if (!channel) return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5374 
5375     // validate state
5376     if (channel->state != L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT){
5377         return ERROR_CODE_COMMAND_DISALLOWED;
5378     }
5379 
5380     // set state decline connection
5381     channel->state  = L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_DECLINE;
5382     channel->reason = result;
5383     l2cap_run();
5384     return ERROR_CODE_SUCCESS;
5385 }
5386 
5387 static gap_security_level_t l2cap_cbm_security_level_for_connection(hci_con_handle_t con_handle){
5388     uint8_t encryption_key_size = gap_encryption_key_size(con_handle);
5389     if (encryption_key_size == 0) return LEVEL_0;
5390 
5391     bool authenticated = gap_authenticated(con_handle);
5392     if (!authenticated) return LEVEL_2;
5393 
5394     return encryption_key_size == 16 ? LEVEL_4 : LEVEL_3;
5395 }
5396 
5397 // used to handle pairing complete after triggering to increase
5398 static void l2cap_cbm_sm_packet_handler(uint8_t packet_type, uint16_t channel_nr, uint8_t *packet, uint16_t size) {
5399     UNUSED(channel_nr);
5400     UNUSED(size);
5401     UNUSED(packet_type);
5402     btstack_assert(packet_type == HCI_EVENT_PACKET);
5403     if (hci_event_packet_get_type(packet) != SM_EVENT_PAIRING_COMPLETE) return;
5404     hci_con_handle_t con_handle = sm_event_pairing_complete_get_handle(packet);
5405     btstack_linked_list_iterator_t it;
5406     btstack_linked_list_iterator_init(&it, &l2cap_channels);
5407     while (btstack_linked_list_iterator_has_next(&it)) {
5408         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
5409         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
5410         if (channel->con_handle != con_handle) continue;
5411         if (channel->state != L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE) continue;
5412 
5413         // found channel, check security level
5414         if (l2cap_cbm_security_level_for_connection(con_handle) < channel->required_security_level){
5415             // pairing failed or wasn't good enough, inform user
5416             l2cap_cbm_emit_channel_opened(channel, ERROR_CODE_INSUFFICIENT_SECURITY);
5417             // discard channel
5418             btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
5419             l2cap_free_channel_entry(channel);
5420         } else {
5421             // send conn request now
5422             channel->state = L2CAP_STATE_WILL_SEND_LE_CONNECTION_REQUEST;
5423             l2cap_run();
5424         }
5425     }
5426 }
5427 
5428 uint8_t l2cap_cbm_create_channel(btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle,
5429     uint16_t psm, uint8_t * receive_sdu_buffer, uint16_t mtu, uint16_t initial_credits, gap_security_level_t security_level,
5430     uint16_t * out_local_cid) {
5431 
5432     static btstack_packet_callback_registration_t sm_event_callback_registration;
5433     static bool sm_callback_registered = false;
5434 
5435     log_info("create, handle 0x%04x psm 0x%x mtu %u", con_handle, psm, mtu);
5436 
5437     hci_connection_t * connection = hci_connection_for_handle(con_handle);
5438     if (!connection) {
5439         log_error("no hci_connection for handle 0x%04x", con_handle);
5440         return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
5441     }
5442 
5443     l2cap_channel_t * channel = l2cap_create_channel_entry(packet_handler, L2CAP_CHANNEL_TYPE_CHANNEL_CBM, connection->address, connection->address_type, psm, mtu, security_level);
5444     if (!channel) {
5445         return BTSTACK_MEMORY_ALLOC_FAILED;
5446     }
5447     log_info("created %p", channel);
5448 
5449     // store local_cid
5450     if (out_local_cid){
5451        *out_local_cid = channel->local_cid;
5452     }
5453 
5454     // setup channel entry
5455     channel->con_handle = con_handle;
5456     channel->receive_sdu_buffer = receive_sdu_buffer;
5457     channel->new_credits_incoming = initial_credits;
5458     channel->automatic_credits    = initial_credits == L2CAP_LE_AUTOMATIC_CREDITS;
5459 
5460     // add to connections list
5461     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
5462 
5463     // check security level
5464     if (l2cap_cbm_security_level_for_connection(con_handle) < channel->required_security_level){
5465         if (!sm_callback_registered){
5466             sm_callback_registered = true;
5467             // lazy registration for SM events
5468             sm_event_callback_registration.callback = &l2cap_cbm_sm_packet_handler;
5469             sm_add_event_handler(&sm_event_callback_registration);
5470         }
5471 
5472         // start pairing
5473         channel->state = L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE;
5474         sm_request_pairing(con_handle);
5475     } else {
5476         // send conn request right away
5477         channel->state = L2CAP_STATE_WILL_SEND_LE_CONNECTION_REQUEST;
5478         l2cap_run();
5479     }
5480 
5481     return ERROR_CODE_SUCCESS;
5482 }
5483 
5484 uint8_t l2cap_cbm_provide_credits(uint16_t local_cid, uint16_t credits){
5485     return l2cap_credit_based_provide_credits(local_cid, credits);
5486 }
5487 #endif
5488 
5489 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
5490 
5491 uint8_t l2cap_ecbm_register_service(btstack_packet_handler_t packet_handler, uint16_t psm, uint16_t min_remote_mtu,
5492                                     gap_security_level_t security_level, bool authorization_required) {
5493 
5494     // check for already registered psm
5495     l2cap_service_t *service = l2cap_ecbm_get_service(psm);
5496     if (service) {
5497         return L2CAP_SERVICE_ALREADY_REGISTERED;
5498     }
5499 
5500     // alloc structure
5501     service = btstack_memory_l2cap_service_get();
5502     if (!service) {
5503         log_error("register: no memory for l2cap_service_t");
5504         return BTSTACK_MEMORY_ALLOC_FAILED;
5505     }
5506 
5507     // fill in
5508     service->psm = psm;
5509     service->mtu = min_remote_mtu;
5510     service->packet_handler = packet_handler;
5511     service->required_security_level = security_level;
5512     service->requires_authorization = authorization_required;
5513 
5514     // add to services list
5515     btstack_linked_list_add(&l2cap_enhanced_services, (btstack_linked_item_t *) service);
5516 
5517     // done
5518     return ERROR_CODE_SUCCESS;
5519 }
5520 
5521 uint8_t l2cap_ecbm_unregister_service(uint16_t psm) {
5522     l2cap_service_t *service = l2cap_ecbm_get_service(psm);
5523     if (!service) return L2CAP_SERVICE_DOES_NOT_EXIST;
5524 
5525     btstack_linked_list_remove(&l2cap_enhanced_services, (btstack_linked_item_t *) service);
5526     btstack_memory_l2cap_service_free(service);
5527     return ERROR_CODE_SUCCESS;
5528 }
5529 
5530 void l2cap_ecbm_mps_set_min(uint16_t mps_min){
5531     l2cap_enhanced_mps_min = mps_min;
5532 }
5533 
5534 void l2cap_ecbm_mps_set_max(uint16_t mps_max){
5535     l2cap_enhanced_mps_max = mps_max;
5536 }
5537 
5538 uint8_t l2cap_ecbm_create_channels(btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle,
5539                                        gap_security_level_t security_level,
5540                                        uint16_t psm, uint8_t num_channels, uint16_t initial_credits, uint16_t mtu,
5541                                        uint8_t ** receive_sdu_buffers, uint16_t * out_local_cid){
5542 
5543     log_info("create enhanced, handle 0x%04x psm 0x%x mtu %u", con_handle, psm, mtu);
5544 
5545     hci_connection_t * connection = hci_connection_for_handle(con_handle);
5546     if (!connection) {
5547         log_error("no hci_connection for handle 0x%04x", con_handle);
5548         return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
5549     }
5550 
5551     // setup all channels
5552     btstack_linked_list_t channels = NULL;
5553     uint8_t status = l2cap_ecbm_setup_channels(&channels, packet_handler, num_channels, connection, psm, mtu,
5554                                                security_level);
5555     uint16_t local_mps = btstack_min(l2cap_enhanced_mps_max, btstack_min(l2cap_max_le_mtu(), mtu));
5556 
5557     // add to connections list and set state + local_sig_id
5558     l2cap_channel_t * channel;
5559     uint8_t i = 0;
5560     uint8_t local_sig_id = l2cap_next_sig_id();
5561     while (true) {
5562         channel = (l2cap_channel_t *) btstack_linked_list_pop(&channels);
5563         if (channel == NULL) break;
5564         channel->state              = L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_REQUEST;
5565         channel->local_sig_id       = local_sig_id;
5566         channel->local_mps = local_mps;
5567         channel->cid_index = i;
5568         channel->num_cids = num_channels;
5569         channel->credits_incoming   = initial_credits;
5570         channel->automatic_credits  = initial_credits == L2CAP_LE_AUTOMATIC_CREDITS;
5571         channel->receive_sdu_buffer = receive_sdu_buffers[i];
5572         // store local_cid
5573         if (out_local_cid){
5574             out_local_cid[i] = channel->local_cid;
5575         }
5576         btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
5577         i++;
5578     }
5579 
5580 #if 0
5581     // check security level
5582     if (l2cap_le_security_level_for_connection(con_handle) < channel->required_security_level){
5583         if (!sm_callback_registered){
5584             sm_callback_registered = true;
5585             // lazy registration for SM events
5586             sm_event_callback_registration.callback = &l2cap_sm_packet_handler;
5587             sm_add_event_handler(&sm_event_callback_registration);
5588         }
5589 
5590         // start pairing
5591         channel->state = L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE;
5592         sm_request_pairing(con_handle);
5593     } else {
5594         // send conn request right away
5595         channel->state = L2CAP_STATE_WILL_SEND_LE_CONNECTION_REQUEST;
5596         l2cap_run();
5597     }
5598 #endif
5599 
5600     l2cap_run();
5601 
5602     return status;
5603 }
5604 
5605 uint8_t l2cap_ecbm_accept_channels(uint16_t local_cid, uint8_t num_channels, uint16_t initial_credits,
5606                                             uint16_t receive_buffer_size, uint8_t ** receive_buffers, uint16_t * out_local_cids){
5607 
5608     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5609     if (!channel) {
5610 
5611         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5612     }
5613 
5614     uint16_t local_mps = btstack_min(l2cap_enhanced_mps_max, btstack_min(l2cap_max_le_mtu(), receive_buffer_size));
5615 
5616     //
5617     hci_con_handle_t  con_handle    = channel->con_handle;
5618     uint8_t           local_sig_id  = channel->local_sig_id;
5619     uint8_t           channel_index = 0;
5620     btstack_linked_list_iterator_t it;
5621     btstack_linked_list_iterator_init(&it, &l2cap_channels);
5622     while (btstack_linked_list_iterator_has_next(&it)) {
5623         channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
5624         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
5625         if (channel->con_handle != con_handle) continue;
5626         if (channel->local_sig_id != local_sig_id) continue;
5627         if (channel->state != L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT) continue;
5628 
5629         if (channel_index < num_channels){
5630             // assign buffer and cid
5631             out_local_cids[channel_index] = channel->local_cid;
5632             channel->receive_sdu_buffer = receive_buffers[channel_index];
5633             channel->local_mtu = receive_buffer_size;
5634             channel->local_mps = local_mps;
5635             channel->credits_incoming   = initial_credits;
5636             channel->automatic_credits  = initial_credits == L2CAP_LE_AUTOMATIC_CREDITS;
5637             channel_index++;
5638         } else {
5639             // clear local cid for response packet
5640             channel->local_cid = 0;
5641             channel->reason = L2CAP_ECBM_CONNECTION_RESULT_SOME_REFUSED_INSUFFICIENT_RESOURCES_AVAILABLE;
5642         }
5643         // update state
5644         channel->state = L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE;
5645     }
5646     l2cap_run_trigger();
5647     return ERROR_CODE_SUCCESS;
5648 }
5649 
5650 uint8_t l2cap_ecbm_decline_channels(uint16_t local_cid, uint16_t result){
5651     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5652     if (!channel) {
5653         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5654     }
5655     //
5656     hci_con_handle_t  con_handle    = channel->con_handle;
5657     uint8_t           local_sig_id  = channel->local_sig_id;
5658     btstack_linked_list_iterator_t it;
5659     btstack_linked_list_iterator_init(&it, &l2cap_channels);
5660     while (btstack_linked_list_iterator_has_next(&it)) {
5661         channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
5662         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
5663         if (channel->con_handle != con_handle) continue;
5664         if (channel->local_sig_id != local_sig_id) continue;
5665         if (channel->state != L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT) continue;
5666 
5667         // prepare response
5668         channel->local_cid = 0;
5669         channel->reason = result;
5670         channel->state = L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE;
5671     }
5672     l2cap_run_trigger();
5673     return ERROR_CODE_SUCCESS;
5674 }
5675 
5676 uint8_t l2cap_ecbm_reconfigure_channels(uint8_t num_cids, uint16_t * local_cids, int16_t receive_buffer_size, uint8_t ** receive_buffers){
5677     btstack_assert(receive_buffers != NULL);
5678     btstack_assert(local_cids != NULL);
5679 
5680     if (num_cids > L2CAP_ECBM_MAX_CID_ARRAY_SIZE){
5681         return ERROR_CODE_UNACCEPTABLE_CONNECTION_PARAMETERS;
5682     }
5683 
5684     // check if all cids exist and have the same con handle
5685     uint8_t i;
5686     hci_con_handle_t con_handle = HCI_CON_HANDLE_INVALID;
5687     for (i = 0 ; i < num_cids ; i++){
5688         l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cids[i]);
5689         if (!channel) {
5690             return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5691         }
5692         if (channel->state != L2CAP_STATE_OPEN){
5693             return ERROR_CODE_COMMAND_DISALLOWED;
5694         }
5695         if (con_handle == HCI_CON_HANDLE_INVALID){
5696             con_handle = channel->con_handle;
5697         } else if (con_handle != channel->con_handle){
5698             return ERROR_CODE_UNACCEPTABLE_CONNECTION_PARAMETERS;
5699         }
5700     }
5701     // set renegotiation data and state
5702     uint8_t sig_id = l2cap_next_sig_id();
5703     for (i = 0 ; i < num_cids ; i++){
5704         l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cids[i]);
5705         channel->cid_index = i;
5706         channel->num_cids = num_cids;
5707         channel->local_sig_id = sig_id;
5708         channel->renegotiate_mtu = receive_buffer_size;
5709         channel->renegotiate_sdu_buffer = receive_buffers[i];
5710         channel->state = L2CAP_STATE_WILL_SEND_EHNANCED_RENEGOTIATION_REQUEST;
5711     }
5712 
5713 
5714     l2cap_run();
5715     return ERROR_CODE_SUCCESS;
5716 }
5717 
5718 uint8_t l2cap_ecbm_provide_credits(uint16_t local_cid, uint16_t credits){
5719     return l2cap_credit_based_provide_credits(local_cid, credits);
5720 }
5721 #endif
5722 
5723 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
5724 // @deprecated - please use l2cap_ertm_create_channel
5725 uint8_t l2cap_create_ertm_channel(btstack_packet_handler_t packet_handler, bd_addr_t address, uint16_t psm,
5726                                   l2cap_ertm_config_t * ertm_contig, uint8_t * buffer, uint32_t size, uint16_t * out_local_cid){
5727     log_error("deprecated - please use l2cap_ertm_create_channel");
5728     return l2cap_ertm_create_channel(packet_handler, address, psm, ertm_contig, buffer, size, out_local_cid);
5729 };
5730 
5731 // @deprecated - please use l2cap_ertm_accept_connection
5732 uint8_t l2cap_accept_ertm_connection(uint16_t local_cid, l2cap_ertm_config_t * ertm_contig, uint8_t * buffer, uint32_t size){
5733     log_error("deprecated - please use l2cap_ertm_accept_connection");
5734     return l2cap_ertm_accept_connection(local_cid, ertm_contig, buffer, size);
5735 }
5736 #endif
5737 
5738 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
5739 // @deprecated - please use l2cap_cbm_register_service
5740 uint8_t l2cap_le_register_service(btstack_packet_handler_t packet_handler, uint16_t psm, gap_security_level_t security_level){
5741     log_error("deprecated - please use l2cap_cbm_register_service");
5742     return l2cap_cbm_register_service(packet_handler, psm, security_level);
5743 }
5744 
5745 // @deprecated - please use l2cap_cbm_unregister_service
5746 uint8_t l2cap_le_unregister_service(uint16_t psm){
5747     log_error("deprecated - please use l2cap_cbm_unregister_service");
5748     return l2cap_cbm_unregister_service(psm);
5749 }
5750 
5751 // @deprecated - please use l2cap_cbm_accept_connection
5752 uint8_t l2cap_le_accept_connection(uint16_t local_cid, uint8_t * receive_sdu_buffer, uint16_t mtu, uint16_t initial_credits){
5753     log_error("deprecated - please use l2cap_cbm_accept_connection");
5754     return l2cap_cbm_accept_connection(local_cid, receive_sdu_buffer, mtu, initial_credits);
5755 }
5756 
5757 // @deprecated - please use l2cap_cbm_decline_connection
5758 uint8_t l2cap_le_decline_connection(uint16_t local_cid){
5759     log_error("deprecated - please use l2cap_cbm_decline_connection");
5760     return l2cap_cbm_decline_connection(local_cid, L2CAP_CBM_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE);
5761 }
5762 
5763 // @deprecated - please use l2cap_cbm_create_channel
5764 uint8_t l2cap_le_create_channel(btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle,
5765                                 uint16_t psm, uint8_t * receive_sdu_buffer, uint16_t mtu, uint16_t initial_credits, gap_security_level_t security_level,
5766                                 uint16_t * out_local_cid){
5767     log_error("deprecated - please use l2cap_cbm_create_channel");
5768     return l2cap_cbm_create_channel(packet_handler, con_handle, psm, receive_sdu_buffer, mtu, initial_credits, security_level, out_local_cid);
5769 }
5770 
5771 // @deprecated - please use l2cap_cbm_provide_credits
5772 uint8_t l2cap_le_provide_credits(uint16_t local_cid, uint16_t credits){
5773     log_error("deprecated - please use l2cap_cbm_provide_credits");
5774     return l2cap_cbm_provide_credits(local_cid, credits);
5775 }
5776 
5777 // @deprecated - please use l2cap_can_send_packet_now
5778 bool l2cap_le_can_send_now(uint16_t local_cid){
5779     log_error("deprecated - please use l2cap_can_send_packet_now");
5780     return l2cap_can_send_packet_now(local_cid);
5781 }
5782 
5783 // @deprecated - please use l2cap_request_can_send_now_event
5784 uint8_t l2cap_le_request_can_send_now_event(uint16_t local_cid){
5785     log_error("deprecated - please use l2cap_request_can_send_now_event");
5786     return l2cap_request_can_send_now_event(local_cid);
5787 }
5788 
5789 // @deprecated - please use l2cap_cbm_send_data
5790 uint8_t l2cap_le_send_data(uint16_t local_cid, const uint8_t * data, uint16_t size){
5791     log_error("deprecated - please use l2cap_cbm_send_data");
5792     return l2cap_send(local_cid, data, size);
5793 }
5794 
5795 // @deprecated - please use l2cap_disconnect
5796 uint8_t l2cap_le_disconnect(uint16_t local_cid){
5797     log_error("deprecated - please use l2cap_disconnect");
5798     return l2cap_disconnect(local_cid);
5799 }
5800 #endif
5801 
5802 #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
5803 static void fuzz_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size) {
5804 }
5805 void l2cap_setup_test_channels_fuzz(void) {
5806     bd_addr_t address;
5807     l2cap_channel_t * channel;
5808 
5809     // 0x41 1setup classic basic
5810     channel = l2cap_create_channel_entry(fuzz_packet_handler, L2CAP_CHANNEL_TYPE_CLASSIC, address,
5811         BD_ADDR_TYPE_ACL, 0x01, 100, LEVEL_4);
5812     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
5813 
5814     // 0x42 setup le cbm
5815     channel = l2cap_create_channel_entry(fuzz_packet_handler, L2CAP_CHANNEL_TYPE_CHANNEL_CBM, address,
5816         BD_ADDR_TYPE_LE_PUBLIC, 0x03, 100, LEVEL_4);
5817     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
5818 
5819     // 0x43 setup le ecbm
5820     channel = l2cap_create_channel_entry(fuzz_packet_handler, L2CAP_CHANNEL_TYPE_CHANNEL_ECBM,
5821         address, BD_ADDR_TYPE_LE_PUBLIC, 0x05, 100, LEVEL_4);
5822     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
5823 }
5824 
5825 void l2cap_free_channels_fuzz(void){
5826     btstack_linked_list_iterator_t it;
5827     btstack_linked_list_iterator_init(&it, &l2cap_channels);
5828     while (btstack_linked_list_iterator_has_next(&it)){
5829         l2cap_channel_t * channel = (l2cap_channel_t*) btstack_linked_list_iterator_next(&it);
5830         bool fixed_channel = false;
5831         switch (channel->channel_type) {
5832             case L2CAP_CHANNEL_TYPE_FIXED_LE:
5833             case L2CAP_CHANNEL_TYPE_FIXED_CLASSIC:
5834             case L2CAP_CHANNEL_TYPE_CONNECTIONLESS:
5835                 fixed_channel = true;
5836                 break;
5837             default:
5838                 break;
5839         }
5840         if (fixed_channel == false) {
5841             btstack_linked_list_iterator_remove(&it);
5842             btstack_memory_l2cap_channel_free(channel);
5843         }
5844     }
5845 }
5846 #endif