xref: /btstack/src/classic/avdtp_util.c (revision 34b22aac0913b061ca6c0da686fd034f9e188df1)
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 void avdtp_initialize_stream_endpoint(avdtp_stream_endpoint_t * stream_endpoint){
51     stream_endpoint->connection = NULL;
52     stream_endpoint->state = AVDTP_STREAM_ENDPOINT_IDLE;
53     stream_endpoint->acceptor_config_state = AVDTP_ACCEPTOR_STREAM_CONFIG_IDLE;
54     stream_endpoint->initiator_config_state = AVDTP_INITIATOR_STREAM_CONFIG_IDLE;
55     stream_endpoint->remote_sep_index = AVDTP_INVALID_SEP_INDEX;
56     stream_endpoint->media_disconnect = 0;
57     stream_endpoint->sep.in_use = 0;
58     stream_endpoint->remote_sep_index = 0;
59 }
60 
61 avdtp_stream_endpoint_t * avdtp_stream_endpoint_for_seid(uint16_t seid, avdtp_context_t * context){
62     btstack_linked_list_iterator_t it;
63     btstack_linked_list_iterator_init(&it, &context->stream_endpoints);
64     while (btstack_linked_list_iterator_has_next(&it)){
65         avdtp_stream_endpoint_t * stream_endpoint = (avdtp_stream_endpoint_t *)btstack_linked_list_iterator_next(&it);
66         if (stream_endpoint->sep.seid == seid){
67             return stream_endpoint;
68         }
69     }
70     return NULL;
71 }
72 
73 avdtp_connection_t * avdtp_connection_for_bd_addr(bd_addr_t addr, avdtp_context_t * context){
74     btstack_linked_list_iterator_t it;
75     btstack_linked_list_iterator_init(&it, &context->connections);
76     while (btstack_linked_list_iterator_has_next(&it)){
77         avdtp_connection_t * connection = (avdtp_connection_t *)btstack_linked_list_iterator_next(&it);
78         if (memcmp(addr, connection->remote_addr, 6) != 0) continue;
79         return connection;
80     }
81     return NULL;
82 }
83 
84 avdtp_connection_t * avdtp_connection_for_avdtp_cid(uint16_t avdtp_cid, avdtp_context_t * context){
85     btstack_linked_list_iterator_t it;
86     btstack_linked_list_iterator_init(&it, &context->connections);
87     while (btstack_linked_list_iterator_has_next(&it)){
88         avdtp_connection_t * connection = (avdtp_connection_t *)btstack_linked_list_iterator_next(&it);
89         if (connection->avdtp_cid != avdtp_cid) continue;
90         return connection;
91     }
92     return NULL;
93 }
94 
95 avdtp_connection_t * avdtp_connection_for_l2cap_signaling_cid(uint16_t l2cap_cid, avdtp_context_t * context){
96     btstack_linked_list_iterator_t it;
97     btstack_linked_list_iterator_init(&it, &context->connections);
98     while (btstack_linked_list_iterator_has_next(&it)){
99         avdtp_connection_t * connection = (avdtp_connection_t *)btstack_linked_list_iterator_next(&it);
100         if (connection->l2cap_signaling_cid != l2cap_cid) continue;
101         return connection;
102     }
103     return NULL;
104 }
105 
106 avdtp_stream_endpoint_t * avdtp_stream_endpoint_for_l2cap_cid(uint16_t l2cap_cid, avdtp_context_t * context){
107     btstack_linked_list_iterator_t it;
108     btstack_linked_list_iterator_init(&it, &context->stream_endpoints);
109     while (btstack_linked_list_iterator_has_next(&it)){
110         avdtp_stream_endpoint_t * stream_endpoint = (avdtp_stream_endpoint_t *)btstack_linked_list_iterator_next(&it);
111         if (stream_endpoint->l2cap_media_cid == l2cap_cid){
112             return stream_endpoint;
113         }
114         if (stream_endpoint->l2cap_reporting_cid == l2cap_cid){
115             return stream_endpoint;
116         }
117         if (stream_endpoint->l2cap_recovery_cid == l2cap_cid){
118             return stream_endpoint;
119         }
120     }
121     return NULL;
122 }
123 
124 avdtp_stream_endpoint_t * avdtp_stream_endpoint_with_seid(uint8_t seid, avdtp_context_t * context){
125     btstack_linked_list_iterator_t it;
126     btstack_linked_list_iterator_init(&it, &context->stream_endpoints);
127     while (btstack_linked_list_iterator_has_next(&it)){
128         avdtp_stream_endpoint_t * stream_endpoint = (avdtp_stream_endpoint_t *)btstack_linked_list_iterator_next(&it);
129         if (stream_endpoint->sep.seid == seid){
130             return stream_endpoint;
131         }
132     }
133     return NULL;
134 }
135 
136 avdtp_stream_endpoint_t * avdtp_stream_endpoint_associated_with_acp_seid(uint16_t acp_seid, avdtp_context_t * context){
137     btstack_linked_list_iterator_t it;
138     btstack_linked_list_iterator_init(&it, &context->stream_endpoints);
139     while (btstack_linked_list_iterator_has_next(&it)){
140         avdtp_stream_endpoint_t * stream_endpoint = (avdtp_stream_endpoint_t *)btstack_linked_list_iterator_next(&it);
141 
142         if (stream_endpoint->remote_sep_index != AVDTP_INVALID_SEP_INDEX){
143             if (!stream_endpoint->connection) continue;
144             if (stream_endpoint->connection->remote_seps[stream_endpoint->remote_sep_index].seid == acp_seid){
145                 return stream_endpoint;
146             }
147         }
148     }
149     return NULL;
150 }
151 
152 int get_bit16(uint16_t bitmap, int position){
153     return (bitmap >> position) & 1;
154 }
155 
156 uint8_t store_bit16(uint16_t bitmap, int position, uint8_t value){
157     if (value){
158         bitmap |= 1 << position;
159     } else {
160         bitmap &= ~ (1 << position);
161     }
162     return bitmap;
163 }
164 
165 int avdtp_read_signaling_header(avdtp_signaling_packet_t * signaling_header, uint8_t * packet, uint16_t size){
166     int pos = 0;
167     if (size < 2) return pos;
168     signaling_header->transaction_label = packet[pos] >> 4;
169     signaling_header->packet_type = (avdtp_packet_type_t)((packet[pos] >> 2) & 0x03);
170     signaling_header->message_type = (avdtp_message_type_t) (packet[pos] & 0x03);
171     pos++;
172     memset(signaling_header->command, 0, sizeof(signaling_header->command));
173     switch (signaling_header->packet_type){
174         case AVDTP_SINGLE_PACKET:
175             signaling_header->num_packets = 0;
176             signaling_header->offset = 0;
177             signaling_header->size = 0;
178             break;
179         case AVDTP_END_PACKET:
180             signaling_header->num_packets = 0;
181             break;
182         case AVDTP_START_PACKET:
183             signaling_header->num_packets = packet[pos++];
184             signaling_header->size = 0;
185             signaling_header->offset = 0;
186             break;
187         case AVDTP_CONTINUE_PACKET:
188             if (signaling_header->num_packets <= 0) {
189                 log_info("    ERROR: wrong num fragmented packets\n");
190                 break;
191             }
192             signaling_header->num_packets--;
193             break;
194     }
195     signaling_header->signal_identifier = (avdtp_signal_identifier_t)(packet[pos++] & 0x3f);
196     return pos;
197 }
198 
199 int avdtp_pack_service_capabilities(uint8_t * buffer, int size, avdtp_capabilities_t caps, avdtp_service_category_t category, uint8_t pack_all_capabilities){
200     UNUSED(size);
201 
202     int i;
203     // pos = 0 reserved for length
204     int pos = 1;
205     switch(category){
206         case AVDTP_MEDIA_TRANSPORT:
207         case AVDTP_REPORTING:
208             break;
209         case AVDTP_DELAY_REPORTING:
210             if (!pack_all_capabilities) break;
211             break;
212         case AVDTP_RECOVERY:
213             buffer[pos++] = caps.recovery.recovery_type; // 0x01=RFC2733
214             buffer[pos++] = caps.recovery.maximum_recovery_window_size;
215             buffer[pos++] = caps.recovery.maximum_number_media_packets;
216             break;
217         case AVDTP_CONTENT_PROTECTION:
218             buffer[pos++] = caps.content_protection.cp_type_value_len + 2;
219             big_endian_store_16(buffer, pos, caps.content_protection.cp_type);
220             pos += 2;
221             memcpy(buffer+pos, caps.content_protection.cp_type_value, caps.content_protection.cp_type_value_len);
222             break;
223         case AVDTP_HEADER_COMPRESSION:
224             buffer[pos++] = (caps.header_compression.back_ch << 7) | (caps.header_compression.media << 6) | (caps.header_compression.recovery << 5);
225             break;
226         case AVDTP_MULTIPLEXING:
227             buffer[pos++] = caps.multiplexing_mode.fragmentation << 7;
228             for (i=0; i<caps.multiplexing_mode.transport_identifiers_num; i++){
229                 buffer[pos++] = caps.multiplexing_mode.transport_session_identifiers[i] << 7;
230                 buffer[pos++] = caps.multiplexing_mode.tcid[i] << 7;
231                 // media, reporting. recovery
232             }
233             break;
234         case AVDTP_MEDIA_CODEC:
235             buffer[pos++] = ((uint8_t)caps.media_codec.media_type) << 4;
236             buffer[pos++] = (uint8_t)caps.media_codec.media_codec_type;
237             for (i = 0; i<caps.media_codec.media_codec_information_len; i++){
238                 buffer[pos++] = caps.media_codec.media_codec_information[i];
239             }
240             break;
241         default:
242             break;
243     }
244     buffer[0] = pos - 1; // length
245     return pos;
246 }
247 
248 static int avdtp_unpack_service_capabilities_has_errors(avdtp_connection_t * connection, avdtp_service_category_t category, uint8_t cap_len){
249     connection->error_code = 0;
250 
251     if (category == AVDTP_SERVICE_CATEGORY_INVALID_0 ||
252         (category == AVDTP_SERVICE_CATEGORY_INVALID_FF && connection->signaling_packet.signal_identifier == AVDTP_SI_RECONFIGURE)){
253         log_info("    ERROR: BAD SERVICE CATEGORY %d\n", category);
254         connection->reject_service_category = category;
255         connection->error_code = BAD_SERV_CATEGORY;
256         return 1;
257     }
258 
259     if (connection->signaling_packet.signal_identifier == AVDTP_SI_RECONFIGURE){
260         if (category != AVDTP_CONTENT_PROTECTION && category != AVDTP_MEDIA_CODEC){
261             log_info("    ERROR: REJECT CATEGORY, INVALID_CAPABILITIES\n");
262             connection->reject_service_category = category;
263             connection->error_code = INVALID_CAPABILITIES;
264             return 1;
265         }
266     }
267 
268     switch(category){
269         case AVDTP_MEDIA_TRANSPORT:
270             if (cap_len != 0){
271                 log_info("    ERROR: REJECT CATEGORY, BAD_MEDIA_TRANSPORT\n");
272                 connection->reject_service_category = category;
273                 connection->error_code = BAD_MEDIA_TRANSPORT_FORMAT;
274                 return 1;
275             }
276             break;
277         case AVDTP_REPORTING:
278         case AVDTP_DELAY_REPORTING:
279             if (cap_len != 0){
280                 log_info("    ERROR: REJECT CATEGORY, BAD_LENGTH\n");
281                 connection->reject_service_category = category;
282                 connection->error_code = BAD_LENGTH;
283                 return 1;
284             }
285             break;
286         case AVDTP_RECOVERY:
287             if (cap_len < 3){
288                 log_info("    ERROR: REJECT CATEGORY, BAD_MEDIA_TRANSPORT\n");
289                 connection->reject_service_category = category;
290                 connection->error_code = BAD_RECOVERY_FORMAT;
291                 return 1;
292             }
293             break;
294         case AVDTP_CONTENT_PROTECTION:
295             if (cap_len < 2){
296                 log_info("    ERROR: REJECT CATEGORY, BAD_CP_FORMAT\n");
297                 connection->reject_service_category = category;
298                 connection->error_code = BAD_CP_FORMAT;
299                 return 1;
300             }
301             break;
302         case AVDTP_HEADER_COMPRESSION:
303             break;
304         case AVDTP_MULTIPLEXING:
305             break;
306         case AVDTP_MEDIA_CODEC:
307             break;
308         default:
309             break;
310     }
311     return 0;
312 }
313 
314 uint16_t avdtp_unpack_service_capabilities(avdtp_connection_t * connection, avdtp_capabilities_t * caps, uint8_t * packet, uint16_t size){
315     if (size == 0) return 0;
316 
317     uint16_t registered_service_categories = 0;
318     int pos = 0;
319     int i;
320     avdtp_service_category_t category = (avdtp_service_category_t)packet[pos++];
321     uint8_t cap_len = packet[pos++];
322 
323     if (avdtp_unpack_service_capabilities_has_errors(connection, category, cap_len)) return 0;
324     int processed_cap_len = 0;
325     int rfa = 0;
326 
327     while (pos < size){
328         if (cap_len > size - pos){
329             connection->reject_service_category = category;
330             connection->error_code = BAD_LENGTH;
331             return 0;
332         }
333         rfa = 0;
334         processed_cap_len = pos;
335         switch(category){
336             case AVDTP_RECOVERY:
337                 caps->recovery.recovery_type = packet[pos++];
338                 caps->recovery.maximum_recovery_window_size = packet[pos++];
339                 caps->recovery.maximum_number_media_packets = packet[pos++];
340                 break;
341             case AVDTP_CONTENT_PROTECTION:
342                 caps->content_protection.cp_type = big_endian_read_16(packet, pos);
343                 pos+=2;
344 
345                 caps->content_protection.cp_type_value_len = cap_len - 2;
346                 pos += caps->content_protection.cp_type_value_len;
347 
348                 // connection->reject_service_category = category;
349                 // connection->error_code = UNSUPPORTED_CONFIGURATION;
350                 // support for content protection goes here
351                 break;
352 
353             case AVDTP_HEADER_COMPRESSION:
354                 caps->header_compression.back_ch  = packet[pos] >> 7;
355                 caps->header_compression.media    = packet[pos] >> 6;
356                 caps->header_compression.recovery = packet[pos] >> 5;
357                 pos++;
358                 break;
359             case AVDTP_MULTIPLEXING:
360                 caps->multiplexing_mode.fragmentation = packet[pos++] >> 7;
361                 // read [tsid, tcid] for media, reporting. recovery respectively
362                 caps->multiplexing_mode.transport_identifiers_num = 3;
363                 for (i=0; i<caps->multiplexing_mode.transport_identifiers_num; i++){
364                     caps->multiplexing_mode.transport_session_identifiers[i] = packet[pos++] >> 7;
365                     caps->multiplexing_mode.tcid[i] = packet[pos++] >> 7;
366                 }
367                 break;
368             case AVDTP_MEDIA_CODEC:
369                 caps->media_codec.media_type = (avdtp_media_type_t)(packet[pos++] >> 4);
370                 caps->media_codec.media_codec_type = (avdtp_media_codec_type_t)(packet[pos++]);
371                 caps->media_codec.media_codec_information_len = cap_len - 2;
372                 caps->media_codec.media_codec_information = &packet[pos];
373                 pos += caps->media_codec.media_codec_information_len;
374                 break;
375             case AVDTP_MEDIA_TRANSPORT:
376             case AVDTP_REPORTING:
377             case AVDTP_DELAY_REPORTING:
378                 pos += cap_len;
379                 break;
380             default:
381                 pos += cap_len;
382                 rfa = 1;
383                 break;
384         }
385         processed_cap_len = pos - processed_cap_len;
386 
387         if (cap_len == processed_cap_len){
388             if (!rfa) {
389                 registered_service_categories = store_bit16(registered_service_categories, category, 1);
390             }
391             if (pos < size-2){
392                 //int old_pos = pos;
393                 category = (avdtp_service_category_t)packet[pos++];
394                 cap_len = packet[pos++];
395                 if (avdtp_unpack_service_capabilities_has_errors(connection, category, cap_len)) return 0;
396             }
397         }
398     }
399     return registered_service_categories;
400 }
401 
402 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){
403     if (signaling_packet->offset) return;
404     uint8_t pack_all_capabilities = 1;
405     signaling_packet->message_type = AVDTP_RESPONSE_ACCEPT_MSG;
406     int i;
407 
408     signaling_packet->size = 0;
409     memset(signaling_packet->command, 0 , sizeof(signaling_packet->command));
410 
411 
412     switch (identifier) {
413         case AVDTP_SI_GET_CAPABILITIES:
414             pack_all_capabilities = 0;
415             break;
416         case AVDTP_SI_GET_ALL_CAPABILITIES:
417             pack_all_capabilities = 1;
418             break;
419         case AVDTP_SI_SET_CONFIGURATION:
420             signaling_packet->command[signaling_packet->size++] = signaling_packet->acp_seid << 2;
421             signaling_packet->command[signaling_packet->size++] = signaling_packet->int_seid << 2;
422             signaling_packet->message_type = AVDTP_CMD_MSG;
423             break;
424         case AVDTP_SI_RECONFIGURE:
425             signaling_packet->command[signaling_packet->size++] = signaling_packet->acp_seid << 2;
426             signaling_packet->message_type = AVDTP_CMD_MSG;
427             break;
428         default:
429             log_error("avdtp_prepare_capabilities wrong identifier %d", identifier);
430             break;
431     }
432 
433     for (i = 1; i < 9; i++){
434         int registered_category = get_bit16(registered_service_categories, i);
435         if (!registered_category && (identifier == AVDTP_SI_SET_CONFIGURATION || identifier == AVDTP_SI_RECONFIGURE)){
436             // TODO: introduce bitmap of mandatory categories
437             if (i == 1){
438                 registered_category = 1;
439             }
440         }
441         if (registered_category){
442             // service category
443             signaling_packet->command[signaling_packet->size++] = i;
444             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);
445         }
446     }
447 
448     signaling_packet->signal_identifier = (avdtp_signal_identifier_t)identifier;
449     signaling_packet->transaction_label = transaction_label;
450 }
451 
452 int avdtp_signaling_create_fragment(uint16_t cid, avdtp_signaling_packet_t * signaling_packet, uint8_t * out_buffer) {
453     int mtu = l2cap_get_remote_mtu_for_local_cid(cid);
454     int data_len = 0;
455 
456     uint16_t offset = signaling_packet->offset;
457     uint16_t pos = 1;
458 
459     if (offset == 0){
460         if (signaling_packet->size <= mtu - 2){
461             signaling_packet->packet_type = AVDTP_SINGLE_PACKET;
462             out_buffer[pos++] = signaling_packet->signal_identifier;
463             data_len = signaling_packet->size;
464         } else {
465             signaling_packet->packet_type = AVDTP_START_PACKET;
466             out_buffer[pos++] = (mtu + signaling_packet->size)/ (mtu-1);
467             out_buffer[pos++] = signaling_packet->signal_identifier;
468             data_len = mtu - 3;
469             signaling_packet->offset = data_len;
470         }
471     } else {
472         int remaining_bytes = signaling_packet->size - offset;
473         if (remaining_bytes <= mtu - 1){
474             signaling_packet->packet_type = AVDTP_END_PACKET;
475             data_len = remaining_bytes;
476             signaling_packet->offset = 0;
477         } else{
478             signaling_packet->packet_type = AVDTP_CONTINUE_PACKET;
479             data_len = mtu - 1;
480             signaling_packet->offset += data_len;
481         }
482     }
483     out_buffer[0] = avdtp_header(signaling_packet->transaction_label, signaling_packet->packet_type, signaling_packet->message_type);
484     memcpy(out_buffer+pos, signaling_packet->command + offset, data_len);
485     pos += data_len;
486     return pos;
487 }
488 
489 
490 void avdtp_signaling_emit_connection_established(btstack_packet_handler_t callback, uint16_t avdtp_cid, bd_addr_t addr, uint8_t status){
491     if (!callback) return;
492     uint8_t event[12];
493     int pos = 0;
494     event[pos++] = HCI_EVENT_AVDTP_META;
495     event[pos++] = sizeof(event) - 2;
496     event[pos++] = AVDTP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED;
497     little_endian_store_16(event, pos, avdtp_cid);
498     pos += 2;
499     reverse_bd_addr(addr,&event[pos]);
500     pos += 6;
501     event[pos++] = status;
502     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
503 }
504 
505 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){
506     if (!callback) return;
507     uint8_t event[8];
508     int pos = 0;
509     event[pos++] = HCI_EVENT_AVDTP_META;
510     event[pos++] = sizeof(event) - 2;
511     event[pos++] = AVDTP_SUBEVENT_STREAMING_CAN_SEND_MEDIA_PACKET_NOW;
512     little_endian_store_16(event, pos, avdtp_cid);
513     pos += 2;
514     event[pos++] = seid;
515     little_endian_store_16(event, pos, sequence_number);
516     pos += 2;
517     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
518 }
519 
520 void avdtp_signaling_emit_connection_released(btstack_packet_handler_t callback, uint16_t avdtp_cid){
521     if (!callback) return;
522     uint8_t event[5];
523     int pos = 0;
524     event[pos++] = HCI_EVENT_AVDTP_META;
525     event[pos++] = sizeof(event) - 2;
526     event[pos++] = AVDTP_SUBEVENT_SIGNALING_CONNECTION_RELEASED;
527     little_endian_store_16(event, pos, avdtp_cid);
528     pos += 2;
529     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
530 }
531 
532 void avdtp_streaming_emit_connection_released(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid){
533     if (!callback) return;
534     uint8_t event[6];
535     int pos = 0;
536     event[pos++] = HCI_EVENT_AVDTP_META;
537     event[pos++] = sizeof(event) - 2;
538     event[pos++] = AVDTP_SUBEVENT_STREAMING_CONNECTION_RELEASED;
539     little_endian_store_16(event, pos, avdtp_cid);
540     pos += 2;
541     event[pos++] = local_seid;
542     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
543 }
544 
545 void avdtp_streaming_emit_connection_established(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, uint8_t status){
546     if (!callback) return;
547     uint8_t event[8];
548     int pos = 0;
549     event[pos++] = HCI_EVENT_AVDTP_META;
550     event[pos++] = sizeof(event) - 2;
551     event[pos++] = AVDTP_SUBEVENT_STREAMING_CONNECTION_ESTABLISHED;
552     little_endian_store_16(event, pos, avdtp_cid);
553     pos += 2;
554     event[pos++] = local_seid;
555     event[pos++] = remote_seid;
556     event[pos++] = status;
557     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
558 }
559 
560 void avdtp_signaling_emit_sep(btstack_packet_handler_t callback, uint16_t avdtp_cid, avdtp_sep_t sep){
561     if (!callback) return;
562     uint8_t event[9];
563     int pos = 0;
564     event[pos++] = HCI_EVENT_AVDTP_META;
565     event[pos++] = sizeof(event) - 2;
566     event[pos++] = AVDTP_SUBEVENT_SIGNALING_SEP_FOUND;
567     little_endian_store_16(event, pos, avdtp_cid);
568     pos += 2;
569     event[pos++] = sep.seid;
570     event[pos++] = sep.in_use;
571     event[pos++] = sep.media_type;
572     event[pos++] = sep.type;
573     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
574 }
575 
576 void avdtp_signaling_emit_accept(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid, avdtp_signal_identifier_t identifier){
577     if (!callback) return;
578     uint8_t event[7];
579     int pos = 0;
580     event[pos++] = HCI_EVENT_AVDTP_META;
581     event[pos++] = sizeof(event) - 2;
582     event[pos++] = AVDTP_SUBEVENT_SIGNALING_ACCEPT;
583     little_endian_store_16(event, pos, avdtp_cid);
584     pos += 2;
585     event[pos++] = local_seid;
586     event[pos++] = identifier;
587     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
588 }
589 
590 void avdtp_signaling_emit_reject(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid, avdtp_signal_identifier_t identifier){
591     if (!callback) return;
592     uint8_t event[7];
593     int pos = 0;
594     event[pos++] = HCI_EVENT_AVDTP_META;
595     event[pos++] = sizeof(event) - 2;
596     event[pos++] = AVDTP_SUBEVENT_SIGNALING_REJECT;
597     little_endian_store_16(event, pos, avdtp_cid);
598     pos += 2;
599     event[pos++] = local_seid;
600     event[pos++] = identifier;
601     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
602 }
603 
604 void avdtp_signaling_emit_general_reject(btstack_packet_handler_t callback, uint16_t avdtp_cid, uint8_t local_seid, avdtp_signal_identifier_t identifier){
605     if (!callback) return;
606     uint8_t event[7];
607     int pos = 0;
608     event[pos++] = HCI_EVENT_AVDTP_META;
609     event[pos++] = sizeof(event) - 2;
610     event[pos++] = AVDTP_SUBEVENT_SIGNALING_GENERAL_REJECT;
611     little_endian_store_16(event, pos, avdtp_cid);
612     pos += 2;
613     event[pos++] = local_seid;
614     event[pos++] = identifier;
615     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
616 }
617 
618 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){
619     if (!callback) return;
620     uint8_t event[15];
621     int pos = 0;
622     event[pos++] = HCI_EVENT_AVDTP_META;
623     event[pos++] = sizeof(event) - 2;
624     event[pos++] = AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CAPABILITY;
625     little_endian_store_16(event, pos, avdtp_cid);
626     pos += 2;
627     event[pos++] = local_seid;
628     event[pos++] = remote_seid;
629     event[pos++] = media_codec.media_type;
630     event[pos++] = media_codec.media_codec_information[0] >> 4;
631     event[pos++] = media_codec.media_codec_information[0] & 0x0F;
632     event[pos++] = media_codec.media_codec_information[1] >> 4;
633     event[pos++] = (media_codec.media_codec_information[1] & 0x0F) >> 2;
634     event[pos++] = media_codec.media_codec_information[1] & 0x03;
635     event[pos++] = media_codec.media_codec_information[2];
636     event[pos++] = media_codec.media_codec_information[3];
637     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
638 }
639 
640 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){
641     if (!callback) return;
642         uint8_t event[111];
643     int pos = 0;
644     event[pos++] = HCI_EVENT_AVDTP_META;
645     event[pos++] = sizeof(event) - 2;
646     event[pos++] = AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CAPABILITY;
647     little_endian_store_16(event, pos, avdtp_cid);
648     pos += 2;
649     event[pos++] = local_seid;
650     event[pos++] = remote_seid;
651     event[pos++] = media_codec.media_type;
652     little_endian_store_16(event, pos, media_codec.media_codec_type);
653     pos += 2;
654     little_endian_store_16(event, pos, media_codec.media_codec_information_len);
655     pos += 2;
656     if (media_codec.media_codec_information_len < 100){
657         memcpy(event+pos, media_codec.media_codec_information, media_codec.media_codec_information_len);
658     } else {
659         memcpy(event+pos, media_codec.media_codec_information, 100);
660     }
661     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
662 }
663 
664 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, adtvp_media_codec_capabilities_t media_codec, uint8_t reconfigure){
665     if (!callback) return;
666     uint8_t event[16+2];
667     int pos = 0;
668     event[pos++] = HCI_EVENT_AVDTP_META;
669     event[pos++] = sizeof(event) - 2;
670 
671     event[pos++] = AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CONFIGURATION;
672     little_endian_store_16(event, pos, avdtp_cid);
673     pos += 2;
674     event[pos++] = local_seid;
675     event[pos++] = remote_seid;
676     event[pos++] = reconfigure;
677 
678     uint8_t num_channels = 0;
679     uint16_t sampling_frequency = 0;
680     uint8_t subbands = 0;
681     uint8_t block_length = 0;
682 
683     uint8_t sampling_frequency_bitmap = media_codec.media_codec_information[0] >> 4;
684     uint8_t channel_mode_bitmap = media_codec.media_codec_information[0] & 0x0F;
685     uint8_t block_length_bitmap = media_codec.media_codec_information[1] >> 4;
686     uint8_t subbands_bitmap = (media_codec.media_codec_information[1] & 0x0F) >> 2;
687 
688     if (channel_mode_bitmap & AVDTP_SBC_MONO){
689         num_channels = 1;
690     }
691     if ( (channel_mode_bitmap & AVDTP_SBC_JOINT_STEREO) ||
692          (channel_mode_bitmap & AVDTP_SBC_STEREO) ||
693          (channel_mode_bitmap & AVDTP_SBC_DUAL_CHANNEL) ){
694         num_channels = 2;
695     }
696 
697     if (sampling_frequency_bitmap & AVDTP_SBC_16000){
698         sampling_frequency = 16000;
699     }
700     if (sampling_frequency_bitmap & AVDTP_SBC_32000){
701         sampling_frequency = 32000;
702     }
703     if (sampling_frequency_bitmap & AVDTP_SBC_44100){
704         sampling_frequency = 44100;
705     }
706     if (sampling_frequency_bitmap & AVDTP_SBC_48000){
707         sampling_frequency = 48000;
708     }
709 
710     if (subbands_bitmap & AVDTP_SBC_SUBBANDS_4){
711         subbands = 4;
712     }
713     if (subbands_bitmap & AVDTP_SBC_SUBBANDS_8){
714         subbands = 8;
715     }
716 
717     if (block_length_bitmap & AVDTP_SBC_BLOCK_LENGTH_4){
718         block_length = 4;
719     }
720     if (block_length_bitmap & AVDTP_SBC_BLOCK_LENGTH_8){
721         block_length = 8;
722     }
723     if (block_length_bitmap & AVDTP_SBC_BLOCK_LENGTH_12){
724         block_length = 12;
725     }
726     if (block_length_bitmap & AVDTP_SBC_BLOCK_LENGTH_16){
727         block_length = 16;
728     }
729 
730     event[pos++] = media_codec.media_type;
731     little_endian_store_16(event, pos, sampling_frequency);
732     pos += 2;
733 
734     event[pos++] = channel_mode_bitmap;
735     event[pos++] = num_channels;
736     event[pos++] = block_length;
737     event[pos++] = subbands;
738     event[pos++] = media_codec.media_codec_information[1] & 0x03;
739     event[pos++] = media_codec.media_codec_information[2];
740     event[pos++] = media_codec.media_codec_information[3];
741     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
742 }
743 
744 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, adtvp_media_codec_capabilities_t media_codec){
745     if (!callback) return;
746     avdtp_signaling_emit_media_codec_sbc(callback, avdtp_cid, local_seid, remote_seid, media_codec, 0);
747 }
748 
749 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, adtvp_media_codec_capabilities_t media_codec){
750     if (!callback) return;
751     avdtp_signaling_emit_media_codec_sbc(callback, avdtp_cid, local_seid, remote_seid, media_codec, 1);
752 }
753 
754 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){
755     uint8_t event[112];
756     int pos = 0;
757     event[pos++] = HCI_EVENT_AVDTP_META;
758     event[pos++] = sizeof(event) - 2;
759     event[pos++] = AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CONFIGURATION;
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++] = reconfigure;
765 
766     event[pos++] = media_codec.media_type;
767     little_endian_store_16(event, pos, media_codec.media_codec_type);
768     pos += 2;
769     little_endian_store_16(event, pos, media_codec.media_codec_information_len);
770     pos += 2;
771 
772     if (media_codec.media_codec_information_len < 100){
773         memcpy(event+pos, media_codec.media_codec_information, media_codec.media_codec_information_len);
774     } else {
775         memcpy(event+pos, media_codec.media_codec_information, 100);
776     }
777     (*callback)(HCI_EVENT_PACKET, 0, event, sizeof(event));
778 }
779 
780 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){
781     if (!callback) return;
782     avdtp_signaling_emit_media_codec_other(callback, avdtp_cid, local_seid, remote_seid, media_codec, 0);
783 }
784 
785 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){
786     if (!callback) return;
787     avdtp_signaling_emit_media_codec_other(callback, avdtp_cid, local_seid, remote_seid, media_codec, 1);
788 }
789 
790 
791 void avdtp_request_can_send_now_acceptor(avdtp_connection_t * connection, uint16_t l2cap_cid){
792     connection->wait_to_send_acceptor = 1;
793     l2cap_request_can_send_now_event(l2cap_cid);
794 }
795 void avdtp_request_can_send_now_initiator(avdtp_connection_t * connection, uint16_t l2cap_cid){
796     connection->wait_to_send_initiator = 1;
797     l2cap_request_can_send_now_event(l2cap_cid);
798 }
799 void avdtp_request_can_send_now_self(avdtp_connection_t * connection, uint16_t l2cap_cid){
800     connection->wait_to_send_self = 1;
801     l2cap_request_can_send_now_event(l2cap_cid);
802 }
803 
804 uint8_t avdtp_get_index_of_remote_stream_endpoint_with_seid(avdtp_stream_endpoint_t * stream_endpoint, uint16_t seid){
805     if (!stream_endpoint->connection) return AVDTP_INVALID_SEP_INDEX;
806     if (stream_endpoint->connection->remote_seps[stream_endpoint->remote_sep_index].seid == seid){
807         return stream_endpoint->remote_sep_index;
808     }
809     int i;
810     for (i=0; i < stream_endpoint->connection->remote_seps_num; i++){
811         if (stream_endpoint->connection->remote_seps[i].seid == seid){
812             return i;
813         }
814     }
815     return AVDTP_INVALID_SEP_INDEX;
816 }
817 
818 uint8_t avdtp_find_remote_sep(avdtp_connection_t * connection, uint8_t remote_seid){
819     if (!connection) return AVDTP_INVALID_SEP_INDEX;
820     int i;
821     for (i = 0; i < connection->remote_seps_num; i++){
822         if (connection->remote_seps[i].seid == remote_seid){
823             return i;
824         }
825     }
826     return AVDTP_INVALID_SEP_INDEX;
827 }
828 
829 
830 uint8_t avdtp_local_seid(avdtp_stream_endpoint_t * stream_endpoint){
831     if (!stream_endpoint) return 0;
832     return stream_endpoint->sep.seid;
833 
834 }
835 
836 uint8_t avdtp_remote_seid(avdtp_stream_endpoint_t * stream_endpoint){
837     if (!stream_endpoint) return 0;
838     if (!stream_endpoint->connection) return 0;
839     return stream_endpoint->connection->remote_seps[stream_endpoint->remote_sep_index].seid;
840 }
841