xref: /btstack/src/l2cap.c (revision 93778f0791884870a1824286aab86477c3dc5437)
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     // send command reject
3770     l2cap_register_signaling_response(handle, COMMAND_REJECT, sig_id, 0, L2CAP_REJ_CMD_UNKNOWN);
3771 }
3772 #endif
3773 
3774 #ifdef L2CAP_USES_CHANNELS
3775 static l2cap_service_t * l2cap_get_service_internal(btstack_linked_list_t * services, uint16_t psm){
3776     btstack_linked_list_iterator_t it;
3777     btstack_linked_list_iterator_init(&it, services);
3778     while (btstack_linked_list_iterator_has_next(&it)){
3779         l2cap_service_t * service = (l2cap_service_t *) btstack_linked_list_iterator_next(&it);
3780         if ( service->psm == psm){
3781             return service;
3782         };
3783     }
3784     return NULL;
3785 }
3786 #endif
3787 
3788 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
3789 
3790 static uint8_t l2cap_ecbm_setup_channels(btstack_linked_list_t * channels,
3791                                          btstack_packet_handler_t packet_handler, uint8_t num_channels,
3792                                          hci_connection_t * connection, uint16_t psm, uint16_t mtu, gap_security_level_t security_level){
3793     uint8_t i;
3794     uint8_t status = ERROR_CODE_SUCCESS;
3795     for (i=0;i<num_channels;i++){
3796         l2cap_channel_t * channel = l2cap_create_channel_entry(packet_handler, L2CAP_CHANNEL_TYPE_CHANNEL_ECBM, connection->address, connection->address_type, psm, mtu, security_level);
3797         if (!channel) {
3798             status = BTSTACK_MEMORY_ALLOC_FAILED;
3799             break;
3800         }
3801         channel->con_handle = connection->con_handle;
3802         btstack_linked_list_add_tail(channels, (btstack_linked_item_t *) channel);
3803     }
3804 
3805     // free channels if not all allocated
3806     if (status != ERROR_CODE_SUCCESS){
3807         while (true) {
3808             l2cap_channel_t * channel = (l2cap_channel_t *) btstack_linked_list_pop(channels);
3809             if (channel == NULL) break;
3810             l2cap_free_channel_entry(channel);
3811         }
3812     }
3813 
3814     return status;
3815 }
3816 
3817 static inline l2cap_service_t * l2cap_ecbm_get_service(uint16_t spsm){
3818     return l2cap_get_service_internal(&l2cap_enhanced_services, spsm);
3819 }
3820 
3821 static inline uint8_t l2cap_ecbm_status_for_result(uint16_t result) {
3822     switch (result) {
3823         case L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS:
3824             return ERROR_CODE_SUCCESS;
3825         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_SPSM_NOT_SUPPORTED:
3826             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_PSM;
3827         case L2CAP_ECBM_CONNECTION_RESULT_SOME_REFUSED_INSUFFICIENT_RESOURCES_AVAILABLE:
3828             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_RESOURCES;
3829         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_AUTHENTICATION:
3830         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_AUTHORIZATION:
3831         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_ENCYRPTION_KEY_SIZE_TOO_SHORT:
3832         case L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_ENCRYPTION:
3833             return L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_SECURITY;
3834         default:
3835             // invalid Source CID, Source CID already allocated, unacceptable parameters
3836             return L2CAP_CONNECTION_RESPONSE_UNKNOWN_ERROR;
3837     }
3838 }
3839 
3840 static void
3841 l2cap_ecbm_emit_incoming_connection(l2cap_channel_t *channel, uint8_t num_channels) {
3842     uint8_t event[16];
3843     event[0] = L2CAP_EVENT_ECBM_INCOMING_CONNECTION;
3844     event[1] = sizeof(event) - 2;
3845     event[2] = channel->address_type;
3846     reverse_bd_addr(channel->address, &event[3]);
3847     little_endian_store_16(event, 9, channel->con_handle);
3848     little_endian_store_16(event, 11, channel->psm);
3849     event[13] = num_channels;
3850     little_endian_store_16(event, 14, channel->local_cid);
3851     hci_dump_packet(HCI_EVENT_PACKET, 1, event, sizeof(event));
3852     (*channel->packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
3853 }
3854 
3855 static uint8_t
3856 l2cap_ecbm_security_status_for_connection_request(hci_con_handle_t handle, gap_security_level_t required_security_level,
3857                                                   bool requires_authorization) {
3858     // check security in increasing error priority
3859     uint8_t security_status = L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS;
3860 
3861     // security: check encryption
3862     if (required_security_level >= LEVEL_2) {
3863         if (gap_encryption_key_size(handle) < 16) {
3864             security_status = L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_ENCYRPTION_KEY_SIZE_TOO_SHORT;
3865         }
3866         if (gap_encryption_key_size(handle) == 0){
3867             security_status = L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_ENCRYPTION;
3868         }
3869     }
3870 
3871     // security: check authentication
3872     if (required_security_level >= LEVEL_3) {
3873         if (!gap_authenticated(handle)) {
3874             security_status = requires_authorization ?
3875                     L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_AUTHORIZATION :
3876                     L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INSUFFICIENT_AUTHENTICATION;
3877         }
3878     }
3879     return security_status;
3880 }
3881 
3882 static void l2cap_ecbm_handle_security_level_incoming(l2cap_channel_t * channel){
3883     // count number of l2cap_channels in state L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE with same remote_sig_id
3884     uint8_t sig_id = channel->remote_sig_id;
3885     hci_con_handle_t con_handle = channel->con_handle;
3886 
3887     uint8_t security_status = l2cap_ecbm_security_status_for_connection_request(channel->con_handle,
3888                                                                                 channel->required_security_level,
3889                                                                                 false);
3890     bool security_sufficient = security_status == L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS;
3891 
3892     uint8_t num_channels = 0;
3893     btstack_linked_list_iterator_t it;
3894     btstack_linked_list_iterator_init(&it, &l2cap_channels);
3895     while (btstack_linked_list_iterator_has_next(&it)) {
3896         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
3897         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
3898         if (channel->con_handle != con_handle) continue;
3899         if (channel->remote_sig_id != sig_id) continue;
3900         if (channel->state != L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE) continue;
3901         num_channels++;
3902 
3903         if (security_sufficient){
3904             channel->state = L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT;
3905         } else {
3906             btstack_linked_list_iterator_remove(&it);
3907             btstack_memory_l2cap_channel_free(channel);
3908         }
3909     }
3910 
3911     if (security_sufficient){
3912         l2cap_ecbm_emit_incoming_connection(channel, num_channels);
3913     } else {
3914         // combine signaling cid and number channels for l2cap_register_signaling_response
3915         uint16_t signaling_cid = L2CAP_CID_SIGNALING;
3916         uint16_t num_channels_and_signaling_cid = (num_channels << 8) | signaling_cid;
3917         l2cap_register_signaling_response(con_handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
3918                                           num_channels_and_signaling_cid, security_status);
3919     }
3920 }
3921 
3922 void l2cap_ecbm_trigger_pending_connection_responses(hci_con_handle_t con_handle){
3923     bool done = false;
3924     while (!done) {
3925         done = true;
3926         btstack_linked_list_iterator_t it;
3927         btstack_linked_list_iterator_init(&it, &l2cap_channels);
3928         while (btstack_linked_list_iterator_has_next(&it)) {
3929             l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
3930             if (channel->channel_type != L2CAP_CHANNEL_TYPE_CHANNEL_ECBM) continue;
3931             if (channel->con_handle != con_handle) continue;
3932             if  (channel->state == L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE) {
3933                 l2cap_ecbm_handle_security_level_incoming(channel);
3934                 done = false;
3935             };
3936         }
3937     }
3938 }
3939 
3940 static int l2cap_ecbm_signaling_handler_dispatch(hci_con_handle_t handle, uint16_t signaling_cid, uint8_t *command,
3941                                                  uint8_t sig_id) {
3942 
3943     hci_connection_t *connection;
3944     btstack_linked_list_iterator_t it;
3945     l2cap_service_t *service;
3946     uint16_t spsm;
3947     uint8_t num_channels;
3948     uint16_t num_channels_and_signaling_cid;
3949     uint8_t i;
3950     uint16_t new_mtu;
3951     uint16_t new_mps;
3952     uint16_t initial_credits;
3953     uint16_t result;
3954     uint8_t status;
3955 
3956     uint8_t code = command[L2CAP_SIGNALING_COMMAND_CODE_OFFSET];
3957     uint16_t len = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
3958     log_info("enhanced dispatch: command 0x%02x, sig id %u, len %u", code, sig_id, len);
3959 
3960     switch (code) {
3961         case L2CAP_CREDIT_BASED_CONNECTION_REQUEST:
3962             // check size
3963             if (len < 10u) return 0u;
3964 
3965             // get hci connection, bail if not found (must not happen)
3966             connection = hci_connection_for_handle(handle);
3967             btstack_assert(connection != NULL);
3968 
3969             // get num channels to establish
3970             num_channels = (len - 8) / sizeof(uint16_t);
3971 
3972             // combine signaling cid and number channels for l2cap_register_signaling_response
3973             num_channels_and_signaling_cid = (num_channels << 8) | signaling_cid;
3974 
3975             // check if service registered
3976             spsm = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
3977             service = l2cap_ecbm_get_service(spsm);
3978 
3979             if (service) {
3980 
3981                 uint16_t remote_mtu = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
3982                 uint16_t remote_mps = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 4);
3983                 uint16_t credits_outgoing = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 6);
3984 
3985                 // param: check remote mtu
3986                 if (service->mtu > remote_mtu) {
3987                     l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
3988                                                       num_channels_and_signaling_cid, L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_INVALID_PARAMETERS);
3989                     return 1;
3990                 }
3991 
3992                 // check if authentication is required and possible
3993                 bool send_pending = false;
3994                 uint8_t security_status = l2cap_ecbm_security_status_for_connection_request(handle,
3995                                                                                             service->required_security_level,
3996                                                                                             service->requires_authorization);
3997                 if (security_status != L2CAP_ECBM_CONNECTION_RESULT_ALL_SUCCESS) {
3998                     if (gap_get_bondable_mode() != 0) {
3999                         // if possible, send pending and continue
4000                         send_pending = true;
4001                     } else {
4002                         // otherwise, send refused and abort
4003                         l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4004                                                           num_channels_and_signaling_cid, security_status);
4005                         return 1;
4006                     }
4007                 }
4008 
4009                 // report the last result code != 0
4010                 result = 0;
4011                 // store one of the local channels for the event
4012                 l2cap_channel_t * a_channel = NULL;
4013                 for (i = 0; i < num_channels; i++) {
4014 
4015                     // check source cids
4016                     uint16_t source_cid = little_endian_read_16(command, 12 + (i * 2));
4017                     if (source_cid < 0x40u) {
4018                         result = L2CAP_ECBM_CONNECTION_RESULT_SOME_REFUSED_INVALID_SOURCE_CID;
4019                         continue;
4020                     }
4021 
4022                     // go through list of channels for this ACL connection and check if we get a match
4023                     btstack_linked_list_iterator_init(&it, &l2cap_channels);
4024                     bool source_cid_allocated = false;
4025                     while (btstack_linked_list_iterator_has_next(&it)) {
4026                         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4027                         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
4028                         if (channel->con_handle != handle) continue;
4029                         if (channel->remote_cid != source_cid) continue;
4030                         source_cid_allocated = true;
4031                         break;
4032                     }
4033                     if (source_cid_allocated) {
4034                         result = 0x00a;
4035                         continue;
4036                     }
4037 
4038                     // setup channel
4039                     l2cap_channel_t *channel = l2cap_create_channel_entry(service->packet_handler,
4040                                                                           L2CAP_CHANNEL_TYPE_CHANNEL_ECBM,
4041                                                                           connection->address,
4042                                                                           connection->address_type, spsm,
4043                                                                           service->mtu,
4044                                                                           service->required_security_level);
4045 
4046                     if (channel == NULL) {
4047                         // Some connections refused – insufficient resources available
4048                         result = 0x004;
4049                         continue;
4050                     }
4051 
4052                     // setup state
4053                     channel->state = L2CAP_STATE_WAIT_INCOMING_SECURITY_LEVEL_UPDATE;
4054                     channel->state_var |= L2CAP_CHANNEL_STATE_VAR_INCOMING;
4055                     channel->con_handle = connection->con_handle;
4056                     channel->remote_sig_id = sig_id;
4057                     channel->remote_cid = source_cid;
4058                     channel->remote_mtu = remote_mtu;
4059                     channel->remote_mps = remote_mps;
4060                     channel->credits_outgoing = credits_outgoing;
4061                     channel->cid_index = i;
4062                     channel->num_cids = num_channels;
4063 
4064                     // if more than one error, we can report any of them
4065                     channel->reason = result;
4066 
4067                     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
4068 
4069                     a_channel = channel;
4070                 }
4071 
4072                 // if no channels have been created, all have been refused, and we can respond right away
4073                 if (a_channel == NULL) {
4074                     l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4075                                                       num_channels_and_signaling_cid, result);
4076                     return 1;
4077                 }
4078 
4079                 // if security is pending, send intermediate response, otherwise, ask user
4080                 if (send_pending){
4081                     l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4082                                                       num_channels_and_signaling_cid, L2CAP_ECBM_CONNECTION_RESULT_ALL_PENDING_AUTHENTICATION);
4083                 } else {
4084                     // if security is ok but authorization is required, send intermediate response and ask user
4085                     if (service->requires_authorization){
4086                         l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4087                                                           num_channels_and_signaling_cid, L2CAP_ECBM_CONNECTION_RESULT_ALL_PENDING_AUTHORIZATION);
4088                     }
4089                     l2cap_ecbm_handle_security_level_incoming(a_channel);
4090                 }
4091 
4092             } else {
4093                 l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_CONNECTION_REQUEST, sig_id,
4094                                                   num_channels_and_signaling_cid, L2CAP_ECBM_CONNECTION_RESULT_ALL_REFUSED_SPSM_NOT_SUPPORTED);
4095             }
4096             return 1;
4097 
4098         case L2CAP_CREDIT_BASED_CONNECTION_RESPONSE:
4099             // check size
4100             if (len < 10u) return 0u;
4101 
4102             // get hci connection, ignore if not found
4103             connection = hci_connection_for_handle(handle);
4104             if (connection == NULL) return 0;
4105 
4106             // get channel config: mtu, mps, initial credits, result
4107             new_mtu = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4108             new_mps = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
4109             initial_credits = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 4);
4110             result = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 6);
4111             status = l2cap_ecbm_status_for_result(result);
4112 
4113             // get num channels to modify
4114             num_channels = (len - 8) / sizeof(uint16_t);
4115             btstack_linked_list_iterator_init(&it, &l2cap_channels);
4116             while (btstack_linked_list_iterator_has_next(&it)) {
4117                 uint8_t channel_status = status;
4118                 l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4119                 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
4120                 if (channel->con_handle != handle) continue;
4121                 if (channel->local_sig_id != sig_id) continue;
4122                 if (channel->state != L2CAP_STATE_WAIT_ENHANCED_CONNECTION_RESPONSE) continue;
4123                 if (channel->cid_index < num_channels) {
4124                     uint16_t remote_cid = little_endian_read_16(command, 12 + channel->cid_index * sizeof(uint16_t));
4125                     if (remote_cid != 0) {
4126                         // check for duplicate remote CIDs
4127                         l2cap_channel_t * original_channel = l2cap_get_channel_for_remote_handle_and_cid(handle, remote_cid);
4128                         if (original_channel == NULL){
4129                             channel->state = L2CAP_STATE_OPEN;
4130                             channel->remote_cid = remote_cid;
4131                             channel->remote_mtu = new_mtu;
4132                             channel->remote_mps = new_mps;
4133                             channel->credits_outgoing = initial_credits;
4134                             l2cap_ecbm_emit_channel_opened(channel, ERROR_CODE_SUCCESS);
4135                             continue;
4136                         }
4137                         // close original channel
4138                         original_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
4139                         channel_status = ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS;
4140                     }
4141                 }
4142                 // open failed
4143                 l2cap_ecbm_emit_channel_opened(channel, channel_status);
4144                 // drop failed channel
4145                 btstack_linked_list_iterator_remove(&it);
4146                 btstack_memory_l2cap_channel_free(channel);
4147             }
4148             return 1;
4149 
4150         case L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST:
4151             // check minimal size
4152             if (len < 6) return 0u;
4153 
4154             // get hci connection, bail if not found (must not happen)
4155             connection = hci_connection_for_handle(handle);
4156             btstack_assert(connection != NULL);
4157 
4158             // get num channels to modify
4159             num_channels = (len - 4) / sizeof(uint16_t);
4160 
4161             // get new mtu and mps
4162             new_mtu = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4163             new_mps = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
4164 
4165             // validate request
4166             result = 0;
4167             for (i = 0; i < num_channels; i++) {
4168                 // check cid
4169                 uint16_t remote_cid = little_endian_read_16(command, 8 + (i * sizeof(uint16_t)));
4170                 l2cap_channel_t *channel = l2cap_get_channel_for_remote_handle_and_cid(handle, remote_cid);
4171                 if (channel == NULL) {
4172                     result = L2CAP_ECBM_RECONFIGURE_FAILED_DESTINATION_CID_INVALID;
4173                     break;
4174                 }
4175                 // check MTU is not reduced
4176                 if (channel->remote_mtu > new_mtu) {
4177                     result = L2CAP_ECBM_RECONFIGURE_FAILED_MTU_REDUCTION_NOT_ALLOWED;
4178                     break;
4179                 }
4180                 // check MPS reduction
4181                 if ((num_channels > 1) && (channel->remote_mps > new_mps)) {
4182                     result = L2CAP_ECBM_RECONFIGURE_FAILED_MPS_REDUCTION_MULTIPLE_CHANNELS;
4183                     break;
4184                 }
4185                 // check MPS valid
4186                 if (new_mps < l2cap_enhanced_mps_min) {
4187                     result = L2CAP_ECBM_RECONFIGURE_FAILED_UNACCEPTABLE_PARAMETERS;
4188                     break;
4189                 }
4190             }
4191 
4192             // send reject
4193             if (result != 0) {
4194                 l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST, sig_id, signaling_cid,
4195                                                   result);
4196                 return 1;
4197             }
4198 
4199             // update channels
4200             for (i = 0; i < num_channels; i++) {
4201                 uint16_t remote_cid = little_endian_read_16(command, 8 + (i * sizeof(uint16_t)));
4202                 l2cap_channel_t *channel = l2cap_get_channel_for_remote_handle_and_cid(handle, remote_cid);
4203                 channel->remote_mps = new_mps;
4204                 channel->remote_mtu = new_mtu;
4205                 // emit event
4206                 uint8_t event[8];
4207                 event[0] = L2CAP_EVENT_ECBM_RECONFIGURED;
4208                 event[1] = sizeof(event) - 2;
4209                 little_endian_store_16(event, 2, channel->local_cid);
4210                 little_endian_store_16(event, 4, new_mtu);
4211                 little_endian_store_16(event, 6, new_mps);
4212                 l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
4213             }
4214 
4215             // send accept
4216             l2cap_register_signaling_response(handle, L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST, sig_id, signaling_cid, 0);
4217             return 1;
4218 
4219         case L2CAP_CREDIT_BASED_RECONFIGURE_RESPONSE:
4220             // check size
4221             if (len < 2u) return 0u;
4222 
4223             result = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4224             btstack_linked_list_iterator_init(&it, &l2cap_channels);
4225             while (btstack_linked_list_iterator_has_next(&it)) {
4226                 l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4227                 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
4228                 if (channel->con_handle != handle) continue;
4229                 if (channel->local_sig_id != sig_id) continue;
4230                 if (channel->state != L2CAP_STATE_WAIT_ENHANCED_RENEGOTIATION_RESPONSE) continue;
4231                 // complete request
4232                 if (result == 0) {
4233                     channel->receive_sdu_buffer = channel->renegotiate_sdu_buffer;
4234                     channel->local_mtu = channel->renegotiate_mtu;
4235                 }
4236                 channel->state = L2CAP_STATE_OPEN;
4237                 // emit event
4238                 l2cap_ecbm_emit_reconfigure_complete(channel, result);
4239             }
4240             break;
4241 
4242         default:
4243             btstack_unreachable();
4244             break;
4245     }
4246     return 0;
4247 }
4248 
4249 #endif
4250 
4251 #ifdef ENABLE_BLE
4252 
4253 static void l2cap_emit_connection_parameter_update_response(hci_con_handle_t con_handle, uint16_t result){
4254     uint8_t event[6];
4255     event[0] = L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_RESPONSE;
4256     event[1] = 4;
4257     little_endian_store_16(event, 2, con_handle);
4258     little_endian_store_16(event, 4, result);
4259     l2cap_emit_event(event, sizeof(event));
4260 }
4261 
4262 // @return valid
4263 static int l2cap_le_signaling_handler_dispatch(hci_con_handle_t handle, uint8_t * command, uint8_t sig_id){
4264     hci_connection_t * connection;
4265     uint16_t result;
4266     uint8_t  event[12];
4267 
4268 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
4269     l2cap_channel_t * channel;
4270     btstack_linked_list_iterator_t it;
4271 #endif
4272 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4273     uint16_t local_cid;
4274     uint16_t le_psm;
4275     l2cap_service_t * service;
4276     uint16_t source_cid;
4277 #endif
4278 
4279     uint8_t code   = command[L2CAP_SIGNALING_COMMAND_CODE_OFFSET];
4280     uint16_t len   = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
4281     log_info("le dispatch: command 0x%02x, sig id %u, len %u", code, sig_id, len);
4282 
4283     switch (code){
4284 
4285         case CONNECTION_PARAMETER_UPDATE_REQUEST:
4286             // check size
4287             if (len < 8u) return 0u;
4288             connection = hci_connection_for_handle(handle);
4289             if (connection != NULL){
4290                 if (connection->role != HCI_ROLE_MASTER){
4291                     // reject command without notifying upper layer when not in master role
4292                     return 0;
4293                 }
4294                 le_connection_parameter_range_t existing_range;
4295                 gap_get_connection_parameter_range(&existing_range);
4296                 uint16_t le_conn_interval_min   = little_endian_read_16(command,L2CAP_SIGNALING_COMMAND_DATA_OFFSET);
4297                 uint16_t le_conn_interval_max   = little_endian_read_16(command,L2CAP_SIGNALING_COMMAND_DATA_OFFSET+2);
4298                 uint16_t le_conn_latency        = little_endian_read_16(command,L2CAP_SIGNALING_COMMAND_DATA_OFFSET+4);
4299                 uint16_t le_supervision_timeout = little_endian_read_16(command,L2CAP_SIGNALING_COMMAND_DATA_OFFSET+6);
4300 
4301                 int update_parameter = gap_connection_parameter_range_included(&existing_range, le_conn_interval_min, le_conn_interval_max, le_conn_latency, le_supervision_timeout);
4302                 if (update_parameter){
4303                     connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_SEND_RESPONSE;
4304                     connection->le_conn_interval_min = le_conn_interval_min;
4305                     connection->le_conn_interval_max = le_conn_interval_max;
4306                     connection->le_conn_latency = le_conn_latency;
4307                     connection->le_supervision_timeout = le_supervision_timeout;
4308                 } else {
4309                     connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_DENY;
4310                 }
4311                 connection->le_con_param_update_identifier = sig_id;
4312             }
4313 
4314             event[0] = L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_REQUEST;
4315             event[1] = 10;
4316             little_endian_store_16(event, 2, handle);
4317             (void)memcpy(&event[4], &command[4], 8);
4318             l2cap_emit_event(event, sizeof(event));
4319             break;
4320 
4321         case CONNECTION_PARAMETER_UPDATE_RESPONSE:
4322             // check size
4323             if (len < 2u) return 0u;
4324             result = little_endian_read_16(command, 4);
4325             l2cap_emit_connection_parameter_update_response(handle, result);
4326             break;
4327 
4328 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
4329         case L2CAP_CREDIT_BASED_CONNECTION_REQUEST:
4330         case L2CAP_CREDIT_BASED_CONNECTION_RESPONSE:
4331         case L2CAP_CREDIT_BASED_RECONFIGURE_REQUEST:
4332         case L2CAP_CREDIT_BASED_RECONFIGURE_RESPONSE:
4333             return l2cap_ecbm_signaling_handler_dispatch(handle, L2CAP_CID_SIGNALING_LE, command, sig_id);
4334 #endif
4335 
4336 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
4337         case COMMAND_REJECT:
4338             btstack_linked_list_iterator_init(&it, &l2cap_channels);
4339             while (btstack_linked_list_iterator_has_next(&it)){
4340                 channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4341                 if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
4342                 if (channel->con_handle   != handle) continue;
4343                 if (channel->local_sig_id != sig_id) continue;
4344 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4345                 // if received while waiting for le connection response, assume legacy device
4346                 if (channel->state == L2CAP_STATE_WAIT_LE_CONNECTION_RESPONSE){
4347                     channel->state = L2CAP_STATE_CLOSED;
4348                     // no official value for this, use: Connection refused – LE_PSM not supported
4349                     l2cap_cbm_emit_channel_opened(channel, L2CAP_CBM_CONNECTION_RESULT_SPSM_NOT_SUPPORTED);
4350 
4351                     // discard channel
4352                     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
4353                     l2cap_free_channel_entry(channel);
4354                     continue;
4355                 }
4356 #endif
4357 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
4358                 // if received while waiting for le connection response, assume legacy device
4359                 if (channel->state == L2CAP_STATE_WAIT_ENHANCED_CONNECTION_RESPONSE){
4360                     channel->state = L2CAP_STATE_CLOSED;
4361                     // treat as SPSM not supported
4362                     l2cap_ecbm_emit_channel_opened(channel, L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_PSM);
4363 
4364                     // discard channel
4365                     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
4366                     l2cap_free_channel_entry(channel);
4367                     continue;
4368                 }
4369 #endif
4370             }
4371             break;
4372 #endif
4373 
4374 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4375         case LE_CREDIT_BASED_CONNECTION_REQUEST:
4376             // check size
4377             if (len < 10u) return 0u;
4378 
4379             // get hci connection, bail if not found (must not happen)
4380             connection = hci_connection_for_handle(handle);
4381             if (!connection) return 0;
4382 
4383             // check if service registered
4384             le_psm  = little_endian_read_16(command, 4);
4385             service = l2cap_cbm_get_service(le_psm);
4386             source_cid = little_endian_read_16(command, 6);
4387 
4388             if (service){
4389                 if (source_cid < 0x40u){
4390                     l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_INVALID_SOURCE_CID);
4391                     return 1;
4392                 }
4393 
4394                 // go through list of channels for this ACL connection and check if we get a match
4395                 btstack_linked_list_iterator_init(&it, &l2cap_channels);
4396                 while (btstack_linked_list_iterator_has_next(&it)){
4397                     l2cap_channel_t * a_channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4398                     if (!l2cap_is_dynamic_channel_type(a_channel->channel_type)) continue;
4399                     if (a_channel->con_handle != handle) continue;
4400                     if (a_channel->remote_cid != source_cid) continue;
4401                     l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_SOURCE_CID_ALREADY_ALLOCATED);
4402                     return 1;
4403                 }
4404 
4405                 // security: check encryption
4406                 if (service->required_security_level >= LEVEL_2){
4407                     if (gap_encryption_key_size(handle) == 0){
4408                         l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_ENCRYPTION);
4409                         return 1;
4410                     }
4411                     // anything less than 16 byte key size is insufficient
4412                     if (gap_encryption_key_size(handle) < 16){
4413                         l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_ENCYRPTION_KEY_SIZE_TOO_SHORT);
4414                         return 1;
4415                     }
4416                 }
4417 
4418                 // security: check authentication
4419                 if (service->required_security_level >= LEVEL_3){
4420                     if (!gap_authenticated(handle)){
4421                         l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_AUTHENTICATION);
4422                         return 1;
4423                     }
4424                 }
4425 
4426                 // security: check authorization
4427                 if (service->required_security_level >= LEVEL_4){
4428                     if (gap_authorization_state(handle) != AUTHORIZATION_GRANTED){
4429                         l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_INSUFFICIENT_AUTHORIZATION);
4430                         return 1;
4431                     }
4432                 }
4433 
4434                 // allocate channel
4435                 channel = l2cap_create_channel_entry(service->packet_handler, L2CAP_CHANNEL_TYPE_CHANNEL_CBM, connection->address,
4436                                                      BD_ADDR_TYPE_LE_RANDOM, le_psm, service->mtu, service->required_security_level);
4437                 if (!channel){
4438                     l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE);
4439                     return 1;
4440                 }
4441 
4442                 channel->con_handle = handle;
4443                 channel->remote_cid = source_cid;
4444                 channel->remote_sig_id = sig_id;
4445                 channel->remote_mtu = little_endian_read_16(command, 8);
4446                 channel->remote_mps = little_endian_read_16(command, 10);
4447                 channel->credits_outgoing = little_endian_read_16(command, 12);
4448 
4449                 // set initial state
4450                 channel->state      = L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT;
4451                 channel->state_var |= L2CAP_CHANNEL_STATE_VAR_INCOMING;
4452 
4453                 // add to connections list
4454                 btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
4455 
4456                 // post connection request event
4457                 l2cap_cbm_emit_incoming_connection(channel);
4458 
4459             } else {
4460                 l2cap_register_signaling_response(handle, LE_CREDIT_BASED_CONNECTION_REQUEST, sig_id, source_cid, L2CAP_CBM_CONNECTION_RESULT_SPSM_NOT_SUPPORTED);
4461             }
4462             break;
4463 
4464         case LE_CREDIT_BASED_CONNECTION_RESPONSE:
4465             // check size
4466             if (len < 10u) return 0u;
4467 
4468             // Find channel for this sig_id and connection handle
4469             channel = NULL;
4470             btstack_linked_list_iterator_init(&it, &l2cap_channels);
4471             while (btstack_linked_list_iterator_has_next(&it)){
4472                 l2cap_channel_t * a_channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
4473                 if (!l2cap_is_dynamic_channel_type(a_channel->channel_type)) continue;
4474                 if (a_channel->con_handle   != handle) continue;
4475                 if (a_channel->local_sig_id != sig_id) continue;
4476                 channel = a_channel;
4477                 break;
4478             }
4479             if (!channel) break;
4480 
4481             // cid + 0
4482             result = little_endian_read_16 (command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET+8);
4483             if (result){
4484                 channel->state = L2CAP_STATE_CLOSED;
4485                 uint8_t status = l2cap_cbm_status_for_result(result);
4486                 l2cap_cbm_emit_channel_opened(channel, status);
4487 
4488                 // discard channel
4489                 btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
4490                 l2cap_free_channel_entry(channel);
4491                 break;
4492             }
4493 
4494             // success
4495             channel->remote_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4496             channel->remote_mtu = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
4497             channel->remote_mps = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 4);
4498             channel->credits_outgoing = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 6);
4499             channel->state = L2CAP_STATE_OPEN;
4500             l2cap_cbm_emit_channel_opened(channel, ERROR_CODE_SUCCESS);
4501             break;
4502 #endif
4503 
4504 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
4505         case L2CAP_FLOW_CONTROL_CREDIT_INDICATION:
4506             return l2cap_credit_based_handle_credit_indication(handle, command, len) ? 1 : 0;
4507 
4508         case DISCONNECTION_REQUEST:
4509             // check size
4510             if (len < 4u) return 0u;
4511 
4512             // find channel
4513             local_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4514             channel = l2cap_get_channel_for_local_cid_and_handle(local_cid, handle);
4515             if (!channel) {
4516                 l2cap_register_signaling_response(handle, DISCONNECTION_REQUEST, sig_id,
4517                                                   little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2), local_cid);
4518                 break;
4519             }
4520             channel->remote_sig_id = sig_id;
4521             channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_RESPONSE;
4522             break;
4523 
4524         case DISCONNECTION_RESPONSE:
4525             // check size
4526             if (len < 4u) return 0u;
4527 
4528             // find channel
4529             local_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
4530             channel = l2cap_get_channel_for_local_cid_and_handle(local_cid, handle);
4531             if (!channel) break;
4532             if (channel->local_sig_id == sig_id) {
4533                 if (channel->state == L2CAP_STATE_WAIT_DISCONNECT){
4534                     l2cap_finalize_channel_close(channel);
4535                 }
4536             }
4537             break;
4538 #endif
4539 
4540         default:
4541             // command unknown -> reject command
4542             return 0;
4543     }
4544     return 1;
4545 }
4546 #endif
4547 
4548 #ifdef ENABLE_CLASSIC
4549 static void l2cap_acl_classic_handler_for_channel(l2cap_channel_t * l2cap_channel, uint8_t * packet, uint16_t size){
4550 
4551     // forward data only in OPEN state
4552     if (l2cap_channel->state != L2CAP_STATE_OPEN) return;
4553 
4554 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
4555     if (l2cap_channel->channel_type == L2CAP_CHANNEL_TYPE_CHANNEL_ECBM){
4556         l2cap_credit_based_handle_pdu(l2cap_channel, packet, size);
4557         return;
4558     }
4559 #endif
4560 
4561 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
4562     if (l2cap_channel->mode == L2CAP_CHANNEL_MODE_ENHANCED_RETRANSMISSION){
4563 
4564         int fcs_size = l2cap_channel->fcs_option ? 2 : 0;
4565 
4566         // assert control + FCS fields are inside
4567         if (size < COMPLETE_L2CAP_HEADER+2+fcs_size) return;
4568 
4569         if (l2cap_channel->fcs_option){
4570             // verify FCS (required if one side requested it)
4571             uint16_t fcs_calculated = crc16_calc(&packet[4], size - (4+2));
4572             uint16_t fcs_packet     = little_endian_read_16(packet, size-2);
4573 
4574 #ifdef L2CAP_ERTM_SIMULATE_FCS_ERROR_INTERVAL
4575             // simulate fcs error
4576             static int counter = 0;
4577             if (++counter == L2CAP_ERTM_SIMULATE_FCS_ERROR_INTERVAL) {
4578                 log_info("Simulate fcs error");
4579                 fcs_calculated++;
4580                 counter = 0;
4581             }
4582 #endif
4583 
4584             if (fcs_calculated == fcs_packet){
4585                 log_info("Packet FCS 0x%04x verified", fcs_packet);
4586             } else {
4587                 log_error("FCS mismatch! Packet 0x%04x, calculated 0x%04x", fcs_packet, fcs_calculated);
4588                 // ERTM State Machine in Bluetooth Spec does not handle 'I-Frame with invalid FCS'
4589                 return;
4590             }
4591         }
4592 
4593         // switch on packet type
4594         uint16_t control = little_endian_read_16(packet, COMPLETE_L2CAP_HEADER);
4595         uint8_t  req_seq = (control >> 8) & 0x3f;
4596         int final = (control >> 7) & 0x01;
4597         if (control & 1){
4598             // S-Frame
4599             int poll  = (control >> 4) & 0x01;
4600             l2cap_supervisory_function_t s = (l2cap_supervisory_function_t) ((control >> 2) & 0x03);
4601             log_info("Control: 0x%04x => Supervisory function %u, ReqSeq %02u", control, (int) s, req_seq);
4602             l2cap_ertm_tx_packet_state_t * tx_state;
4603             switch (s){
4604                 case L2CAP_SUPERVISORY_FUNCTION_RR_RECEIVER_READY:
4605                     log_info("L2CAP_SUPERVISORY_FUNCTION_RR_RECEIVER_READY");
4606                     l2cap_ertm_process_req_seq(l2cap_channel, req_seq);
4607                     if (poll && final){
4608                         // S-frames shall not be transmitted with both the F-bit and the P-bit set to 1 at the same time.
4609                         log_error("P=F=1 in S-Frame");
4610                         break;
4611                     }
4612                     if (poll){
4613                         // check if we did request selective retransmission before <==> we have stored SDU segments
4614                         int i;
4615                         int num_stored_out_of_order_packets = 0;
4616                         for (i=0;i<l2cap_channel->num_rx_buffers;i++){
4617                             int index = l2cap_channel->rx_store_index + i;
4618                             if (index >= l2cap_channel->num_rx_buffers){
4619                                 index -= l2cap_channel->num_rx_buffers;
4620                             }
4621                             l2cap_ertm_rx_packet_state_t * rx_state = &l2cap_channel->rx_packets_state[index];
4622                             if (!rx_state->valid) continue;
4623                             num_stored_out_of_order_packets++;
4624                         }
4625                         if (num_stored_out_of_order_packets){
4626                             l2cap_channel->send_supervisor_frame_selective_reject = 1;
4627                         } else {
4628                             l2cap_channel->send_supervisor_frame_receiver_ready   = 1;
4629                         }
4630                         l2cap_channel->set_final_bit_after_packet_with_poll_bit_set = 1;
4631                     }
4632                     if (final){
4633                         // Stop-MonitorTimer
4634                         l2cap_ertm_stop_monitor_timer(l2cap_channel);
4635                         // If UnackedFrames > 0 then Start-RetransTimer
4636                         if (l2cap_channel->unacked_frames){
4637                             l2cap_ertm_start_retransmission_timer(l2cap_channel);
4638                         }
4639                         // final bit set <- response to RR with poll bit set. All not acknowledged packets need to be retransmitted
4640                         l2cap_ertm_retransmit_unacknowleded_frames(l2cap_channel);
4641                     }
4642                     break;
4643                 case L2CAP_SUPERVISORY_FUNCTION_REJ_REJECT:
4644                     log_info("L2CAP_SUPERVISORY_FUNCTION_REJ_REJECT");
4645                     l2cap_ertm_process_req_seq(l2cap_channel, req_seq);
4646                     // restart transmittion from last unacknowledted packet (earlier packets already freed in l2cap_ertm_process_req_seq)
4647                     l2cap_ertm_retransmit_unacknowleded_frames(l2cap_channel);
4648                     break;
4649                 case L2CAP_SUPERVISORY_FUNCTION_RNR_RECEIVER_NOT_READY:
4650                     log_error("L2CAP_SUPERVISORY_FUNCTION_RNR_RECEIVER_NOT_READY");
4651                     break;
4652                 case L2CAP_SUPERVISORY_FUNCTION_SREJ_SELECTIVE_REJECT:
4653                     log_info("L2CAP_SUPERVISORY_FUNCTION_SREJ_SELECTIVE_REJECT");
4654                     if (poll){
4655                         l2cap_ertm_process_req_seq(l2cap_channel, req_seq);
4656                     }
4657                     // find requested i-frame
4658                     tx_state = l2cap_ertm_get_tx_state(l2cap_channel, req_seq);
4659                     if (tx_state){
4660                         log_info("Retransmission for tx_seq %u requested", req_seq);
4661                         l2cap_channel->set_final_bit_after_packet_with_poll_bit_set = poll;
4662                         tx_state->retransmission_requested = 1;
4663                         l2cap_channel->srej_active = 1;
4664                     }
4665                     break;
4666                 default:
4667                     break;
4668             }
4669         } else {
4670             // I-Frame
4671             // get control
4672             l2cap_segmentation_and_reassembly_t sar = (l2cap_segmentation_and_reassembly_t) (control >> 14);
4673             uint8_t tx_seq = (control >> 1) & 0x3f;
4674             log_info("Control: 0x%04x => SAR %u, ReqSeq %02u, R?, TxSeq %02u", control, (int) sar, req_seq, tx_seq);
4675             log_info("SAR: pos %u", l2cap_channel->reassembly_pos);
4676             log_info("State: expected_tx_seq %02u, req_seq %02u", l2cap_channel->expected_tx_seq, l2cap_channel->req_seq);
4677             l2cap_ertm_process_req_seq(l2cap_channel, req_seq);
4678             if (final){
4679                 // final bit set <- response to RR with poll bit set. All not acknowledged packets need to be retransmitted
4680                 l2cap_ertm_retransmit_unacknowleded_frames(l2cap_channel);
4681             }
4682 
4683             // get SDU
4684             const uint8_t * payload_data = &packet[COMPLETE_L2CAP_HEADER+2];
4685             uint16_t        payload_len  = size-(COMPLETE_L2CAP_HEADER+2+fcs_size);
4686 
4687             // assert SDU size is smaller or equal to our buffers
4688             uint16_t max_payload_size = 0;
4689             switch (sar){
4690                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_UNSEGMENTED_L2CAP_SDU:
4691                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_START_OF_L2CAP_SDU:
4692                     // SDU Length + MPS
4693                     max_payload_size = l2cap_channel->local_mps + 2;
4694                     break;
4695                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_CONTINUATION_OF_L2CAP_SDU:
4696                 case L2CAP_SEGMENTATION_AND_REASSEMBLY_END_OF_L2CAP_SDU:
4697                     max_payload_size = l2cap_channel->local_mps;
4698                     break;
4699                 default:
4700                     btstack_assert(false);
4701                     break;
4702             }
4703             if (payload_len > max_payload_size){
4704                 log_info("payload len %u > max payload %u -> drop packet", payload_len, max_payload_size);
4705                 return;
4706             }
4707 
4708             // check ordering
4709             if (l2cap_channel->expected_tx_seq == tx_seq){
4710                 log_info("Received expected frame with TxSeq == ExpectedTxSeq == %02u", tx_seq);
4711                 l2cap_channel->expected_tx_seq = l2cap_next_ertm_seq_nr(l2cap_channel->expected_tx_seq);
4712                 l2cap_channel->req_seq         = l2cap_channel->expected_tx_seq;
4713 
4714                 // process SDU
4715                 l2cap_ertm_handle_in_sequence_sdu(l2cap_channel, sar, payload_data, payload_len);
4716 
4717                 // process stored segments
4718                 while (true){
4719                     int index = l2cap_channel->rx_store_index;
4720                     l2cap_ertm_rx_packet_state_t * rx_state = &l2cap_channel->rx_packets_state[index];
4721                     if (!rx_state->valid) break;
4722 
4723                     log_info("Processing stored frame with TxSeq == ExpectedTxSeq == %02u", l2cap_channel->expected_tx_seq);
4724                     l2cap_channel->expected_tx_seq = l2cap_next_ertm_seq_nr(l2cap_channel->expected_tx_seq);
4725                     l2cap_channel->req_seq         = l2cap_channel->expected_tx_seq;
4726 
4727                     rx_state->valid = 0;
4728                     l2cap_ertm_handle_in_sequence_sdu(l2cap_channel, rx_state->sar, &l2cap_channel->rx_packets_data[index], rx_state->len);
4729 
4730                     // update rx store index
4731                     index++;
4732                     if (index >= l2cap_channel->num_rx_buffers){
4733                         index = 0;
4734                     }
4735                     l2cap_channel->rx_store_index = index;
4736                 }
4737 
4738                 //
4739                 l2cap_channel->send_supervisor_frame_receiver_ready = 1;
4740 
4741             } else {
4742                 int delta = (tx_seq - l2cap_channel->expected_tx_seq) & 0x3f;
4743                 if (delta < 2){
4744                     // store segment
4745                     l2cap_ertm_handle_out_of_sequence_sdu(l2cap_channel, sar, delta, payload_data, payload_len);
4746 
4747                     log_info("Received unexpected frame TxSeq %u but expected %u -> send S-SREJ", tx_seq, l2cap_channel->expected_tx_seq);
4748                     l2cap_channel->send_supervisor_frame_selective_reject = 1;
4749                 } else {
4750                     log_info("Received unexpected frame TxSeq %u but expected %u -> send S-REJ", tx_seq, l2cap_channel->expected_tx_seq);
4751                     l2cap_channel->send_supervisor_frame_reject = 1;
4752                 }
4753             }
4754         }
4755         return;
4756     }
4757 #endif
4758 
4759     // check size
4760     uint16_t payload_size = size - COMPLETE_L2CAP_HEADER;
4761     if (l2cap_channel->local_mtu < payload_size) return;
4762 
4763     l2cap_dispatch_to_channel(l2cap_channel, L2CAP_DATA_PACKET, &packet[COMPLETE_L2CAP_HEADER], payload_size);
4764 }
4765 #endif
4766 
4767 static void l2cap_acl_classic_handler(hci_con_handle_t handle, uint8_t *packet, uint16_t size){
4768 #ifdef ENABLE_CLASSIC
4769     l2cap_channel_t * l2cap_channel;
4770     l2cap_fixed_channel_t * l2cap_fixed_channel;
4771 
4772     uint16_t channel_id = READ_L2CAP_CHANNEL_ID(packet);
4773     uint8_t  broadcast_flag = READ_ACL_FLAGS(packet) >> 2;
4774     switch (channel_id) {
4775 
4776         case L2CAP_CID_SIGNALING: {
4777             if (broadcast_flag != 0) break;
4778             uint32_t command_offset = 8;
4779             while ((command_offset + L2CAP_SIGNALING_COMMAND_DATA_OFFSET) < size) {
4780                 // assert signaling command is fully inside packet
4781                 uint16_t data_len = little_endian_read_16(packet, command_offset + L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET);
4782                 uint32_t next_command_offset = command_offset + L2CAP_SIGNALING_COMMAND_DATA_OFFSET + data_len;
4783                 if (next_command_offset > size){
4784                     log_error("l2cap signaling command len invalid -> drop");
4785                     break;
4786                 }
4787                 // handle signaling command
4788                 l2cap_signaling_handler_dispatch(handle, &packet[command_offset]);
4789                 // go to next command
4790                 command_offset = next_command_offset;
4791             }
4792             break;
4793         }
4794 
4795         case L2CAP_CID_CONNECTIONLESS_CHANNEL:
4796             if (broadcast_flag == 0) break;
4797             l2cap_fixed_channel = l2cap_fixed_channel_for_channel_id(L2CAP_CID_CONNECTIONLESS_CHANNEL);
4798             if (!l2cap_fixed_channel) break;
4799             if (!l2cap_fixed_channel->packet_handler) break;
4800             (*l2cap_fixed_channel->packet_handler)(UCD_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
4801             break;
4802 
4803 #ifdef ENABLE_BLE
4804         case L2CAP_CID_BR_EDR_SECURITY_MANAGER:
4805             l2cap_fixed_channel = l2cap_fixed_channel_for_channel_id(L2CAP_CID_BR_EDR_SECURITY_MANAGER);
4806             if ((l2cap_fixed_channel == NULL) || (l2cap_fixed_channel->packet_handler == NULL)){
4807                 // Pairing Failed
4808                 l2cap_register_signaling_response(handle, (uint8_t) SM_PAIRING_FAILED, 0, L2CAP_CID_BR_EDR_SECURITY_MANAGER, SM_REASON_PAIRING_NOT_SUPPORTED);
4809             } else {
4810                 (*l2cap_fixed_channel->packet_handler)(SM_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
4811             }
4812             break;
4813 #endif
4814 
4815         default:
4816             if (broadcast_flag != 0) break;
4817             // Find channel for this channel_id and connection handle
4818             l2cap_channel = l2cap_get_channel_for_local_cid_and_handle(channel_id, handle);
4819             if (l2cap_channel != NULL){
4820                 l2cap_acl_classic_handler_for_channel(l2cap_channel, packet, size);
4821             }
4822             break;
4823     }
4824 #else
4825     UNUSED(handle); // ok: no code
4826     UNUSED(packet); // ok: no code
4827     UNUSED(size);   // ok: no code
4828 #endif
4829 }
4830 
4831 static void l2cap_acl_le_handler(hci_con_handle_t handle, uint8_t *packet, uint16_t size){
4832 #ifdef ENABLE_BLE
4833 
4834     l2cap_fixed_channel_t * l2cap_fixed_channel;
4835 
4836 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4837     l2cap_channel_t * l2cap_channel;
4838 #endif
4839     uint16_t channel_id = READ_L2CAP_CHANNEL_ID(packet);
4840     switch (channel_id) {
4841 
4842         case L2CAP_CID_SIGNALING_LE: {
4843             uint8_t sig_id = packet[COMPLETE_L2CAP_HEADER + 1];
4844             uint16_t len = little_endian_read_16(packet, COMPLETE_L2CAP_HEADER + 2);
4845             if ((COMPLETE_L2CAP_HEADER + 4u + len) > size) break;
4846             int      valid  = l2cap_le_signaling_handler_dispatch(handle, &packet[COMPLETE_L2CAP_HEADER], sig_id);
4847             if (!valid){
4848                 l2cap_register_signaling_response(handle, COMMAND_REJECT_LE, sig_id, 0, L2CAP_REJ_CMD_UNKNOWN);
4849             }
4850             break;
4851         }
4852 
4853         case L2CAP_CID_ATTRIBUTE_PROTOCOL:
4854             l2cap_fixed_channel = l2cap_fixed_channel_for_channel_id(L2CAP_CID_ATTRIBUTE_PROTOCOL);
4855             if (!l2cap_fixed_channel) break;
4856             if (!l2cap_fixed_channel->packet_handler) break;
4857             (*l2cap_fixed_channel->packet_handler)(ATT_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
4858             break;
4859 
4860         case L2CAP_CID_SECURITY_MANAGER_PROTOCOL:
4861             l2cap_fixed_channel = l2cap_fixed_channel_for_channel_id(L2CAP_CID_SECURITY_MANAGER_PROTOCOL);
4862             if ((l2cap_fixed_channel == NULL) || (l2cap_fixed_channel->packet_handler == NULL)){
4863                 // Pairing Failed
4864                 l2cap_register_signaling_response(handle, (uint8_t) SM_PAIRING_FAILED, 0, L2CAP_CID_SECURITY_MANAGER_PROTOCOL, SM_REASON_PAIRING_NOT_SUPPORTED);
4865             } else {
4866                 (*l2cap_fixed_channel->packet_handler)(SM_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
4867             }
4868             break;
4869 
4870         default:
4871 
4872 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
4873             l2cap_channel = l2cap_get_channel_for_local_cid_and_handle(channel_id, handle);
4874             if (l2cap_channel != NULL) {
4875                 l2cap_credit_based_handle_pdu(l2cap_channel, packet, size);
4876             }
4877 #endif
4878             break;
4879     }
4880 #else
4881     UNUSED(handle); // ok: no code
4882     UNUSED(packet); // ok: no code
4883     UNUSED(size);   // ok: no code
4884 #endif
4885 }
4886 
4887 static void l2cap_acl_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
4888     UNUSED(packet_type);    // ok: registered with hci_register_acl_packet_handler
4889     UNUSED(channel);        // ok: there is no channel
4890 
4891     // Assert full L2CAP header present
4892     if (size < COMPLETE_L2CAP_HEADER) return;
4893 
4894     // Dispatch to Classic or LE handler (SCO packets are not dispatched to L2CAP)
4895     hci_con_handle_t handle = READ_ACL_CONNECTION_HANDLE(packet);
4896     hci_connection_t *conn = hci_connection_for_handle(handle);
4897     if (!conn) return;
4898     if (conn->address_type == BD_ADDR_TYPE_ACL){
4899         l2cap_acl_classic_handler(handle, packet, size);
4900     } else {
4901         l2cap_acl_le_handler(handle, packet, size);
4902     }
4903 
4904     l2cap_run();
4905 }
4906 
4907 // Bluetooth 4.0 - allows to register handler for Attribute Protocol and Security Manager Protocol
4908 void l2cap_register_fixed_channel(btstack_packet_handler_t packet_handler, uint16_t channel_id) {
4909     l2cap_fixed_channel_t * channel = l2cap_fixed_channel_for_channel_id(channel_id);
4910     if (!channel) return;
4911     channel->packet_handler = packet_handler;
4912 }
4913 
4914 #ifdef L2CAP_USES_CHANNELS
4915 // finalize closed channel - l2cap_handle_disconnect_request & DISCONNECTION_RESPONSE
4916 void l2cap_finalize_channel_close(l2cap_channel_t * channel){
4917     channel->state = L2CAP_STATE_CLOSED;
4918     l2cap_handle_channel_closed(channel);
4919     // discard channel
4920     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
4921     l2cap_free_channel_entry(channel);
4922 }
4923 #endif
4924 
4925 #ifdef ENABLE_CLASSIC
4926 static inline l2cap_service_t * l2cap_get_service(uint16_t psm){
4927     return l2cap_get_service_internal(&l2cap_services, psm);
4928 }
4929 
4930 static void l2cap_update_minimal_security_level(void){
4931     // update minimal service security level
4932     gap_security_level_t minimal_level = LEVEL_1;
4933     btstack_linked_list_iterator_t it;
4934     btstack_linked_list_iterator_init(&it, &l2cap_services);
4935     while (btstack_linked_list_iterator_has_next(&it)){
4936         l2cap_service_t * service = (l2cap_service_t *) btstack_linked_list_iterator_next(&it);
4937         if (service->required_security_level > minimal_level){
4938             minimal_level = service->required_security_level;
4939         };
4940     }
4941     gap_set_minimal_service_security_level(minimal_level);
4942 }
4943 
4944 uint8_t l2cap_register_service(btstack_packet_handler_t service_packet_handler, uint16_t psm, uint16_t mtu, gap_security_level_t security_level){
4945 
4946     log_info("L2CAP_REGISTER_SERVICE psm 0x%x mtu %u", psm, mtu);
4947 
4948     // check for alread registered psm
4949     l2cap_service_t *service = l2cap_get_service(psm);
4950     if (service) {
4951         log_error("register: PSM %u already registered", psm);
4952         return L2CAP_SERVICE_ALREADY_REGISTERED;
4953     }
4954 
4955     // alloc structure
4956     service = btstack_memory_l2cap_service_get();
4957     if (!service) {
4958         log_error("register: no memory for l2cap_service_t");
4959         return BTSTACK_MEMORY_ALLOC_FAILED;
4960     }
4961 
4962     // fill in
4963     service->psm = psm;
4964     service->mtu = mtu;
4965     service->packet_handler = service_packet_handler;
4966     service->required_security_level = security_level;
4967 
4968     // add to services list
4969     btstack_linked_list_add(&l2cap_services, (btstack_linked_item_t *) service);
4970 
4971     l2cap_update_minimal_security_level();
4972 
4973 #ifndef ENABLE_EXPLICIT_CONNECTABLE_MODE_CONTROL
4974     // enable page scan
4975     gap_connectable_control(1);
4976 #endif
4977 
4978 
4979     return ERROR_CODE_SUCCESS;
4980 }
4981 
4982 uint8_t l2cap_unregister_service(uint16_t psm){
4983 
4984     log_info("unregister psm 0x%x", psm);
4985 
4986     l2cap_service_t *service = l2cap_get_service(psm);
4987     if (!service) return L2CAP_SERVICE_DOES_NOT_EXIST;
4988     btstack_linked_list_remove(&l2cap_services, (btstack_linked_item_t *) service);
4989     btstack_memory_l2cap_service_free(service);
4990 
4991     l2cap_update_minimal_security_level();
4992 
4993 #ifndef ENABLE_EXPLICIT_CONNECTABLE_MODE_CONTROL
4994     // disable page scan when no services registered
4995     if (btstack_linked_list_empty(&l2cap_services)) {
4996         gap_connectable_control(0);
4997     }
4998 #endif
4999 
5000     return ERROR_CODE_SUCCESS;
5001 }
5002 #endif
5003 
5004 
5005 #ifdef L2CAP_USES_CREDIT_BASED_CHANNELS
5006 
5007 static void l2cap_credit_based_send_pdu(l2cap_channel_t *channel) {
5008     btstack_assert(channel != NULL);
5009     btstack_assert(channel->send_sdu_buffer != NULL);
5010     btstack_assert(channel->credits_outgoing > 0);
5011 
5012     // send part of SDU
5013     hci_reserve_packet_buffer();
5014     uint8_t *acl_buffer = hci_get_outgoing_packet_buffer();
5015     uint8_t *l2cap_payload = acl_buffer + 8;
5016     uint16_t pos = 0;
5017     if (!channel->send_sdu_pos) {
5018         // store SDU len
5019         channel->send_sdu_pos += 2u;
5020         little_endian_store_16(l2cap_payload, pos, channel->send_sdu_len);
5021         pos += 2u;
5022     }
5023     uint16_t payload_size = btstack_min(channel->send_sdu_len + 2u - channel->send_sdu_pos, channel->remote_mps - pos);
5024     log_info("len %u, pos %u => payload %u, credits %u", channel->send_sdu_len, channel->send_sdu_pos, payload_size,
5025              channel->credits_outgoing);
5026     (void) memcpy(&l2cap_payload[pos],
5027                   &channel->send_sdu_buffer[channel->send_sdu_pos - 2u],
5028                   payload_size); // -2 for virtual SDU len
5029     pos += payload_size;
5030     channel->send_sdu_pos += payload_size;
5031     l2cap_setup_header(acl_buffer, channel->con_handle, 0, channel->remote_cid, pos);
5032 
5033     channel->credits_outgoing--;
5034 
5035     // update state (mark SDU as done) before calling hci_send_acl_packet_buffer (trigger l2cap_le_send_pdu again)
5036     bool done = channel->send_sdu_pos >= (channel->send_sdu_len + 2u);
5037     if (done) {
5038         channel->send_sdu_buffer = NULL;
5039     }
5040 
5041     hci_send_acl_packet_buffer(8u + pos);
5042 
5043     if (done) {
5044         // send done event
5045         l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_PACKET_SENT);
5046         // inform about can send now
5047         l2cap_credit_based_notify_channel_can_send(channel);
5048     }
5049 }
5050 
5051 static uint8_t l2cap_credit_based_send_data(l2cap_channel_t * channel, const uint8_t * data, uint16_t size){
5052 
5053     if (size > channel->remote_mtu){
5054         log_error("l2cap send, cid 0x%02x, data length exceeds remote MTU.", channel->local_cid);
5055         return L2CAP_DATA_LEN_EXCEEDS_REMOTE_MTU;
5056     }
5057 
5058     if (channel->send_sdu_buffer){
5059         log_info("l2cap send, cid 0x%02x, cannot send", channel->local_cid);
5060         return BTSTACK_ACL_BUFFERS_FULL;
5061     }
5062 
5063     channel->send_sdu_buffer = data;
5064     channel->send_sdu_len    = size;
5065     channel->send_sdu_pos    = 0;
5066 
5067     l2cap_notify_channel_can_send();
5068     return ERROR_CODE_SUCCESS;
5069 }
5070 
5071 static uint8_t l2cap_credit_based_provide_credits(uint16_t local_cid, uint16_t credits){
5072     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5073     if (!channel) {
5074         log_error("le credits no channel for cid 0x%02x", local_cid);
5075         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5076     }
5077 
5078     // check state
5079     if (channel->state != L2CAP_STATE_OPEN){
5080         log_error("le credits but channel 0x%02x not open yet", local_cid);
5081     }
5082 
5083     // ignore if set to automatic credits
5084     if (channel->automatic_credits) return ERROR_CODE_SUCCESS;
5085 
5086     // assert incoming credits + credits <= 0xffff
5087     uint32_t total_credits = channel->credits_incoming;
5088     total_credits += channel->new_credits_incoming;
5089     total_credits += credits;
5090     if (total_credits > 0xffffu){
5091         log_error("le credits overrun: current %u, scheduled %u, additional %u", channel->credits_incoming,
5092                   channel->new_credits_incoming, credits);
5093     }
5094 
5095     // set credits_granted
5096     channel->new_credits_incoming += credits;
5097 
5098     // go
5099     l2cap_run();
5100     return ERROR_CODE_SUCCESS;
5101 }
5102 
5103 static void l2cap_credit_based_send_credits(l2cap_channel_t *channel) {
5104     log_info("l2cap: sending %u credits", channel->new_credits_incoming);
5105     channel->local_sig_id = l2cap_next_sig_id();
5106     uint16_t new_credits = channel->new_credits_incoming;
5107     channel->new_credits_incoming = 0;
5108     channel->credits_incoming += new_credits;
5109     uint16_t signaling_cid = channel->address_type == BD_ADDR_TYPE_ACL ? L2CAP_CID_SIGNALING : L2CAP_CID_SIGNALING_LE;
5110     l2cap_send_general_signaling_packet(channel->con_handle, signaling_cid, L2CAP_FLOW_CONTROL_CREDIT_INDICATION, channel->local_sig_id, channel->local_cid, new_credits);
5111 }
5112 
5113 // @return valid
5114 static bool l2cap_credit_based_handle_credit_indication(hci_con_handle_t handle, const uint8_t * command, uint16_t len){
5115     // check size
5116     if (len < 4u) return false;
5117 
5118     // find channel
5119     uint16_t remote_cid = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 0);
5120     l2cap_channel_t * channel = l2cap_get_channel_for_remote_handle_and_cid(handle, remote_cid);
5121     if (!channel) {
5122         log_error("credit: no channel for handle 0x%04x/cid 0x%02x", handle, remote_cid);
5123         return true;
5124     }
5125     uint16_t new_credits = little_endian_read_16(command, L2CAP_SIGNALING_COMMAND_DATA_OFFSET + 2);
5126     uint16_t credits_before = channel->credits_outgoing;
5127     channel->credits_outgoing += new_credits;
5128     // check for credit overrun
5129     if (credits_before > channel->credits_outgoing) {
5130         log_error("credit: new credits caused overrrun for cid 0x%02x, disconnecting", channel->local_cid);
5131         channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5132         return true;
5133     }
5134     log_info("credit: %u credits for 0x%02x, now %u", new_credits, channel->local_cid, channel->credits_outgoing);
5135     l2cap_call_notify_channel_in_run = true;
5136     return true;
5137 }
5138 
5139 static void l2cap_credit_based_handle_pdu(l2cap_channel_t * l2cap_channel, const uint8_t * packet, uint16_t size){
5140     // ignore empty packets
5141     if (size == COMPLETE_L2CAP_HEADER) return;
5142 
5143     // credit counting
5144     if (l2cap_channel->credits_incoming == 0u){
5145         log_info("(e)CBM: packet received but no incoming credits");
5146         l2cap_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5147         return;
5148     }
5149     l2cap_channel->credits_incoming--;
5150 
5151     // automatic credits
5152     if ((l2cap_channel->credits_incoming < L2CAP_CREDIT_BASED_FLOW_CONTROL_MODE_AUTOMATIC_CREDITS_WATERMARK) && l2cap_channel->automatic_credits){
5153         l2cap_channel->new_credits_incoming = L2CAP_CREDIT_BASED_FLOW_CONTROL_MODE_AUTOMATIC_CREDITS_INCREMENT;
5154     }
5155 
5156     // first fragment
5157     uint16_t pos = 0;
5158     if (!l2cap_channel->receive_sdu_len){
5159         if (size < (COMPLETE_L2CAP_HEADER + 2)) return;
5160         uint16_t sdu_len = little_endian_read_16(packet, COMPLETE_L2CAP_HEADER);
5161         if (sdu_len > l2cap_channel->local_mtu) {
5162             log_info("(e)CBM: packet received larger than MTU");
5163             l2cap_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5164             return;
5165         }
5166         l2cap_channel->receive_sdu_len = sdu_len;
5167         l2cap_channel->receive_sdu_pos = 0;
5168         pos  += 2u;
5169         size -= 2u;
5170     }
5171 
5172     uint16_t fragment_size   = size-COMPLETE_L2CAP_HEADER;
5173 
5174     // check fragment_size
5175     if (fragment_size > l2cap_channel->local_mps) {
5176         log_info("(e)CBM: fragment larger than local MPS");
5177         l2cap_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5178         return;
5179     }
5180 
5181     // check sdu overrun
5182     if ((l2cap_channel->receive_sdu_pos + fragment_size) > l2cap_channel->receive_sdu_len){
5183         log_info("(e)CBM: fragments larger than SDU");
5184         l2cap_channel->state = L2CAP_STATE_WILL_SEND_DISCONNECT_REQUEST;
5185         return;
5186     }
5187 
5188     (void)memcpy(&l2cap_channel->receive_sdu_buffer[l2cap_channel->receive_sdu_pos],
5189                  &packet[COMPLETE_L2CAP_HEADER + pos],
5190                  fragment_size);
5191     l2cap_channel->receive_sdu_pos += fragment_size;
5192 
5193     // done?
5194     log_debug("le packet pos %u, len %u", l2cap_channel->receive_sdu_pos, l2cap_channel->receive_sdu_len);
5195     if (l2cap_channel->receive_sdu_pos >= l2cap_channel->receive_sdu_len){
5196         l2cap_dispatch_to_channel(l2cap_channel, L2CAP_DATA_PACKET, l2cap_channel->receive_sdu_buffer, l2cap_channel->receive_sdu_len);
5197         l2cap_channel->receive_sdu_len = 0;
5198     }
5199 }
5200 
5201 static void l2cap_credit_based_notify_channel_can_send(l2cap_channel_t *channel){
5202     if (!channel->waiting_for_can_send_now) return;
5203     if (channel->send_sdu_buffer) return;
5204     channel->waiting_for_can_send_now = 0;
5205     log_debug("le can send now, local_cid 0x%x", channel->local_cid);
5206     l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_CAN_SEND_NOW);
5207 }
5208 #endif
5209 
5210 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
5211 // 1BH2222
5212 static void l2cap_cbm_emit_incoming_connection(l2cap_channel_t *channel) {
5213     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",
5214              channel->address_type, bd_addr_to_str(channel->address), channel->con_handle,  channel->psm, channel->local_cid, channel->remote_cid, channel->remote_mtu);
5215     uint8_t event[19];
5216     event[0] = L2CAP_EVENT_CBM_INCOMING_CONNECTION;
5217     event[1] = sizeof(event) - 2u;
5218     event[2] = channel->address_type;
5219     reverse_bd_addr(channel->address, &event[3]);
5220     little_endian_store_16(event,  9, channel->con_handle);
5221     little_endian_store_16(event, 11, channel->psm);
5222     little_endian_store_16(event, 13, channel->local_cid);
5223     little_endian_store_16(event, 15, channel->remote_cid);
5224     little_endian_store_16(event, 17, channel->remote_mtu);
5225     hci_dump_packet( HCI_EVENT_PACKET, 1, event, sizeof(event));
5226     l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
5227 }
5228 // 11BH22222
5229 static void l2cap_cbm_emit_channel_opened(l2cap_channel_t *channel, uint8_t status) {
5230     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",
5231              status, channel->address_type, bd_addr_to_str(channel->address), channel->con_handle, channel->psm,
5232              channel->local_cid, channel->remote_cid, channel->local_mtu, channel->remote_mtu);
5233     uint8_t event[23];
5234     event[0] = L2CAP_EVENT_CBM_CHANNEL_OPENED;
5235     event[1] = sizeof(event) - 2u;
5236     event[2] = status;
5237     event[3] = channel->address_type;
5238     reverse_bd_addr(channel->address, &event[4]);
5239     little_endian_store_16(event, 10, channel->con_handle);
5240     event[12] = (channel->state_var & L2CAP_CHANNEL_STATE_VAR_INCOMING) ? 1 : 0;
5241     little_endian_store_16(event, 13, channel->psm);
5242     little_endian_store_16(event, 15, channel->local_cid);
5243     little_endian_store_16(event, 17, channel->remote_cid);
5244     little_endian_store_16(event, 19, channel->local_mtu);
5245     little_endian_store_16(event, 21, channel->remote_mtu);
5246     hci_dump_packet( HCI_EVENT_PACKET, 1, event, sizeof(event));
5247     l2cap_dispatch_to_channel(channel, HCI_EVENT_PACKET, event, sizeof(event));
5248 }
5249 
5250 // finalize closed channel - l2cap_handle_disconnect_request & DISCONNECTION_RESPONSE
5251 void l2cap_cbm_finialize_channel_close(l2cap_channel_t * channel){
5252     channel->state = L2CAP_STATE_CLOSED;
5253     l2cap_emit_simple_event_with_cid(channel, L2CAP_EVENT_CHANNEL_CLOSED);
5254     // discard channel
5255     btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
5256     l2cap_free_channel_entry(channel);
5257 }
5258 
5259 static inline l2cap_service_t * l2cap_cbm_get_service(uint16_t le_psm){
5260     return l2cap_get_service_internal(&l2cap_le_services, le_psm);
5261 }
5262 
5263 uint8_t l2cap_cbm_register_service(btstack_packet_handler_t packet_handler, uint16_t psm, gap_security_level_t security_level){
5264 
5265     log_info("l2cap_cbm_register_service psm 0x%x", psm);
5266 
5267     // check for alread registered psm
5268     l2cap_service_t *service = l2cap_cbm_get_service(psm);
5269     if (service) {
5270         return L2CAP_SERVICE_ALREADY_REGISTERED;
5271     }
5272 
5273     // alloc structure
5274     service = btstack_memory_l2cap_service_get();
5275     if (!service) {
5276         log_error("register: no memory for l2cap_service_t");
5277         return BTSTACK_MEMORY_ALLOC_FAILED;
5278     }
5279 
5280     // fill in
5281     service->psm = psm;
5282     service->mtu = 0;
5283     service->packet_handler = packet_handler;
5284     service->required_security_level = security_level;
5285     service->requires_authorization = false;
5286 
5287     // add to services list
5288     btstack_linked_list_add(&l2cap_le_services, (btstack_linked_item_t *) service);
5289 
5290     // done
5291     return ERROR_CODE_SUCCESS;
5292 }
5293 
5294 uint8_t l2cap_cbm_unregister_service(uint16_t psm) {
5295     log_info("l2cap_cbm_unregister_service psm 0x%x", psm);
5296     l2cap_service_t *service = l2cap_cbm_get_service(psm);
5297     if (!service) return L2CAP_SERVICE_DOES_NOT_EXIST;
5298 
5299     btstack_linked_list_remove(&l2cap_le_services, (btstack_linked_item_t *) service);
5300     btstack_memory_l2cap_service_free(service);
5301     return ERROR_CODE_SUCCESS;
5302 }
5303 
5304 uint8_t l2cap_cbm_accept_connection(uint16_t local_cid, uint8_t * receive_sdu_buffer, uint16_t mtu, uint16_t initial_credits){
5305     // get channel
5306     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5307     if (!channel) return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5308 
5309     // validate state
5310     if (channel->state != L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT){
5311         return ERROR_CODE_COMMAND_DISALLOWED;
5312     }
5313 
5314     // set state accept connection
5315     channel->state = L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_ACCEPT;
5316     channel->receive_sdu_buffer = receive_sdu_buffer;
5317     channel->local_mtu = mtu;
5318     channel->new_credits_incoming = initial_credits;
5319     channel->automatic_credits  = initial_credits == L2CAP_LE_AUTOMATIC_CREDITS;
5320 
5321     // go
5322     l2cap_run();
5323     return ERROR_CODE_SUCCESS;
5324 }
5325 
5326 uint8_t l2cap_cbm_decline_connection(uint16_t local_cid, uint16_t result) {
5327     // get channel
5328     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5329     if (!channel) return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5330 
5331     // validate state
5332     if (channel->state != L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT){
5333         return ERROR_CODE_COMMAND_DISALLOWED;
5334     }
5335 
5336     // set state decline connection
5337     channel->state  = L2CAP_STATE_WILL_SEND_LE_CONNECTION_RESPONSE_DECLINE;
5338     channel->reason = result;
5339     l2cap_run();
5340     return ERROR_CODE_SUCCESS;
5341 }
5342 
5343 static gap_security_level_t l2cap_cbm_security_level_for_connection(hci_con_handle_t con_handle){
5344     uint8_t encryption_key_size = gap_encryption_key_size(con_handle);
5345     if (encryption_key_size == 0) return LEVEL_0;
5346 
5347     bool authenticated = gap_authenticated(con_handle);
5348     if (!authenticated) return LEVEL_2;
5349 
5350     return encryption_key_size == 16 ? LEVEL_4 : LEVEL_3;
5351 }
5352 
5353 // used to handle pairing complete after triggering to increase
5354 static void l2cap_cbm_sm_packet_handler(uint8_t packet_type, uint16_t channel_nr, uint8_t *packet, uint16_t size) {
5355     UNUSED(channel_nr);
5356     UNUSED(size);
5357     UNUSED(packet_type);
5358     btstack_assert(packet_type == HCI_EVENT_PACKET);
5359     if (hci_event_packet_get_type(packet) != SM_EVENT_PAIRING_COMPLETE) return;
5360     hci_con_handle_t con_handle = sm_event_pairing_complete_get_handle(packet);
5361     btstack_linked_list_iterator_t it;
5362     btstack_linked_list_iterator_init(&it, &l2cap_channels);
5363     while (btstack_linked_list_iterator_has_next(&it)) {
5364         l2cap_channel_t *channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
5365         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
5366         if (channel->con_handle != con_handle) continue;
5367         if (channel->state != L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE) continue;
5368 
5369         // found channel, check security level
5370         if (l2cap_cbm_security_level_for_connection(con_handle) < channel->required_security_level){
5371             // pairing failed or wasn't good enough, inform user
5372             l2cap_cbm_emit_channel_opened(channel, ERROR_CODE_INSUFFICIENT_SECURITY);
5373             // discard channel
5374             btstack_linked_list_remove(&l2cap_channels, (btstack_linked_item_t *) channel);
5375             l2cap_free_channel_entry(channel);
5376         } else {
5377             // send conn request now
5378             channel->state = L2CAP_STATE_WILL_SEND_LE_CONNECTION_REQUEST;
5379             l2cap_run();
5380         }
5381     }
5382 }
5383 
5384 uint8_t l2cap_cbm_create_channel(btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle,
5385     uint16_t psm, uint8_t * receive_sdu_buffer, uint16_t mtu, uint16_t initial_credits, gap_security_level_t security_level,
5386     uint16_t * out_local_cid) {
5387 
5388     static btstack_packet_callback_registration_t sm_event_callback_registration;
5389     static bool sm_callback_registered = false;
5390 
5391     log_info("create, handle 0x%04x psm 0x%x mtu %u", con_handle, psm, mtu);
5392 
5393     hci_connection_t * connection = hci_connection_for_handle(con_handle);
5394     if (!connection) {
5395         log_error("no hci_connection for handle 0x%04x", con_handle);
5396         return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
5397     }
5398 
5399     l2cap_channel_t * channel = l2cap_create_channel_entry(packet_handler, L2CAP_CHANNEL_TYPE_CHANNEL_CBM, connection->address, connection->address_type, psm, mtu, security_level);
5400     if (!channel) {
5401         return BTSTACK_MEMORY_ALLOC_FAILED;
5402     }
5403     log_info("created %p", channel);
5404 
5405     // store local_cid
5406     if (out_local_cid){
5407        *out_local_cid = channel->local_cid;
5408     }
5409 
5410     // setup channel entry
5411     channel->con_handle = con_handle;
5412     channel->receive_sdu_buffer = receive_sdu_buffer;
5413     channel->new_credits_incoming = initial_credits;
5414     channel->automatic_credits    = initial_credits == L2CAP_LE_AUTOMATIC_CREDITS;
5415 
5416     // add to connections list
5417     btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
5418 
5419     // check security level
5420     if (l2cap_cbm_security_level_for_connection(con_handle) < channel->required_security_level){
5421         if (!sm_callback_registered){
5422             sm_callback_registered = true;
5423             // lazy registration for SM events
5424             sm_event_callback_registration.callback = &l2cap_cbm_sm_packet_handler;
5425             sm_add_event_handler(&sm_event_callback_registration);
5426         }
5427 
5428         // start pairing
5429         channel->state = L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE;
5430         sm_request_pairing(con_handle);
5431     } else {
5432         // send conn request right away
5433         channel->state = L2CAP_STATE_WILL_SEND_LE_CONNECTION_REQUEST;
5434         l2cap_run();
5435     }
5436 
5437     return ERROR_CODE_SUCCESS;
5438 }
5439 
5440 uint8_t l2cap_cbm_provide_credits(uint16_t local_cid, uint16_t credits){
5441     return l2cap_credit_based_provide_credits(local_cid, credits);
5442 }
5443 #endif
5444 
5445 #ifdef ENABLE_L2CAP_ENHANCED_CREDIT_BASED_FLOW_CONTROL_MODE
5446 
5447 uint8_t l2cap_ecbm_register_service(btstack_packet_handler_t packet_handler, uint16_t psm, uint16_t min_remote_mtu,
5448                                     gap_security_level_t security_level, bool authorization_required) {
5449 
5450     // check for already registered psm
5451     l2cap_service_t *service = l2cap_ecbm_get_service(psm);
5452     if (service) {
5453         return L2CAP_SERVICE_ALREADY_REGISTERED;
5454     }
5455 
5456     // alloc structure
5457     service = btstack_memory_l2cap_service_get();
5458     if (!service) {
5459         log_error("register: no memory for l2cap_service_t");
5460         return BTSTACK_MEMORY_ALLOC_FAILED;
5461     }
5462 
5463     // fill in
5464     service->psm = psm;
5465     service->mtu = min_remote_mtu;
5466     service->packet_handler = packet_handler;
5467     service->required_security_level = security_level;
5468     service->requires_authorization = authorization_required;
5469 
5470     // add to services list
5471     btstack_linked_list_add(&l2cap_enhanced_services, (btstack_linked_item_t *) service);
5472 
5473     // done
5474     return ERROR_CODE_SUCCESS;
5475 }
5476 
5477 uint8_t l2cap_ecbm_unregister_service(uint16_t psm) {
5478     l2cap_service_t *service = l2cap_ecbm_get_service(psm);
5479     if (!service) return L2CAP_SERVICE_DOES_NOT_EXIST;
5480 
5481     btstack_linked_list_remove(&l2cap_enhanced_services, (btstack_linked_item_t *) service);
5482     btstack_memory_l2cap_service_free(service);
5483     return ERROR_CODE_SUCCESS;
5484 }
5485 
5486 void l2cap_ecbm_mps_set_min(uint16_t mps_min){
5487     l2cap_enhanced_mps_min = mps_min;
5488 }
5489 
5490 void l2cap_ecbm_mps_set_max(uint16_t mps_max){
5491     l2cap_enhanced_mps_max = mps_max;
5492 }
5493 
5494 uint8_t l2cap_ecbm_create_channels(btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle,
5495                                        gap_security_level_t security_level,
5496                                        uint16_t psm, uint8_t num_channels, uint16_t initial_credits, uint16_t mtu,
5497                                        uint8_t ** receive_sdu_buffers, uint16_t * out_local_cid){
5498 
5499     log_info("create enhanced, handle 0x%04x psm 0x%x mtu %u", con_handle, psm, mtu);
5500 
5501     hci_connection_t * connection = hci_connection_for_handle(con_handle);
5502     if (!connection) {
5503         log_error("no hci_connection for handle 0x%04x", con_handle);
5504         return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
5505     }
5506 
5507     // setup all channels
5508     btstack_linked_list_t channels = NULL;
5509     uint8_t status = l2cap_ecbm_setup_channels(&channels, packet_handler, num_channels, connection, psm, mtu,
5510                                                security_level);
5511     uint16_t local_mps = btstack_min(l2cap_enhanced_mps_max, btstack_min(l2cap_max_le_mtu(), mtu));
5512 
5513     // add to connections list and set state + local_sig_id
5514     l2cap_channel_t * channel;
5515     uint8_t i = 0;
5516     uint8_t local_sig_id = l2cap_next_sig_id();
5517     while (true) {
5518         channel = (l2cap_channel_t *) btstack_linked_list_pop(&channels);
5519         if (channel == NULL) break;
5520         channel->state              = L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_REQUEST;
5521         channel->local_sig_id       = local_sig_id;
5522         channel->local_mps = local_mps;
5523         channel->cid_index = i;
5524         channel->num_cids = num_channels;
5525         channel->credits_incoming   = initial_credits;
5526         channel->automatic_credits  = initial_credits == L2CAP_LE_AUTOMATIC_CREDITS;
5527         channel->receive_sdu_buffer = receive_sdu_buffers[i];
5528         // store local_cid
5529         if (out_local_cid){
5530             out_local_cid[i] = channel->local_cid;
5531         }
5532         btstack_linked_list_add_tail(&l2cap_channels, (btstack_linked_item_t *) channel);
5533         i++;
5534     }
5535 
5536 #if 0
5537     // check security level
5538     if (l2cap_le_security_level_for_connection(con_handle) < channel->required_security_level){
5539         if (!sm_callback_registered){
5540             sm_callback_registered = true;
5541             // lazy registration for SM events
5542             sm_event_callback_registration.callback = &l2cap_sm_packet_handler;
5543             sm_add_event_handler(&sm_event_callback_registration);
5544         }
5545 
5546         // start pairing
5547         channel->state = L2CAP_STATE_WAIT_OUTGOING_SECURITY_LEVEL_UPDATE;
5548         sm_request_pairing(con_handle);
5549     } else {
5550         // send conn request right away
5551         channel->state = L2CAP_STATE_WILL_SEND_LE_CONNECTION_REQUEST;
5552         l2cap_run();
5553     }
5554 #endif
5555 
5556     l2cap_run();
5557 
5558     return status;
5559 }
5560 
5561 uint8_t l2cap_ecbm_accept_channels(uint16_t local_cid, uint8_t num_channels, uint16_t initial_credits,
5562                                             uint16_t receive_buffer_size, uint8_t ** receive_buffers, uint16_t * out_local_cids){
5563 
5564     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5565     if (!channel) {
5566 
5567         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5568     }
5569 
5570     uint16_t local_mps = btstack_min(l2cap_enhanced_mps_max, btstack_min(l2cap_max_le_mtu(), receive_buffer_size));
5571 
5572     //
5573     hci_con_handle_t  con_handle    = channel->con_handle;
5574     uint8_t           local_sig_id  = channel->local_sig_id;
5575     uint8_t           channel_index = 0;
5576     btstack_linked_list_iterator_t it;
5577     btstack_linked_list_iterator_init(&it, &l2cap_channels);
5578     while (btstack_linked_list_iterator_has_next(&it)) {
5579         channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
5580         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
5581         if (channel->con_handle != con_handle) continue;
5582         if (channel->local_sig_id != local_sig_id) continue;
5583         if (channel->state != L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT) continue;
5584 
5585         if (channel_index < num_channels){
5586             // assign buffer and cid
5587             out_local_cids[channel_index] = channel->local_cid;
5588             channel->receive_sdu_buffer = receive_buffers[channel_index];
5589             channel->local_mtu = receive_buffer_size;
5590             channel->local_mps = local_mps;
5591             channel->credits_incoming   = initial_credits;
5592             channel->automatic_credits  = initial_credits == L2CAP_LE_AUTOMATIC_CREDITS;
5593             channel_index++;
5594         } else {
5595             // clear local cid for response packet
5596             channel->local_cid = 0;
5597             channel->reason = L2CAP_ECBM_CONNECTION_RESULT_SOME_REFUSED_INSUFFICIENT_RESOURCES_AVAILABLE;
5598         }
5599         // update state
5600         channel->state = L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE;
5601     }
5602     l2cap_run_trigger();
5603     return ERROR_CODE_SUCCESS;
5604 }
5605 
5606 uint8_t l2cap_ecbm_decline_channels(uint16_t local_cid, uint16_t result){
5607     l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cid);
5608     if (!channel) {
5609         return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5610     }
5611     //
5612     hci_con_handle_t  con_handle    = channel->con_handle;
5613     uint8_t           local_sig_id  = channel->local_sig_id;
5614     btstack_linked_list_iterator_t it;
5615     btstack_linked_list_iterator_init(&it, &l2cap_channels);
5616     while (btstack_linked_list_iterator_has_next(&it)) {
5617         channel = (l2cap_channel_t *) btstack_linked_list_iterator_next(&it);
5618         if (!l2cap_is_dynamic_channel_type(channel->channel_type)) continue;
5619         if (channel->con_handle != con_handle) continue;
5620         if (channel->local_sig_id != local_sig_id) continue;
5621         if (channel->state != L2CAP_STATE_WAIT_CLIENT_ACCEPT_OR_REJECT) continue;
5622 
5623         // prepare response
5624         channel->local_cid = 0;
5625         channel->reason = result;
5626         channel->state = L2CAP_STATE_WILL_SEND_ENHANCED_CONNECTION_RESPONSE;
5627     }
5628     l2cap_run_trigger();
5629     return ERROR_CODE_SUCCESS;
5630 }
5631 
5632 uint8_t l2cap_ecbm_reconfigure_channels(uint8_t num_cids, uint16_t * local_cids, int16_t receive_buffer_size, uint8_t ** receive_buffers){
5633     btstack_assert(receive_buffers != NULL);
5634     btstack_assert(local_cids != NULL);
5635 
5636     if (num_cids > L2CAP_ECBM_MAX_CID_ARRAY_SIZE){
5637         return ERROR_CODE_UNACCEPTABLE_CONNECTION_PARAMETERS;
5638     }
5639 
5640     // check if all cids exist and have the same con handle
5641     uint8_t i;
5642     hci_con_handle_t con_handle = HCI_CON_HANDLE_INVALID;
5643     for (i = 0 ; i < num_cids ; i++){
5644         l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cids[i]);
5645         if (!channel) {
5646             return L2CAP_LOCAL_CID_DOES_NOT_EXIST;
5647         }
5648         if (channel->state != L2CAP_STATE_OPEN){
5649             return ERROR_CODE_COMMAND_DISALLOWED;
5650         }
5651         if (con_handle == HCI_CON_HANDLE_INVALID){
5652             con_handle = channel->con_handle;
5653         } else if (con_handle != channel->con_handle){
5654             return ERROR_CODE_UNACCEPTABLE_CONNECTION_PARAMETERS;
5655         }
5656     }
5657     // set renegotiation data and state
5658     uint8_t sig_id = l2cap_next_sig_id();
5659     for (i = 0 ; i < num_cids ; i++){
5660         l2cap_channel_t * channel = l2cap_get_channel_for_local_cid(local_cids[i]);
5661         channel->cid_index = i;
5662         channel->num_cids = num_cids;
5663         channel->local_sig_id = sig_id;
5664         channel->renegotiate_mtu = receive_buffer_size;
5665         channel->renegotiate_sdu_buffer = receive_buffers[i];
5666         channel->state = L2CAP_STATE_WILL_SEND_EHNANCED_RENEGOTIATION_REQUEST;
5667     }
5668 
5669 
5670     l2cap_run();
5671     return ERROR_CODE_SUCCESS;
5672 }
5673 
5674 uint8_t l2cap_ecbm_provide_credits(uint16_t local_cid, uint16_t credits){
5675     return l2cap_credit_based_provide_credits(local_cid, credits);
5676 }
5677 #endif
5678 
5679 #ifdef ENABLE_L2CAP_ENHANCED_RETRANSMISSION_MODE
5680 // @deprecated - please use l2cap_ertm_create_channel
5681 uint8_t l2cap_create_ertm_channel(btstack_packet_handler_t packet_handler, bd_addr_t address, uint16_t psm,
5682                                   l2cap_ertm_config_t * ertm_contig, uint8_t * buffer, uint32_t size, uint16_t * out_local_cid){
5683     log_error("deprecated - please use l2cap_ertm_create_channel");
5684     return l2cap_ertm_create_channel(packet_handler, address, psm, ertm_contig, buffer, size, out_local_cid);
5685 };
5686 
5687 // @deprecated - please use l2cap_ertm_accept_connection
5688 uint8_t l2cap_accept_ertm_connection(uint16_t local_cid, l2cap_ertm_config_t * ertm_contig, uint8_t * buffer, uint32_t size){
5689     log_error("deprecated - please use l2cap_ertm_accept_connection");
5690     return l2cap_ertm_accept_connection(local_cid, ertm_contig, buffer, size);
5691 }
5692 #endif
5693 
5694 #ifdef ENABLE_L2CAP_LE_CREDIT_BASED_FLOW_CONTROL_MODE
5695 // @deprecated - please use l2cap_cbm_register_service
5696 uint8_t l2cap_le_register_service(btstack_packet_handler_t packet_handler, uint16_t psm, gap_security_level_t security_level){
5697     log_error("deprecated - please use l2cap_cbm_register_service");
5698     return l2cap_cbm_register_service(packet_handler, psm, security_level);
5699 }
5700 
5701 // @deprecated - please use l2cap_cbm_unregister_service
5702 uint8_t l2cap_le_unregister_service(uint16_t psm){
5703     log_error("deprecated - please use l2cap_cbm_unregister_service");
5704     return l2cap_cbm_unregister_service(psm);
5705 }
5706 
5707 // @deprecated - please use l2cap_cbm_accept_connection
5708 uint8_t l2cap_le_accept_connection(uint16_t local_cid, uint8_t * receive_sdu_buffer, uint16_t mtu, uint16_t initial_credits){
5709     log_error("deprecated - please use l2cap_cbm_accept_connection");
5710     return l2cap_cbm_accept_connection(local_cid, receive_sdu_buffer, mtu, initial_credits);
5711 }
5712 
5713 // @deprecated - please use l2cap_cbm_decline_connection
5714 uint8_t l2cap_le_decline_connection(uint16_t local_cid){
5715     log_error("deprecated - please use l2cap_cbm_decline_connection");
5716     return l2cap_cbm_decline_connection(local_cid, L2CAP_CBM_CONNECTION_RESULT_NO_RESOURCES_AVAILABLE);
5717 }
5718 
5719 // @deprecated - please use l2cap_cbm_create_channel
5720 uint8_t l2cap_le_create_channel(btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle,
5721                                 uint16_t psm, uint8_t * receive_sdu_buffer, uint16_t mtu, uint16_t initial_credits, gap_security_level_t security_level,
5722                                 uint16_t * out_local_cid){
5723     log_error("deprecated - please use l2cap_cbm_create_channel");
5724     return l2cap_cbm_create_channel(packet_handler, con_handle, psm, receive_sdu_buffer, mtu, initial_credits, security_level, out_local_cid);
5725 }
5726 
5727 // @deprecated - please use l2cap_cbm_provide_credits
5728 uint8_t l2cap_le_provide_credits(uint16_t local_cid, uint16_t credits){
5729     log_error("deprecated - please use l2cap_cbm_provide_credits");
5730     return l2cap_cbm_provide_credits(local_cid, credits);
5731 }
5732 
5733 // @deprecated - please use l2cap_can_send_packet_now
5734 bool l2cap_le_can_send_now(uint16_t local_cid){
5735     log_error("deprecated - please use l2cap_can_send_packet_now");
5736     return l2cap_can_send_packet_now(local_cid);
5737 }
5738 
5739 // @deprecated - please use l2cap_request_can_send_now_event
5740 uint8_t l2cap_le_request_can_send_now_event(uint16_t local_cid){
5741     log_error("deprecated - please use l2cap_request_can_send_now_event");
5742     return l2cap_request_can_send_now_event(local_cid);
5743 }
5744 
5745 // @deprecated - please use l2cap_cbm_send_data
5746 uint8_t l2cap_le_send_data(uint16_t local_cid, const uint8_t * data, uint16_t size){
5747     log_error("deprecated - please use l2cap_cbm_send_data");
5748     return l2cap_send(local_cid, data, size);
5749 }
5750 
5751 // @deprecated - please use l2cap_disconnect
5752 uint8_t l2cap_le_disconnect(uint16_t local_cid){
5753     log_error("deprecated - please use l2cap_disconnect");
5754     return l2cap_disconnect(local_cid);
5755 }
5756 #endif
5757