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