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