xref: /btstack/src/l2cap.c (revision 8c4cc1b8690db4acb034e433fc1f9704ac23aad9)
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
1887         uint16_t source_cid    = l2cap_signaling_responses[0].cid;   // CONNECTION_REQUEST, REJECT_SM_PAIRING, DISCONNECT_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 ECHO_REQUEST:
1911                 l2cap_send_classic_signaling_packet(handle, ECHO_RESPONSE, sig_id, 0, NULL);
1912                 break;
1913             case INFORMATION_REQUEST:
1914                 switch (info_type){
1915                     case L2CAP_INFO_TYPE_CONNECTIONLESS_MTU: {
1916                             uint16_t connectionless_mtu = hci_max_acl_data_packet_length();
1917                         l2cap_send_classic_signaling_packet(handle, INFORMATION_RESPONSE, sig_id, info_type, 0,
1918                                                             sizeof(connectionless_mtu), &connectionless_mtu);
1919                         }
1920                         break;
1921                     case L2CAP_INFO_TYPE_EXTENDED_FEATURES_SUPPORTED: {
1922                             uint32_t features = l2cap_extended_features_mask();
1923                         l2cap_send_classic_signaling_packet(handle, INFORMATION_RESPONSE, sig_id, info_type, 0,
1924                                                             sizeof(features), &features);
1925                         }
1926                         break;
1927                     case L2CAP_INFO_TYPE_FIXED_CHANNELS_SUPPORTED: {
1928                             uint8_t map[8];
1929                             memset(map, 0, 8);
1930                             // L2CAP Signaling Channel + Connectionless reception
1931                             map[0] = (1 << L2CAP_CID_SIGNALING) | (1 << L2CAP_CID_CONNECTIONLESS_CHANNEL);
1932 #if defined (ENABLE_EXPLICIT_BR_EDR_SECURITY_MANAGER) || (defined(ENABLE_BLE) && defined(ENABLE_CROSS_TRANSPORT_KEY_DERIVATION))
1933                             // BR/EDR Security Manager (bit 7) if BR/EDR Secure Connections possible
1934                             if (gap_secure_connections_active()){
1935                                 map[0] |= (1 << L2CAP_CID_BR_EDR_SECURITY_MANAGER);
1936                             }
1937 #endif
1938                             l2cap_send_classic_signaling_packet(handle, INFORMATION_RESPONSE, sig_id, info_type, 0,
1939                                                             sizeof(map), &map);
1940                         }
1941                         break;
1942                     default:
1943                         // all other types are not supported
1944                         l2cap_send_classic_signaling_packet(handle, INFORMATION_RESPONSE, sig_id, info_type, 1, 0, NULL);
1945                         break;
1946                 }
1947                 break;
1948             case COMMAND_REJECT:
1949                 l2cap_send_classic_signaling_packet(handle, COMMAND_REJECT, sig_id, result, 0, NULL);
1950                 break;
1951 #endif
1952 #ifdef ENABLE_BLE
1953             case LE_CREDIT_BASED_CONNECTION_REQUEST:
1954                 l2cap_send_le_signaling_packet(handle, LE_CREDIT_BASED_CONNECTION_RESPONSE, sig_id, 0, 0, 0, 0, result);
1955                 break;
1956             case DISCONNECTION_REQUEST:
1957                 // Invalid CID, local cid, remote cid
1958                 little_endian_store_16(buffer, 0, result);
1959                 little_endian_store_16(buffer, 2, source_cid);
1960                 l2cap_send_le_signaling_packet(handle, COMMAND_REJECT, sig_id, 0x0002, 4, buffer);
1961                 break;
1962             case COMMAND_REJECT_LE:
1963                 l2cap_send_le_signaling_packet(handle, COMMAND_REJECT, sig_id, result, 0, NULL);
1964                 break;
1965 #endif
1966 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
1967             case L2CAP_CREDIT_BASED_CONNECTION_REQUEST: {
1968                 // send variable size array or cids with each cid being zero
1969                 uint16_t cids[6];
1970                 (void) memset(cids, 0xff, sizeof(cids));
1971                 (void) memset(cids, 0x00, num_channels * sizeof(uint16_t));
1972                 l2cap_send_general_signaling_packet(handle, signaling_cid, L2CAP_CREDIT_BASED_CONNECTION_RESPONSE,
1973                                                     sig_id, 0, 0, 0, result, cids);
1974                 break;
1975             }
1976 
1977             case L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST:
1978                 l2cap_send_general_signaling_packet(handle, signaling_cid, L2CAP_CREDIT_BASED_RECONFIGURE_RESPONSE,
1979                                                     sig_id, result);
1980                 break;
1981 #endif
1982             case SM_PAIRING_FAILED:
1983                 buffer[0] = SM_CODE_PAIRING_FAILED;
1984                 buffer[1] = (uint8_t) result;
1985                 l2cap_send_connectionless(handle, source_cid, buffer, 2);
1986                 break;
1987             default:
1988                 // should not happen
1989                 break;
1990         }
1991     }
1992 }
1993 
1994 #ifdef ENABLE_CLASSIC
1995 static bool l2ap_run_information_requests(void){
1996     // send l2cap information request if requested
1997     btstack_linked_list_iterator_t it;
1998     hci_connections_get_iterator(&it);
1999     uint8_t info_type;
2000     l2cap_information_state_t new_state;
2001     while(btstack_linked_list_iterator_has_next(&it)){
2002         hci_connection_t * connection = (hci_connection_t *) btstack_linked_list_iterator_next(&it);
2003         switch (connection->l2cap_state.information_state){
2004             case L2CAP_INFORMATION_STATE_W2_SEND_EXTENDED_FEATURE_REQUEST:
2005                 info_type = L2CAP_INFO_TYPE_EXTENDED_FEATURES_SUPPORTED;
2006                 new_state = L2CAP_INFORMATION_STATE_W4_EXTENDED_FEATURE_RESPONSE;
2007                 break;
2008             case L2CAP_INFORMATION_STATE_W2_SEND_FIXED_CHANNELS_REQUEST:
2009                 info_type = L2CAP_INFO_TYPE_FIXED_CHANNELS_SUPPORTED;
2010                 new_state = L2CAP_INFORMATION_STATE_W4_FIXED_CHANNELS_RESPONSE;
2011                 break;
2012             default:
2013                 continue;
2014         }
2015         if (!hci_can_send_acl_packet_now(connection->con_handle)) break;
2016 
2017         connection->l2cap_state.information_state = new_state;
2018         uint8_t sig_id = l2cap_next_sig_id();
2019         l2cap_send_classic_signaling_packet(connection->con_handle, INFORMATION_REQUEST, sig_id, info_type);
2020     }
2021     return false;
2022 }
2023 #endif
2024 
2025 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
2026 // returns true if channel has been closed
2027 static bool l2cap_cbm_run_channel(l2cap_channel_t * channel) {
2028     uint16_t mps;
2029     bool channel_closed = false;
2030     // log_info("l2cap_run: channel %p, state %u, var 0x%02x", channel, channel->state, channel->state_var);
2031     switch (channel->state){
2032         case L2CAP_STATE_WILL_SEND_LE_CONNECTION_REQUEST:
2033             channel->state = L2CAP_STATE_WAIT_LE_CONNECTION_RESPONSE;
2034             // le psm, source cid, mtu, mps, initial credits
2035             channel->local_sig_id = l2cap_next_sig_id();
2036             channel->credits_incoming =  channel->new_credits_incoming;
2037             channel->new_credits_incoming = 0;
2038             channel->local_mps = btstack_min(l2cap_max_le_mtu(), channel->local_mtu);
2039             l2cap_send_le_signaling_packet( channel->con_handle, LE_CREDIT_BASED_CONNECTION_REQUEST,
2040                                             channel->local_sig_id, channel->psm, channel->local_cid, channel->local_mtu,
2041                                             channel->local_mps, channel->credits_incoming);
2042             break;
2043         case L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_ACCEPT:
2044             // TODO: support larger MPS
2045             channel->state = L2CAP_STATE_OPEN;
2046             channel->credits_incoming =  channel->new_credits_incoming;
2047             channel->new_credits_incoming = 0;
2048             mps = btstack_min(l2cap_max_le_mtu(), channel->local_mtu);
2049             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);
2050             // notify client
2051             l2cap_cbm_emit_channel_opened(channel, ERROR_CODE_SUCCESS);
2052             break;
2053         case L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_DECLINE:
2054             channel->state = L2CAP_STATE_INVALID;
2055             l2cap_send_le_signaling_packet(channel->con_handle, LE_CREDIT_BASED_CONNECTION_RESPONSE, channel->remote_sig_id, 0, 0, 0, 0, channel->reason);
2056             channel_closed = true;
2057             break;
2058         case L2CAP_STATE_OPEN:
2059             if (channel->new_credits_incoming){
2060                 l2cap_credit_based_send_credits(channel);
2061             }
2062             break;
2063         case L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST:
2064             channel->local_sig_id = l2cap_next_sig_id();
2065             channel->state = L2CAP_STATE_WAIT_DISCONNECT;
2066             l2cap_send_le_signaling_packet( channel->con_handle, DISCONNECTION_REQUEST, channel->local_sig_id, channel->remote_cid, channel->local_cid);
2067             break;
2068         case L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE:
2069             channel->state = L2CAP_STATE_INVALID;
2070             l2cap_send_le_signaling_packet( channel->con_handle, DISCONNECTION_RESPONSE, channel->remote_sig_id, channel->local_cid, channel->remote_cid);
2071             l2cap_cbm_finialize_channel_close(channel);  // -- remove from list
2072             break;
2073         default:
2074             break;
2075     }
2076     return channel_closed;
2077 }
2078 
2079 static void l2cap_cbm_run_channels(void){
2080     btstack_linked_list_iterator_t it;
2081     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2082     while (btstack_linked_list_iterator_has_next(&it)){
2083         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2084 
2085         if (channel->channel_type != L2CAP_CHANNEL_TYPE_CHANNEL_CBM) continue;
2086         if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2087 
2088         bool channel_closed = l2cap_cbm_run_channel(channel);
2089         if (channel_closed) {
2090             // discard channel - l2cap_finialize_channel_close without sending l2cap close event
2091             btstack_linked_list_iterator_remove(&it);
2092             l2cap_free_channel_entry(channel);
2093         }
2094     }
2095 }
2096 
2097 static inline uint8_t l2cap_cbm_status_for_result(uint16_t result) {
2098     switch (result) {
2099         case L2CAP_CBM_CONNECTION_RESULT_SUCCESS:
2100             return ERROR_CODE_SUCCESS;
2101         case L2CAP_CBM_CONNECTION_RESULT_SPSM_NOT_SUPPORTED:
2102             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_PSM;
2103         case L2CAP_CBM_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE:
2104             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_RESOURCES;
2105         case L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_AUTHENTICATION:
2106         case L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_AUTHORIZATION:
2107         case L2CAP_CBM_CONNECTION_RESULT_ENCYRPTION_KEY_SIZE_TOO_SHORT:
2108         case L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_ENCRYPTION:
2109             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_SECURITY;
2110         default:
2111             // invalid Source CID, Source CID already allocated, unacceptable parameters
2112             return L2CAP_CONNECTION_RESPONSE_UNKNOWN_ERROR;
2113     }
2114 }
2115 
2116 #endif
2117 
2118 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
2119 
2120 static void l2cap_run_trigger_callback(void * context){
2121     UNUSED(context);
2122     l2cap_run();
2123 }
2124 
2125 static void l2cap_run_trigger(void){
2126     btstack_run_loop_execute_on_main_thread(&l2cap_trigger_run_registration);
2127 }
2128 
2129 // 11BH22222
2130 static void l2cap_ecbm_emit_channel_opened(l2cap_channel_t *channel, uint8_t status) {
2131     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",
2132             status, channel->address_type, bd_addr_to_str(channel->address), channel->con_handle, channel->psm,
2133             channel->local_cid, channel->remote_cid, channel->local_mtu, channel->remote_mtu);
2134     uint8_t event[23];
2135     event[0] = L2CAP_EVENT_ECBM_CHANNEL_OPENED;
2136     event[1] = sizeof(event) - 2u;
2137     event[2] = status;
2138     event[3] = channel->address_type;
2139     reverse_bd_addr(channel->address, &event[4]);
2140     little_endian_store_16(event, 10, channel->con_handle);
2141     event[12] = (channel->state_var & L2CAP_CHANNEL_STATE_VAR_INCOMING) ? 1 : 0;
2142     little_endian_store_16(event, 13, channel->psm);
2143     little_endian_store_16(event, 15, channel->local_cid);
2144     little_endian_store_16(event, 17, channel->remote_cid);
2145     little_endian_store_16(event, 19, channel->local_mtu);
2146     little_endian_store_16(event, 21, channel->remote_mtu);
2147     hci_dump_packet(HCI_EVENT_PACKET, 1, event, sizeof(event));
2148     l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
2149 }
2150 
2151 static void l2cap_ecbm_emit_reconfigure_complete(l2cap_channel_t *channel, uint16_t result) {
2152     // emit event
2153     uint8_t event[6];
2154     event[0] = L2CAP_EVENT_ECBM_RECONFIGURATION_COMPLETE;
2155     event[1] = sizeof(event) - 2;
2156     little_endian_store_16(event, 2, channel->local_cid);
2157     little_endian_store_16(event, 4, result);
2158     l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
2159 }
2160 
2161 static void l2cap_ecbm_run_channels(void) {
2162     hci_con_handle_t con_handle = HCI_CON_HANDLE_INVALID;
2163     // num max channels + 1 for signaling pdu generator
2164     uint16_t cids[L2CAP_ECBM_MAX_CID_ARRAY_SIZE + 1];
2165     uint8_t num_cids = 0;
2166     uint8_t sig_id;
2167     uint16_t spsm;
2168     L2CAP_STATE matching_state;
2169     bool match_remote_sig_cid;
2170     uint8_t result = 0;
2171     uint16_t local_mtu;
2172     uint16_t initial_credits;
2173     uint16_t signaling_cid;
2174     L2CAP_STATE new_state;
2175     uint16_t local_mps;
2176 
2177     // pick first channel that needs to send a combined signaling pdu and setup collection via break
2178     // then collect all others that belong to the same pdu
2179     btstack_linked_list_iterator_t it;
2180     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2181     while (btstack_linked_list_iterator_has_next(&it)) {
2182         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2183         if (channel->channel_type != L2CAP_CHANNEL_TYPE_CHANNEL_ECBM) continue;
2184         if (con_handle == HCI_CON_HANDLE_INVALID) {
2185             switch (channel->state) {
2186                 case L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_REQUEST:
2187                     if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2188                     local_mtu = channel->local_mtu;
2189                     local_mps = channel->local_mps;
2190                     spsm = channel->psm;
2191                     result = channel->reason;
2192                     initial_credits = channel->credits_incoming;
2193                     sig_id = channel->local_sig_id;
2194                     new_state = L2CAP_STATE_WAIT_ENHANCED_CONNECTION_RESPONSE;
2195                     match_remote_sig_cid = false;
2196                     break;
2197                 case L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE:
2198                     if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2199                     local_mtu = channel->local_mtu;
2200                     local_mps = channel->local_mps;
2201                     initial_credits = channel->credits_incoming;
2202                     sig_id = channel->remote_sig_id;
2203                     new_state = L2CAP_STATE_OPEN;
2204                     match_remote_sig_cid = true;
2205                     break;
2206                 case L2CAP_STATE_WILL_SEND_EHNANCED_RENEGOTIATION_REQUEST:
2207                     if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2208                     sig_id = channel->local_sig_id;
2209                     local_mtu = channel->renegotiate_mtu;
2210                     local_mps = channel->local_mps;
2211                     new_state = L2CAP_STATE_WAIT_ENHANCED_RENEGOTIATION_RESPONSE;
2212                     match_remote_sig_cid = false;
2213                     break;
2214                 case L2CAP_STATE_OPEN:
2215                     if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2216                     if (channel->new_credits_incoming) {
2217                         l2cap_credit_based_send_credits(channel);
2218                     }
2219                     continue;
2220                 case L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST:
2221                     if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2222                     channel->local_sig_id = l2cap_next_sig_id();
2223                     channel->state = L2CAP_STATE_WAIT_DISCONNECT;
2224                     signaling_cid = channel->address_type == BD_ADDR_TYPE_ACL ? L2CAP_CID_SIGNALING : L2CAP_CID_SIGNALING_LE;
2225                     l2cap_send_general_signaling_packet(channel->con_handle, signaling_cid, DISCONNECTION_REQUEST,
2226                                                         channel->local_sig_id, channel->remote_cid, channel->local_cid);
2227                     continue;
2228                 case L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE:
2229                     if (!hci_can_send_acl_packet_now(channel->con_handle)) continue;
2230                     channel->state = L2CAP_STATE_INVALID;
2231                     signaling_cid = channel->address_type == BD_ADDR_TYPE_ACL ? L2CAP_CID_SIGNALING : L2CAP_CID_SIGNALING_LE;
2232                     l2cap_send_general_signaling_packet(channel->con_handle, signaling_cid, DISCONNECTION_RESPONSE,
2233                                                         channel->remote_sig_id, channel->local_cid,
2234                                                         channel->remote_cid);
2235                     l2cap_cbm_finialize_channel_close(channel);  // -- remove from list
2236                     continue;
2237                 default:
2238                     continue;
2239             }
2240 
2241             // channel picked - setup cid array and collect info
2242             (void) memset(cids, 0xff, sizeof(cids));
2243             (void) memset(cids, 0, channel->num_cids * sizeof(uint16_t));
2244             matching_state = channel->state;
2245             con_handle = channel->con_handle;
2246             signaling_cid = channel->address_type == BD_ADDR_TYPE_ACL ? L2CAP_CID_SIGNALING : L2CAP_CID_SIGNALING_LE;
2247             num_cids = channel->num_cids;
2248 
2249         } else {
2250             // check if it matches first channel by state, con_handle, and signaling id
2251             if (matching_state != channel->state) continue;
2252             if (channel->con_handle != con_handle) continue;
2253             if (match_remote_sig_cid) {
2254                 if (channel->remote_sig_id != sig_id) continue;
2255             } else {
2256                 if (channel->local_sig_id != sig_id) continue;
2257             }
2258         }
2259 
2260         // add this cid
2261         cids[channel->cid_index] = channel->local_cid;
2262 
2263         // set new state
2264         channel->state = new_state;
2265 
2266         // handle open for L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE
2267         if (matching_state == L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE) {
2268             if (channel->reason == L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS) {
2269                 l2cap_ecbm_emit_channel_opened(channel, ERROR_CODE_SUCCESS);
2270             } else {
2271                 result = channel->reason;
2272                 btstack_linked_list_iterator_remove(&it);
2273                 btstack_memory_l2cap_channel_free(channel);
2274             }
2275         }
2276     }
2277 
2278     if (con_handle != HCI_CON_HANDLE_INVALID) {
2279         switch (matching_state) {
2280             case L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_REQUEST:
2281                 log_info("send combined connection request for %u cids", num_cids);
2282                 l2cap_send_general_signaling_packet(con_handle, signaling_cid, L2CAP_CREDIT_BASED_CONNECTION_REQUEST,
2283                                                     sig_id, spsm, local_mtu, local_mps, initial_credits, cids);
2284                 break;
2285             case L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE:
2286                 log_info("send combined connection response for %u cids", num_cids);
2287                 l2cap_send_general_signaling_packet(con_handle, signaling_cid, L2CAP_CREDIT_BASED_CONNECTION_RESPONSE,
2288                                                     sig_id, local_mtu, local_mps, initial_credits, result, cids);
2289                 break;
2290             case L2CAP_STATE_WILL_SEND_EHNANCED_RENEGOTIATION_REQUEST:
2291                 log_info("send combined renegotiation request for %u cids", num_cids);
2292                 l2cap_send_general_signaling_packet(con_handle, signaling_cid, L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST,
2293                                                     sig_id, local_mtu, local_mps, cids);
2294                 break;
2295             default:
2296                 break;
2297         }
2298     }
2299 }
2300 #endif
2301 
2302 // MARK: L2CAP_RUN
2303 // process outstanding signaling tasks
2304 static void l2cap_run(void){
2305 
2306     // log_info("l2cap_run: entered");
2307     l2cap_run_signaling_response();
2308 
2309 #ifdef ENABLE_CLASSIC
2310     bool done = l2ap_run_information_requests();
2311     if (done) return;
2312 #endif
2313 
2314 #if defined(ENABLE_CLASSIC) || defined(ENABLE_BLE)
2315     btstack_linked_list_iterator_t it;
2316 #endif
2317 
2318 #ifdef ENABLE_CLASSIC
2319     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2320     while (btstack_linked_list_iterator_has_next(&it)){
2321 
2322         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2323 
2324         if (channel->channel_type != L2CAP_CHANNEL_TYPE_CLASSIC) continue;
2325 
2326         // log_info("l2cap_run: channel %p, state %u, var 0x%02x", channel, channel->state, channel->state_var);
2327         bool finalized = l2cap_run_for_classic_channel(channel);
2328 
2329         if (!finalized) {
2330 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
2331             l2cap_run_for_classic_channel_ertm(channel);
2332 #endif
2333         }
2334     }
2335 #endif
2336 
2337 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
2338     l2cap_cbm_run_channels();
2339 #endif
2340 
2341 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
2342     l2cap_ecbm_run_channels();
2343 #endif
2344 
2345 #ifdef ENABLE_BLE
2346     // send l2cap con paramter update if necessary
2347     hci_connections_get_iterator(&it);
2348     while(btstack_linked_list_iterator_has_next(&it)){
2349         hci_connection_t * connection = (hci_connection_t *) btstack_linked_list_iterator_next(&it);
2350         if ((connection->address_type != BD_ADDR_TYPE_LE_PUBLIC) && (connection->address_type != BD_ADDR_TYPE_LE_RANDOM)) continue;
2351         if (!hci_can_send_acl_packet_now(connection->con_handle)) continue;
2352         switch (connection->le_con_parameter_update_state){
2353             case CON_PARAMETER_UPDATE_SEND_REQUEST:
2354                 connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_NONE;
2355                 l2cap_send_le_signaling_packet(connection->con_handle, CONNECTION_PARAMETER_UPDATE_REQUEST, l2cap_next_sig_id(),
2356                                                connection->le_conn_interval_min, connection->le_conn_interval_max, connection->le_conn_latency, connection->le_supervision_timeout);
2357                 break;
2358             case CON_PARAMETER_UPDATE_SEND_RESPONSE:
2359                 connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_CHANGE_HCI_CON_PARAMETERS;
2360                 l2cap_send_le_signaling_packet(connection->con_handle, CONNECTION_PARAMETER_UPDATE_RESPONSE, connection->le_con_param_update_identifier, 0);
2361                 break;
2362             case CON_PARAMETER_UPDATE_DENY:
2363                 connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_NONE;
2364                 l2cap_send_le_signaling_packet(connection->con_handle, CONNECTION_PARAMETER_UPDATE_RESPONSE, connection->le_con_param_update_identifier, 1);
2365                 break;
2366             default:
2367                 break;
2368         }
2369     }
2370 #endif
2371 
2372     if (l2cap_call_notify_channel_in_run){
2373         l2cap_call_notify_channel_in_run = false;
2374         l2cap_notify_channel_can_send();
2375     }
2376 
2377     // log_info("l2cap_run: exit");
2378 }
2379 
2380 #ifdef ENABLE_CLASSIC
2381 static void l2cap_ready_to_connect(l2cap_channel_t * channel){
2382 
2383 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
2384     // assumption: outgoing connection
2385     if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
2386         // ERTM requested: trigger information request if not already started then wait for response
2387         hci_connection_t * connection = hci_connection_for_handle(channel->con_handle);
2388         switch (connection->l2cap_state.information_state){
2389             case L2CAP_INFORMATION_STATE_DONE:
2390                 break;
2391             case L2CAP_INFORMATION_STATE_IDLE:
2392                 connection->l2cap_state.information_state = L2CAP_INFORMATION_STATE_W2_SEND_EXTENDED_FEATURE_REQUEST;
2393                 /* fall through */
2394             default:
2395                 channel->state = L2CAP_STATE_WAIT_OUTGOING_EXTENDED_FEATURES;
2396                 return;
2397         }
2398     }
2399 #endif
2400 
2401     // fine, go ahead
2402     channel->state = L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST;
2403 }
2404 
2405 static void l2cap_handle_connection_complete(hci_con_handle_t con_handle, l2cap_channel_t * channel){
2406     if ((channel->state == L2CAP_STATE_WAIT_CONNECTION_COMPLETE) || (channel->state == L2CAP_STATE_WILL_SEND_CREATE_CONNECTION)) {
2407         log_info("connection complete con_handle %04x - for channel %p cid 0x%04x", (int) con_handle, channel, channel->local_cid);
2408         channel->con_handle = con_handle;
2409         // query remote features if pairing is required
2410         if (channel->required_security_level > LEVEL_0){
2411             channel->state = L2CAP_STATE_WAIT_REMOTE_SUPPORTED_FEATURES;
2412             hci_remote_features_query(con_handle);
2413         } else {
2414             l2cap_ready_to_connect(channel);
2415         }
2416     }
2417 }
2418 
2419 static void l2cap_handle_remote_supported_features_received(l2cap_channel_t * channel){
2420     if (channel->state != L2CAP_STATE_WAIT_REMOTE_SUPPORTED_FEATURES) return;
2421 
2422     bool security_required = channel->required_security_level > LEVEL_0;
2423 
2424     if ((channel->state_var & L2CAP_CHANNEL_STATE_VAR_INCOMING) != 0){
2425 
2426         // Core V5.2, Vol 3, Part C, 5.2.2.2 - Security Mode 4
2427         //   When a remote device attempts to access a service offered by a Bluetooth device that is in security mode 4
2428         //   and a sufficient link key exists and authentication has not been performed the local device shall authenticate
2429         //   the remote device and enable encryption after the channel establishment request is received but before a channel
2430         //   establishment confirmation (L2CAP_ConnectRsp with result code of 0x0000 or a higher-level channel establishment
2431         //   confirmation such as that of RFCOMM) is sent.
2432 
2433         //   If the remote device has indicated support for Secure Simple Pairing, a channel establishment request is
2434         //   received for a service other than SDP, and encryption has not yet been enabled, then the local device shall
2435         //   disconnect the ACL link with error code 0x05 - Authentication Failure.
2436 
2437         // => Disconnect if l2cap request received in mode 4 and ssp supported, non-sdp psm, not encrypted, no link key available
2438         if ((gap_get_security_mode() == GAP_SECURITY_MODE_4)
2439         && gap_ssp_supported_on_both_sides(channel->con_handle)
2440         && (channel->psm != PSM_SDP)
2441         && (gap_encryption_key_size(channel->con_handle) == 0)){
2442             hci_disconnect_security_block(channel->con_handle);
2443             return;
2444         }
2445 
2446         // incoming: assert security requirements
2447         channel->state = L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE;
2448         if (channel->required_security_level <= gap_security_level(channel->con_handle)){
2449             l2cap_handle_security_level_incoming_sufficient(channel);
2450         } else {
2451             // send connection pending if not already done
2452             if ((channel->state_var & L2CAP_CHANNEL_STATE_VAR_SENT_CONN_RESP_PEND) == 0){
2453                 channel->state_var |= L2CAP_CHANNEL_STATE_VAR_SEND_CONN_RESP_PEND;
2454             }
2455             gap_request_security_level(channel->con_handle, channel->required_security_level);
2456         }
2457     } else {
2458         // outgoing: we have been waiting for remote supported features
2459         if (security_required){
2460             // request security level
2461             channel->state = L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE;
2462             gap_request_security_level(channel->con_handle, channel->required_security_level);
2463         } else {
2464             l2cap_ready_to_connect(channel);
2465         }
2466     }
2467 }
2468 #endif
2469 
2470 #ifdef L2CAP_USES_CHANNELS
2471 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,
2472     uint16_t psm, uint16_t local_mtu, gap_security_level_t security_level){
2473 
2474     l2cap_channel_t * channel = btstack_memory_l2cap_channel_get();
2475     if (!channel) {
2476         return NULL;
2477     }
2478 
2479     // fill in
2480     channel->packet_handler = packet_handler;
2481     channel->channel_type   = channel_type;
2482     bd_addr_copy(channel->address, address);
2483     channel->address_type = address_type;
2484     channel->psm = psm;
2485     channel->local_mtu  = local_mtu;
2486     channel->remote_mtu = L2CAP_DEFAULT_MTU;
2487     channel->required_security_level = security_level;
2488 
2489     //
2490     channel->local_cid = l2cap_next_local_cid();
2491     channel->con_handle = HCI_CON_HANDLE_INVALID;
2492 
2493     // set initial state
2494     channel->state = L2CAP_STATE_WILL_SEND_CREATE_CONNECTION;
2495     channel->state_var = L2CAP_CHANNEL_STATE_VAR_NONE;
2496     channel->remote_sig_id = L2CAP_SIG_ID_INVALID;
2497     channel->local_sig_id = L2CAP_SIG_ID_INVALID;
2498 
2499     log_info("create channel %p, local_cid 0x%04x", channel, channel->local_cid);
2500 
2501     return channel;
2502 }
2503 
2504 static void l2cap_free_channel_entry(l2cap_channel_t * channel){
2505     log_info("free channel %p, local_cid 0x%04x", channel, channel->local_cid);
2506     // assert all timers are stopped
2507     l2cap_stop_rtx(channel);
2508 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
2509     l2cap_ertm_stop_retransmission_timer(channel);
2510     l2cap_ertm_stop_monitor_timer(channel);
2511 #endif
2512     // free  memory
2513     btstack_memory_l2cap_channel_free(channel);
2514 }
2515 #endif
2516 
2517 #ifdef ENABLE_CLASSIC
2518 
2519 /**
2520  * @brief Creates L2CAP channel to the PSM of a remote device with baseband address. A new baseband connection will be initiated if necessary.
2521  * @param packet_handler
2522  * @param address
2523  * @param psm
2524  * @param mtu
2525  * @param local_cid
2526  */
2527 
2528 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){
2529     // limit MTU to the size of our outgoing HCI buffer
2530     uint16_t local_mtu = btstack_min(mtu, l2cap_max_mtu());
2531 
2532 	// determine security level based on psm
2533 	const gap_security_level_t security_level = l2cap_security_level_0_allowed_for_PSM(psm) ? LEVEL_0 : gap_get_security_level();
2534 	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);
2535 
2536     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);
2537     if (!channel) {
2538         return BTSTACK_MEMORY_ALLOC_FAILED;
2539     }
2540 
2541 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
2542     channel->mode = L2CAP_CHANNEL_MODE_BASIC;
2543 #endif
2544 
2545     // add to connections list
2546     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
2547 
2548     // store local_cid
2549     if (out_local_cid){
2550        *out_local_cid = channel->local_cid;
2551     }
2552 
2553 	// state: L2CAP_STATE_WILL_SEND_CREATE_CONNECTION
2554 
2555     // check if hci connection is already usable,
2556     hci_connection_t * conn = hci_connection_for_bd_addr_and_type(address, BD_ADDR_TYPE_ACL);
2557     if (conn && conn->state == OPEN){
2558     	// simulate connection complete
2559 	    l2cap_handle_connection_complete(conn->con_handle, channel);
2560 
2561 	    // state: L2CAP_STATE_WAIT_REMOTE_SUPPORTED_FEATURES or L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST
2562 
2563         // simulate if remote supported features if requested and already received
2564         if ((channel->state == L2CAP_STATE_WAIT_REMOTE_SUPPORTED_FEATURES) && hci_remote_features_available(conn->con_handle)) {
2565         	// simulate remote features received
2566             l2cap_handle_remote_supported_features_received(channel);
2567         }
2568     }
2569 
2570     l2cap_run();
2571 
2572     return ERROR_CODE_SUCCESS;
2573 }
2574 
2575 static void l2cap_handle_connection_failed_for_addr(bd_addr_t address, uint8_t status){
2576     // mark all channels before emitting open events as these could trigger new connetion requests to the same device
2577     btstack_linked_list_iterator_t it;
2578     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2579     while (btstack_linked_list_iterator_has_next(&it)){
2580         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2581         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2582         if (bd_addr_cmp( channel->address, address) != 0) continue;
2583         // channel for this address found
2584         switch (channel->state){
2585             case L2CAP_STATE_WAIT_CONNECTION_COMPLETE:
2586             case L2CAP_STATE_WILL_SEND_CREATE_CONNECTION:
2587                 channel->state = L2CAP_STATE_EMIT_OPEN_FAILED_AND_DISCARD;
2588                 break;
2589             default:
2590                 break;
2591         }
2592     }
2593     // emit and free marked entries. restart loop to deal with list changes
2594     int done = 0;
2595     while (!done) {
2596         done = 1;
2597         btstack_linked_list_iterator_init(&it, &l2cap_channels);
2598         while (btstack_linked_list_iterator_has_next(&it)){
2599             l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2600             if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2601             if (channel->state == L2CAP_STATE_EMIT_OPEN_FAILED_AND_DISCARD){
2602                 done = 0;
2603                 // failure, forward error code
2604                 l2cap_handle_channel_open_failed(channel, status);
2605                 // discard channel
2606                 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
2607                 l2cap_free_channel_entry(channel);
2608                 break;
2609             }
2610         }
2611     }
2612 
2613 }
2614 
2615 static void l2cap_handle_connection_success_for_addr(bd_addr_t address, hci_con_handle_t handle){
2616     btstack_linked_list_iterator_t it;
2617     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2618     while (btstack_linked_list_iterator_has_next(&it)){
2619         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2620         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2621         if ( ! bd_addr_cmp( channel->address, address) ){
2622             l2cap_handle_connection_complete(handle, channel);
2623         }
2624     }
2625 
2626 #ifdef ENABLE_L2CAP_INFORMATION_REQUESTS_ON_CONNECT
2627     // trigger query of extended features and fixed channels right away (instead of later)
2628     hci_connection_t * hci_connection = hci_connection_for_handle(handle);
2629     btstack_assert(hci_connection != NULL);
2630     hci_connection->l2cap_state.information_state = L2CAP_INFORMATION_STATE_W2_SEND_EXTENDED_FEATURE_REQUEST;
2631 #endif
2632 
2633     // process
2634     l2cap_run();
2635 }
2636 #endif
2637 
2638 static bool l2cap_channel_ready_to_send(l2cap_channel_t * channel){
2639     switch (channel->channel_type){
2640 #ifdef ENABLE_CLASSIC
2641         case L2CAP_CHANNEL_TYPE_CLASSIC:
2642             if (channel->state != L2CAP_STATE_OPEN) return false;
2643 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
2644             // send if we have more data and remote windows isn't full yet
2645             if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION) {
2646                 if (channel->unacked_frames >= btstack_min(channel->num_stored_tx_frames, channel->remote_tx_window_size)) return false;
2647                 return hci_can_send_acl_packet_now(channel->con_handle);
2648             }
2649 #endif
2650             if (!channel->waiting_for_can_send_now) return false;
2651             return hci_can_send_acl_packet_now(channel->con_handle);
2652         case L2CAP_CHANNEL_TYPE_FIXED_CLASSIC:
2653         case L2CAP_CHANNEL_TYPE_CONNECTIONLESS:
2654             if (!channel->waiting_for_can_send_now) return false;
2655             return hci_can_send_acl_classic_packet_now();
2656 #endif
2657 #ifdef ENABLE_BLE
2658         case L2CAP_CHANNEL_TYPE_FIXED_LE:
2659             if (!channel->waiting_for_can_send_now) return false;
2660             return hci_can_send_acl_le_packet_now();
2661 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
2662         case L2CAP_CHANNEL_TYPE_CHANNEL_CBM:
2663             if (channel->state != L2CAP_STATE_OPEN) return false;
2664             if (channel->send_sdu_buffer == NULL) return false;
2665             if (channel->credits_outgoing == 0u) return false;
2666             return hci_can_send_acl_packet_now(channel->con_handle);
2667 #endif
2668 #endif
2669 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
2670         case L2CAP_CHANNEL_TYPE_CHANNEL_ECBM:
2671             if (channel->state != L2CAP_STATE_OPEN) return false;
2672             if (channel->send_sdu_buffer == NULL) return false;
2673             if (channel->credits_outgoing == 0u) return false;
2674             return hci_can_send_acl_packet_now(channel->con_handle);
2675 #endif
2676         default:
2677             return false;
2678     }
2679 }
2680 
2681 static void l2cap_channel_trigger_send(l2cap_channel_t * channel){
2682     switch (channel->channel_type){
2683 #ifdef ENABLE_CLASSIC
2684         case L2CAP_CHANNEL_TYPE_CLASSIC:
2685 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
2686             if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION) {
2687                 l2cap_ertm_channel_send_information_frame(channel);
2688                 return;
2689             }
2690 #endif
2691             channel->waiting_for_can_send_now = 0;
2692             l2cap_emit_can_send_now(channel->packet_handler, channel->local_cid);
2693             break;
2694         case L2CAP_CHANNEL_TYPE_CONNECTIONLESS:
2695         case L2CAP_CHANNEL_TYPE_FIXED_CLASSIC:
2696             channel->waiting_for_can_send_now = 0;
2697             l2cap_emit_can_send_now(channel->packet_handler, channel->local_cid);
2698             break;
2699 #endif
2700 #ifdef ENABLE_BLE
2701         case L2CAP_CHANNEL_TYPE_FIXED_LE:
2702             channel->waiting_for_can_send_now = 0;
2703             l2cap_emit_can_send_now(channel->packet_handler, channel->local_cid);
2704             break;
2705 #endif
2706 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
2707         case L2CAP_CHANNEL_TYPE_CHANNEL_CBM:
2708             l2cap_credit_based_send_pdu(channel);
2709             break;
2710 #endif
2711 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
2712         case L2CAP_CHANNEL_TYPE_CHANNEL_ECBM:
2713             l2cap_credit_based_send_pdu(channel);
2714             break;
2715 #endif
2716         default:
2717             btstack_unreachable();
2718             break;
2719     }
2720 }
2721 
2722 static void l2cap_notify_channel_can_send(void){
2723     bool done = false;
2724     while (!done){
2725         done = true;
2726         btstack_linked_list_iterator_t it;
2727         btstack_linked_list_iterator_init(&it, &l2cap_channels);
2728         while (btstack_linked_list_iterator_has_next(&it)){
2729             l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2730             bool ready = l2cap_channel_ready_to_send(channel);
2731             if (!ready) continue;
2732 
2733             // requeue channel for fairness
2734             btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
2735             btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
2736 
2737             // trigger sending
2738             l2cap_channel_trigger_send(channel);
2739 
2740             // exit inner loop as we just broke the iterator, but try again
2741             done = false;
2742             break;
2743         }
2744     }
2745 }
2746 
2747 #ifdef L2CAP_USES_CHANNELS
2748 
2749 uint8_t l2cap_disconnect(uint16_t local_cid){
2750     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
2751     if (!channel) {
2752         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
2753     }
2754     channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
2755     l2cap_run();
2756     return ERROR_CODE_SUCCESS;
2757 }
2758 
2759 static int l2cap_send_open_failed_on_hci_disconnect(l2cap_channel_t * channel){
2760     // open cannot fail for for incoming connections
2761     if (channel->state_var & L2CAP_CHANNEL_STATE_VAR_INCOMING) return 0;
2762 
2763     // check state
2764     switch (channel->state){
2765         case L2CAP_STATE_WILL_SEND_CREATE_CONNECTION:
2766         case L2CAP_STATE_WAIT_CONNECTION_COMPLETE:
2767         case L2CAP_STATE_WAIT_REMOTE_SUPPORTED_FEATURES:
2768         case L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE:
2769         case L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT:
2770         case L2CAP_STATE_WAIT_OUTGOING_EXTENDED_FEATURES:
2771         case L2CAP_STATE_WAIT_CONNECT_RSP:
2772         case L2CAP_STATE_CONFIG:
2773         case L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST:
2774         case L2CAP_STATE_WILL_SEND_LE_CONNECTION_REQUEST:
2775         case L2CAP_STATE_WAIT_LE_CONNECTION_RESPONSE:
2776         case L2CAP_STATE_EMIT_OPEN_FAILED_AND_DISCARD:
2777             return 1;
2778 
2779         case L2CAP_STATE_OPEN:
2780         case L2CAP_STATE_CLOSED:
2781         case L2CAP_STATE_WAIT_INCOMING_EXTENDED_FEATURES:
2782         case L2CAP_STATE_WAIT_DISCONNECT:
2783         case L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_INSUFFICIENT_SECURITY:
2784         case L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_DECLINE:
2785         case L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_ACCEPT:
2786         case L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST:
2787         case L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE:
2788         case L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_DECLINE:
2789         case L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_ACCEPT:
2790         case L2CAP_STATE_INVALID:
2791         case L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE:
2792             return 0;
2793 
2794         default:
2795             // get a "warning" about new states
2796             btstack_assert(false);
2797             return 0;
2798     }
2799 }
2800 #endif
2801 
2802 #ifdef ENABLE_CLASSIC
2803 static void l2cap_handle_hci_disconnect_event(l2cap_channel_t * channel){
2804     if (l2cap_send_open_failed_on_hci_disconnect(channel)){
2805         l2cap_handle_channel_open_failed(channel, L2CAP_CONNECTION_BASEBAND_DISCONNECT);
2806     } else {
2807         l2cap_handle_channel_closed(channel);
2808     }
2809     l2cap_free_channel_entry(channel);
2810 }
2811 #endif
2812 
2813 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
2814 static void l2cap_handle_hci_le_disconnect_event(l2cap_channel_t * channel){
2815     if (l2cap_send_open_failed_on_hci_disconnect(channel)){
2816         l2cap_cbm_emit_channel_opened(channel, L2CAP_CONNECTION_BASEBAND_DISCONNECT);
2817     } else {
2818         l2cap_emit_channel_closed(channel);
2819     }
2820     l2cap_free_channel_entry(channel);
2821 }
2822 #endif
2823 
2824 #ifdef ENABLE_CLASSIC
2825 static void l2cap_check_classic_timeout(hci_con_handle_t handle){
2826     if (gap_get_connection_type(handle) != GAP_CONNECTION_ACL) {
2827         return;
2828     }
2829     if (hci_authentication_active_for_handle(handle)) {
2830         return;
2831     }
2832     bool hci_con_used = false;
2833     btstack_linked_list_iterator_t it;
2834     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2835     while (btstack_linked_list_iterator_has_next(&it)){
2836         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2837         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2838         if (channel->con_handle != handle) continue;
2839         hci_con_used = true;
2840         break;
2841     }
2842     if (hci_con_used) {
2843         return;
2844     }
2845     if (!hci_can_send_command_packet_now()) {
2846         return;
2847     }
2848     hci_send_cmd(&hci_disconnect, handle, 0x13); // remote closed connection
2849 }
2850 
2851 static void l2cap_handle_features_complete(hci_con_handle_t handle){
2852     if (hci_remote_features_available(handle) == false){
2853         return;
2854     }
2855     btstack_linked_list_iterator_t it;
2856     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2857     while (btstack_linked_list_iterator_has_next(&it)){
2858         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2859         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2860         if (channel->con_handle != handle) continue;
2861         log_info("remote supported features, channel %p, cid %04x - state %u", channel, channel->local_cid, channel->state);
2862         l2cap_handle_remote_supported_features_received(channel);
2863     }
2864 }
2865 
2866 static void l2cap_handle_security_level_incoming_sufficient(l2cap_channel_t * channel){
2867     channel->state = L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT;
2868     l2cap_emit_incoming_connection(channel);
2869 }
2870 
2871 static void l2cap_handle_security_level(hci_con_handle_t handle, gap_security_level_t actual_level){
2872     log_info("security level update for handle 0x%04x", handle);
2873 
2874     // trigger l2cap information requests
2875     if (actual_level > LEVEL_0){
2876         hci_connection_t * hci_connection = hci_connection_for_handle(handle);
2877         btstack_assert(hci_connection != NULL);
2878         if (hci_connection->l2cap_state.information_state == L2CAP_INFORMATION_STATE_IDLE){
2879             hci_connection->l2cap_state.information_state = L2CAP_INFORMATION_STATE_W2_SEND_EXTENDED_FEATURE_REQUEST;
2880         }
2881     }
2882 
2883     bool done = false;
2884     while (!done){
2885         done = true;
2886         btstack_linked_list_iterator_t it;
2887         btstack_linked_list_iterator_init(&it, &l2cap_channels);
2888         while (btstack_linked_list_iterator_has_next(&it)){
2889             l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2890             if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2891             if (channel->con_handle != handle) continue;
2892 
2893             gap_security_level_t required_level = channel->required_security_level;
2894 
2895             log_info("channel %p, cid %04x - state %u: actual %u >= required %u?", channel, channel->local_cid, channel->state, actual_level, required_level);
2896 
2897             switch (channel->state){
2898                 case L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE:
2899                     if (actual_level >= required_level){
2900                         l2cap_handle_security_level_incoming_sufficient(channel);
2901                     } else {
2902                         channel->reason = L2CAP_CONNECTION_RESULT_SECURITY_BLOCK;
2903                         channel->state = L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_DECLINE;
2904                     }
2905                     break;
2906 
2907                 case L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE:
2908                     if (actual_level >= required_level){
2909                         l2cap_ready_to_connect(channel);
2910                     } else {
2911                         // security level insufficient, report error and free channel
2912                         l2cap_handle_channel_open_failed(channel, L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_SECURITY);
2913                         btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t  *) channel);
2914                         l2cap_free_channel_entry(channel);
2915                     }
2916                     break;
2917 
2918                 default:
2919                     break;
2920             }
2921         }
2922     }
2923 }
2924 #endif
2925 
2926 #ifdef L2CAP_USES_CHANNELS
2927 static void l2cap_handle_disconnection_complete(hci_con_handle_t handle){
2928     // collect channels to close
2929     btstack_linked_list_t channels_to_close = NULL;
2930     btstack_linked_list_iterator_t it;
2931     btstack_linked_list_iterator_init(&it, &l2cap_channels);
2932     while (btstack_linked_list_iterator_has_next(&it)) {
2933         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2934         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
2935         if (channel->con_handle != handle) continue;
2936         btstack_linked_list_iterator_remove(&it);
2937         btstack_linked_list_add(&channels_to_close, (btstack_linked_item_t *) channel);
2938     }
2939     // send l2cap open failed or closed events for all channels on this handle and free them
2940     btstack_linked_list_iterator_init(&it, &channels_to_close);
2941     while (btstack_linked_list_iterator_has_next(&it)) {
2942         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
2943         btstack_linked_list_iterator_remove(&it);
2944         switch(channel->channel_type){
2945 #ifdef ENABLE_CLASSIC
2946             case L2CAP_CHANNEL_TYPE_CLASSIC:
2947                 l2cap_handle_hci_disconnect_event(channel);
2948                 break;
2949 #endif
2950 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
2951             case L2CAP_CHANNEL_TYPE_CHANNEL_CBM:
2952                 l2cap_handle_hci_le_disconnect_event(channel);
2953                 break;
2954 #endif
2955 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
2956             case L2CAP_CHANNEL_TYPE_CHANNEL_ECBM:
2957                 switch (channel->state) {
2958                     case L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_REQUEST:
2959                     case L2CAP_STATE_WAIT_ENHANCED_CONNECTION_RESPONSE:
2960                         // emit open failed if disconnected before connection complete
2961                         l2cap_ecbm_emit_channel_opened(channel, L2CAP_CONNECTION_BASEBAND_DISCONNECT);
2962                         break;
2963                     case L2CAP_STATE_WILL_SEND_EHNANCED_RENEGOTIATION_REQUEST:
2964                     case L2CAP_STATE_WAIT_ENHANCED_RENEGOTIATION_RESPONSE:
2965                         // emit reconfigure failure - result = 0xffff
2966                         l2cap_ecbm_emit_reconfigure_complete(channel, 0xffff);
2967                         break;
2968                     default:
2969                         l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_CHANNEL_CLOSED);
2970                         break;
2971                 }
2972                 l2cap_free_channel_entry(channel);
2973                 break;
2974 #endif
2975             default:
2976                 break;
2977         }
2978     }
2979 }
2980 #endif
2981 
2982 static void l2cap_hci_event_handler(uint8_t packet_type, uint16_t cid, uint8_t *packet, uint16_t size){
2983 
2984     UNUSED(packet_type); // ok: registered with hci_event_callback_registration
2985     UNUSED(cid);         // ok: there is no channel
2986     UNUSED(size);        // ok: fixed format events read from HCI buffer
2987 
2988 #ifdef ENABLE_CLASSIC
2989     bd_addr_t address;
2990     gap_security_level_t security_level;
2991 #endif
2992 #ifdef L2CAP_USES_CHANNELS
2993     hci_con_handle_t handle;
2994 #endif
2995 
2996     switch(hci_event_packet_get_type(packet)){
2997 
2998         // Notify channel packet handler if they can send now
2999         case HCI_EVENT_TRANSPORT_PACKET_SENT:
3000         case HCI_EVENT_NUMBER_OF_COMPLETED_PACKETS:
3001         case BTSTACK_EVENT_NR_CONNECTIONS_CHANGED:
3002 #ifdef ENABLE_TESTING_SUPPORT
3003         case HCI_EVENT_NOP:
3004 #endif
3005             l2cap_call_notify_channel_in_run = true;
3006             break;
3007 
3008         case HCI_EVENT_COMMAND_STATUS:
3009 #ifdef ENABLE_CLASSIC
3010             // check command status for create connection for errors
3011             if (hci_event_command_status_get_command_opcode(packet) == HCI_OPCODE_HCI_CREATE_CONNECTION){
3012                 // cache outgoing address and reset
3013                 (void)memcpy(address, l2cap_outgoing_classic_addr, 6);
3014                 memset(l2cap_outgoing_classic_addr, 0, 6);
3015                 // error => outgoing connection failed
3016                 uint8_t status = hci_event_command_status_get_status(packet);
3017                 if (status){
3018                     l2cap_handle_connection_failed_for_addr(address, status);
3019                 }
3020             }
3021 #endif
3022             l2cap_run();    // try sending signaling packets first
3023             break;
3024 
3025 #ifdef ENABLE_CLASSIC
3026         // handle connection complete events
3027         case HCI_EVENT_CONNECTION_COMPLETE:
3028             reverse_bd_addr(&packet[5], address);
3029             if (packet[2] == 0){
3030                 handle = little_endian_read_16(packet, 3);
3031                 l2cap_handle_connection_success_for_addr(address, handle);
3032             } else {
3033                 l2cap_handle_connection_failed_for_addr(address, packet[2]);
3034             }
3035             break;
3036 
3037         // handle successful create connection cancel command
3038         case HCI_EVENT_COMMAND_COMPLETE:
3039             if (hci_event_command_complete_get_command_opcode(packet) == HCI_OPCODE_HCI_CREATE_CONNECTION_CANCEL) {
3040                 if (packet[5] == 0){
3041                     reverse_bd_addr(&packet[6], address);
3042                     // CONNECTION TERMINATED BY LOCAL HOST (0X16)
3043                     l2cap_handle_connection_failed_for_addr(address, 0x16);
3044                 }
3045             }
3046             l2cap_run();    // try sending signaling packets first
3047             break;
3048 #endif
3049 
3050 #ifdef L2CAP_USES_CHANNELS
3051         // handle disconnection complete events
3052         case HCI_EVENT_DISCONNECTION_COMPLETE:
3053             handle = little_endian_read_16(packet, 3);
3054             l2cap_handle_disconnection_complete(handle);
3055             break;
3056 #endif
3057 
3058         // HCI Connection Timeouts
3059 #ifdef ENABLE_CLASSIC
3060         case L2CAP_EVENT_TIMEOUT_CHECK:
3061             handle = little_endian_read_16(packet, 2);
3062             l2cap_check_classic_timeout(handle);
3063             break;
3064 
3065         case HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE:
3066         case HCI_EVENT_READ_REMOTE_EXTENDED_FEATURES_COMPLETE:
3067             handle = little_endian_read_16(packet, 3);
3068             l2cap_handle_features_complete(handle);
3069             break;
3070 
3071         case GAP_EVENT_SECURITY_LEVEL:
3072             handle = little_endian_read_16(packet, 2);
3073             security_level = (gap_security_level_t) packet[4];
3074             l2cap_handle_security_level(handle, security_level);
3075             break;
3076 #endif
3077         default:
3078             break;
3079     }
3080 
3081     l2cap_run();
3082 }
3083 
3084 static void l2cap_register_signaling_response(hci_con_handle_t handle, uint8_t code, uint8_t sig_id, uint16_t cid, uint16_t data){
3085     // Vol 3, Part A, 4.3: "The DCID and SCID fields shall be ignored when the result field indicates the connection was refused."
3086     if (l2cap_signaling_responses_pending < NR_PENDING_SIGNALING_RESPONSES) {
3087         l2cap_signaling_responses[l2cap_signaling_responses_pending].handle = handle;
3088         l2cap_signaling_responses[l2cap_signaling_responses_pending].code = code;
3089         l2cap_signaling_responses[l2cap_signaling_responses_pending].sig_id = sig_id;
3090         l2cap_signaling_responses[l2cap_signaling_responses_pending].cid = cid;
3091         l2cap_signaling_responses[l2cap_signaling_responses_pending].data = data;
3092         l2cap_signaling_responses_pending++;
3093         l2cap_run();
3094     }
3095 }
3096 
3097 #ifdef ENABLE_CLASSIC
3098 static void l2cap_handle_disconnect_request(l2cap_channel_t *channel, uint8_t identifier){
3099     switch (channel->state){
3100         case L2CAP_STATE_CONFIG:
3101         case L2CAP_STATE_OPEN:
3102         case L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST:
3103         case L2CAP_STATE_WAIT_DISCONNECT:
3104             break;
3105         default:
3106             // ignore in other states
3107             return;
3108     }
3109 
3110     channel->remote_sig_id = identifier;
3111     channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE;
3112     l2cap_run();
3113 }
3114 
3115 static void l2cap_handle_connection_request(hci_con_handle_t handle, uint8_t sig_id, uint16_t psm, uint16_t source_cid){
3116 
3117     // log_info("l2cap_handle_connection_request for handle %u, psm %u cid 0x%02x", handle, psm, source_cid);
3118     l2cap_service_t *service = l2cap_get_service(psm);
3119     if (!service) {
3120         l2cap_register_signaling_response(handle, CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CONNECTION_RESULT_PSM_NOT_SUPPORTED);
3121         return;
3122     }
3123 
3124     hci_connection_t * hci_connection = hci_connection_for_handle( handle );
3125     if (!hci_connection) {
3126         //
3127         log_error("no hci_connection for handle %u", handle);
3128         return;
3129     }
3130 
3131     // if SC only mode is active and service requires encryption, reject connection if SC not active or use security level
3132     gap_security_level_t required_level = service->required_security_level;
3133     if (gap_get_secure_connections_only_mode() && (required_level != LEVEL_0)){
3134         if (gap_secure_connection(handle)){
3135             required_level = LEVEL_4;
3136         } else {
3137             l2cap_register_signaling_response(handle, CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CONNECTION_RESULT_SECURITY_BLOCK);
3138             return;
3139         }
3140     }
3141 
3142     // alloc structure
3143     l2cap_channel_t * channel = l2cap_create_channel_entry(service->packet_handler, L2CAP_CHANNEL_TYPE_CLASSIC, hci_connection->address, BD_ADDR_TYPE_ACL,
3144     psm, service->mtu, required_level);
3145     if (!channel){
3146         l2cap_register_signaling_response(handle, CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE);
3147         return;
3148     }
3149 
3150     channel->con_handle = handle;
3151     channel->remote_cid = source_cid;
3152     channel->remote_sig_id = sig_id;
3153 
3154     // limit local mtu to max acl packet length - l2cap header
3155     if (channel->local_mtu > l2cap_max_mtu()) {
3156         channel->local_mtu = l2cap_max_mtu();
3157     }
3158 
3159     // set initial state
3160     channel->state =     L2CAP_STATE_WAIT_REMOTE_SUPPORTED_FEATURES;
3161     channel->state_var = L2CAP_CHANNEL_STATE_VAR_INCOMING;
3162 
3163     // add to connections list
3164     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
3165 
3166     //
3167     if (required_level > LEVEL_0){
3168         // send conn resp pending if remote supported features have not been received yet
3169         if (hci_remote_features_available(handle)) {
3170             l2cap_handle_remote_supported_features_received(channel);
3171         } else {
3172             channel->state_var |= L2CAP_CHANNEL_STATE_VAR_SEND_CONN_RESP_PEND;
3173             hci_remote_features_query(handle);
3174         }
3175     } else {
3176         l2cap_handle_security_level_incoming_sufficient(channel);
3177     }
3178 }
3179 
3180 void l2cap_accept_connection(uint16_t local_cid){
3181     log_info("L2CAP_ACCEPT_CONNECTION local_cid 0x%x", local_cid);
3182     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
3183     if (!channel) {
3184         log_error("accept called but local_cid 0x%x not found", local_cid);
3185         return;
3186     }
3187 
3188 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3189     // configure L2CAP Basic mode
3190     channel->mode  = L2CAP_CHANNEL_MODE_BASIC;
3191 #endif
3192 
3193     channel->state = L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_ACCEPT;
3194 
3195     // process
3196     l2cap_run();
3197 }
3198 
3199 void l2cap_decline_connection(uint16_t local_cid){
3200     log_info("decline local_cid 0x%x", local_cid);
3201     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid( local_cid);
3202     if (!channel) {
3203         log_error( "l2cap_decline_connection called but local_cid 0x%x not found", local_cid);
3204         return;
3205     }
3206     channel->state  = L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_DECLINE;
3207     channel->reason = L2CAP_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE;
3208     l2cap_run();
3209 }
3210 
3211 // @pre command len is valid, see check in l2cap_signaling_handler_channel
3212 static void l2cap_signaling_handle_configure_request(l2cap_channel_t *channel, uint8_t *command){
3213 
3214 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3215     uint8_t use_fcs = 1;
3216 #endif
3217 
3218     channel->remote_sig_id = command[L2CAP_SIGNALING_COMMAND_SIGID_OFFSET];
3219 
3220     uint16_t flags = little_endian_read_16(command, 6);
3221     if (flags & 1) {
3222         channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_CONT);
3223     }
3224 
3225     // accept the other's configuration options
3226     uint16_t end_pos = 4 + little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
3227     uint16_t pos     = 8;
3228     while (pos < end_pos){
3229         uint8_t option_hint = command[pos] >> 7;
3230         uint8_t option_type = command[pos] & 0x7f;
3231         // log_info("l2cap cid %u, hint %u, type %u", channel->local_cid, option_hint, option_type);
3232         pos++;
3233         uint8_t length = command[pos++];
3234         // MTU { type(8): 1, len(8):2, MTU(16) }
3235         if ((option_type == L2CAP_CONFIG_OPTION_TYPE_MAX_TRANSMISSION_UNIT) && (length == 2)){
3236             channel->remote_mtu = little_endian_read_16(command, pos);
3237             log_info("Remote MTU %u", channel->remote_mtu);
3238             if (channel->remote_mtu > l2cap_max_mtu()){
3239                 log_info("Remote MTU %u larger than outgoing buffer, only using MTU = %u", channel->remote_mtu, l2cap_max_mtu());
3240                 channel->remote_mtu = l2cap_max_mtu();
3241             }
3242             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_MTU);
3243         }
3244         // Flush timeout { type(8):2, len(8): 2, Flush Timeout(16)}
3245         if ((option_type == L2CAP_CONFIG_OPTION_TYPE_FLUSH_TIMEOUT) && (length == 2)){
3246             channel->flush_timeout = little_endian_read_16(command, pos);
3247             log_info("Flush timeout: %u ms", channel->flush_timeout);
3248         }
3249 
3250 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3251         // Retransmission and Flow Control Option
3252         if (option_type == L2CAP_CONFIG_OPTION_TYPE_RETRANSMISSION_AND_FLOW_CONTROL && length == 9){
3253             l2cap_channel_mode_t mode = (l2cap_channel_mode_t) command[pos];
3254             switch(channel->mode){
3255                 case L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION:
3256                     // Store remote config
3257                     channel->remote_tx_window_size = command[pos+1];
3258                     channel->remote_max_transmit   = command[pos+2];
3259                     channel->remote_retransmission_timeout_ms = little_endian_read_16(command, pos + 3);
3260                     channel->remote_monitor_timeout_ms = little_endian_read_16(command, pos + 5);
3261                     {
3262                         uint16_t remote_mps = little_endian_read_16(command, pos + 7);
3263                         // optimize our tx buffer configuration based on actual remote mps if remote mps is smaller than planned
3264                         if (remote_mps < channel->remote_mps){
3265                             // get current tx storage
3266                             uint16_t num_bytes_per_tx_buffer_before = sizeof(l2cap_ertm_tx_packet_state_t) + channel->remote_mps;
3267                             uint16_t tx_storage = channel->num_tx_buffers * num_bytes_per_tx_buffer_before;
3268 
3269                             channel->remote_mps = remote_mps;
3270                             uint16_t num_bytes_per_tx_buffer_now = sizeof(l2cap_ertm_tx_packet_state_t) + channel->remote_mps;
3271                             channel->num_tx_buffers = tx_storage / num_bytes_per_tx_buffer_now;
3272                             uint32_t total_storage = (sizeof(l2cap_ertm_rx_packet_state_t) + channel->local_mps) * channel->num_rx_buffers + tx_storage + channel->local_mtu;
3273                             l2cap_ertm_setup_buffers(channel, (uint8_t *) channel->rx_packets_state, total_storage);
3274                         }
3275                         // limit remote mtu by our tx buffers. Include 2 bytes SDU Length
3276                         uint16_t effective_mtu = channel->remote_mps * channel->num_tx_buffers - 2;
3277                         channel->remote_mtu    = btstack_min( effective_mtu, channel->remote_mtu);
3278                     }
3279                     log_info("FC&C config: tx window: %u, max transmit %u, retrans timeout %u, monitor timeout %u, mps %u",
3280                         channel->remote_tx_window_size,
3281                         channel->remote_max_transmit,
3282                         channel->remote_retransmission_timeout_ms,
3283                         channel->remote_monitor_timeout_ms,
3284                         channel->remote_mps);
3285                     // If ERTM mandatory, but remote doens't offer ERTM -> disconnect
3286                     if (channel->ertm_mandatory && mode != L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
3287                         channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
3288                     } else {
3289                         channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_ERTM);
3290                     }
3291                     break;
3292                 case L2CAP_CHANNEL_MODE_BASIC:
3293                     switch (mode){
3294                         case L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION:
3295                             // remote asks for ERTM, but we want basic mode. disconnect if this happens a second time
3296                             if (channel->state_var & L2CAP_CHANNEL_STATE_VAR_BASIC_FALLBACK_TRIED){
3297                                 channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
3298                             }
3299                             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_BASIC_FALLBACK_TRIED);
3300                             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_REJECTED);
3301                             break;
3302                         default: // case L2CAP_CHANNEL_MODE_BASIC:
3303                             // TODO store and evaluate configuration
3304                             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_ERTM);
3305                             break;
3306                     }
3307                     break;
3308                 default:
3309                     break;
3310             }
3311         }
3312         if (option_type == L2CAP_CONFIG_OPTION_TYPE_FRAME_CHECK_SEQUENCE && length == 1){
3313             use_fcs = command[pos];
3314         }
3315 #endif
3316         // check for unknown options
3317         if ((option_hint == 0) && ((option_type < L2CAP_CONFIG_OPTION_TYPE_MAX_TRANSMISSION_UNIT) || (option_type > L2CAP_CONFIG_OPTION_TYPE_EXTENDED_WINDOW_SIZE))){
3318             log_info("l2cap cid %u, unknown option 0x%02x", channel->local_cid, option_type);
3319             channel->unknown_option = option_type;
3320             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_INVALID);
3321         }
3322         pos += length;
3323     }
3324 
3325 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3326         // "FCS" has precedence over "No FCS"
3327         uint8_t update = channel->fcs_option || use_fcs;
3328         log_info("local fcs: %u, remote fcs: %u -> %u", channel->fcs_option, use_fcs, update);
3329         channel->fcs_option = update;
3330         // If ERTM mandatory, but remote didn't send Retransmission and Flowcontrol options -> disconnect
3331         if (((channel->state_var & L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_ERTM) == 0) & (channel->ertm_mandatory)){
3332             channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
3333         }
3334 #endif
3335 }
3336 
3337 // @pre command len is valid, see check in l2cap_signaling_handler_channel
3338 static void l2cap_signaling_handle_configure_response(l2cap_channel_t *channel, uint16_t result, uint8_t *command){
3339     log_info("l2cap_signaling_handle_configure_response");
3340 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3341     uint16_t end_pos = 4 + little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
3342     uint16_t pos     = 10;
3343     while (pos < end_pos){
3344         uint8_t option_hint = command[pos] >> 7;
3345         uint8_t option_type = command[pos] & 0x7f;
3346         // log_info("l2cap cid %u, hint %u, type %u", channel->local_cid, option_hint, option_type);
3347         pos++;
3348         uint8_t length = command[pos++];
3349 
3350         // Retransmission and Flow Control Option
3351         if (option_type == L2CAP_CONFIG_OPTION_TYPE_RETRANSMISSION_AND_FLOW_CONTROL && length == 9){
3352             switch (channel->mode){
3353                 case L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION:
3354                     if (channel->ertm_mandatory){
3355                         // ??
3356                     } else {
3357                         // On 'Reject - Unacceptable Parameters' to our optional ERTM request, fall back to BASIC mode
3358                         if (result == L2CAP_CONF_RESULT_UNACCEPTABLE_PARAMETERS){
3359                             l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_ERTM_BUFFER_RELEASED);
3360                             channel->mode = L2CAP_CHANNEL_MODE_BASIC;
3361                         }
3362                     }
3363                     break;
3364                 case L2CAP_CHANNEL_MODE_BASIC:
3365                     if (result == L2CAP_CONF_RESULT_UNACCEPTABLE_PARAMETERS){
3366                         // On 'Reject - Unacceptable Parameters' to our Basic mode request, disconnect
3367                         channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
3368                     }
3369                     break;
3370                 default:
3371                     break;
3372             }
3373         }
3374 
3375         // check for unknown options
3376         if (option_hint == 0 && (option_type < L2CAP_CONFIG_OPTION_TYPE_MAX_TRANSMISSION_UNIT || option_type > L2CAP_CONFIG_OPTION_TYPE_EXTENDED_WINDOW_SIZE)){
3377             log_info("l2cap cid %u, unknown option 0x%02x", channel->local_cid, option_type);
3378             channel->unknown_option = option_type;
3379             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_INVALID);
3380         }
3381 
3382         pos += length;
3383     }
3384 #else
3385     UNUSED(channel);  // ok: no code
3386     UNUSED(result);   // ok: no code
3387     UNUSED(command);  // ok: no code
3388 #endif
3389 }
3390 
3391 static int l2cap_channel_ready_for_open(l2cap_channel_t *channel){
3392     // log_info("l2cap_channel_ready_for_open 0x%02x", channel->state_var);
3393     if ((channel->state_var & L2CAP_CHANNEL_STATE_VAR_RCVD_CONF_RSP) == 0) return 0;
3394     if ((channel->state_var & L2CAP_CHANNEL_STATE_VAR_SENT_CONF_RSP) == 0) return 0;
3395     // addition check that fixes re-entrance issue causing l2cap event channel opened twice
3396     if (channel->state == L2CAP_STATE_OPEN) return 0;
3397     return 1;
3398 }
3399 
3400 
3401 // @pre command len is valid, see check in l2cap_signaling_handler_dispatch
3402 static void l2cap_signaling_handler_channel(l2cap_channel_t *channel, uint8_t *command){
3403 
3404     uint8_t  code       = command[L2CAP_SIGNALING_COMMAND_CODE_OFFSET];
3405     uint8_t  identifier = command[L2CAP_SIGNALING_COMMAND_SIGID_OFFSET];
3406     uint16_t cmd_len    = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
3407     uint16_t result = 0;
3408 
3409     log_info("L2CAP signaling handler code %u, state %u", code, channel->state);
3410 
3411     // handle DISCONNECT REQUESTS seperately
3412     if (code == DISCONNECTION_REQUEST){
3413         l2cap_handle_disconnect_request(channel, identifier);
3414         return;
3415     }
3416 
3417     // @STATEMACHINE(l2cap)
3418     switch (channel->state) {
3419 
3420         case L2CAP_STATE_WAIT_CONNECT_RSP:
3421             switch (code){
3422                 case CONNECTION_RESPONSE:
3423                     if (cmd_len < 8){
3424                         // command imcomplete
3425                         l2cap_register_signaling_response(channel->con_handle, COMMAND_REJECT, identifier, 0, L2CAP_REJ_CMD_UNKNOWN);
3426                         break;
3427                     }
3428                     l2cap_stop_rtx(channel);
3429                     result = little_endian_read_16 (command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+4);
3430                     switch (result) {
3431                         case 0:
3432                             // successful connection
3433                             channel->remote_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3434                             channel->state = L2CAP_STATE_CONFIG;
3435                             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_REQ);
3436                             break;
3437                         case 1:
3438                             // connection pending. get some coffee, but start the ERTX
3439                             l2cap_start_ertx(channel);
3440                             break;
3441                         default:
3442                             // channel closed
3443                             channel->state = L2CAP_STATE_CLOSED;
3444                             // map l2cap connection response result to BTstack status enumeration
3445                             l2cap_handle_channel_open_failed(channel, L2CAP_CONNECTION_RESPONSE_RESULT_SUCCESSFUL + result);
3446 
3447                             // drop link key if security block
3448                             if ((L2CAP_CONNECTION_RESPONSE_RESULT_SUCCESSFUL + result) == L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_SECURITY){
3449                                 gap_drop_link_key_for_bd_addr(channel->address);
3450                             }
3451 
3452                             // discard channel
3453                             btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
3454                             l2cap_free_channel_entry(channel);
3455                             break;
3456                     }
3457                     break;
3458 
3459                 default:
3460                     //@TODO: implement other signaling packets
3461                     break;
3462             }
3463             break;
3464 
3465         case L2CAP_STATE_CONFIG:
3466             switch (code) {
3467                 case CONFIGURE_REQUEST:
3468                     if (cmd_len < 4){
3469                         // command incomplete
3470                         l2cap_register_signaling_response(channel->con_handle, COMMAND_REJECT, identifier, 0, L2CAP_REJ_CMD_UNKNOWN);
3471                         break;
3472                     }
3473                     channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP);
3474                     l2cap_signaling_handle_configure_request(channel, command);
3475                     if (!(channel->state_var & L2CAP_CHANNEL_STATE_VAR_SEND_CONF_RSP_CONT)){
3476                         // only done if continuation not set
3477                         channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_RCVD_CONF_REQ);
3478                     }
3479                     break;
3480                 case CONFIGURE_RESPONSE:
3481                     if (cmd_len < 6){
3482                         // command incomplete
3483                         l2cap_register_signaling_response(channel->con_handle, COMMAND_REJECT, identifier, 0, L2CAP_REJ_CMD_UNKNOWN);
3484                         break;
3485                     }
3486                     result = little_endian_read_16 (command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+4);
3487                     l2cap_stop_rtx(channel);
3488                     l2cap_signaling_handle_configure_response(channel, result, command);
3489                     switch (result){
3490                         case 0: // success
3491                             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_RCVD_CONF_RSP);
3492                             break;
3493                         case 4: // pending
3494                             l2cap_start_ertx(channel);
3495                             break;
3496                         default:
3497 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3498                             if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION && channel->ertm_mandatory){
3499                                 // remote does not offer ertm but it's required
3500                                 channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
3501                                 break;
3502                             }
3503 #endif
3504                             // retry on negative result
3505                             channelStateVarSetFlag(channel, L2CAP_CHANNEL_STATE_VAR_SEND_CONF_REQ);
3506                             break;
3507                     }
3508                     break;
3509                 default:
3510                     break;
3511             }
3512             if (l2cap_channel_ready_for_open(channel)){
3513 
3514 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3515                 // assert that packet can be stored in fragment buffers in ertm
3516                 if (channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
3517                     uint16_t effective_mps = btstack_min(channel->remote_mps, channel->local_mps);
3518                     uint16_t usable_mtu = channel->num_tx_buffers == 1 ? effective_mps : channel->num_tx_buffers * effective_mps - 2;
3519                     if (usable_mtu < channel->remote_mtu){
3520                         log_info("Remote MTU %u > max storable ERTM packet, only using MTU = %u", channel->remote_mtu, usable_mtu);
3521                         channel->remote_mtu = usable_mtu;
3522                     }
3523                 }
3524 #endif
3525                 // for open:
3526                 channel->state = L2CAP_STATE_OPEN;
3527                 l2cap_emit_channel_opened(channel, 0);
3528             }
3529             break;
3530 
3531         case L2CAP_STATE_WAIT_DISCONNECT:
3532             switch (code) {
3533                 case DISCONNECTION_RESPONSE:
3534                     l2cap_finalize_channel_close(channel);
3535                     break;
3536                 default:
3537                     //@TODO: implement other signaling packets
3538                     break;
3539             }
3540             break;
3541 
3542         case L2CAP_STATE_CLOSED:
3543             // @TODO handle incoming requests
3544             break;
3545 
3546         case L2CAP_STATE_OPEN:
3547             //@TODO: implement other signaling packets, e.g. re-configure
3548             break;
3549         default:
3550             break;
3551     }
3552     // log_info("new state %u", channel->state);
3553 }
3554 
3555 #ifdef ENABLE_CLASSIC
3556 static void l2cap_handle_information_request_complete(hci_connection_t * connection){
3557 
3558     connection->l2cap_state.information_state = L2CAP_INFORMATION_STATE_DONE;
3559 
3560     // emit event
3561     uint8_t event[8];
3562     event[0] = L2CAP_EVENT_INFORMATION_RESPONSE;
3563     event[1] = sizeof(event) - 2;
3564     little_endian_store_16(event, 2, connection->con_handle);
3565     little_endian_store_16(event, 4, connection->l2cap_state.extended_feature_mask);
3566     little_endian_store_16(event, 6, connection->l2cap_state.fixed_channels_supported);
3567     l2cap_emit_event(event, sizeof(event));
3568 
3569     // trigger connection request
3570     btstack_linked_list_iterator_t it;
3571     btstack_linked_list_iterator_init(&it, &l2cap_channels);
3572     while (btstack_linked_list_iterator_has_next(&it)){
3573         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
3574         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
3575         if (channel->con_handle != connection->con_handle) continue;
3576 
3577         // incoming connection: information request was triggered after user has accepted connection,
3578         // now: verify channel configuration, esp. if ertm will be mandatory
3579         if (channel->state == L2CAP_STATE_WAIT_INCOMING_EXTENDED_FEATURES){
3580             // default: continue
3581             channel->state = L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_ACCEPT;
3582 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3583             if ((channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION) && ((connection->l2cap_state.extended_feature_mask & 0x08) == 0)){
3584                 // ERTM not possible, select basic mode and release buffer
3585                 channel->mode = L2CAP_CHANNEL_MODE_BASIC;
3586                 l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_ERTM_BUFFER_RELEASED);
3587 
3588                 // bail if ERTM is mandatory
3589                 if (channel->ertm_mandatory){
3590                     // We chose 'no resources available' for "ERTM mandatory but you don't even know ERTM exists"
3591                     log_info("ERTM mandatory -> reject connection");
3592                     channel->state  = L2CAP_STATE_WILL_SEND_CONNECTION_RESPONSE_DECLINE;
3593                     channel->reason = L2CAP_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE;
3594                 }  else {
3595                     log_info("ERTM not supported by remote -> use Basic mode");
3596                 }
3597             }
3598 #endif
3599             continue;
3600         }
3601 
3602         // outgoing connection: information request is triggered before connection request
3603         if (channel->state == L2CAP_STATE_WAIT_OUTGOING_EXTENDED_FEATURES){
3604 
3605 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
3606             // if ERTM was requested, but is not listed in extended feature mask:
3607             if ((channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION) && ((connection->l2cap_state.extended_feature_mask & 0x08) == 0)){
3608 
3609                 if (channel->ertm_mandatory){
3610                     // bail if ERTM is mandatory
3611                     channel->state = L2CAP_STATE_CLOSED;
3612                     // map l2cap connection response result to BTstack status enumeration
3613                     l2cap_handle_channel_open_failed(channel, L2CAP_CONNECTION_RESPONSE_RESULT_ERTM_NOT_SUPPORTED);
3614                     // discard channel
3615                     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
3616                     l2cap_free_channel_entry(channel);
3617                     continue;
3618 
3619                 } else {
3620                     // fallback to Basic mode
3621                     l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_ERTM_BUFFER_RELEASED);
3622                     channel->mode = L2CAP_CHANNEL_MODE_BASIC;
3623                 }
3624             }
3625 #endif
3626 
3627             // respond to connection request
3628             channel->state = L2CAP_STATE_WILL_SEND_CONNECTION_REQUEST;
3629             continue;
3630         }
3631     }
3632 }
3633 #endif
3634 
3635 // @pre command len is valid, see check in l2cap_acl_classic_handler
3636 static void l2cap_signaling_handler_dispatch(hci_con_handle_t handle, uint8_t * command){
3637 
3638     hci_connection_t * connection;
3639     btstack_linked_list_iterator_t it;
3640 
3641     // get code, signal identifier and command len
3642     uint8_t code     = command[L2CAP_SIGNALING_COMMAND_CODE_OFFSET];
3643     uint8_t sig_id   = command[L2CAP_SIGNALING_COMMAND_SIGID_OFFSET];
3644     uint16_t cmd_len = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
3645 
3646     // general commands without an assigned channel
3647     switch(code) {
3648 
3649         case CONNECTION_REQUEST:
3650             if (cmd_len == 4){
3651                 uint16_t psm =        little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3652                 uint16_t source_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+2);
3653                 l2cap_handle_connection_request(handle, sig_id, psm, source_cid);
3654             } else {
3655                 l2cap_register_signaling_response(handle, COMMAND_REJECT, sig_id, 0, L2CAP_REJ_CMD_UNKNOWN);
3656             }
3657             return;
3658 
3659         case ECHO_REQUEST:
3660             l2cap_register_signaling_response(handle, code, sig_id, 0, 0);
3661             return;
3662 
3663         case INFORMATION_REQUEST:
3664             if (cmd_len == 2) {
3665                 uint16_t info_type = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3666                 l2cap_register_signaling_response(handle, code, sig_id, 0, info_type);
3667                 return;
3668             }
3669             break;
3670 
3671         case INFORMATION_RESPONSE:
3672             connection = hci_connection_for_handle(handle);
3673             if (!connection) return;
3674             switch (connection->l2cap_state.information_state){
3675                 case L2CAP_INFORMATION_STATE_W4_EXTENDED_FEATURE_RESPONSE:
3676                     // get extended features from response if valid
3677                     if (cmd_len >= 6) {
3678                         uint16_t info_type = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3679                         uint16_t result    = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+2);
3680                         if (result == 0 && info_type == L2CAP_INFO_TYPE_EXTENDED_FEATURES_SUPPORTED) {
3681                             connection->l2cap_state.extended_feature_mask = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+4);
3682                         }
3683                         log_info("extended features mask 0x%02x", connection->l2cap_state.extended_feature_mask);
3684                         if ((connection->l2cap_state.extended_feature_mask & 0x80) != 0){
3685                             connection->l2cap_state.information_state = L2CAP_INFORMATION_STATE_W2_SEND_FIXED_CHANNELS_REQUEST;
3686                         } else {
3687                             // information request complete
3688                             l2cap_handle_information_request_complete(connection);
3689                         }
3690                     }
3691                     break;
3692                 case L2CAP_INFORMATION_STATE_W4_FIXED_CHANNELS_RESPONSE:
3693                     if (cmd_len >= 12) {
3694                         uint16_t info_type = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3695                         uint16_t result    = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+2);
3696                         if (result == 0 && info_type == L2CAP_INFO_TYPE_FIXED_CHANNELS_SUPPORTED) {
3697                             connection->l2cap_state.fixed_channels_supported = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 4);
3698                         }
3699                         log_info("fixed channels mask 0x%02x", connection->l2cap_state.fixed_channels_supported);
3700                         // information request complete
3701                         l2cap_handle_information_request_complete(connection);
3702                     }
3703                     break;
3704                 default:
3705                     break;
3706             }
3707             return;
3708 
3709 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
3710         case L2CAP_CREDIT_BASED_CONNECTION_REQUEST:
3711         case L2CAP_CREDIT_BASED_CONNECTION_RESPONSE:
3712         case L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST:
3713         case L2CAP_CREDIT_BASED_RECONFIGURE_RESPONSE:
3714             l2cap_ecbm_signaling_handler_dispatch(handle, L2CAP_CID_SIGNALING, command, sig_id);
3715             return;
3716         case L2CAP_FLOW_CONTROL_CREDIT_INDICATION:
3717             // return if valid
3718             if (l2cap_credit_based_handle_credit_indication(handle, command, cmd_len)) return;
3719             break;
3720 
3721         case COMMAND_REJECT:
3722             btstack_linked_list_iterator_init(&it, &l2cap_channels);
3723             while (btstack_linked_list_iterator_has_next(&it)) {
3724                 l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
3725                 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
3726                 if (channel->con_handle != handle) continue;
3727                 if (channel->local_sig_id != sig_id) continue;
3728                 if (channel->state != L2CAP_STATE_WAIT_ENHANCED_CONNECTION_RESPONSE) continue;
3729 
3730                 // open failed
3731                 channel->state = L2CAP_STATE_CLOSED;
3732                 l2cap_ecbm_emit_channel_opened(channel,
3733                                                ERROR_CODE_CONNECTION_REJECTED_DUE_TO_LIMITED_RESOURCES);
3734                 // drop failed channel
3735                 btstack_linked_list_iterator_remove(&it);
3736                 l2cap_free_channel_entry(channel);
3737             }
3738             break;
3739 #endif
3740 
3741         default:
3742             break;
3743     }
3744 
3745     // Get potential destination CID
3746     uint16_t dest_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3747 
3748     // Find channel for this sig_id and connection handle
3749     btstack_linked_list_iterator_init(&it, &l2cap_channels);
3750     while (btstack_linked_list_iterator_has_next(&it)){
3751         l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
3752         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
3753         if (channel->con_handle != handle) continue;
3754         if (code & 1) {
3755             // match odd commands (responses) by previous signaling identifier
3756             if (channel->local_sig_id == sig_id) {
3757                 l2cap_signaling_handler_channel(channel, command);
3758                 return;
3759             }
3760         } else {
3761             // match even commands (requests) by local channel id
3762             if (channel->local_cid == dest_cid) {
3763                 l2cap_signaling_handler_channel(channel, command);
3764                 return;
3765             }
3766         }
3767     }
3768 
3769     // If dynamic channel cannot be found, either never set-up or already finalized, assume state CLOSED
3770     // Handle events as described in Core 5.4, Vol 3. Host, 6.1.1 CLOSED state
3771     switch (code){
3772         case CONNECTION_RESPONSE:
3773         case CONFIGURE_RESPONSE:
3774         case DISCONNECTION_RESPONSE:
3775             // Ignore request
3776             break;
3777         default:
3778             // send command reject with reason unknown command
3779             l2cap_register_signaling_response(handle, COMMAND_REJECT, sig_id, 0, L2CAP_REJ_CMD_UNKNOWN);
3780             break;
3781     }
3782 }
3783 #endif
3784 
3785 #ifdef L2CAP_USES_CHANNELS
3786 static l2cap_service_t * l2cap_get_service_internal(btstack_linked_list_t * services, uint16_t psm){
3787     btstack_linked_list_iterator_t it;
3788     btstack_linked_list_iterator_init(&it, services);
3789     while (btstack_linked_list_iterator_has_next(&it)){
3790         l2cap_service_t * service = (l2cap_service_t *) btstack_linked_list_iterator_next(&it);
3791         if ( service->psm == psm){
3792             return service;
3793         };
3794     }
3795     return NULL;
3796 }
3797 #endif
3798 
3799 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
3800 
3801 static uint8_t l2cap_ecbm_setup_channels(btstack_linked_list_t * channels,
3802                                          btstack_packet_handler_t packet_handler, uint8_t num_channels,
3803                                          hci_connection_t * connection, uint16_t psm, uint16_t mtu, gap_security_level_t security_level){
3804     uint8_t i;
3805     uint8_t status = ERROR_CODE_SUCCESS;
3806     for (i=0;i<num_channels;i++){
3807         l2cap_channel_t * channel = l2cap_create_channel_entry(packet_handler, L2CAP_CHANNEL_TYPE_CHANNEL_ECBM, connection->address, connection->address_type, psm, mtu, security_level);
3808         if (!channel) {
3809             status = BTSTACK_MEMORY_ALLOC_FAILED;
3810             break;
3811         }
3812         channel->con_handle = connection->con_handle;
3813         btstack_linked_list_add_tail(channels, (btstack_linked_item_t *) channel);
3814     }
3815 
3816     // free channels if not all allocated
3817     if (status != ERROR_CODE_SUCCESS){
3818         while (true) {
3819             l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_pop(channels);
3820             if (channel == NULL) break;
3821             l2cap_free_channel_entry(channel);
3822         }
3823     }
3824 
3825     return status;
3826 }
3827 
3828 static inline l2cap_service_t * l2cap_ecbm_get_service(uint16_t spsm){
3829     return l2cap_get_service_internal(&l2cap_enhanced_services, spsm);
3830 }
3831 
3832 static inline uint8_t l2cap_ecbm_status_for_result(uint16_t result) {
3833     switch (result) {
3834         case L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS:
3835             return ERROR_CODE_SUCCESS;
3836         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_SPSM_NOT_SUPPORTED:
3837             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_PSM;
3838         case L2CAP_ECBM_CONNECTION_RESULT_SOME_REFUSED_INSUFFICIENT_RESOURCES_AVAILABLE:
3839             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_RESOURCES;
3840         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_AUTHENTICATION:
3841         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_AUTHORIZATION:
3842         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_ENCYRPTION_KEY_SIZE_TOO_SHORT:
3843         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_ENCRYPTION:
3844             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_SECURITY;
3845         default:
3846             // invalid Source CID, Source CID already allocated, unacceptable parameters
3847             return L2CAP_CONNECTION_RESPONSE_UNKNOWN_ERROR;
3848     }
3849 }
3850 
3851 static void
3852 l2cap_ecbm_emit_incoming_connection(l2cap_channel_t *channel, uint8_t num_channels) {
3853     uint8_t event[16];
3854     event[0] = L2CAP_EVENT_ECBM_INCOMING_CONNECTION;
3855     event[1] = sizeof(event) - 2;
3856     event[2] = channel->address_type;
3857     reverse_bd_addr(channel->address, &event[3]);
3858     little_endian_store_16(event, 9, channel->con_handle);
3859     little_endian_store_16(event, 11, channel->psm);
3860     event[13] = num_channels;
3861     little_endian_store_16(event, 14, channel->local_cid);
3862     hci_dump_packet(HCI_EVENT_PACKET, 1, event, sizeof(event));
3863     (*channel->packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
3864 }
3865 
3866 static uint8_t
3867 l2cap_ecbm_security_status_for_connection_request(hci_con_handle_t handle, gap_security_level_t required_security_level,
3868                                                   bool requires_authorization) {
3869     // check security in increasing error priority
3870     uint8_t security_status = L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS;
3871 
3872     // security: check encryption
3873     if (required_security_level >= LEVEL_2) {
3874         if (gap_encryption_key_size(handle) < 16) {
3875             security_status = L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_ENCYRPTION_KEY_SIZE_TOO_SHORT;
3876         }
3877         if (gap_encryption_key_size(handle) == 0){
3878             security_status = L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_ENCRYPTION;
3879         }
3880     }
3881 
3882     // security: check authentication
3883     if (required_security_level >= LEVEL_3) {
3884         if (!gap_authenticated(handle)) {
3885             security_status = requires_authorization ?
3886                     L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_AUTHORIZATION :
3887                     L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_AUTHENTICATION;
3888         }
3889     }
3890     return security_status;
3891 }
3892 
3893 static void l2cap_ecbm_handle_security_level_incoming(l2cap_channel_t * channel){
3894     // count number of l2cap_channels in state L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE with same remote_sig_id
3895     uint8_t sig_id = channel->remote_sig_id;
3896     hci_con_handle_t con_handle = channel->con_handle;
3897 
3898     uint8_t security_status = l2cap_ecbm_security_status_for_connection_request(channel->con_handle,
3899                                                                                 channel->required_security_level,
3900                                                                                 false);
3901     bool security_sufficient = security_status == L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS;
3902 
3903     uint8_t num_channels = 0;
3904     btstack_linked_list_iterator_t it;
3905     btstack_linked_list_iterator_init(&it, &l2cap_channels);
3906     while (btstack_linked_list_iterator_has_next(&it)) {
3907         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
3908         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
3909         if (channel->con_handle != con_handle) continue;
3910         if (channel->remote_sig_id != sig_id) continue;
3911         if (channel->state != L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE) continue;
3912         num_channels++;
3913 
3914         if (security_sufficient){
3915             channel->state = L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT;
3916         } else {
3917             btstack_linked_list_iterator_remove(&it);
3918             btstack_memory_l2cap_channel_free(channel);
3919         }
3920     }
3921 
3922     if (security_sufficient){
3923         l2cap_ecbm_emit_incoming_connection(channel, num_channels);
3924     } else {
3925         // combine signaling cid and number channels for l2cap_register_signaling_response
3926         uint16_t signaling_cid = L2CAP_CID_SIGNALING;
3927         uint16_t num_channels_and_signaling_cid = (num_channels << 8) | signaling_cid;
3928         l2cap_register_signaling_response(con_handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
3929                                           num_channels_and_signaling_cid, security_status);
3930     }
3931 }
3932 
3933 void l2cap_ecbm_trigger_pending_connection_responses(hci_con_handle_t con_handle){
3934     bool done = false;
3935     while (!done) {
3936         done = true;
3937         btstack_linked_list_iterator_t it;
3938         btstack_linked_list_iterator_init(&it, &l2cap_channels);
3939         while (btstack_linked_list_iterator_has_next(&it)) {
3940             l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
3941             if (channel->channel_type != L2CAP_CHANNEL_TYPE_CHANNEL_ECBM) continue;
3942             if (channel->con_handle != con_handle) continue;
3943             if  (channel->state == L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE) {
3944                 l2cap_ecbm_handle_security_level_incoming(channel);
3945                 done = false;
3946             };
3947         }
3948     }
3949 }
3950 
3951 static int l2cap_ecbm_signaling_handler_dispatch(hci_con_handle_t handle, uint16_t signaling_cid, uint8_t *command,
3952                                                  uint8_t sig_id) {
3953 
3954     hci_connection_t *connection;
3955     btstack_linked_list_iterator_t it;
3956     l2cap_service_t *service;
3957     uint16_t spsm;
3958     uint8_t num_channels;
3959     uint16_t num_channels_and_signaling_cid;
3960     uint8_t i;
3961     uint16_t new_mtu;
3962     uint16_t new_mps;
3963     uint16_t initial_credits;
3964     uint16_t result;
3965     uint8_t status;
3966 
3967     uint8_t code = command[L2CAP_SIGNALING_COMMAND_CODE_OFFSET];
3968     uint16_t len = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
3969     log_info("enhanced dispatch: command 0x%02x, sig id %u, len %u", code, sig_id, len);
3970 
3971     switch (code) {
3972         case L2CAP_CREDIT_BASED_CONNECTION_REQUEST:
3973             // check size
3974             if (len < 10u) return 0u;
3975 
3976             // get hci connection, bail if not found (must not happen)
3977             connection = hci_connection_for_handle(handle);
3978             btstack_assert(connection != NULL);
3979 
3980             // get num channels to establish
3981             num_channels = (len - 8) / sizeof(uint16_t);
3982 
3983             // combine signaling cid and number channels for l2cap_register_signaling_response
3984             num_channels_and_signaling_cid = (num_channels << 8) | signaling_cid;
3985 
3986             // check if service registered
3987             spsm = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3988             service = l2cap_ecbm_get_service(spsm);
3989 
3990             if (service) {
3991 
3992                 uint16_t remote_mtu = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
3993                 uint16_t remote_mps = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 4);
3994                 uint16_t credits_outgoing = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 6);
3995 
3996                 // param: check remote mtu
3997                 if (service->mtu > remote_mtu) {
3998                     l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
3999                                                       num_channels_and_signaling_cid, L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INVALID_PARAMETERS);
4000                     return 1;
4001                 }
4002 
4003                 // check if authentication is required and possible
4004                 bool send_pending = false;
4005                 uint8_t security_status = l2cap_ecbm_security_status_for_connection_request(handle,
4006                                                                                             service->required_security_level,
4007                                                                                             service->requires_authorization);
4008                 if (security_status != L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS) {
4009                     if (gap_get_bondable_mode() != 0) {
4010                         // if possible, send pending and continue
4011                         send_pending = true;
4012                     } else {
4013                         // otherwise, send refused and abort
4014                         l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4015                                                           num_channels_and_signaling_cid, security_status);
4016                         return 1;
4017                     }
4018                 }
4019 
4020                 // report the last result code != 0
4021                 result = 0;
4022                 // store one of the local channels for the event
4023                 l2cap_channel_t * a_channel = NULL;
4024                 for (i = 0; i < num_channels; i++) {
4025 
4026                     // check source cids
4027                     uint16_t source_cid = little_endian_read_16(command, 12 + (i * 2));
4028                     if (source_cid < 0x40u) {
4029                         result = L2CAP_ECBM_CONNECTION_RESULT_SOME_REFUSED_INVALID_SOURCE_CID;
4030                         continue;
4031                     }
4032 
4033                     // go through list of channels for this ACL connection and check if we get a match
4034                     btstack_linked_list_iterator_init(&it, &l2cap_channels);
4035                     bool source_cid_allocated = false;
4036                     while (btstack_linked_list_iterator_has_next(&it)) {
4037                         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4038                         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
4039                         if (channel->con_handle != handle) continue;
4040                         if (channel->remote_cid != source_cid) continue;
4041                         source_cid_allocated = true;
4042                         break;
4043                     }
4044                     if (source_cid_allocated) {
4045                         result = 0x00a;
4046                         continue;
4047                     }
4048 
4049                     // setup channel
4050                     l2cap_channel_t *channel = l2cap_create_channel_entry(service->packet_handler,
4051                                                                           L2CAP_CHANNEL_TYPE_CHANNEL_ECBM,
4052                                                                           connection->address,
4053                                                                           connection->address_type, spsm,
4054                                                                           service->mtu,
4055                                                                           service->required_security_level);
4056 
4057                     if (channel == NULL) {
4058                         // Some connections refused – insufficient resources available
4059                         result = 0x004;
4060                         continue;
4061                     }
4062 
4063                     // setup state
4064                     channel->state = L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE;
4065                     channel->state_var |= L2CAP_CHANNEL_STATE_VAR_INCOMING;
4066                     channel->con_handle = connection->con_handle;
4067                     channel->remote_sig_id = sig_id;
4068                     channel->remote_cid = source_cid;
4069                     channel->remote_mtu = remote_mtu;
4070                     channel->remote_mps = remote_mps;
4071                     channel->credits_outgoing = credits_outgoing;
4072                     channel->cid_index = i;
4073                     channel->num_cids = num_channels;
4074 
4075                     // if more than one error, we can report any of them
4076                     channel->reason = result;
4077 
4078                     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
4079 
4080                     a_channel = channel;
4081                 }
4082 
4083                 // if no channels have been created, all have been refused, and we can respond right away
4084                 if (a_channel == NULL) {
4085                     l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4086                                                       num_channels_and_signaling_cid, result);
4087                     return 1;
4088                 }
4089 
4090                 // if security is pending, send intermediate response, otherwise, ask user
4091                 if (send_pending){
4092                     l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4093                                                       num_channels_and_signaling_cid, L2CAP_ECBM_CONNECTION_RESULT_ALL_PENDING_AUTHENTICATION);
4094                 } else {
4095                     // if security is ok but authorization is required, send intermediate response and ask user
4096                     if (service->requires_authorization){
4097                         l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4098                                                           num_channels_and_signaling_cid, L2CAP_ECBM_CONNECTION_RESULT_ALL_PENDING_AUTHORIZATION);
4099                     }
4100                     l2cap_ecbm_handle_security_level_incoming(a_channel);
4101                 }
4102 
4103             } else {
4104                 l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4105                                                   num_channels_and_signaling_cid, L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_SPSM_NOT_SUPPORTED);
4106             }
4107             return 1;
4108 
4109         case L2CAP_CREDIT_BASED_CONNECTION_RESPONSE:
4110             // check size
4111             if (len < 10u) return 0u;
4112 
4113             // get hci connection, ignore if not found
4114             connection = hci_connection_for_handle(handle);
4115             if (connection == NULL) return 0;
4116 
4117             // get channel config: mtu, mps, initial credits, result
4118             new_mtu = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4119             new_mps = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
4120             initial_credits = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 4);
4121             result = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 6);
4122             status = l2cap_ecbm_status_for_result(result);
4123 
4124             // get num channels to modify
4125             num_channels = (len - 8) / sizeof(uint16_t);
4126             btstack_linked_list_iterator_init(&it, &l2cap_channels);
4127             while (btstack_linked_list_iterator_has_next(&it)) {
4128                 uint8_t channel_status = status;
4129                 l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4130                 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
4131                 if (channel->con_handle != handle) continue;
4132                 if (channel->local_sig_id != sig_id) continue;
4133                 if (channel->state != L2CAP_STATE_WAIT_ENHANCED_CONNECTION_RESPONSE) continue;
4134                 if (channel->cid_index < num_channels) {
4135                     uint16_t remote_cid = little_endian_read_16(command, 12 + channel->cid_index * sizeof(uint16_t));
4136                     if (remote_cid != 0) {
4137                         // check for duplicate remote CIDs
4138                         l2cap_channel_t * original_channel = l2cap_get_channel_for_remote_handle_and_cid(handle, remote_cid);
4139                         if (original_channel == NULL){
4140                             channel->state = L2CAP_STATE_OPEN;
4141                             channel->remote_cid = remote_cid;
4142                             channel->remote_mtu = new_mtu;
4143                             channel->remote_mps = new_mps;
4144                             channel->credits_outgoing = initial_credits;
4145                             l2cap_ecbm_emit_channel_opened(channel, ERROR_CODE_SUCCESS);
4146                             continue;
4147                         }
4148                         // close original channel
4149                         original_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
4150                         channel_status = ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS;
4151                     }
4152                 }
4153                 // open failed
4154                 l2cap_ecbm_emit_channel_opened(channel, channel_status);
4155                 // drop failed channel
4156                 btstack_linked_list_iterator_remove(&it);
4157                 btstack_memory_l2cap_channel_free(channel);
4158             }
4159             return 1;
4160 
4161         case L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST:
4162             // check minimal size
4163             if (len < 6) return 0u;
4164 
4165             // get hci connection, bail if not found (must not happen)
4166             connection = hci_connection_for_handle(handle);
4167             btstack_assert(connection != NULL);
4168 
4169             // get num channels to modify
4170             num_channels = (len - 4) / sizeof(uint16_t);
4171 
4172             // get new mtu and mps
4173             new_mtu = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4174             new_mps = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
4175 
4176             // validate request
4177             result = 0;
4178             for (i = 0; i < num_channels; i++) {
4179                 // check cid
4180                 uint16_t remote_cid = little_endian_read_16(command, 8 + (i * sizeof(uint16_t)));
4181                 l2cap_channel_t *channel = l2cap_get_channel_for_remote_handle_and_cid(handle, remote_cid);
4182                 if (channel == NULL) {
4183                     result = L2CAP_ECBM_RECONFIGURE_FAILED_DESTINATION_CID_INVALID;
4184                     break;
4185                 }
4186                 // check MTU is not reduced
4187                 if (channel->remote_mtu > new_mtu) {
4188                     result = L2CAP_ECBM_RECONFIGURE_FAILED_MTU_REDUCTION_NOT_ALLOWED;
4189                     break;
4190                 }
4191                 // check MPS reduction
4192                 if ((num_channels > 1) && (channel->remote_mps > new_mps)) {
4193                     result = L2CAP_ECBM_RECONFIGURE_FAILED_MPS_REDUCTION_MULTIPLE_CHANNELS;
4194                     break;
4195                 }
4196                 // check MPS valid
4197                 if (new_mps < l2cap_enhanced_mps_min) {
4198                     result = L2CAP_ECBM_RECONFIGURE_FAILED_UNACCEPTABLE_PARAMETERS;
4199                     break;
4200                 }
4201             }
4202 
4203             // send reject
4204             if (result != 0) {
4205                 l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST, sig_id, signaling_cid,
4206                                                   result);
4207                 return 1;
4208             }
4209 
4210             // update channels
4211             for (i = 0; i < num_channels; i++) {
4212                 uint16_t remote_cid = little_endian_read_16(command, 8 + (i * sizeof(uint16_t)));
4213                 l2cap_channel_t *channel = l2cap_get_channel_for_remote_handle_and_cid(handle, remote_cid);
4214                 channel->remote_mps = new_mps;
4215                 channel->remote_mtu = new_mtu;
4216                 // emit event
4217                 uint8_t event[8];
4218                 event[0] = L2CAP_EVENT_ECBM_RECONFIGURED;
4219                 event[1] = sizeof(event) - 2;
4220                 little_endian_store_16(event, 2, channel->local_cid);
4221                 little_endian_store_16(event, 4, new_mtu);
4222                 little_endian_store_16(event, 6, new_mps);
4223                 l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
4224             }
4225 
4226             // send accept
4227             l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST, sig_id, signaling_cid, 0);
4228             return 1;
4229 
4230         case L2CAP_CREDIT_BASED_RECONFIGURE_RESPONSE:
4231             // check size
4232             if (len < 2u) return 0u;
4233 
4234             result = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4235             btstack_linked_list_iterator_init(&it, &l2cap_channels);
4236             while (btstack_linked_list_iterator_has_next(&it)) {
4237                 l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4238                 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
4239                 if (channel->con_handle != handle) continue;
4240                 if (channel->local_sig_id != sig_id) continue;
4241                 if (channel->state != L2CAP_STATE_WAIT_ENHANCED_RENEGOTIATION_RESPONSE) continue;
4242                 // complete request
4243                 if (result == 0) {
4244                     channel->receive_sdu_buffer = channel->renegotiate_sdu_buffer;
4245                     channel->local_mtu = channel->renegotiate_mtu;
4246                 }
4247                 channel->state = L2CAP_STATE_OPEN;
4248                 // emit event
4249                 l2cap_ecbm_emit_reconfigure_complete(channel, result);
4250             }
4251             break;
4252 
4253         default:
4254             btstack_unreachable();
4255             break;
4256     }
4257     return 0;
4258 }
4259 
4260 #endif
4261 
4262 #ifdef ENABLE_BLE
4263 
4264 static void l2cap_emit_connection_parameter_update_response(hci_con_handle_t con_handle, uint16_t result){
4265     uint8_t event[6];
4266     event[0] = L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_RESPONSE;
4267     event[1] = 4;
4268     little_endian_store_16(event, 2, con_handle);
4269     little_endian_store_16(event, 4, result);
4270     l2cap_emit_event(event, sizeof(event));
4271 }
4272 
4273 // @return valid
4274 static int l2cap_le_signaling_handler_dispatch(hci_con_handle_t handle, uint8_t * command, uint8_t sig_id){
4275     hci_connection_t * connection;
4276     uint16_t result;
4277     uint8_t  event[12];
4278 
4279 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
4280     l2cap_channel_t * channel;
4281     btstack_linked_list_iterator_t it;
4282 #endif
4283 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4284     uint16_t local_cid;
4285     uint16_t le_psm;
4286     l2cap_service_t * service;
4287     uint16_t source_cid;
4288 #endif
4289 
4290     uint8_t code   = command[L2CAP_SIGNALING_COMMAND_CODE_OFFSET];
4291     uint16_t len   = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
4292     log_info("le dispatch: command 0x%02x, sig id %u, len %u", code, sig_id, len);
4293 
4294     switch (code){
4295 
4296         case CONNECTION_PARAMETER_UPDATE_REQUEST:
4297             // check size
4298             if (len < 8u) return 0u;
4299             connection = hci_connection_for_handle(handle);
4300             if (connection != NULL){
4301                 if (connection->role != HCI_ROLE_MASTER){
4302                     // reject command without notifying upper layer when not in master role
4303                     return 0;
4304                 }
4305                 le_connection_parameter_range_t existing_range;
4306                 gap_get_connection_parameter_range(&existing_range);
4307                 uint16_t le_conn_interval_min   = little_endian_read_16(command,L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
4308                 uint16_t le_conn_interval_max   = little_endian_read_16(command,L2CAP_SIGNALING_COMMAND_DATA_OFFSET+2);
4309                 uint16_t le_conn_latency        = little_endian_read_16(command,L2CAP_SIGNALING_COMMAND_DATA_OFFSET+4);
4310                 uint16_t le_supervision_timeout = little_endian_read_16(command,L2CAP_SIGNALING_COMMAND_DATA_OFFSET+6);
4311 
4312                 int update_parameter = gap_connection_parameter_range_included(&existing_range, le_conn_interval_min, le_conn_interval_max, le_conn_latency, le_supervision_timeout);
4313                 if (update_parameter){
4314                     connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_SEND_RESPONSE;
4315                     connection->le_conn_interval_min = le_conn_interval_min;
4316                     connection->le_conn_interval_max = le_conn_interval_max;
4317                     connection->le_conn_latency = le_conn_latency;
4318                     connection->le_supervision_timeout = le_supervision_timeout;
4319                 } else {
4320                     connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_DENY;
4321                 }
4322                 connection->le_con_param_update_identifier = sig_id;
4323             }
4324 
4325             event[0] = L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_REQUEST;
4326             event[1] = 10;
4327             little_endian_store_16(event, 2, handle);
4328             (void)memcpy(&event[4], &command[4], 8);
4329             l2cap_emit_event(event, sizeof(event));
4330             break;
4331 
4332         case CONNECTION_PARAMETER_UPDATE_RESPONSE:
4333             // check size
4334             if (len < 2u) return 0u;
4335             result = little_endian_read_16(command, 4);
4336             l2cap_emit_connection_parameter_update_response(handle, result);
4337             break;
4338 
4339 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
4340         case L2CAP_CREDIT_BASED_CONNECTION_REQUEST:
4341         case L2CAP_CREDIT_BASED_CONNECTION_RESPONSE:
4342         case L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST:
4343         case L2CAP_CREDIT_BASED_RECONFIGURE_RESPONSE:
4344             return l2cap_ecbm_signaling_handler_dispatch(handle, L2CAP_CID_SIGNALING_LE, command, sig_id);
4345 #endif
4346 
4347 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
4348         case COMMAND_REJECT:
4349             btstack_linked_list_iterator_init(&it, &l2cap_channels);
4350             while (btstack_linked_list_iterator_has_next(&it)){
4351                 channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4352                 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
4353                 if (channel->con_handle   != handle) continue;
4354                 if (channel->local_sig_id != sig_id) continue;
4355 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4356                 // if received while waiting for le connection response, assume legacy device
4357                 if (channel->state == L2CAP_STATE_WAIT_LE_CONNECTION_RESPONSE){
4358                     channel->state = L2CAP_STATE_CLOSED;
4359                     // no official value for this, use: Connection refused – LE_PSM not supported
4360                     l2cap_cbm_emit_channel_opened(channel, L2CAP_CBM_CONNECTION_RESULT_SPSM_NOT_SUPPORTED);
4361 
4362                     // discard channel
4363                     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
4364                     l2cap_free_channel_entry(channel);
4365                     continue;
4366                 }
4367 #endif
4368 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
4369                 // if received while waiting for le connection response, assume legacy device
4370                 if (channel->state == L2CAP_STATE_WAIT_ENHANCED_CONNECTION_RESPONSE){
4371                     channel->state = L2CAP_STATE_CLOSED;
4372                     // treat as SPSM not supported
4373                     l2cap_ecbm_emit_channel_opened(channel, L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_PSM);
4374 
4375                     // discard channel
4376                     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
4377                     l2cap_free_channel_entry(channel);
4378                     continue;
4379                 }
4380 #endif
4381             }
4382             break;
4383 #endif
4384 
4385 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4386         case LE_CREDIT_BASED_CONNECTION_REQUEST:
4387             // check size
4388             if (len < 10u) return 0u;
4389 
4390             // get hci connection, bail if not found (must not happen)
4391             connection = hci_connection_for_handle(handle);
4392             if (!connection) return 0;
4393 
4394             // check if service registered
4395             le_psm  = little_endian_read_16(command, 4);
4396             service = l2cap_cbm_get_service(le_psm);
4397             source_cid = little_endian_read_16(command, 6);
4398 
4399             if (service){
4400                 if (source_cid < 0x40u){
4401                     l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_INVALID_SOURCE_CID);
4402                     return 1;
4403                 }
4404 
4405                 // go through list of channels for this ACL connection and check if we get a match
4406                 btstack_linked_list_iterator_init(&it, &l2cap_channels);
4407                 while (btstack_linked_list_iterator_has_next(&it)){
4408                     l2cap_channel_t * a_channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4409                     if (!l2cap_is_dynamic_channel_type(a_channel->channel_type)) continue;
4410                     if (a_channel->con_handle != handle) continue;
4411                     if (a_channel->remote_cid != source_cid) continue;
4412                     l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_SOURCE_CID_ALREADY_ALLOCATED);
4413                     return 1;
4414                 }
4415 
4416                 // security: check encryption
4417                 if (service->required_security_level >= LEVEL_2){
4418                     if (gap_encryption_key_size(handle) == 0){
4419                         l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_ENCRYPTION);
4420                         return 1;
4421                     }
4422                     // anything less than 16 byte key size is insufficient
4423                     if (gap_encryption_key_size(handle) < 16){
4424                         l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_ENCYRPTION_KEY_SIZE_TOO_SHORT);
4425                         return 1;
4426                     }
4427                 }
4428 
4429                 // security: check authentication
4430                 if (service->required_security_level >= LEVEL_3){
4431                     if (!gap_authenticated(handle)){
4432                         l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_AUTHENTICATION);
4433                         return 1;
4434                     }
4435                 }
4436 
4437                 // security: check authorization
4438                 if (service->required_security_level >= LEVEL_4){
4439                     if (gap_authorization_state(handle) != AUTHORIZATION_GRANTED){
4440                         l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_AUTHORIZATION);
4441                         return 1;
4442                     }
4443                 }
4444 
4445                 // allocate channel
4446                 channel = l2cap_create_channel_entry(service->packet_handler, L2CAP_CHANNEL_TYPE_CHANNEL_CBM, connection->address,
4447                                                      BD_ADDR_TYPE_LE_RANDOM, le_psm, service->mtu, service->required_security_level);
4448                 if (!channel){
4449                     l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE);
4450                     return 1;
4451                 }
4452 
4453                 channel->con_handle = handle;
4454                 channel->remote_cid = source_cid;
4455                 channel->remote_sig_id = sig_id;
4456                 channel->remote_mtu = little_endian_read_16(command, 8);
4457                 channel->remote_mps = little_endian_read_16(command, 10);
4458                 channel->credits_outgoing = little_endian_read_16(command, 12);
4459 
4460                 // set initial state
4461                 channel->state      = L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT;
4462                 channel->state_var |= L2CAP_CHANNEL_STATE_VAR_INCOMING;
4463 
4464                 // add to connections list
4465                 btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
4466 
4467                 // post connection request event
4468                 l2cap_cbm_emit_incoming_connection(channel);
4469 
4470             } else {
4471                 l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_SPSM_NOT_SUPPORTED);
4472             }
4473             break;
4474 
4475         case LE_CREDIT_BASED_CONNECTION_RESPONSE:
4476             // check size
4477             if (len < 10u) return 0u;
4478 
4479             // Find channel for this sig_id and connection handle
4480             channel = NULL;
4481             btstack_linked_list_iterator_init(&it, &l2cap_channels);
4482             while (btstack_linked_list_iterator_has_next(&it)){
4483                 l2cap_channel_t * a_channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4484                 if (!l2cap_is_dynamic_channel_type(a_channel->channel_type)) continue;
4485                 if (a_channel->con_handle   != handle) continue;
4486                 if (a_channel->local_sig_id != sig_id) continue;
4487                 channel = a_channel;
4488                 break;
4489             }
4490             if (!channel) break;
4491 
4492             // cid + 0
4493             result = little_endian_read_16 (command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+8);
4494             if (result){
4495                 channel->state = L2CAP_STATE_CLOSED;
4496                 uint8_t status = l2cap_cbm_status_for_result(result);
4497                 l2cap_cbm_emit_channel_opened(channel, status);
4498 
4499                 // discard channel
4500                 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
4501                 l2cap_free_channel_entry(channel);
4502                 break;
4503             }
4504 
4505             // success
4506             channel->remote_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4507             channel->remote_mtu = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
4508             channel->remote_mps = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 4);
4509             channel->credits_outgoing = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 6);
4510             channel->state = L2CAP_STATE_OPEN;
4511             l2cap_cbm_emit_channel_opened(channel, ERROR_CODE_SUCCESS);
4512             break;
4513 #endif
4514 
4515 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
4516         case L2CAP_FLOW_CONTROL_CREDIT_INDICATION:
4517             return l2cap_credit_based_handle_credit_indication(handle, command, len) ? 1 : 0;
4518 
4519         case DISCONNECTION_REQUEST:
4520             // check size
4521             if (len < 4u) return 0u;
4522 
4523             // find channel
4524             local_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4525             channel = l2cap_get_channel_for_local_cid_and_handle(local_cid, handle);
4526             if (!channel) {
4527                 l2cap_register_signaling_response(handle, DISCONNECTION_REQUEST, sig_id,
4528                                                   little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2), local_cid);
4529                 break;
4530             }
4531             channel->remote_sig_id = sig_id;
4532             channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE;
4533             break;
4534 
4535         case DISCONNECTION_RESPONSE:
4536             // check size
4537             if (len < 4u) return 0u;
4538 
4539             // find channel
4540             local_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4541             channel = l2cap_get_channel_for_local_cid_and_handle(local_cid, handle);
4542             if (!channel) break;
4543             if (channel->local_sig_id == sig_id) {
4544                 if (channel->state == L2CAP_STATE_WAIT_DISCONNECT){
4545                     l2cap_finalize_channel_close(channel);
4546                 }
4547             }
4548             break;
4549 #endif
4550 
4551         default:
4552             // command unknown -> reject command
4553             return 0;
4554     }
4555     return 1;
4556 }
4557 #endif
4558 
4559 #ifdef ENABLE_CLASSIC
4560 static void l2cap_acl_classic_handler_for_channel(l2cap_channel_t * l2cap_channel, uint8_t * packet, uint16_t size){
4561 
4562     // forward data only in OPEN state
4563     if (l2cap_channel->state != L2CAP_STATE_OPEN) return;
4564 
4565 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
4566     if (l2cap_channel->channel_type == L2CAP_CHANNEL_TYPE_CHANNEL_ECBM){
4567         l2cap_credit_based_handle_pdu(l2cap_channel, packet, size);
4568         return;
4569     }
4570 #endif
4571 
4572 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
4573     if (l2cap_channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
4574 
4575         int fcs_size = l2cap_channel->fcs_option ? 2 : 0;
4576 
4577         // assert control + FCS fields are inside
4578         if (size < COMPLETE_L2CAP_HEADER+2+fcs_size) return;
4579 
4580         if (l2cap_channel->fcs_option){
4581             // verify FCS (required if one side requested it)
4582             uint16_t fcs_calculated = crc16_calc(&packet[4], size - (4+2));
4583             uint16_t fcs_packet     = little_endian_read_16(packet, size-2);
4584 
4585 #ifdef L2CAP_ERTM_SIMULATE_FCS_ERROR_INTERVAL
4586             // simulate fcs error
4587             static int counter = 0;
4588             if (++counter == L2CAP_ERTM_SIMULATE_FCS_ERROR_INTERVAL) {
4589                 log_info("Simulate fcs error");
4590                 fcs_calculated++;
4591                 counter = 0;
4592             }
4593 #endif
4594 
4595             if (fcs_calculated == fcs_packet){
4596                 log_info("Packet FCS 0x%04x verified", fcs_packet);
4597             } else {
4598                 log_error("FCS mismatch! Packet 0x%04x, calculated 0x%04x", fcs_packet, fcs_calculated);
4599                 // ERTM State Machine in Bluetooth Spec does not handle 'I-Frame with invalid FCS'
4600                 return;
4601             }
4602         }
4603 
4604         // switch on packet type
4605         uint16_t control = little_endian_read_16(packet, COMPLETE_L2CAP_HEADER);
4606         uint8_t  req_seq = (control >> 8) & 0x3f;
4607         int final = (control >> 7) & 0x01;
4608         if (control & 1){
4609             // S-Frame
4610             int poll  = (control >> 4) & 0x01;
4611             l2cap_supervisory_function_t s = (l2cap_supervisory_function_t) ((control >> 2) & 0x03);
4612             log_info("Control: 0x%04x => Supervisory function %u, ReqSeq %02u", control, (int) s, req_seq);
4613             l2cap_ertm_tx_packet_state_t * tx_state;
4614             switch (s){
4615                 case L2CAP_SUPERVISORY_FUNCTION_RR_RECEIVER_READY:
4616                     log_info("L2CAP_SUPERVISORY_FUNCTION_RR_RECEIVER_READY");
4617                     l2cap_ertm_process_req_seq(l2cap_channel, req_seq);
4618                     if (poll && final){
4619                         // S-frames shall not be transmitted with both the F-bit and the P-bit set to 1 at the same time.
4620                         log_error("P=F=1 in S-Frame");
4621                         break;
4622                     }
4623                     if (poll){
4624                         // check if we did request selective retransmission before <==> we have stored SDU segments
4625                         int i;
4626                         int num_stored_out_of_order_packets = 0;
4627                         for (i=0;i<l2cap_channel->num_rx_buffers;i++){
4628                             int index = l2cap_channel->rx_store_index + i;
4629                             if (index >= l2cap_channel->num_rx_buffers){
4630                                 index -= l2cap_channel->num_rx_buffers;
4631                             }
4632                             l2cap_ertm_rx_packet_state_t * rx_state = &l2cap_channel->rx_packets_state[index];
4633                             if (!rx_state->valid) continue;
4634                             num_stored_out_of_order_packets++;
4635                         }
4636                         if (num_stored_out_of_order_packets){
4637                             l2cap_channel->send_supervisor_frame_selective_reject = 1;
4638                         } else {
4639                             l2cap_channel->send_supervisor_frame_receiver_ready   = 1;
4640                         }
4641                         l2cap_channel->set_final_bit_after_packet_with_poll_bit_set = 1;
4642                     }
4643                     if (final){
4644                         // Stop-MonitorTimer
4645                         l2cap_ertm_stop_monitor_timer(l2cap_channel);
4646                         // If UnackedFrames > 0 then Start-RetransTimer
4647                         if (l2cap_channel->unacked_frames){
4648                             l2cap_ertm_start_retransmission_timer(l2cap_channel);
4649                         }
4650                         // final bit set <- response to RR with poll bit set. All not acknowledged packets need to be retransmitted
4651                         l2cap_ertm_retransmit_unacknowleded_frames(l2cap_channel);
4652                     }
4653                     break;
4654                 case L2CAP_SUPERVISORY_FUNCTION_REJ_REJECT:
4655                     log_info("L2CAP_SUPERVISORY_FUNCTION_REJ_REJECT");
4656                     l2cap_ertm_process_req_seq(l2cap_channel, req_seq);
4657                     // restart transmittion from last unacknowledted packet (earlier packets already freed in l2cap_ertm_process_req_seq)
4658                     l2cap_ertm_retransmit_unacknowleded_frames(l2cap_channel);
4659                     break;
4660                 case L2CAP_SUPERVISORY_FUNCTION_RNR_RECEIVER_NOT_READY:
4661                     log_error("L2CAP_SUPERVISORY_FUNCTION_RNR_RECEIVER_NOT_READY");
4662                     break;
4663                 case L2CAP_SUPERVISORY_FUNCTION_SREJ_SELECTIVE_REJECT:
4664                     log_info("L2CAP_SUPERVISORY_FUNCTION_SREJ_SELECTIVE_REJECT");
4665                     if (poll){
4666                         l2cap_ertm_process_req_seq(l2cap_channel, req_seq);
4667                     }
4668                     // find requested i-frame
4669                     tx_state = l2cap_ertm_get_tx_state(l2cap_channel, req_seq);
4670                     if (tx_state){
4671                         log_info("Retransmission for tx_seq %u requested", req_seq);
4672                         l2cap_channel->set_final_bit_after_packet_with_poll_bit_set = poll;
4673                         tx_state->retransmission_requested = 1;
4674                         l2cap_channel->srej_active = 1;
4675                     }
4676                     break;
4677                 default:
4678                     break;
4679             }
4680         } else {
4681             // I-Frame
4682             // get control
4683             l2cap_segmentation_and_reassembly_t sar = (l2cap_segmentation_and_reassembly_t) (control >> 14);
4684             uint8_t tx_seq = (control >> 1) & 0x3f;
4685             log_info("Control: 0x%04x => SAR %u, ReqSeq %02u, R?, TxSeq %02u", control, (int) sar, req_seq, tx_seq);
4686             log_info("SAR: pos %u", l2cap_channel->reassembly_pos);
4687             log_info("State: expected_tx_seq %02u, req_seq %02u", l2cap_channel->expected_tx_seq, l2cap_channel->req_seq);
4688             l2cap_ertm_process_req_seq(l2cap_channel, req_seq);
4689             if (final){
4690                 // final bit set <- response to RR with poll bit set. All not acknowledged packets need to be retransmitted
4691                 l2cap_ertm_retransmit_unacknowleded_frames(l2cap_channel);
4692             }
4693 
4694             // get SDU
4695             const uint8_t * payload_data = &packet[COMPLETE_L2CAP_HEADER+2];
4696             uint16_t        payload_len  = size-(COMPLETE_L2CAP_HEADER+2+fcs_size);
4697 
4698             // assert SDU size is smaller or equal to our buffers
4699             uint16_t max_payload_size = 0;
4700             switch (sar){
4701                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_UNSEGMENTED_L2CAP_SDU:
4702                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_START_OF_L2CAP_SDU:
4703                     // SDU Length + MPS
4704                     max_payload_size = l2cap_channel->local_mps + 2;
4705                     break;
4706                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_CONTINUATION_OF_L2CAP_SDU:
4707                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_END_OF_L2CAP_SDU:
4708                     max_payload_size = l2cap_channel->local_mps;
4709                     break;
4710                 default:
4711                     btstack_assert(false);
4712                     break;
4713             }
4714             if (payload_len > max_payload_size){
4715                 log_info("payload len %u > max payload %u -> drop packet", payload_len, max_payload_size);
4716                 return;
4717             }
4718 
4719             // check ordering
4720             if (l2cap_channel->expected_tx_seq == tx_seq){
4721                 log_info("Received expected frame with TxSeq == ExpectedTxSeq == %02u", tx_seq);
4722                 l2cap_channel->expected_tx_seq = l2cap_next_ertm_seq_nr(l2cap_channel->expected_tx_seq);
4723                 l2cap_channel->req_seq         = l2cap_channel->expected_tx_seq;
4724 
4725                 // process SDU
4726                 l2cap_ertm_handle_in_sequence_sdu(l2cap_channel, sar, payload_data, payload_len);
4727 
4728                 // process stored segments
4729                 while (true){
4730                     int index = l2cap_channel->rx_store_index;
4731                     l2cap_ertm_rx_packet_state_t * rx_state = &l2cap_channel->rx_packets_state[index];
4732                     if (!rx_state->valid) break;
4733 
4734                     log_info("Processing stored frame with TxSeq == ExpectedTxSeq == %02u", l2cap_channel->expected_tx_seq);
4735                     l2cap_channel->expected_tx_seq = l2cap_next_ertm_seq_nr(l2cap_channel->expected_tx_seq);
4736                     l2cap_channel->req_seq         = l2cap_channel->expected_tx_seq;
4737 
4738                     rx_state->valid = 0;
4739                     l2cap_ertm_handle_in_sequence_sdu(l2cap_channel, rx_state->sar, &l2cap_channel->rx_packets_data[index], rx_state->len);
4740 
4741                     // update rx store index
4742                     index++;
4743                     if (index >= l2cap_channel->num_rx_buffers){
4744                         index = 0;
4745                     }
4746                     l2cap_channel->rx_store_index = index;
4747                 }
4748 
4749                 //
4750                 l2cap_channel->send_supervisor_frame_receiver_ready = 1;
4751 
4752             } else {
4753                 int delta = (tx_seq - l2cap_channel->expected_tx_seq) & 0x3f;
4754                 if (delta < 2){
4755                     // store segment
4756                     l2cap_ertm_handle_out_of_sequence_sdu(l2cap_channel, sar, delta, payload_data, payload_len);
4757 
4758                     log_info("Received unexpected frame TxSeq %u but expected %u -> send S-SREJ", tx_seq, l2cap_channel->expected_tx_seq);
4759                     l2cap_channel->send_supervisor_frame_selective_reject = 1;
4760                 } else {
4761                     log_info("Received unexpected frame TxSeq %u but expected %u -> send S-REJ", tx_seq, l2cap_channel->expected_tx_seq);
4762                     l2cap_channel->send_supervisor_frame_reject = 1;
4763                 }
4764             }
4765         }
4766         return;
4767     }
4768 #endif
4769 
4770     // check size
4771     uint16_t payload_size = size - COMPLETE_L2CAP_HEADER;
4772     if (l2cap_channel->local_mtu < payload_size) return;
4773 
4774     l2cap_dispatch_to_channel(l2cap_channel, L2CAP_DATA_PACKET, &packet[COMPLETE_L2CAP_HEADER], payload_size);
4775 }
4776 #endif
4777 
4778 static void l2cap_acl_classic_handler(hci_con_handle_t handle, uint8_t *packet, uint16_t size){
4779 #ifdef ENABLE_CLASSIC
4780     l2cap_channel_t * l2cap_channel;
4781     l2cap_fixed_channel_t * l2cap_fixed_channel;
4782 
4783     uint16_t channel_id = READ_L2CAP_CHANNEL_ID(packet);
4784     uint8_t  broadcast_flag = READ_ACL_FLAGS(packet) >> 2;
4785     switch (channel_id) {
4786 
4787         case L2CAP_CID_SIGNALING: {
4788             if (broadcast_flag != 0) break;
4789             uint32_t command_offset = 8;
4790             while ((command_offset + L2CAP_SIGNALING_COMMAND_DATA_OFFSET) < size) {
4791                 // assert signaling command is fully inside packet
4792                 uint16_t data_len = little_endian_read_16(packet, command_offset + L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
4793                 uint32_t next_command_offset = command_offset + L2CAP_SIGNALING_COMMAND_DATA_OFFSET + data_len;
4794                 if (next_command_offset > size){
4795                     log_error("l2cap signaling command len invalid -> drop");
4796                     break;
4797                 }
4798                 // handle signaling command
4799                 l2cap_signaling_handler_dispatch(handle, &packet[command_offset]);
4800                 // go to next command
4801                 command_offset = next_command_offset;
4802             }
4803             break;
4804         }
4805 
4806         case L2CAP_CID_CONNECTIONLESS_CHANNEL:
4807             if (broadcast_flag == 0) break;
4808             l2cap_fixed_channel = l2cap_fixed_channel_for_channel_id(L2CAP_CID_CONNECTIONLESS_CHANNEL);
4809             if (!l2cap_fixed_channel) break;
4810             if (!l2cap_fixed_channel->packet_handler) break;
4811             (*l2cap_fixed_channel->packet_handler)(UCD_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
4812             break;
4813 
4814 #ifdef ENABLE_BLE
4815         case L2CAP_CID_BR_EDR_SECURITY_MANAGER:
4816             l2cap_fixed_channel = l2cap_fixed_channel_for_channel_id(L2CAP_CID_BR_EDR_SECURITY_MANAGER);
4817             if ((l2cap_fixed_channel == NULL) || (l2cap_fixed_channel->packet_handler == NULL)){
4818                 // Pairing Failed
4819                 l2cap_register_signaling_response(handle, (uint8_t) SM_PAIRING_FAILED, 0, L2CAP_CID_BR_EDR_SECURITY_MANAGER, SM_REASON_PAIRING_NOT_SUPPORTED);
4820             } else {
4821                 (*l2cap_fixed_channel->packet_handler)(SM_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
4822             }
4823             break;
4824 #endif
4825 
4826         default:
4827             if (broadcast_flag != 0) break;
4828             // Find channel for this channel_id and connection handle
4829             l2cap_channel = l2cap_get_channel_for_local_cid_and_handle(channel_id, handle);
4830             if (l2cap_channel != NULL){
4831                 l2cap_acl_classic_handler_for_channel(l2cap_channel, packet, size);
4832             }
4833             break;
4834     }
4835 #else
4836     UNUSED(handle); // ok: no code
4837     UNUSED(packet); // ok: no code
4838     UNUSED(size);   // ok: no code
4839 #endif
4840 }
4841 
4842 static void l2cap_acl_le_handler(hci_con_handle_t handle, uint8_t *packet, uint16_t size){
4843 #ifdef ENABLE_BLE
4844 
4845     l2cap_fixed_channel_t * l2cap_fixed_channel;
4846 
4847 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4848     l2cap_channel_t * l2cap_channel;
4849 #endif
4850     uint16_t channel_id = READ_L2CAP_CHANNEL_ID(packet);
4851     switch (channel_id) {
4852 
4853         case L2CAP_CID_SIGNALING_LE: {
4854             uint8_t sig_id = packet[COMPLETE_L2CAP_HEADER + 1];
4855             uint16_t len = little_endian_read_16(packet, COMPLETE_L2CAP_HEADER + 2);
4856             if ((COMPLETE_L2CAP_HEADER + 4u + len) > size) break;
4857             int      valid  = l2cap_le_signaling_handler_dispatch(handle, &packet[COMPLETE_L2CAP_HEADER], sig_id);
4858             if (!valid){
4859                 l2cap_register_signaling_response(handle, COMMAND_REJECT_LE, sig_id, 0, L2CAP_REJ_CMD_UNKNOWN);
4860             }
4861             break;
4862         }
4863 
4864         case L2CAP_CID_ATTRIBUTE_PROTOCOL:
4865             l2cap_fixed_channel = l2cap_fixed_channel_for_channel_id(L2CAP_CID_ATTRIBUTE_PROTOCOL);
4866             if (!l2cap_fixed_channel) break;
4867             if (!l2cap_fixed_channel->packet_handler) break;
4868             (*l2cap_fixed_channel->packet_handler)(ATT_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
4869             break;
4870 
4871         case L2CAP_CID_SECURITY_MANAGER_PROTOCOL:
4872             l2cap_fixed_channel = l2cap_fixed_channel_for_channel_id(L2CAP_CID_SECURITY_MANAGER_PROTOCOL);
4873             if ((l2cap_fixed_channel == NULL) || (l2cap_fixed_channel->packet_handler == NULL)){
4874                 // Pairing Failed
4875                 l2cap_register_signaling_response(handle, (uint8_t) SM_PAIRING_FAILED, 0, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, SM_REASON_PAIRING_NOT_SUPPORTED);
4876             } else {
4877                 (*l2cap_fixed_channel->packet_handler)(SM_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
4878             }
4879             break;
4880 
4881         default:
4882 
4883 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4884             l2cap_channel = l2cap_get_channel_for_local_cid_and_handle(channel_id, handle);
4885             if (l2cap_channel != NULL) {
4886                 l2cap_credit_based_handle_pdu(l2cap_channel, packet, size);
4887             }
4888 #endif
4889             break;
4890     }
4891 #else
4892     UNUSED(handle); // ok: no code
4893     UNUSED(packet); // ok: no code
4894     UNUSED(size);   // ok: no code
4895 #endif
4896 }
4897 
4898 static void l2cap_acl_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
4899     UNUSED(packet_type);    // ok: registered with hci_register_acl_packet_handler
4900     UNUSED(channel);        // ok: there is no channel
4901 
4902     // Assert full L2CAP header present
4903     if (size < COMPLETE_L2CAP_HEADER) return;
4904 
4905     // Dispatch to Classic or LE handler (SCO packets are not dispatched to L2CAP)
4906     hci_con_handle_t handle = READ_ACL_CONNECTION_HANDLE(packet);
4907     hci_connection_t *conn = hci_connection_for_handle(handle);
4908     if (!conn) return;
4909     if (conn->address_type == BD_ADDR_TYPE_ACL){
4910         l2cap_acl_classic_handler(handle, packet, size);
4911     } else {
4912         l2cap_acl_le_handler(handle, packet, size);
4913     }
4914 
4915     l2cap_run();
4916 }
4917 
4918 // Bluetooth 4.0 - allows to register handler for Attribute Protocol and Security Manager Protocol
4919 void l2cap_register_fixed_channel(btstack_packet_handler_t packet_handler, uint16_t channel_id) {
4920     l2cap_fixed_channel_t * channel = l2cap_fixed_channel_for_channel_id(channel_id);
4921     if (!channel) return;
4922     channel->packet_handler = packet_handler;
4923 }
4924 
4925 #ifdef L2CAP_USES_CHANNELS
4926 // finalize closed channel - l2cap_handle_disconnect_request & DISCONNECTION_RESPONSE
4927 void l2cap_finalize_channel_close(l2cap_channel_t * channel){
4928     channel->state = L2CAP_STATE_CLOSED;
4929     l2cap_handle_channel_closed(channel);
4930     // discard channel
4931     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
4932     l2cap_free_channel_entry(channel);
4933 }
4934 #endif
4935 
4936 #ifdef ENABLE_CLASSIC
4937 static inline l2cap_service_t * l2cap_get_service(uint16_t psm){
4938     return l2cap_get_service_internal(&l2cap_services, psm);
4939 }
4940 
4941 static void l2cap_update_minimal_security_level(void){
4942     // update minimal service security level
4943     gap_security_level_t minimal_level = LEVEL_1;
4944     btstack_linked_list_iterator_t it;
4945     btstack_linked_list_iterator_init(&it, &l2cap_services);
4946     while (btstack_linked_list_iterator_has_next(&it)){
4947         l2cap_service_t * service = (l2cap_service_t *) btstack_linked_list_iterator_next(&it);
4948         if (service->required_security_level > minimal_level){
4949             minimal_level = service->required_security_level;
4950         };
4951     }
4952     gap_set_minimal_service_security_level(minimal_level);
4953 }
4954 
4955 uint8_t l2cap_register_service(btstack_packet_handler_t service_packet_handler, uint16_t psm, uint16_t mtu, gap_security_level_t security_level){
4956 
4957     log_info("L2CAP_REGISTER_SERVICE psm 0x%x mtu %u", psm, mtu);
4958 
4959     // check for alread registered psm
4960     l2cap_service_t *service = l2cap_get_service(psm);
4961     if (service) {
4962         log_error("register: PSM %u already registered", psm);
4963         return L2CAP_SERVICE_ALREADY_REGISTERED;
4964     }
4965 
4966     // alloc structure
4967     service = btstack_memory_l2cap_service_get();
4968     if (!service) {
4969         log_error("register: no memory for l2cap_service_t");
4970         return BTSTACK_MEMORY_ALLOC_FAILED;
4971     }
4972 
4973     // fill in
4974     service->psm = psm;
4975     service->mtu = mtu;
4976     service->packet_handler = service_packet_handler;
4977     service->required_security_level = security_level;
4978 
4979     // add to services list
4980     btstack_linked_list_add(&l2cap_services, (btstack_linked_item_t *) service);
4981 
4982     l2cap_update_minimal_security_level();
4983 
4984 #ifndef ENABLE_EXPLICIT_CONNECTABLE_MODE_CONTROL
4985     // enable page scan
4986     gap_connectable_control(1);
4987 #endif
4988 
4989 
4990     return ERROR_CODE_SUCCESS;
4991 }
4992 
4993 uint8_t l2cap_unregister_service(uint16_t psm){
4994 
4995     log_info("unregister psm 0x%x", psm);
4996 
4997     l2cap_service_t *service = l2cap_get_service(psm);
4998     if (!service) return L2CAP_SERVICE_DOES_NOT_EXIST;
4999     btstack_linked_list_remove(&l2cap_services, (btstack_linked_item_t *) service);
5000     btstack_memory_l2cap_service_free(service);
5001 
5002     l2cap_update_minimal_security_level();
5003 
5004 #ifndef ENABLE_EXPLICIT_CONNECTABLE_MODE_CONTROL
5005     // disable page scan when no services registered
5006     if (btstack_linked_list_empty(&l2cap_services)) {
5007         gap_connectable_control(0);
5008     }
5009 #endif
5010 
5011     return ERROR_CODE_SUCCESS;
5012 }
5013 #endif
5014 
5015 
5016 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
5017 
5018 static void l2cap_credit_based_send_pdu(l2cap_channel_t *channel) {
5019     btstack_assert(channel != NULL);
5020     btstack_assert(channel->send_sdu_buffer != NULL);
5021     btstack_assert(channel->credits_outgoing > 0);
5022 
5023     // send part of SDU
5024     hci_reserve_packet_buffer();
5025     uint8_t *acl_buffer = hci_get_outgoing_packet_buffer();
5026     uint8_t *l2cap_payload = acl_buffer + 8;
5027     uint16_t pos = 0;
5028     if (!channel->send_sdu_pos) {
5029         // store SDU len
5030         channel->send_sdu_pos += 2u;
5031         little_endian_store_16(l2cap_payload, pos, channel->send_sdu_len);
5032         pos += 2u;
5033     }
5034     uint16_t payload_size = btstack_min(channel->send_sdu_len + 2u - channel->send_sdu_pos, channel->remote_mps - pos);
5035     log_info("len %u, pos %u => payload %u, credits %u", channel->send_sdu_len, channel->send_sdu_pos, payload_size,
5036              channel->credits_outgoing);
5037     (void) memcpy(&l2cap_payload[pos],
5038                   &channel->send_sdu_buffer[channel->send_sdu_pos - 2u],
5039                   payload_size); // -2 for virtual SDU len
5040     pos += payload_size;
5041     channel->send_sdu_pos += payload_size;
5042     l2cap_setup_header(acl_buffer, channel->con_handle, 0, channel->remote_cid, pos);
5043 
5044     channel->credits_outgoing--;
5045 
5046     // update state (mark SDU as done) before calling hci_send_acl_packet_buffer (trigger l2cap_le_send_pdu again)
5047     bool done = channel->send_sdu_pos >= (channel->send_sdu_len + 2u);
5048     if (done) {
5049         channel->send_sdu_buffer = NULL;
5050     }
5051 
5052     hci_send_acl_packet_buffer(8u + pos);
5053 
5054     if (done) {
5055         // send done event
5056         l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_PACKET_SENT);
5057         // inform about can send now
5058         l2cap_credit_based_notify_channel_can_send(channel);
5059     }
5060 }
5061 
5062 static uint8_t l2cap_credit_based_send_data(l2cap_channel_t * channel, const uint8_t * data, uint16_t size){
5063 
5064     if (size > channel->remote_mtu){
5065         log_error("l2cap send, cid 0x%02x, data length exceeds remote MTU.", channel->local_cid);
5066         return L2CAP_DATA_LEN_EXCEEDS_REMOTE_MTU;
5067     }
5068 
5069     if (channel->send_sdu_buffer){
5070         log_info("l2cap send, cid 0x%02x, cannot send", channel->local_cid);
5071         return BTSTACK_ACL_BUFFERS_FULL;
5072     }
5073 
5074     channel->send_sdu_buffer = data;
5075     channel->send_sdu_len    = size;
5076     channel->send_sdu_pos    = 0;
5077 
5078     l2cap_notify_channel_can_send();
5079     return ERROR_CODE_SUCCESS;
5080 }
5081 
5082 static uint8_t l2cap_credit_based_provide_credits(uint16_t local_cid, uint16_t credits){
5083     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5084     if (!channel) {
5085         log_error("le credits no channel for cid 0x%02x", local_cid);
5086         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5087     }
5088 
5089     // check state
5090     if (channel->state != L2CAP_STATE_OPEN){
5091         log_error("le credits but channel 0x%02x not open yet", local_cid);
5092     }
5093 
5094     // ignore if set to automatic credits
5095     if (channel->automatic_credits) return ERROR_CODE_SUCCESS;
5096 
5097     // assert incoming credits + credits <= 0xffff
5098     uint32_t total_credits = channel->credits_incoming;
5099     total_credits += channel->new_credits_incoming;
5100     total_credits += credits;
5101     if (total_credits > 0xffffu){
5102         log_error("le credits overrun: current %u, scheduled %u, additional %u", channel->credits_incoming,
5103                   channel->new_credits_incoming, credits);
5104     }
5105 
5106     // set credits_granted
5107     channel->new_credits_incoming += credits;
5108 
5109     // go
5110     l2cap_run();
5111     return ERROR_CODE_SUCCESS;
5112 }
5113 
5114 static void l2cap_credit_based_send_credits(l2cap_channel_t *channel) {
5115     log_info("l2cap: sending %u credits", channel->new_credits_incoming);
5116     channel->local_sig_id = l2cap_next_sig_id();
5117     uint16_t new_credits = channel->new_credits_incoming;
5118     channel->new_credits_incoming = 0;
5119     channel->credits_incoming += new_credits;
5120     uint16_t signaling_cid = channel->address_type == BD_ADDR_TYPE_ACL ? L2CAP_CID_SIGNALING : L2CAP_CID_SIGNALING_LE;
5121     l2cap_send_general_signaling_packet(channel->con_handle, signaling_cid, L2CAP_FLOW_CONTROL_CREDIT_INDICATION, channel->local_sig_id, channel->local_cid, new_credits);
5122 }
5123 
5124 // @return valid
5125 static bool l2cap_credit_based_handle_credit_indication(hci_con_handle_t handle, const uint8_t * command, uint16_t len){
5126     // check size
5127     if (len < 4u) return false;
5128 
5129     // find channel
5130     uint16_t remote_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
5131     l2cap_channel_t * channel = l2cap_get_channel_for_remote_handle_and_cid(handle, remote_cid);
5132     if (!channel) {
5133         log_error("credit: no channel for handle 0x%04x/cid 0x%02x", handle, remote_cid);
5134         return true;
5135     }
5136     uint16_t new_credits = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
5137     uint16_t credits_before = channel->credits_outgoing;
5138     channel->credits_outgoing += new_credits;
5139     // check for credit overrun
5140     if (credits_before > channel->credits_outgoing) {
5141         log_error("credit: new credits caused overrrun for cid 0x%02x, disconnecting", channel->local_cid);
5142         channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5143         return true;
5144     }
5145     log_info("credit: %u credits for 0x%02x, now %u", new_credits, channel->local_cid, channel->credits_outgoing);
5146     l2cap_call_notify_channel_in_run = true;
5147     return true;
5148 }
5149 
5150 static void l2cap_credit_based_handle_pdu(l2cap_channel_t * l2cap_channel, const uint8_t * packet, uint16_t size){
5151     // ignore empty packets
5152     if (size == COMPLETE_L2CAP_HEADER) return;
5153 
5154     // credit counting
5155     if (l2cap_channel->credits_incoming == 0u){
5156         log_info("(e)CBM: packet received but no incoming credits");
5157         l2cap_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5158         return;
5159     }
5160     l2cap_channel->credits_incoming--;
5161 
5162     // automatic credits
5163     if ((l2cap_channel->credits_incoming < L2CAP_CREDIT_BASED_FLOW_CONTROL_MODE_AUTOMATIC_CREDITS_WATERMARK) && l2cap_channel->automatic_credits){
5164         l2cap_channel->new_credits_incoming = L2CAP_CREDIT_BASED_FLOW_CONTROL_MODE_AUTOMATIC_CREDITS_INCREMENT;
5165     }
5166 
5167     // first fragment
5168     uint16_t pos = 0;
5169     if (!l2cap_channel->receive_sdu_len){
5170         if (size < (COMPLETE_L2CAP_HEADER + 2)) return;
5171         uint16_t sdu_len = little_endian_read_16(packet, COMPLETE_L2CAP_HEADER);
5172         if (sdu_len > l2cap_channel->local_mtu) {
5173             log_info("(e)CBM: packet received larger than MTU");
5174             l2cap_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5175             return;
5176         }
5177         l2cap_channel->receive_sdu_len = sdu_len;
5178         l2cap_channel->receive_sdu_pos = 0;
5179         pos  += 2u;
5180         size -= 2u;
5181     }
5182 
5183     uint16_t fragment_size   = size-COMPLETE_L2CAP_HEADER;
5184 
5185     // check fragment_size
5186     if (fragment_size > l2cap_channel->local_mps) {
5187         log_info("(e)CBM: fragment larger than local MPS");
5188         l2cap_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5189         return;
5190     }
5191 
5192     // check sdu overrun
5193     if ((l2cap_channel->receive_sdu_pos + fragment_size) > l2cap_channel->receive_sdu_len){
5194         log_info("(e)CBM: fragments larger than SDU");
5195         l2cap_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5196         return;
5197     }
5198 
5199     (void)memcpy(&l2cap_channel->receive_sdu_buffer[l2cap_channel->receive_sdu_pos],
5200                  &packet[COMPLETE_L2CAP_HEADER + pos],
5201                  fragment_size);
5202     l2cap_channel->receive_sdu_pos += fragment_size;
5203 
5204     // done?
5205     log_debug("le packet pos %u, len %u", l2cap_channel->receive_sdu_pos, l2cap_channel->receive_sdu_len);
5206     if (l2cap_channel->receive_sdu_pos >= l2cap_channel->receive_sdu_len){
5207         l2cap_dispatch_to_channel(l2cap_channel, L2CAP_DATA_PACKET, l2cap_channel->receive_sdu_buffer, l2cap_channel->receive_sdu_len);
5208         l2cap_channel->receive_sdu_len = 0;
5209     }
5210 }
5211 
5212 static void l2cap_credit_based_notify_channel_can_send(l2cap_channel_t *channel){
5213     if (!channel->waiting_for_can_send_now) return;
5214     if (channel->send_sdu_buffer) return;
5215     channel->waiting_for_can_send_now = 0;
5216     log_debug("le can send now, local_cid 0x%x", channel->local_cid);
5217     l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_CAN_SEND_NOW);
5218 }
5219 #endif
5220 
5221 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
5222 // 1BH2222
5223 static void l2cap_cbm_emit_incoming_connection(l2cap_channel_t *channel) {
5224     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",
5225              channel->address_type, bd_addr_to_str(channel->address), channel->con_handle,  channel->psm, channel->local_cid, channel->remote_cid, channel->remote_mtu);
5226     uint8_t event[19];
5227     event[0] = L2CAP_EVENT_CBM_INCOMING_CONNECTION;
5228     event[1] = sizeof(event) - 2u;
5229     event[2] = channel->address_type;
5230     reverse_bd_addr(channel->address, &event[3]);
5231     little_endian_store_16(event,  9, channel->con_handle);
5232     little_endian_store_16(event, 11, channel->psm);
5233     little_endian_store_16(event, 13, channel->local_cid);
5234     little_endian_store_16(event, 15, channel->remote_cid);
5235     little_endian_store_16(event, 17, channel->remote_mtu);
5236     hci_dump_packet( HCI_EVENT_PACKET, 1, event, sizeof(event));
5237     l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
5238 }
5239 // 11BH22222
5240 static void l2cap_cbm_emit_channel_opened(l2cap_channel_t *channel, uint8_t status) {
5241     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",
5242              status, channel->address_type, bd_addr_to_str(channel->address), channel->con_handle, channel->psm,
5243              channel->local_cid, channel->remote_cid, channel->local_mtu, channel->remote_mtu);
5244     uint8_t event[23];
5245     event[0] = L2CAP_EVENT_CBM_CHANNEL_OPENED;
5246     event[1] = sizeof(event) - 2u;
5247     event[2] = status;
5248     event[3] = channel->address_type;
5249     reverse_bd_addr(channel->address, &event[4]);
5250     little_endian_store_16(event, 10, channel->con_handle);
5251     event[12] = (channel->state_var & L2CAP_CHANNEL_STATE_VAR_INCOMING) ? 1 : 0;
5252     little_endian_store_16(event, 13, channel->psm);
5253     little_endian_store_16(event, 15, channel->local_cid);
5254     little_endian_store_16(event, 17, channel->remote_cid);
5255     little_endian_store_16(event, 19, channel->local_mtu);
5256     little_endian_store_16(event, 21, channel->remote_mtu);
5257     hci_dump_packet( HCI_EVENT_PACKET, 1, event, sizeof(event));
5258     l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
5259 }
5260 
5261 // finalize closed channel - l2cap_handle_disconnect_request & DISCONNECTION_RESPONSE
5262 void l2cap_cbm_finialize_channel_close(l2cap_channel_t * channel){
5263     channel->state = L2CAP_STATE_CLOSED;
5264     l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_CHANNEL_CLOSED);
5265     // discard channel
5266     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
5267     l2cap_free_channel_entry(channel);
5268 }
5269 
5270 static inline l2cap_service_t * l2cap_cbm_get_service(uint16_t le_psm){
5271     return l2cap_get_service_internal(&l2cap_le_services, le_psm);
5272 }
5273 
5274 uint8_t l2cap_cbm_register_service(btstack_packet_handler_t packet_handler, uint16_t psm, gap_security_level_t security_level){
5275 
5276     log_info("l2cap_cbm_register_service psm 0x%x", psm);
5277 
5278     // check for alread registered psm
5279     l2cap_service_t *service = l2cap_cbm_get_service(psm);
5280     if (service) {
5281         return L2CAP_SERVICE_ALREADY_REGISTERED;
5282     }
5283 
5284     // alloc structure
5285     service = btstack_memory_l2cap_service_get();
5286     if (!service) {
5287         log_error("register: no memory for l2cap_service_t");
5288         return BTSTACK_MEMORY_ALLOC_FAILED;
5289     }
5290 
5291     // fill in
5292     service->psm = psm;
5293     service->mtu = 0;
5294     service->packet_handler = packet_handler;
5295     service->required_security_level = security_level;
5296     service->requires_authorization = false;
5297 
5298     // add to services list
5299     btstack_linked_list_add(&l2cap_le_services, (btstack_linked_item_t *) service);
5300 
5301     // done
5302     return ERROR_CODE_SUCCESS;
5303 }
5304 
5305 uint8_t l2cap_cbm_unregister_service(uint16_t psm) {
5306     log_info("l2cap_cbm_unregister_service psm 0x%x", psm);
5307     l2cap_service_t *service = l2cap_cbm_get_service(psm);
5308     if (!service) return L2CAP_SERVICE_DOES_NOT_EXIST;
5309 
5310     btstack_linked_list_remove(&l2cap_le_services, (btstack_linked_item_t *) service);
5311     btstack_memory_l2cap_service_free(service);
5312     return ERROR_CODE_SUCCESS;
5313 }
5314 
5315 uint8_t l2cap_cbm_accept_connection(uint16_t local_cid, uint8_t * receive_sdu_buffer, uint16_t mtu, uint16_t initial_credits){
5316     // get channel
5317     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5318     if (!channel) return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5319 
5320     // validate state
5321     if (channel->state != L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT){
5322         return ERROR_CODE_COMMAND_DISALLOWED;
5323     }
5324 
5325     // set state accept connection
5326     channel->state = L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_ACCEPT;
5327     channel->receive_sdu_buffer = receive_sdu_buffer;
5328     channel->local_mtu = mtu;
5329     channel->new_credits_incoming = initial_credits;
5330     channel->automatic_credits  = initial_credits == L2CAP_LE_AUTOMATIC_CREDITS;
5331 
5332     // go
5333     l2cap_run();
5334     return ERROR_CODE_SUCCESS;
5335 }
5336 
5337 uint8_t l2cap_cbm_decline_connection(uint16_t local_cid, uint16_t result) {
5338     // get channel
5339     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5340     if (!channel) return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5341 
5342     // validate state
5343     if (channel->state != L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT){
5344         return ERROR_CODE_COMMAND_DISALLOWED;
5345     }
5346 
5347     // set state decline connection
5348     channel->state  = L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_DECLINE;
5349     channel->reason = result;
5350     l2cap_run();
5351     return ERROR_CODE_SUCCESS;
5352 }
5353 
5354 static gap_security_level_t l2cap_cbm_security_level_for_connection(hci_con_handle_t con_handle){
5355     uint8_t encryption_key_size = gap_encryption_key_size(con_handle);
5356     if (encryption_key_size == 0) return LEVEL_0;
5357 
5358     bool authenticated = gap_authenticated(con_handle);
5359     if (!authenticated) return LEVEL_2;
5360 
5361     return encryption_key_size == 16 ? LEVEL_4 : LEVEL_3;
5362 }
5363 
5364 // used to handle pairing complete after triggering to increase
5365 static void l2cap_cbm_sm_packet_handler(uint8_t packet_type, uint16_t channel_nr, uint8_t *packet, uint16_t size) {
5366     UNUSED(channel_nr);
5367     UNUSED(size);
5368     UNUSED(packet_type);
5369     btstack_assert(packet_type == HCI_EVENT_PACKET);
5370     if (hci_event_packet_get_type(packet) != SM_EVENT_PAIRING_COMPLETE) return;
5371     hci_con_handle_t con_handle = sm_event_pairing_complete_get_handle(packet);
5372     btstack_linked_list_iterator_t it;
5373     btstack_linked_list_iterator_init(&it, &l2cap_channels);
5374     while (btstack_linked_list_iterator_has_next(&it)) {
5375         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
5376         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
5377         if (channel->con_handle != con_handle) continue;
5378         if (channel->state != L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE) continue;
5379 
5380         // found channel, check security level
5381         if (l2cap_cbm_security_level_for_connection(con_handle) < channel->required_security_level){
5382             // pairing failed or wasn't good enough, inform user
5383             l2cap_cbm_emit_channel_opened(channel, ERROR_CODE_INSUFFICIENT_SECURITY);
5384             // discard channel
5385             btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
5386             l2cap_free_channel_entry(channel);
5387         } else {
5388             // send conn request now
5389             channel->state = L2CAP_STATE_WILL_SEND_LE_CONNECTION_REQUEST;
5390             l2cap_run();
5391         }
5392     }
5393 }
5394 
5395 uint8_t l2cap_cbm_create_channel(btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle,
5396     uint16_t psm, uint8_t * receive_sdu_buffer, uint16_t mtu, uint16_t initial_credits, gap_security_level_t security_level,
5397     uint16_t * out_local_cid) {
5398 
5399     static btstack_packet_callback_registration_t sm_event_callback_registration;
5400     static bool sm_callback_registered = false;
5401 
5402     log_info("create, handle 0x%04x psm 0x%x mtu %u", con_handle, psm, mtu);
5403 
5404     hci_connection_t * connection = hci_connection_for_handle(con_handle);
5405     if (!connection) {
5406         log_error("no hci_connection for handle 0x%04x", con_handle);
5407         return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
5408     }
5409 
5410     l2cap_channel_t * channel = l2cap_create_channel_entry(packet_handler, L2CAP_CHANNEL_TYPE_CHANNEL_CBM, connection->address, connection->address_type, psm, mtu, security_level);
5411     if (!channel) {
5412         return BTSTACK_MEMORY_ALLOC_FAILED;
5413     }
5414     log_info("created %p", channel);
5415 
5416     // store local_cid
5417     if (out_local_cid){
5418        *out_local_cid = channel->local_cid;
5419     }
5420 
5421     // setup channel entry
5422     channel->con_handle = con_handle;
5423     channel->receive_sdu_buffer = receive_sdu_buffer;
5424     channel->new_credits_incoming = initial_credits;
5425     channel->automatic_credits    = initial_credits == L2CAP_LE_AUTOMATIC_CREDITS;
5426 
5427     // add to connections list
5428     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
5429 
5430     // check security level
5431     if (l2cap_cbm_security_level_for_connection(con_handle) < channel->required_security_level){
5432         if (!sm_callback_registered){
5433             sm_callback_registered = true;
5434             // lazy registration for SM events
5435             sm_event_callback_registration.callback = &l2cap_cbm_sm_packet_handler;
5436             sm_add_event_handler(&sm_event_callback_registration);
5437         }
5438 
5439         // start pairing
5440         channel->state = L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE;
5441         sm_request_pairing(con_handle);
5442     } else {
5443         // send conn request right away
5444         channel->state = L2CAP_STATE_WILL_SEND_LE_CONNECTION_REQUEST;
5445         l2cap_run();
5446     }
5447 
5448     return ERROR_CODE_SUCCESS;
5449 }
5450 
5451 uint8_t l2cap_cbm_provide_credits(uint16_t local_cid, uint16_t credits){
5452     return l2cap_credit_based_provide_credits(local_cid, credits);
5453 }
5454 #endif
5455 
5456 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
5457 
5458 uint8_t l2cap_ecbm_register_service(btstack_packet_handler_t packet_handler, uint16_t psm, uint16_t min_remote_mtu,
5459                                     gap_security_level_t security_level, bool authorization_required) {
5460 
5461     // check for already registered psm
5462     l2cap_service_t *service = l2cap_ecbm_get_service(psm);
5463     if (service) {
5464         return L2CAP_SERVICE_ALREADY_REGISTERED;
5465     }
5466 
5467     // alloc structure
5468     service = btstack_memory_l2cap_service_get();
5469     if (!service) {
5470         log_error("register: no memory for l2cap_service_t");
5471         return BTSTACK_MEMORY_ALLOC_FAILED;
5472     }
5473 
5474     // fill in
5475     service->psm = psm;
5476     service->mtu = min_remote_mtu;
5477     service->packet_handler = packet_handler;
5478     service->required_security_level = security_level;
5479     service->requires_authorization = authorization_required;
5480 
5481     // add to services list
5482     btstack_linked_list_add(&l2cap_enhanced_services, (btstack_linked_item_t *) service);
5483 
5484     // done
5485     return ERROR_CODE_SUCCESS;
5486 }
5487 
5488 uint8_t l2cap_ecbm_unregister_service(uint16_t psm) {
5489     l2cap_service_t *service = l2cap_ecbm_get_service(psm);
5490     if (!service) return L2CAP_SERVICE_DOES_NOT_EXIST;
5491 
5492     btstack_linked_list_remove(&l2cap_enhanced_services, (btstack_linked_item_t *) service);
5493     btstack_memory_l2cap_service_free(service);
5494     return ERROR_CODE_SUCCESS;
5495 }
5496 
5497 void l2cap_ecbm_mps_set_min(uint16_t mps_min){
5498     l2cap_enhanced_mps_min = mps_min;
5499 }
5500 
5501 void l2cap_ecbm_mps_set_max(uint16_t mps_max){
5502     l2cap_enhanced_mps_max = mps_max;
5503 }
5504 
5505 uint8_t l2cap_ecbm_create_channels(btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle,
5506                                        gap_security_level_t security_level,
5507                                        uint16_t psm, uint8_t num_channels, uint16_t initial_credits, uint16_t mtu,
5508                                        uint8_t ** receive_sdu_buffers, uint16_t * out_local_cid){
5509 
5510     log_info("create enhanced, handle 0x%04x psm 0x%x mtu %u", con_handle, psm, mtu);
5511 
5512     hci_connection_t * connection = hci_connection_for_handle(con_handle);
5513     if (!connection) {
5514         log_error("no hci_connection for handle 0x%04x", con_handle);
5515         return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
5516     }
5517 
5518     // setup all channels
5519     btstack_linked_list_t channels = NULL;
5520     uint8_t status = l2cap_ecbm_setup_channels(&channels, packet_handler, num_channels, connection, psm, mtu,
5521                                                security_level);
5522     uint16_t local_mps = btstack_min(l2cap_enhanced_mps_max, btstack_min(l2cap_max_le_mtu(), mtu));
5523 
5524     // add to connections list and set state + local_sig_id
5525     l2cap_channel_t * channel;
5526     uint8_t i = 0;
5527     uint8_t local_sig_id = l2cap_next_sig_id();
5528     while (true) {
5529         channel = (l2cap_channel_t *) btstack_linked_list_pop(&channels);
5530         if (channel == NULL) break;
5531         channel->state              = L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_REQUEST;
5532         channel->local_sig_id       = local_sig_id;
5533         channel->local_mps = local_mps;
5534         channel->cid_index = i;
5535         channel->num_cids = num_channels;
5536         channel->credits_incoming   = initial_credits;
5537         channel->automatic_credits  = initial_credits == L2CAP_LE_AUTOMATIC_CREDITS;
5538         channel->receive_sdu_buffer = receive_sdu_buffers[i];
5539         // store local_cid
5540         if (out_local_cid){
5541             out_local_cid[i] = channel->local_cid;
5542         }
5543         btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
5544         i++;
5545     }
5546 
5547 #if 0
5548     // check security level
5549     if (l2cap_le_security_level_for_connection(con_handle) < channel->required_security_level){
5550         if (!sm_callback_registered){
5551             sm_callback_registered = true;
5552             // lazy registration for SM events
5553             sm_event_callback_registration.callback = &l2cap_sm_packet_handler;
5554             sm_add_event_handler(&sm_event_callback_registration);
5555         }
5556 
5557         // start pairing
5558         channel->state = L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE;
5559         sm_request_pairing(con_handle);
5560     } else {
5561         // send conn request right away
5562         channel->state = L2CAP_STATE_WILL_SEND_LE_CONNECTION_REQUEST;
5563         l2cap_run();
5564     }
5565 #endif
5566 
5567     l2cap_run();
5568 
5569     return status;
5570 }
5571 
5572 uint8_t l2cap_ecbm_accept_channels(uint16_t local_cid, uint8_t num_channels, uint16_t initial_credits,
5573                                             uint16_t receive_buffer_size, uint8_t ** receive_buffers, uint16_t * out_local_cids){
5574 
5575     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5576     if (!channel) {
5577 
5578         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5579     }
5580 
5581     uint16_t local_mps = btstack_min(l2cap_enhanced_mps_max, btstack_min(l2cap_max_le_mtu(), receive_buffer_size));
5582 
5583     //
5584     hci_con_handle_t  con_handle    = channel->con_handle;
5585     uint8_t           local_sig_id  = channel->local_sig_id;
5586     uint8_t           channel_index = 0;
5587     btstack_linked_list_iterator_t it;
5588     btstack_linked_list_iterator_init(&it, &l2cap_channels);
5589     while (btstack_linked_list_iterator_has_next(&it)) {
5590         channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
5591         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
5592         if (channel->con_handle != con_handle) continue;
5593         if (channel->local_sig_id != local_sig_id) continue;
5594         if (channel->state != L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT) continue;
5595 
5596         if (channel_index < num_channels){
5597             // assign buffer and cid
5598             out_local_cids[channel_index] = channel->local_cid;
5599             channel->receive_sdu_buffer = receive_buffers[channel_index];
5600             channel->local_mtu = receive_buffer_size;
5601             channel->local_mps = local_mps;
5602             channel->credits_incoming   = initial_credits;
5603             channel->automatic_credits  = initial_credits == L2CAP_LE_AUTOMATIC_CREDITS;
5604             channel_index++;
5605         } else {
5606             // clear local cid for response packet
5607             channel->local_cid = 0;
5608             channel->reason = L2CAP_ECBM_CONNECTION_RESULT_SOME_REFUSED_INSUFFICIENT_RESOURCES_AVAILABLE;
5609         }
5610         // update state
5611         channel->state = L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE;
5612     }
5613     l2cap_run_trigger();
5614     return ERROR_CODE_SUCCESS;
5615 }
5616 
5617 uint8_t l2cap_ecbm_decline_channels(uint16_t local_cid, uint16_t result){
5618     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5619     if (!channel) {
5620         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5621     }
5622     //
5623     hci_con_handle_t  con_handle    = channel->con_handle;
5624     uint8_t           local_sig_id  = channel->local_sig_id;
5625     btstack_linked_list_iterator_t it;
5626     btstack_linked_list_iterator_init(&it, &l2cap_channels);
5627     while (btstack_linked_list_iterator_has_next(&it)) {
5628         channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
5629         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
5630         if (channel->con_handle != con_handle) continue;
5631         if (channel->local_sig_id != local_sig_id) continue;
5632         if (channel->state != L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT) continue;
5633 
5634         // prepare response
5635         channel->local_cid = 0;
5636         channel->reason = result;
5637         channel->state = L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE;
5638     }
5639     l2cap_run_trigger();
5640     return ERROR_CODE_SUCCESS;
5641 }
5642 
5643 uint8_t l2cap_ecbm_reconfigure_channels(uint8_t num_cids, uint16_t * local_cids, int16_t receive_buffer_size, uint8_t ** receive_buffers){
5644     btstack_assert(receive_buffers != NULL);
5645     btstack_assert(local_cids != NULL);
5646 
5647     if (num_cids > L2CAP_ECBM_MAX_CID_ARRAY_SIZE){
5648         return ERROR_CODE_UNACCEPTABLE_CONNECTION_PARAMETERS;
5649     }
5650 
5651     // check if all cids exist and have the same con handle
5652     uint8_t i;
5653     hci_con_handle_t con_handle = HCI_CON_HANDLE_INVALID;
5654     for (i = 0 ; i < num_cids ; i++){
5655         l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cids[i]);
5656         if (!channel) {
5657             return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5658         }
5659         if (channel->state != L2CAP_STATE_OPEN){
5660             return ERROR_CODE_COMMAND_DISALLOWED;
5661         }
5662         if (con_handle == HCI_CON_HANDLE_INVALID){
5663             con_handle = channel->con_handle;
5664         } else if (con_handle != channel->con_handle){
5665             return ERROR_CODE_UNACCEPTABLE_CONNECTION_PARAMETERS;
5666         }
5667     }
5668     // set renegotiation data and state
5669     uint8_t sig_id = l2cap_next_sig_id();
5670     for (i = 0 ; i < num_cids ; i++){
5671         l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cids[i]);
5672         channel->cid_index = i;
5673         channel->num_cids = num_cids;
5674         channel->local_sig_id = sig_id;
5675         channel->renegotiate_mtu = receive_buffer_size;
5676         channel->renegotiate_sdu_buffer = receive_buffers[i];
5677         channel->state = L2CAP_STATE_WILL_SEND_EHNANCED_RENEGOTIATION_REQUEST;
5678     }
5679 
5680 
5681     l2cap_run();
5682     return ERROR_CODE_SUCCESS;
5683 }
5684 
5685 uint8_t l2cap_ecbm_provide_credits(uint16_t local_cid, uint16_t credits){
5686     return l2cap_credit_based_provide_credits(local_cid, credits);
5687 }
5688 #endif
5689 
5690 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
5691 // @deprecated - please use l2cap_ertm_create_channel
5692 uint8_t l2cap_create_ertm_channel(btstack_packet_handler_t packet_handler, bd_addr_t address, uint16_t psm,
5693                                   l2cap_ertm_config_t * ertm_contig, uint8_t * buffer, uint32_t size, uint16_t * out_local_cid){
5694     log_error("deprecated - please use l2cap_ertm_create_channel");
5695     return l2cap_ertm_create_channel(packet_handler, address, psm, ertm_contig, buffer, size, out_local_cid);
5696 };
5697 
5698 // @deprecated - please use l2cap_ertm_accept_connection
5699 uint8_t l2cap_accept_ertm_connection(uint16_t local_cid, l2cap_ertm_config_t * ertm_contig, uint8_t * buffer, uint32_t size){
5700     log_error("deprecated - please use l2cap_ertm_accept_connection");
5701     return l2cap_ertm_accept_connection(local_cid, ertm_contig, buffer, size);
5702 }
5703 #endif
5704 
5705 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
5706 // @deprecated - please use l2cap_cbm_register_service
5707 uint8_t l2cap_le_register_service(btstack_packet_handler_t packet_handler, uint16_t psm, gap_security_level_t security_level){
5708     log_error("deprecated - please use l2cap_cbm_register_service");
5709     return l2cap_cbm_register_service(packet_handler, psm, security_level);
5710 }
5711 
5712 // @deprecated - please use l2cap_cbm_unregister_service
5713 uint8_t l2cap_le_unregister_service(uint16_t psm){
5714     log_error("deprecated - please use l2cap_cbm_unregister_service");
5715     return l2cap_cbm_unregister_service(psm);
5716 }
5717 
5718 // @deprecated - please use l2cap_cbm_accept_connection
5719 uint8_t l2cap_le_accept_connection(uint16_t local_cid, uint8_t * receive_sdu_buffer, uint16_t mtu, uint16_t initial_credits){
5720     log_error("deprecated - please use l2cap_cbm_accept_connection");
5721     return l2cap_cbm_accept_connection(local_cid, receive_sdu_buffer, mtu, initial_credits);
5722 }
5723 
5724 // @deprecated - please use l2cap_cbm_decline_connection
5725 uint8_t l2cap_le_decline_connection(uint16_t local_cid){
5726     log_error("deprecated - please use l2cap_cbm_decline_connection");
5727     return l2cap_cbm_decline_connection(local_cid, L2CAP_CBM_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE);
5728 }
5729 
5730 // @deprecated - please use l2cap_cbm_create_channel
5731 uint8_t l2cap_le_create_channel(btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle,
5732                                 uint16_t psm, uint8_t * receive_sdu_buffer, uint16_t mtu, uint16_t initial_credits, gap_security_level_t security_level,
5733                                 uint16_t * out_local_cid){
5734     log_error("deprecated - please use l2cap_cbm_create_channel");
5735     return l2cap_cbm_create_channel(packet_handler, con_handle, psm, receive_sdu_buffer, mtu, initial_credits, security_level, out_local_cid);
5736 }
5737 
5738 // @deprecated - please use l2cap_cbm_provide_credits
5739 uint8_t l2cap_le_provide_credits(uint16_t local_cid, uint16_t credits){
5740     log_error("deprecated - please use l2cap_cbm_provide_credits");
5741     return l2cap_cbm_provide_credits(local_cid, credits);
5742 }
5743 
5744 // @deprecated - please use l2cap_can_send_packet_now
5745 bool l2cap_le_can_send_now(uint16_t local_cid){
5746     log_error("deprecated - please use l2cap_can_send_packet_now");
5747     return l2cap_can_send_packet_now(local_cid);
5748 }
5749 
5750 // @deprecated - please use l2cap_request_can_send_now_event
5751 uint8_t l2cap_le_request_can_send_now_event(uint16_t local_cid){
5752     log_error("deprecated - please use l2cap_request_can_send_now_event");
5753     return l2cap_request_can_send_now_event(local_cid);
5754 }
5755 
5756 // @deprecated - please use l2cap_cbm_send_data
5757 uint8_t l2cap_le_send_data(uint16_t local_cid, const uint8_t * data, uint16_t size){
5758     log_error("deprecated - please use l2cap_cbm_send_data");
5759     return l2cap_send(local_cid, data, size);
5760 }
5761 
5762 // @deprecated - please use l2cap_disconnect
5763 uint8_t l2cap_le_disconnect(uint16_t local_cid){
5764     log_error("deprecated - please use l2cap_disconnect");
5765     return l2cap_disconnect(local_cid);
5766 }
5767 #endif
5768