xref: /btstack/src/classic/avdtp_util.c (revision 5308b30f8d0df008775ab8954889591879660657)
1 /*
2  * Copyright (C) 2016 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 MATTHIAS
24  * RINGWALD 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__ "avdtp_util.c"
39 
40 #include <stdint.h>
41 #include <string.h>
42 
43 #include "btstack.h"
44 #include "avdtp.h"
45 #include "avdtp_util.h"
46 
47 #define MAX_MEDIA_CODEC_INFORMATION_LENGTH 100
48 
49 
50 /*
51 
52  List of AVDTP_SUBEVENTs sorted by packet handler
53 
54 
55 Sink + Source:
56 - AVDTP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED
57 - AVDTP_SUBEVENT_SIGNALING_CONNECTION_RELEASED
58 - AVDTP_SUBEVENT_SIGNALING_SEP_FOUND
59 - AVDTP_SUBEVENT_SIGNALING_ACCEPT
60 - AVDTP_SUBEVENT_SIGNALING_REJECT
61 - AVDTP_SUBEVENT_SIGNALING_GENERAL_REJECT
62 - AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CAPABILITY
63 - AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CAPABILITY
64 - AVDTP_SUBEVENT_SIGNALING_MEDIA_TRANSPORT_CAPABILITY
65 - AVDTP_SUBEVENT_SIGNALING_REPORTING_CAPABILITY
66 - AVDTP_SUBEVENT_SIGNALING_RECOVERY_CAPABILITY
67 - AVDTP_SUBEVENT_SIGNALING_CONTENT_PROTECTION_CAPABILITY
68 - AVDTP_SUBEVENT_SIGNALING_MULTIPLEXING_CAPABILITY
69 - AVDTP_SUBEVENT_SIGNALING_DELAY_REPORTING_CAPABILITY
70 - AVDTP_SUBEVENT_SIGNALING_HEADER_COMPRESSION_CAPABILITY
71 - AVDTP_SUBEVENT_SIGNALING_CAPABILITIES_DONE
72 - AVDTP_SUBEVENT_SIGNALING_SEP_DICOVERY_DONE
73 
74 Source:
75  - AVDTP_SUBEVENT_SIGNALING_DELAY_REPORT
76 
77 Sink or Source based on SEP Type:
78 - AVDTP_SUBEVENT_STREAMING_CONNECTION_ESTABLISHED
79 - AVDTP_SUBEVENT_STREAMING_CONNECTION_RELEASED
80 - AVDTP_SUBEVENT_STREAMING_CAN_SEND_MEDIA_PACKET_NOW
81 - AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CONFIGURATION
82 - AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CONFIGURATION
83 
84 */
85 
86 static const char * avdtp_si_name[] = {
87     "ERROR",
88     "AVDTP_SI_DISCOVER",
89     "AVDTP_SI_GET_CAPABILITIES",
90     "AVDTP_SI_SET_CONFIGURATION",
91     "AVDTP_SI_GET_CONFIGURATION",
92     "AVDTP_SI_RECONFIGURE",
93     "AVDTP_SI_OPEN",
94     "AVDTP_SI_START",
95     "AVDTP_SI_CLOSE",
96     "AVDTP_SI_SUSPEND",
97     "AVDTP_SI_ABORT",
98     "AVDTP_SI_SECURITY_CONTROL",
99     "AVDTP_SI_GET_ALL_CAPABILITIES",
100     "AVDTP_SI_DELAY_REPORT"
101 };
102 const char * avdtp_si2str(uint16_t index){
103     if ((index <= 0) || (index >= sizeof(avdtp_si_name)/sizeof(avdtp_si_name[0]) )) return avdtp_si_name[0];
104     return avdtp_si_name[index];
105 }
106 
107 void avdtp_reset_stream_endpoint(avdtp_stream_endpoint_t * stream_endpoint){
108     stream_endpoint->media_con_handle = 0;
109     stream_endpoint->l2cap_media_cid = 0;
110     stream_endpoint->l2cap_reporting_cid = 0;
111     stream_endpoint->l2cap_recovery_cid = 0;
112 
113     stream_endpoint->state = AVDTP_STREAM_ENDPOINT_IDLE;
114     stream_endpoint->acceptor_config_state = AVDTP_ACCEPTOR_STREAM_CONFIG_IDLE;
115     stream_endpoint->initiator_config_state = AVDTP_INITIATOR_STREAM_CONFIG_IDLE;
116 
117     stream_endpoint->connection = NULL;
118 
119     stream_endpoint->sep.in_use = 0;
120     memset(&stream_endpoint->remote_sep, 0, sizeof(avdtp_sep_t));
121 
122     stream_endpoint->remote_capabilities_bitmap = 0;
123     memset(&stream_endpoint->remote_capabilities, 0, sizeof(avdtp_capabilities_t));
124     stream_endpoint->remote_configuration_bitmap = 0;
125     memset(&stream_endpoint->remote_configuration, 0, sizeof(avdtp_capabilities_t));
126 
127     // temporary reconfigure SBC config used by A2DP
128     memset(stream_endpoint->reconfigure_media_codec_sbc_info, 0, 4);
129 
130     stream_endpoint->media_disconnect = 0;
131     stream_endpoint->media_connect = 0;
132     stream_endpoint->start_stream = 0;
133     stream_endpoint->close_stream = 0;
134     stream_endpoint->request_can_send_now = 0;
135     stream_endpoint->abort_stream = 0;
136     stream_endpoint->suspend_stream = 0;
137     stream_endpoint->sequence_number = 0;
138 }
139 
140 int get_bit16(uint16_t bitmap, int position){
141     return (bitmap >> position) & 1;
142 }
143 
144 uint16_t store_bit16(uint16_t bitmap, int position, uint8_t value){
145     if (value){
146         bitmap |= 1 << position;
147     } else {
148         bitmap &= ~ (1 << position);
149     }
150     return bitmap;
151 }
152 
153 avdtp_message_type_t avdtp_get_signaling_packet_type(uint8_t * packet){
154     return (avdtp_message_type_t) (packet[0] & 0x03);
155 }
156 
157 int avdtp_read_signaling_header(avdtp_signaling_packet_t * signaling_header, uint8_t * packet, uint16_t size){
158     int pos = 0;
159     if (size < 2) return pos;
160     signaling_header->transaction_label = packet[pos] >> 4;
161     signaling_header->packet_type = (avdtp_packet_type_t)((packet[pos] >> 2) & 0x03);
162     signaling_header->message_type = (avdtp_message_type_t) (packet[pos] & 0x03);
163     pos++;
164     memset(signaling_header->command, 0, sizeof(signaling_header->command));
165     switch (signaling_header->packet_type){
166         case AVDTP_SINGLE_PACKET:
167             signaling_header->num_packets = 0;
168             signaling_header->offset = 0;
169             signaling_header->size = 0;
170             break;
171         case AVDTP_END_PACKET:
172             signaling_header->num_packets = 0;
173             break;
174         case AVDTP_START_PACKET:
175             signaling_header->num_packets = packet[pos++];
176             signaling_header->size = 0;
177             signaling_header->offset = 0;
178             break;
179         case AVDTP_CONTINUE_PACKET:
180             if (signaling_header->num_packets <= 0) {
181                 log_info("    ERROR: wrong num fragmented packets\n");
182                 break;
183             }
184             signaling_header->num_packets--;
185             break;
186     }
187     signaling_header->signal_identifier = (avdtp_signal_identifier_t)(packet[pos++] & 0x3f);
188     return pos;
189 }
190 
191 static bool avdtp_is_basic_capability(int service_category){
192     return (AVDTP_MEDIA_TRANSPORT <= service_category) && (service_category <= AVDTP_MEDIA_CODEC);
193 }
194 
195 int avdtp_pack_service_capabilities(uint8_t *buffer, int size, avdtp_capabilities_t caps, avdtp_service_category_t category) {
196     UNUSED(size);
197 
198     int i;
199     // pos = 0 reserved for length
200     int pos = 1;
201     switch(category){
202         case AVDTP_MEDIA_TRANSPORT:
203         case AVDTP_REPORTING:
204         case AVDTP_DELAY_REPORTING:
205             break;
206         case AVDTP_RECOVERY:
207             buffer[pos++] = caps.recovery.recovery_type; // 0x01=RFC2733
208             buffer[pos++] = caps.recovery.maximum_recovery_window_size;
209             buffer[pos++] = caps.recovery.maximum_number_media_packets;
210             break;
211         case AVDTP_CONTENT_PROTECTION:
212             buffer[pos++] = caps.content_protection.cp_type_value_len + 2;
213             big_endian_store_16(buffer, pos, caps.content_protection.cp_type);
214             pos += 2;
215             (void)memcpy(buffer + pos, caps.content_protection.cp_type_value,
216                          caps.content_protection.cp_type_value_len);
217             pos += caps.content_protection.cp_type_value_len;
218             break;
219         case AVDTP_HEADER_COMPRESSION:
220             buffer[pos++] = (caps.header_compression.back_ch << 7) | (caps.header_compression.media << 6) | (caps.header_compression.recovery << 5);
221             break;
222         case AVDTP_MULTIPLEXING:
223             buffer[pos++] = caps.multiplexing_mode.fragmentation << 7;
224             for (i=0; i<caps.multiplexing_mode.transport_identifiers_num; i++){
225                 buffer[pos++] = caps.multiplexing_mode.transport_session_identifiers[i] << 7;
226                 buffer[pos++] = caps.multiplexing_mode.tcid[i] << 7;
227                 // media, reporting. recovery
228             }
229             break;
230         case AVDTP_MEDIA_CODEC:
231             buffer[pos++] = ((uint8_t)caps.media_codec.media_type) << 4;
232             buffer[pos++] = (uint8_t)caps.media_codec.media_codec_type;
233             for (i = 0; i<caps.media_codec.media_codec_information_len; i++){
234                 buffer[pos++] = caps.media_codec.media_codec_information[i];
235             }
236             break;
237         default:
238             break;
239     }
240     buffer[0] = pos - 1; // length
241     return pos;
242 }
243 
244 static int avdtp_unpack_service_capabilities_has_errors(avdtp_connection_t * connection, avdtp_signal_identifier_t signal_identifier, avdtp_service_category_t category, uint8_t cap_len){
245     connection->error_code = 0;
246 
247     if ((category == AVDTP_SERVICE_CATEGORY_INVALID_0) ||
248         ((category == AVDTP_SERVICE_CATEGORY_INVALID_FF) && (signal_identifier == AVDTP_SI_RECONFIGURE))){
249         log_info("    ERROR: BAD SERVICE CATEGORY %d\n", category);
250         connection->reject_service_category = category;
251         connection->error_code = BAD_SERV_CATEGORY;
252         return 1;
253     }
254 
255     if (signal_identifier == AVDTP_SI_RECONFIGURE){
256         if ( (category != AVDTP_CONTENT_PROTECTION) && (category != AVDTP_MEDIA_CODEC)){
257             log_info("    ERROR: REJECT CATEGORY, INVALID_CAPABILITIES\n");
258             connection->reject_service_category = category;
259             connection->error_code = INVALID_CAPABILITIES;
260             return 1;
261         }
262     }
263 
264     switch(category){
265         case AVDTP_MEDIA_TRANSPORT:
266             if (cap_len != 0){
267                 log_info("    ERROR: REJECT CATEGORY, BAD_MEDIA_TRANSPORT\n");
268                 connection->reject_service_category = category;
269                 connection->error_code = BAD_MEDIA_TRANSPORT_FORMAT;
270                 return 1;
271             }
272             break;
273         case AVDTP_REPORTING:
274         case AVDTP_DELAY_REPORTING:
275             if (cap_len != 0){
276                 log_info("    ERROR: REJECT CATEGORY, BAD_LENGTH\n");
277                 connection->reject_service_category = category;
278                 connection->error_code = BAD_LENGTH;
279                 return 1;
280             }
281             break;
282         case AVDTP_RECOVERY:
283             if (cap_len != 3){
284                 log_info("    ERROR: REJECT CATEGORY, BAD_MEDIA_TRANSPORT\n");
285                 connection->reject_service_category = category;
286                 connection->error_code = BAD_RECOVERY_FORMAT;
287                 return 1;
288             }
289             break;
290         case AVDTP_CONTENT_PROTECTION:
291             if (cap_len < 2){
292                 log_info("    ERROR: REJECT CATEGORY, BAD_CP_FORMAT\n");
293                 connection->reject_service_category = category;
294                 connection->error_code = BAD_CP_FORMAT;
295                 return 1;
296             }
297             break;
298         case AVDTP_HEADER_COMPRESSION:
299             // TODO: find error code for bad header compression
300             if (cap_len != 1){
301                 log_info("    ERROR: REJECT CATEGORY, BAD_HEADER_COMPRESSION\n");
302                 connection->reject_service_category = category;
303                 connection->error_code = BAD_RECOVERY_FORMAT;
304                 return 1;
305             }
306             break;
307         case AVDTP_MULTIPLEXING:
308             break;
309         case AVDTP_MEDIA_CODEC:
310             break;
311         default:
312             break;
313     }
314     return 0;
315 }
316 
317 uint16_t avdtp_unpack_service_capabilities(avdtp_connection_t * connection, avdtp_signal_identifier_t signal_identifier, avdtp_capabilities_t * caps, uint8_t * packet, uint16_t size){
318 
319     int i;
320 
321     uint16_t registered_service_categories = 0;
322     uint16_t to_process = size;
323 
324     while (to_process >= 2){
325 
326         avdtp_service_category_t category = (avdtp_service_category_t) packet[0];
327         uint8_t cap_len = packet[1];
328         packet     += 2;
329         to_process -= 2;
330 
331         if (cap_len > to_process){
332             connection->reject_service_category = category;
333             connection->error_code = BAD_LENGTH;
334             return 0;
335         }
336 
337         if (avdtp_unpack_service_capabilities_has_errors(connection, signal_identifier, category, cap_len)) return 0;
338 
339         int category_valid = 1;
340 
341         uint8_t * data = packet;
342         uint16_t  pos = 0;
343 
344         switch(category){
345             case AVDTP_RECOVERY:
346                 caps->recovery.recovery_type = data[pos++];
347                 caps->recovery.maximum_recovery_window_size = data[pos++];
348                 caps->recovery.maximum_number_media_packets = data[pos++];
349                 break;
350             case AVDTP_CONTENT_PROTECTION:
351                 caps->content_protection.cp_type = big_endian_read_16(data, 0);
352                 caps->content_protection.cp_type_value_len = cap_len - 2;
353                 // connection->reject_service_category = category;
354                 // connection->error_code = UNSUPPORTED_CONFIGURATION;
355                 // support for content protection goes here
356                 break;
357             case AVDTP_HEADER_COMPRESSION:
358                 caps->header_compression.back_ch  = (data[0] >> 7) & 1;
359                 caps->header_compression.media    = (data[0] >> 6) & 1;
360                 caps->header_compression.recovery = (data[0] >> 5) & 1;
361                 break;
362             case AVDTP_MULTIPLEXING:
363                 caps->multiplexing_mode.fragmentation = (data[pos++] >> 7) & 1;
364                 // read [tsid, tcid] for media, reporting. recovery respectively
365                 caps->multiplexing_mode.transport_identifiers_num = 3;
366                 for (i=0; i<caps->multiplexing_mode.transport_identifiers_num; i++){
367                     caps->multiplexing_mode.transport_session_identifiers[i] = (data[pos++] >> 7) & 1;
368                     caps->multiplexing_mode.tcid[i] = (data[pos++] >> 7) & 1;
369                 }
370                 break;
371             case AVDTP_MEDIA_CODEC:
372                 caps->media_codec.media_type = (avdtp_media_type_t)(data[pos++] >> 4);
373                 caps->media_codec.media_codec_type = (avdtp_media_codec_type_t)(data[pos++]);
374                 caps->media_codec.media_codec_information_len = cap_len - 2;
375                 caps->media_codec.media_codec_information = &data[pos++];
376                 break;
377             case AVDTP_MEDIA_TRANSPORT:
378             case AVDTP_REPORTING:
379             case AVDTP_DELAY_REPORTING:
380                 break;
381             default:
382                 category_valid = 0;
383                 break;
384         }
385 
386         if (category_valid) {
387             registered_service_categories = store_bit16(registered_service_categories, category, 1);
388         }
389 
390         packet     += cap_len;
391         to_process -= cap_len;
392     }
393 
394     return registered_service_categories;
395 }
396 
397 void avdtp_prepare_capabilities(avdtp_signaling_packet_t * signaling_packet, uint8_t transaction_label, uint16_t service_categories, avdtp_capabilities_t capabilities, uint8_t identifier){
398     if (signaling_packet->offset) return;
399     bool basic_capabilities_only = false;
400     signaling_packet->message_type = AVDTP_RESPONSE_ACCEPT_MSG;
401     int i;
402 
403     signaling_packet->size = 0;
404     memset(signaling_packet->command, 0 , sizeof(signaling_packet->command));
405 
406     switch (identifier) {
407         case AVDTP_SI_GET_CAPABILITIES:
408             basic_capabilities_only = true;
409             break;
410         case AVDTP_SI_GET_ALL_CAPABILITIES:
411             break;
412         case AVDTP_SI_SET_CONFIGURATION:
413             signaling_packet->command[signaling_packet->size++] = signaling_packet->acp_seid << 2;
414             signaling_packet->command[signaling_packet->size++] = signaling_packet->int_seid << 2;
415             signaling_packet->message_type = AVDTP_CMD_MSG;
416             break;
417         case AVDTP_SI_RECONFIGURE:
418             signaling_packet->command[signaling_packet->size++] = signaling_packet->acp_seid << 2;
419             signaling_packet->message_type = AVDTP_CMD_MSG;
420             break;
421         default:
422             log_error("avdtp_prepare_capabilities wrong identifier %d", identifier);
423             break;
424     }
425 
426     for (i = AVDTP_MEDIA_TRANSPORT; i <= AVDTP_DELAY_REPORTING; i++){
427         int registered_category = get_bit16(service_categories, i);
428         if (!registered_category && (identifier == AVDTP_SI_SET_CONFIGURATION)){
429             // TODO: introduce bitmap of mandatory categories
430             if (i == AVDTP_MEDIA_TRANSPORT){
431                 registered_category = true;
432             }
433         }
434         // AVDTP_SI_GET_CAPABILITIES reports only basic capabilities (i.e., it skips non-basic categories)
435         if (basic_capabilities_only && !avdtp_is_basic_capability(i)){
436             registered_category = false;
437         }
438 
439         if (registered_category){
440             // service category
441             signaling_packet->command[signaling_packet->size++] = i;
442             signaling_packet->size += avdtp_pack_service_capabilities(signaling_packet->command + signaling_packet->size,
443                     sizeof(signaling_packet->command) - signaling_packet->size, capabilities, (avdtp_service_category_t) i);
444         }
445     }
446     signaling_packet->signal_identifier = (avdtp_signal_identifier_t)identifier;
447     signaling_packet->transaction_label = transaction_label;
448 }
449 
450 int avdtp_signaling_create_fragment(uint16_t cid, avdtp_signaling_packet_t * signaling_packet, uint8_t * out_buffer) {
451     int mtu = l2cap_get_remote_mtu_for_local_cid(cid);
452     int data_len = 0;
453 
454     uint16_t offset = signaling_packet->offset;
455     uint16_t pos = 1;
456 
457     if (offset == 0){
458         if (signaling_packet->size <= (mtu - 2)){
459             signaling_packet->packet_type = AVDTP_SINGLE_PACKET;
460             out_buffer[pos++] = signaling_packet->signal_identifier;
461             data_len = signaling_packet->size;
462         } else {
463             signaling_packet->packet_type = AVDTP_START_PACKET;
464             out_buffer[pos++] = (mtu + signaling_packet->size)/ (mtu-1);
465             out_buffer[pos++] = signaling_packet->signal_identifier;
466             data_len = mtu - 3;
467             signaling_packet->offset = data_len;
468         }
469     } else {
470         int remaining_bytes = signaling_packet->size - offset;
471         if (remaining_bytes <= (mtu - 1)){
472             signaling_packet->packet_type = AVDTP_END_PACKET;
473             data_len = remaining_bytes;
474             signaling_packet->offset = 0;
475         } else{
476             signaling_packet->packet_type = AVDTP_CONTINUE_PACKET;
477             data_len = mtu - 1;
478             signaling_packet->offset += data_len;
479         }
480     }
481     out_buffer[0] = avdtp_header(signaling_packet->transaction_label, signaling_packet->packet_type, signaling_packet->message_type);
482     (void)memcpy(out_buffer + pos, signaling_packet->command + offset,
483                  data_len);
484     pos += data_len;
485     return pos;
486 }
487 
488 
489 void avdtp_signaling_emit_connection_established(uint16_t avdtp_cid, bd_addr_t addr, hci_con_handle_t con_handle, uint8_t status) {
490     uint8_t event[14];
491     int pos = 0;
492     event[pos++] = HCI_EVENT_AVDTP_META;
493     event[pos++] = sizeof(event) - 2;
494     event[pos++] = AVDTP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED;
495     little_endian_store_16(event, pos, avdtp_cid);
496     pos += 2;
497     reverse_bd_addr(addr,&event[pos]);
498     pos += 6;
499     little_endian_store_16(event, pos, con_handle);
500     pos += 2;
501     event[pos++] = status;
502     avdtp_emit_sink_and_source(event, pos);
503 }
504 
505 void avdtp_signaling_emit_connection_released(uint16_t avdtp_cid) {
506     uint8_t event[5];
507     int pos = 0;
508     event[pos++] = HCI_EVENT_AVDTP_META;
509     event[pos++] = sizeof(event) - 2;
510     event[pos++] = AVDTP_SUBEVENT_SIGNALING_CONNECTION_RELEASED;
511     little_endian_store_16(event, pos, avdtp_cid);
512     pos += 2;
513     avdtp_emit_sink_and_source(event, pos);
514 }
515 
516 void avdtp_signaling_emit_sep(uint16_t avdtp_cid, avdtp_sep_t sep) {
517     uint8_t event[9];
518     int pos = 0;
519     event[pos++] = HCI_EVENT_AVDTP_META;
520     event[pos++] = sizeof(event) - 2;
521     event[pos++] = AVDTP_SUBEVENT_SIGNALING_SEP_FOUND;
522     little_endian_store_16(event, pos, avdtp_cid);
523     pos += 2;
524     event[pos++] = sep.seid;
525     event[pos++] = sep.in_use;
526     event[pos++] = sep.media_type;
527     event[pos++] = sep.type;
528     avdtp_emit_sink_and_source(event, pos);
529 }
530 
531 void avdtp_signaling_emit_sep_done(uint16_t avdtp_cid) {
532     uint8_t event[5];
533     int pos = 0;
534     event[pos++] = HCI_EVENT_AVDTP_META;
535     event[pos++] = sizeof(event) - 2;
536     event[pos++] = AVDTP_SUBEVENT_SIGNALING_SEP_DICOVERY_DONE;
537     little_endian_store_16(event, pos, avdtp_cid);
538     pos += 2;
539     avdtp_emit_sink_and_source(event, pos);
540 }
541 
542 void avdtp_signaling_emit_accept(uint16_t avdtp_cid, uint8_t local_seid, avdtp_signal_identifier_t identifier, bool is_initiator) {
543     uint8_t event[8];
544     int pos = 0;
545     event[pos++] = HCI_EVENT_AVDTP_META;
546     event[pos++] = sizeof(event) - 2;
547     event[pos++] = AVDTP_SUBEVENT_SIGNALING_ACCEPT;
548     little_endian_store_16(event, pos, avdtp_cid);
549     pos += 2;
550     event[pos++] = local_seid;
551     event[pos++] = is_initiator ? 1 : 0;
552     event[pos++] = identifier;
553     avdtp_emit_sink_and_source(event, pos);
554 }
555 
556 void avdtp_signaling_emit_accept_for_stream_endpoint(avdtp_stream_endpoint_t * stream_endpoint, uint8_t local_seid,  avdtp_signal_identifier_t identifier, bool is_initiator){
557     uint8_t event[8];
558     int pos = 0;
559     event[pos++] = HCI_EVENT_AVDTP_META;
560     event[pos++] = sizeof(event) - 2;
561     event[pos++] = AVDTP_SUBEVENT_SIGNALING_ACCEPT;
562     little_endian_store_16(event, pos, stream_endpoint->connection->avdtp_cid);
563     pos += 2;
564     event[pos++] = local_seid;
565     event[pos++] = is_initiator ? 1 : 0;
566     event[pos++] = identifier;
567 
568     btstack_packet_handler_t packet_handler = avdtp_packet_handler_for_stream_endpoint(stream_endpoint);
569     (*packet_handler)(HCI_EVENT_PACKET, 0, event, pos);
570 }
571 
572 void avdtp_signaling_emit_reject(uint16_t avdtp_cid, uint8_t local_seid, avdtp_signal_identifier_t identifier, bool is_initiator) {
573     uint8_t event[8];
574     int pos = 0;
575     event[pos++] = HCI_EVENT_AVDTP_META;
576     event[pos++] = sizeof(event) - 2;
577     event[pos++] = AVDTP_SUBEVENT_SIGNALING_REJECT;
578     little_endian_store_16(event, pos, avdtp_cid);
579     pos += 2;
580     event[pos++] = local_seid;
581     event[pos++] = is_initiator ? 1 : 0;
582     event[pos++] = identifier;
583     avdtp_emit_sink_and_source(event, pos);
584 }
585 
586 void avdtp_signaling_emit_general_reject(uint16_t avdtp_cid, uint8_t local_seid, avdtp_signal_identifier_t identifier, bool is_initiator) {
587     uint8_t event[8];
588     int pos = 0;
589     event[pos++] = HCI_EVENT_AVDTP_META;
590     event[pos++] = sizeof(event) - 2;
591     event[pos++] = AVDTP_SUBEVENT_SIGNALING_GENERAL_REJECT;
592     little_endian_store_16(event, pos, avdtp_cid);
593     pos += 2;
594     event[pos++] = local_seid;
595     event[pos++] = is_initiator ? 1 : 0;
596     event[pos++] = identifier;
597     avdtp_emit_sink_and_source(event, pos);
598 }
599 
600 static inline void
601 avdtp_signaling_emit_capability(uint8_t capability_subevent_id, uint16_t avdtp_cid, uint8_t remote_seid) {
602     uint8_t event[6];
603     int pos = 0;
604     event[pos++] = HCI_EVENT_AVDTP_META;
605     event[pos++] = sizeof(event) - 2;
606     event[pos++] = capability_subevent_id;
607     little_endian_store_16(event, pos, avdtp_cid);
608     pos += 2;
609     event[pos++] = remote_seid;
610     avdtp_emit_sink_and_source(event, pos);
611 }
612 
613 static void avdtp_signaling_emit_media_codec_sbc_capability(uint16_t avdtp_cid, uint8_t remote_seid, adtvp_media_codec_capabilities_t media_codec) {
614     uint8_t event[14];
615     int pos = 0;
616     event[pos++] = HCI_EVENT_AVDTP_META;
617     event[pos++] = sizeof(event) - 2;
618     event[pos++] = AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CAPABILITY;
619     little_endian_store_16(event, pos, avdtp_cid);
620     pos += 2;
621     event[pos++] = remote_seid;
622     event[pos++] = media_codec.media_type;
623     event[pos++] = media_codec.media_codec_information[0] >> 4;
624     event[pos++] = media_codec.media_codec_information[0] & 0x0F;
625     event[pos++] = media_codec.media_codec_information[1] >> 4;
626     event[pos++] = (media_codec.media_codec_information[1] & 0x0F) >> 2;
627     event[pos++] = media_codec.media_codec_information[1] & 0x03;
628     event[pos++] = media_codec.media_codec_information[2];
629     event[pos++] = media_codec.media_codec_information[3];
630     avdtp_emit_sink_and_source(event, pos);
631 }
632 
633 static void avdtp_signaling_emit_media_codec_other_capability(uint16_t avdtp_cid, uint8_t remote_seid, adtvp_media_codec_capabilities_t media_codec) {
634     uint8_t event[MAX_MEDIA_CODEC_INFORMATION_LENGTH + 11];
635     int pos = 0;
636     event[pos++] = HCI_EVENT_AVDTP_META;
637     event[pos++] = sizeof(event) - 2;
638     event[pos++] = AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CAPABILITY;
639     little_endian_store_16(event, pos, avdtp_cid);
640     pos += 2;
641     event[pos++] = remote_seid;
642     event[pos++] = media_codec.media_type;
643     little_endian_store_16(event, pos, media_codec.media_codec_type);
644     pos += 2;
645     little_endian_store_16(event, pos, media_codec.media_codec_information_len);
646     pos += 2;
647     (void)memcpy(event + pos, media_codec.media_codec_information,
648                  btstack_min(media_codec.media_codec_information_len, MAX_MEDIA_CODEC_INFORMATION_LENGTH));
649     avdtp_emit_sink_and_source(event, pos);
650 }
651 
652 static void
653 avdtp_signaling_emit_media_transport_capability(uint16_t avdtp_cid, uint8_t remote_seid) {
654 	avdtp_signaling_emit_capability(AVDTP_SUBEVENT_SIGNALING_MEDIA_TRANSPORT_CAPABILITY, avdtp_cid,
655 									remote_seid);
656 }
657 
658 static void avdtp_signaling_emit_reporting_capability(uint16_t avdtp_cid, uint8_t remote_seid) {
659 	avdtp_signaling_emit_capability(AVDTP_SUBEVENT_SIGNALING_REPORTING_CAPABILITY, avdtp_cid, remote_seid);
660 }
661 
662 static void
663 avdtp_signaling_emit_delay_reporting_capability(uint16_t avdtp_cid, uint8_t remote_seid) {
664 	avdtp_signaling_emit_capability(AVDTP_SUBEVENT_SIGNALING_DELAY_REPORTING_CAPABILITY, avdtp_cid,
665 									remote_seid);
666 }
667 
668 static void avdtp_signaling_emit_recovery_capability(uint16_t avdtp_cid, uint8_t remote_seid, avdtp_recovery_capabilities_t *recovery) {
669     uint8_t event[9];
670     int pos = 0;
671     event[pos++] = HCI_EVENT_AVDTP_META;
672     event[pos++] = sizeof(event) - 2;
673     event[pos++] = AVDTP_SUBEVENT_SIGNALING_RECOVERY_CAPABILITY;
674     little_endian_store_16(event, pos, avdtp_cid);
675     pos += 2;
676     event[pos++] = remote_seid;
677     event[pos++] = recovery->recovery_type;
678     event[pos++] = recovery->maximum_recovery_window_size;
679     event[pos++] = recovery->maximum_number_media_packets;
680     avdtp_emit_sink_and_source(event, pos);
681 }
682 
683 static void
684 avdtp_signaling_emit_content_protection_capability(uint16_t avdtp_cid, uint8_t remote_seid, adtvp_content_protection_t *content_protection) {
685     uint8_t event[21];
686     int pos = 0;
687     event[pos++] = HCI_EVENT_AVDTP_META;
688     event[pos++] = sizeof(event) - 2;
689     event[pos++] = AVDTP_SUBEVENT_SIGNALING_CONTENT_PROTECTION_CAPABILITY;
690     little_endian_store_16(event, pos, avdtp_cid);
691     pos += 2;
692     event[pos++] = remote_seid;
693 
694     little_endian_store_16(event, pos, content_protection->cp_type);
695     pos += 2;
696     little_endian_store_16(event, pos, content_protection->cp_type_value_len);
697     pos += 2;
698 
699     //TODO: reserve place for value
700     if (content_protection->cp_type_value_len < 10){
701         (void)memcpy(event + pos, content_protection->cp_type_value,
702                      content_protection->cp_type_value_len);
703     }
704     avdtp_emit_sink_and_source(event, pos);
705 }
706 
707 
708 static void
709 avdtp_signaling_emit_header_compression_capability(uint16_t avdtp_cid, uint8_t remote_seid, avdtp_header_compression_capabilities_t *header_compression) {
710     uint8_t event[9];
711     int pos = 0;
712     event[pos++] = HCI_EVENT_AVDTP_META;
713     event[pos++] = sizeof(event) - 2;
714     event[pos++] = AVDTP_SUBEVENT_SIGNALING_HEADER_COMPRESSION_CAPABILITY;
715     little_endian_store_16(event, pos, avdtp_cid);
716     pos += 2;
717     event[pos++] = remote_seid;
718     event[pos++] = header_compression->back_ch;
719     event[pos++] = header_compression->media;
720     event[pos++] = header_compression->recovery;
721     avdtp_emit_sink_and_source(event, pos);
722 }
723 
724 static void
725 avdtp_signaling_emit_content_multiplexing_capability(uint16_t avdtp_cid, uint8_t remote_seid, avdtp_multiplexing_mode_capabilities_t *multiplexing_mode) {
726     uint8_t event[14];
727     int pos = 0;
728     event[pos++] = HCI_EVENT_AVDTP_META;
729     event[pos++] = sizeof(event) - 2;
730     event[pos++] = AVDTP_SUBEVENT_SIGNALING_MULTIPLEXING_CAPABILITY;
731     little_endian_store_16(event, pos, avdtp_cid);
732     pos += 2;
733     event[pos++] = remote_seid;
734 
735     event[pos++] = multiplexing_mode->fragmentation;
736     event[pos++] = multiplexing_mode->transport_identifiers_num;
737 
738     int i;
739     for (i = 0; i < 3; i++){
740         event[pos++] = multiplexing_mode->transport_session_identifiers[i];
741     }
742     for (i = 0; i < 3; i++){
743         event[pos++] = multiplexing_mode->tcid[i];
744     }
745     avdtp_emit_sink_and_source(event, pos);
746 }
747 
748 static void avdtp_signaling_emit_capability_done(uint16_t avdtp_cid, uint8_t remote_seid) {
749     uint8_t event[6];
750     int pos = 0;
751     event[pos++] = HCI_EVENT_AVDTP_META;
752     event[pos++] = sizeof(event) - 2;
753     event[pos++] = AVDTP_SUBEVENT_SIGNALING_CAPABILITIES_DONE;
754     little_endian_store_16(event, pos, avdtp_cid);
755     pos += 2;
756     event[pos++] = remote_seid;
757     avdtp_emit_sink_and_source(event, pos);
758 }
759 
760 // emit events for all capabilities incl. final done event
761 void avdtp_signaling_emit_capabilities(uint16_t avdtp_cid, uint8_t remote_seid, avdtp_capabilities_t *capabilities,
762 									   uint16_t registered_service_categories) {
763     if (get_bit16(registered_service_categories, AVDTP_MEDIA_CODEC)){
764         switch (capabilities->media_codec.media_codec_type){
765             case AVDTP_CODEC_SBC:
766 				avdtp_signaling_emit_media_codec_sbc_capability(avdtp_cid, remote_seid, capabilities->media_codec);
767                 break;
768             default:
769 				avdtp_signaling_emit_media_codec_other_capability(avdtp_cid, remote_seid, capabilities->media_codec);
770                 break;
771         }
772     }
773 
774     if (get_bit16(registered_service_categories, AVDTP_MEDIA_TRANSPORT)){
775 		avdtp_signaling_emit_media_transport_capability(avdtp_cid, remote_seid);
776     }
777     if (get_bit16(registered_service_categories, AVDTP_REPORTING)){
778 		avdtp_signaling_emit_reporting_capability(avdtp_cid, remote_seid);
779     }
780     if (get_bit16(registered_service_categories, AVDTP_RECOVERY)){
781 		avdtp_signaling_emit_recovery_capability(avdtp_cid, remote_seid, &capabilities->recovery);
782     }
783     if (get_bit16(registered_service_categories, AVDTP_CONTENT_PROTECTION)){
784 		avdtp_signaling_emit_content_protection_capability(avdtp_cid, remote_seid,
785 														   &capabilities->content_protection);
786     }
787     if (get_bit16(registered_service_categories, AVDTP_HEADER_COMPRESSION)){
788 		avdtp_signaling_emit_header_compression_capability(avdtp_cid, remote_seid,
789 														   &capabilities->header_compression);
790     }
791     if (get_bit16(registered_service_categories, AVDTP_MULTIPLEXING)){
792 		avdtp_signaling_emit_content_multiplexing_capability(avdtp_cid, remote_seid,
793 															 &capabilities->multiplexing_mode);
794     }
795     if (get_bit16(registered_service_categories, AVDTP_DELAY_REPORTING)){
796 		avdtp_signaling_emit_delay_reporting_capability(avdtp_cid, remote_seid);
797     }
798 	avdtp_signaling_emit_capability_done(avdtp_cid, remote_seid);
799 }
800 
801 static void avdtp_signaling_emit_media_codec_sbc(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
802                                      avdtp_media_type_t media_type, const uint8_t *media_codec_information,
803                                      uint8_t reconfigure) {
804 
805     btstack_packet_handler_t packet_handler = avdtp_packet_handler_for_stream_endpoint(stream_endpoint);
806     uint8_t local_seid = avdtp_local_seid(stream_endpoint);
807     uint8_t remote_seid = avdtp_remote_seid(stream_endpoint);
808 
809     uint8_t event[16 + 2];
810     int pos = 0;
811     event[pos++] = HCI_EVENT_AVDTP_META;
812     event[pos++] = sizeof(event) - 2;
813 
814     event[pos++] = AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CONFIGURATION;
815     little_endian_store_16(event, pos, avdtp_cid);
816     pos += 2;
817     event[pos++] = local_seid;
818     event[pos++] = remote_seid;
819     event[pos++] = reconfigure;
820 
821 
822     uint8_t sampling_frequency_bitmap = media_codec_information[0] >> 4;
823     uint8_t channel_mode_bitmap = media_codec_information[0] & 0x0F;
824     uint8_t block_length_bitmap = media_codec_information[1] >> 4;
825     uint8_t subbands_bitmap = (media_codec_information[1] & 0x0F) >> 2;
826 
827     uint8_t num_channels = 0;
828     if ((channel_mode_bitmap & AVDTP_SBC_JOINT_STEREO) ||
829         (channel_mode_bitmap & AVDTP_SBC_STEREO) ||
830         (channel_mode_bitmap & AVDTP_SBC_DUAL_CHANNEL)) {
831         num_channels = 2;
832     } else if (channel_mode_bitmap & AVDTP_SBC_MONO) {
833         num_channels = 1;
834     }
835 
836     uint16_t sampling_frequency = 0;
837     if (sampling_frequency_bitmap & AVDTP_SBC_48000) {
838         sampling_frequency = 48000;
839     } else if (sampling_frequency_bitmap & AVDTP_SBC_44100) {
840         sampling_frequency = 44100;
841     } else if (sampling_frequency_bitmap & AVDTP_SBC_32000) {
842         sampling_frequency = 32000;
843     } else if (sampling_frequency_bitmap & AVDTP_SBC_16000) {
844         sampling_frequency = 16000;
845     }
846 
847     uint8_t subbands = 0;
848     if (subbands_bitmap & AVDTP_SBC_SUBBANDS_8){
849         subbands = 8;
850     } else if (subbands_bitmap & AVDTP_SBC_SUBBANDS_4){
851         subbands = 4;
852     }
853 
854     uint8_t block_length = 0;
855     if (block_length_bitmap & AVDTP_SBC_BLOCK_LENGTH_16){
856         block_length = 16;
857     } else if (block_length_bitmap & AVDTP_SBC_BLOCK_LENGTH_12){
858         block_length = 12;
859     } else if (block_length_bitmap & AVDTP_SBC_BLOCK_LENGTH_8){
860         block_length = 8;
861     } else if (block_length_bitmap & AVDTP_SBC_BLOCK_LENGTH_4){
862         block_length = 4;
863     }
864 
865     event[pos++] = media_type;
866     little_endian_store_16(event, pos, sampling_frequency);
867     pos += 2;
868 
869     event[pos++] = channel_mode_bitmap;
870     event[pos++] = num_channels;
871     event[pos++] = block_length;
872     event[pos++] = subbands;
873     event[pos++] = media_codec_information[1] & 0x03;
874     event[pos++] = media_codec_information[2];
875     event[pos++] = media_codec_information[3];
876     (*packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
877 }
878 
879 static void avdtp_signaling_emit_media_codec_other(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
880                                        adtvp_media_codec_capabilities_t * media_codec, uint8_t reconfigure) {
881 
882     btstack_packet_handler_t packet_handler = avdtp_packet_handler_for_stream_endpoint(stream_endpoint);
883     uint8_t local_seid = avdtp_local_seid(stream_endpoint);
884     uint8_t remote_seid = avdtp_remote_seid(stream_endpoint);
885 
886     uint8_t event[MAX_MEDIA_CODEC_INFORMATION_LENGTH + 13];
887     int pos = 0;
888     event[pos++] = HCI_EVENT_AVDTP_META;
889     event[pos++] = sizeof(event) - 2;
890     event[pos++] = AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CONFIGURATION;
891     little_endian_store_16(event, pos, avdtp_cid);
892     pos += 2;
893     event[pos++] = local_seid;
894     event[pos++] = remote_seid;
895     event[pos++] = reconfigure;
896     event[pos++] = media_codec->media_type;
897     little_endian_store_16(event, pos, media_codec->media_codec_type);
898     pos += 2;
899     little_endian_store_16(event, pos, media_codec->media_codec_information_len);
900     pos += 2;
901 
902     int media_codec_len = btstack_min(MAX_MEDIA_CODEC_INFORMATION_LENGTH, media_codec->media_codec_information_len);
903     (void)memcpy(event + pos, media_codec->media_codec_information, media_codec_len);
904 
905     (*packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
906 }
907 
908 void avdtp_signaling_emit_delay(uint16_t avdtp_cid, uint8_t local_seid, uint16_t delay) {
909     uint8_t event[8];
910     int pos = 0;
911     event[pos++] = HCI_EVENT_AVDTP_META;
912     event[pos++] = sizeof(event) - 2;
913     event[pos++] = AVDTP_SUBEVENT_SIGNALING_DELAY_REPORT;
914     little_endian_store_16(event, pos, avdtp_cid);
915     pos += 2;
916     event[pos++] = local_seid;
917     little_endian_store_16(event, pos, delay);
918     pos += 2;
919     avdtp_emit_source(event, sizeof(event));
920 }
921 
922 void avdtp_signaling_emit_media_codec_sbc_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
923                                                         avdtp_media_type_t media_type,
924                                                         const uint8_t *media_codec_information) {
925     avdtp_signaling_emit_media_codec_sbc(stream_endpoint, avdtp_cid, media_type,
926                                          media_codec_information, 0);
927 }
928 
929 void avdtp_signaling_emit_media_codec_other_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
930                                                           adtvp_media_codec_capabilities_t * media_codec) {
931     avdtp_signaling_emit_media_codec_other(stream_endpoint, avdtp_cid, media_codec, 0);
932 }
933 
934 void avdtp_signaling_emit_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid,
935                                         avdtp_capabilities_t *configuration, uint16_t configured_service_categories) {
936 
937     if (get_bit16(configured_service_categories, AVDTP_MEDIA_CODEC)){
938         switch (configuration->media_codec.media_codec_type){
939             case AVDTP_CODEC_SBC:
940                 avdtp_signaling_emit_media_codec_sbc_configuration(
941                         stream_endpoint, avdtp_cid,
942                         configuration->media_codec.media_type,
943                         configuration->media_codec.media_codec_information);
944                 break;
945             default:
946                 avdtp_signaling_emit_media_codec_other_configuration(stream_endpoint, avdtp_cid,
947                                                                      &configuration->media_codec);
948                 break;
949         }
950     }
951 }
952 
953 void avdtp_streaming_emit_connection_established(avdtp_stream_endpoint_t *stream_endpoint, uint8_t status) {
954     uint8_t event[14];
955     int pos = 0;
956     event[pos++] = HCI_EVENT_AVDTP_META;
957     event[pos++] = sizeof(event) - 2;
958     event[pos++] = AVDTP_SUBEVENT_STREAMING_CONNECTION_ESTABLISHED;
959     little_endian_store_16(event, pos, stream_endpoint->connection->avdtp_cid);
960     pos += 2;
961     reverse_bd_addr(stream_endpoint->connection->remote_addr, &event[pos]);
962     pos += 6;
963     event[pos++] = avdtp_local_seid(stream_endpoint);
964     event[pos++] = avdtp_remote_seid(stream_endpoint);
965     event[pos++] = status;
966 
967     btstack_packet_handler_t packet_handler = avdtp_packet_handler_for_stream_endpoint(stream_endpoint);
968     (*packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
969 }
970 
971 void avdtp_streaming_emit_connection_released(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid, uint8_t local_seid) {
972     uint8_t event[6];
973     int pos = 0;
974     event[pos++] = HCI_EVENT_AVDTP_META;
975     event[pos++] = sizeof(event) - 2;
976     event[pos++] = AVDTP_SUBEVENT_STREAMING_CONNECTION_RELEASED;
977     little_endian_store_16(event, pos, avdtp_cid);
978     pos += 2;
979     event[pos++] = local_seid;
980 
981     btstack_packet_handler_t packet_handler = avdtp_packet_handler_for_stream_endpoint(stream_endpoint);
982     (*packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
983 }
984 
985 void avdtp_streaming_emit_can_send_media_packet_now(avdtp_stream_endpoint_t *stream_endpoint, uint16_t sequence_number) {
986     uint8_t event[8];
987     int pos = 0;
988     event[pos++] = HCI_EVENT_AVDTP_META;
989     event[pos++] = sizeof(event) - 2;
990     event[pos++] = AVDTP_SUBEVENT_STREAMING_CAN_SEND_MEDIA_PACKET_NOW;
991     little_endian_store_16(event, pos, stream_endpoint->connection->avdtp_cid);
992     pos += 2;
993     event[pos++] = avdtp_local_seid(stream_endpoint);
994     little_endian_store_16(event, pos, sequence_number);
995     pos += 2;
996 
997     btstack_packet_handler_t packet_handler = avdtp_packet_handler_for_stream_endpoint(stream_endpoint);
998     (*packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
999 }
1000 
1001 uint8_t avdtp_request_can_send_now_acceptor(avdtp_connection_t * connection, uint16_t l2cap_cid){
1002     if (!connection) return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
1003     connection->wait_to_send_acceptor = 1;
1004     l2cap_request_can_send_now_event(l2cap_cid);
1005     return ERROR_CODE_SUCCESS;
1006 }
1007 
1008 uint8_t avdtp_request_can_send_now_initiator(avdtp_connection_t * connection, uint16_t l2cap_cid){
1009     if (!connection) return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
1010     connection->wait_to_send_initiator = 1;
1011     l2cap_request_can_send_now_event(l2cap_cid);
1012     return ERROR_CODE_SUCCESS;
1013 }
1014 
1015 uint8_t avdtp_local_seid(avdtp_stream_endpoint_t * stream_endpoint){
1016     if (!stream_endpoint) return 0;
1017     return stream_endpoint->sep.seid;
1018 
1019 }
1020 
1021 uint8_t avdtp_remote_seid(avdtp_stream_endpoint_t * stream_endpoint){
1022     if (!stream_endpoint) return AVDTP_INVALID_SEP_SEID;
1023     return stream_endpoint->remote_sep.seid;
1024 }
1025 
1026 // helper for A2DP
1027 
1028 void a2dp_replace_subevent_id_and_emit_cmd(btstack_packet_handler_t callback, uint8_t * packet, uint16_t size, uint8_t subevent_id){
1029     UNUSED(size);
1030     btstack_assert(callback != NULL);
1031     packet[0] = HCI_EVENT_A2DP_META;
1032     packet[2] = subevent_id;
1033     (*callback)(HCI_EVENT_PACKET, 0, packet, size);
1034 }
1035 
1036 void a2dp_emit_stream_event(btstack_packet_handler_t callback, uint16_t cid, uint8_t local_seid, uint8_t subevent_id){
1037     uint8_t event[6];
1038     int pos = 0;
1039     event[pos++] = HCI_EVENT_A2DP_META;
1040     event[pos++] = sizeof(event) - 2;
1041     event[pos++] = subevent_id;
1042     little_endian_store_16(event, pos, cid);
1043     pos += 2;
1044     event[pos++] = local_seid;
1045     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
1046 }
1047