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