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