3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2006-2010 Nokia Corporation
6 * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
36 #include <netinet/in.h>
38 #include <bluetooth/bluetooth.h>
39 #include <bluetooth/sdp.h>
40 #include <bluetooth/sdp_lib.h>
43 #include <dbus/dbus.h>
47 #include "../src/adapter.h"
48 #include "../src/manager.h"
49 #include "../src/device.h"
55 #include "glib-compat.h"
65 # define MAX(x, y) ((x) > (y) ? (x) : (y))
68 #define AVDTP_DISCOVER 0x01
69 #define AVDTP_GET_CAPABILITIES 0x02
70 #define AVDTP_SET_CONFIGURATION 0x03
71 #define AVDTP_GET_CONFIGURATION 0x04
72 #define AVDTP_RECONFIGURE 0x05
73 #define AVDTP_OPEN 0x06
74 #define AVDTP_START 0x07
75 #define AVDTP_CLOSE 0x08
76 #define AVDTP_SUSPEND 0x09
77 #define AVDTP_ABORT 0x0A
78 #define AVDTP_SECURITY_CONTROL 0x0B
79 #define AVDTP_GET_ALL_CAPABILITIES 0x0C
80 #define AVDTP_DELAY_REPORT 0x0D
82 #define AVDTP_PKT_TYPE_SINGLE 0x00
83 #define AVDTP_PKT_TYPE_START 0x01
84 #define AVDTP_PKT_TYPE_CONTINUE 0x02
85 #define AVDTP_PKT_TYPE_END 0x03
87 #define AVDTP_MSG_TYPE_COMMAND 0x00
88 #define AVDTP_MSG_TYPE_GEN_REJECT 0x01
89 #define AVDTP_MSG_TYPE_ACCEPT 0x02
90 #define AVDTP_MSG_TYPE_REJECT 0x03
92 #ifdef __TIZEN_PATCH__
93 #define REQ_TIMEOUT 10
98 #define ABORT_TIMEOUT 2
99 #define DISCONNECT_TIMEOUT 1
100 #define STREAM_TIMEOUT 20
102 #if __BYTE_ORDER == __LITTLE_ENDIAN
104 struct avdtp_common_header {
105 uint8_t message_type:2;
106 uint8_t packet_type:2;
107 uint8_t transaction:4;
108 } __attribute__ ((packed));
110 struct avdtp_single_header {
111 uint8_t message_type:2;
112 uint8_t packet_type:2;
113 uint8_t transaction:4;
116 } __attribute__ ((packed));
118 struct avdtp_start_header {
119 uint8_t message_type:2;
120 uint8_t packet_type:2;
121 uint8_t transaction:4;
122 uint8_t no_of_packets;
125 } __attribute__ ((packed));
127 struct avdtp_continue_header {
128 uint8_t message_type:2;
129 uint8_t packet_type:2;
130 uint8_t transaction:4;
131 } __attribute__ ((packed));
139 uint8_t media_type:4;
140 } __attribute__ ((packed));
145 } __attribute__ ((packed));
147 #elif __BYTE_ORDER == __BIG_ENDIAN
149 struct avdtp_common_header {
150 uint8_t transaction:4;
151 uint8_t packet_type:2;
152 uint8_t message_type:2;
153 } __attribute__ ((packed));
155 struct avdtp_single_header {
156 uint8_t transaction:4;
157 uint8_t packet_type:2;
158 uint8_t message_type:2;
161 } __attribute__ ((packed));
163 struct avdtp_start_header {
164 uint8_t transaction:4;
165 uint8_t packet_type:2;
166 uint8_t message_type:2;
167 uint8_t no_of_packets;
170 } __attribute__ ((packed));
172 struct avdtp_continue_header {
173 uint8_t transaction:4;
174 uint8_t packet_type:2;
175 uint8_t message_type:2;
176 } __attribute__ ((packed));
182 uint8_t media_type:4;
185 } __attribute__ ((packed));
190 } __attribute__ ((packed));
193 #error "Unknown byte order"
198 struct discover_resp {
199 struct seid_info seps[0];
200 } __attribute__ ((packed));
204 } __attribute__ ((packed));
207 struct seid first_seid;
208 struct seid other_seids[0];
209 } __attribute__ ((packed));
212 struct seid first_seid;
213 struct seid other_seids[0];
214 } __attribute__ ((packed));
218 } __attribute__ ((packed));
223 } __attribute__ ((packed));
225 #if __BYTE_ORDER == __LITTLE_ENDIAN
230 } __attribute__ ((packed));
239 } __attribute__ ((packed));
245 } __attribute__ ((packed));
252 uint8_t serv_cap_len;
255 } __attribute__ ((packed));
261 } __attribute__ ((packed));
263 #elif __BYTE_ORDER == __BIG_ENDIAN
268 } __attribute__ ((packed));
277 } __attribute__ ((packed));
283 } __attribute__ ((packed));
290 uint8_t serv_cap_len;
293 } __attribute__ ((packed));
299 } __attribute__ ((packed));
302 #error "Unknown byte order"
309 uint8_t message_type;
320 struct avdtp_stream *stream; /* Set if the request targeted a stream */
324 struct avdtp_remote_sep {
328 struct avdtp_service_capability *codec;
329 gboolean delay_reporting;
330 GSList *caps; /* of type struct avdtp_service_capability */
331 struct avdtp_stream *stream;
334 struct avdtp_server {
342 struct avdtp_local_sep {
344 struct avdtp_stream *stream;
345 struct seid_info info;
347 gboolean delay_reporting;
349 struct avdtp_sep_ind *ind;
350 struct avdtp_sep_cfm *cfm;
352 struct avdtp_server *server;
355 struct stream_callback {
356 avdtp_stream_state_cb cb;
361 struct avdtp_state_callback {
362 avdtp_session_state_cb cb;
367 struct avdtp_stream {
371 struct avdtp *session;
372 struct avdtp_local_sep *lsep;
376 struct avdtp_service_capability *codec;
377 guint io_id; /* Transport GSource ID */
378 guint timer; /* Waiting for other side to close or open
379 * the transport channel */
380 gboolean open_acp; /* If we are in ACT role for Open */
381 gboolean close_int; /* If we are in INT role for Close */
382 gboolean abort_int; /* If we are in INT role for Abort */
384 gboolean delay_reporting;
385 uint16_t delay; /* AVDTP 1.3 Delay Reporting feature */
386 gboolean starting; /* only valid while sep state == OPEN */
389 /* Structure describing an AVDTP connection between two devices */
397 struct avdtp_server *server;
400 avdtp_session_state_t state;
402 /* True if the session should be automatically disconnected */
405 /* True if the entire device is being disconnected */
406 gboolean device_disconnect;
411 GSList *seps; /* Elements of type struct avdtp_remote_sep * */
413 GSList *streams; /* Elements of type struct avdtp_stream * */
415 GSList *req_queue; /* Elements of type struct pending_req * */
416 GSList *prio_queue; /* Same as req_queue but is processed before it */
418 struct avdtp_stream *pending_open;
427 avdtp_discover_cb_t discov_cb;
430 struct pending_req *req;
434 /* Attempt stream setup instead of disconnecting */
435 gboolean stream_setup;
437 DBusPendingCall *pending_auth;
440 static GSList *servers = NULL;
442 static GSList *avdtp_callbacks = NULL;
444 static gboolean auto_connect = TRUE;
446 static int send_request(struct avdtp *session, gboolean priority,
447 struct avdtp_stream *stream, uint8_t signal_id,
448 void *buffer, size_t size);
449 static gboolean avdtp_parse_resp(struct avdtp *session,
450 struct avdtp_stream *stream,
451 uint8_t transaction, uint8_t signal_id,
452 void *buf, int size);
453 static gboolean avdtp_parse_rej(struct avdtp *session,
454 struct avdtp_stream *stream,
455 uint8_t transaction, uint8_t signal_id,
456 void *buf, int size);
457 static int process_queue(struct avdtp *session);
458 static void connection_lost(struct avdtp *session, int err);
459 static void avdtp_sep_set_state(struct avdtp *session,
460 struct avdtp_local_sep *sep,
461 avdtp_state_t state);
462 static void auth_cb(DBusError *derr, void *user_data);
464 static struct avdtp_server *find_server(GSList *list, const bdaddr_t *src)
466 for (; list; list = list->next) {
467 struct avdtp_server *server = list->data;
469 if (bacmp(&server->src, src) == 0)
476 static const char *avdtp_statestr(avdtp_state_t state)
479 case AVDTP_STATE_IDLE:
481 case AVDTP_STATE_CONFIGURED:
483 case AVDTP_STATE_OPEN:
485 case AVDTP_STATE_STREAMING:
487 case AVDTP_STATE_CLOSING:
489 case AVDTP_STATE_ABORTING:
492 return "<unknown state>";
496 static gboolean try_send(int sk, void *data, size_t len)
501 err = send(sk, data, len, 0);
502 } while (err < 0 && errno == EINTR);
505 error("send: %s (%d)", strerror(errno), errno);
507 } else if ((size_t) err != len) {
508 error("try_send: complete buffer not sent (%d/%zu bytes)",
516 static gboolean avdtp_send(struct avdtp *session, uint8_t transaction,
517 uint8_t message_type, uint8_t signal_id,
518 void *data, size_t len)
520 unsigned int cont_fragments, sent;
521 struct avdtp_start_header start;
522 struct avdtp_continue_header cont;
525 if (session->io == NULL) {
526 error("avdtp_send: session is closed");
530 sock = g_io_channel_unix_get_fd(session->io);
532 /* Single packet - no fragmentation */
533 if (sizeof(struct avdtp_single_header) + len <= session->omtu) {
534 struct avdtp_single_header single;
536 memset(&single, 0, sizeof(single));
538 single.transaction = transaction;
539 single.packet_type = AVDTP_PKT_TYPE_SINGLE;
540 single.message_type = message_type;
541 single.signal_id = signal_id;
543 memcpy(session->buf, &single, sizeof(single));
544 memcpy(session->buf + sizeof(single), data, len);
546 return try_send(sock, session->buf, sizeof(single) + len);
549 /* Check if there is enough space to start packet */
550 if (session->omtu < sizeof(start)) {
551 error("No enough space to fragment packet");
555 /* Count the number of needed fragments */
556 cont_fragments = (len - (session->omtu - sizeof(start))) /
557 (session->omtu - sizeof(cont)) + 1;
559 DBG("%zu bytes split into %d fragments", len, cont_fragments + 1);
561 /* Send the start packet */
562 memset(&start, 0, sizeof(start));
563 start.transaction = transaction;
564 start.packet_type = AVDTP_PKT_TYPE_START;
565 start.message_type = message_type;
566 start.no_of_packets = cont_fragments + 1;
567 start.signal_id = signal_id;
569 memcpy(session->buf, &start, sizeof(start));
570 memcpy(session->buf + sizeof(start), data,
571 session->omtu - sizeof(start));
573 if (!try_send(sock, session->buf, session->omtu))
576 DBG("first packet with %zu bytes sent", session->omtu - sizeof(start));
578 sent = session->omtu - sizeof(start);
580 /* Send the continue fragments and the end packet */
585 if (left + sizeof(cont) > session->omtu) {
586 cont.packet_type = AVDTP_PKT_TYPE_CONTINUE;
587 to_copy = session->omtu - sizeof(cont);
588 DBG("sending continue with %d bytes", to_copy);
590 cont.packet_type = AVDTP_PKT_TYPE_END;
592 DBG("sending end with %d bytes", to_copy);
595 cont.transaction = transaction;
596 cont.message_type = message_type;
598 memcpy(session->buf, &cont, sizeof(cont));
599 memcpy(session->buf + sizeof(cont), data + sent, to_copy);
601 if (!try_send(sock, session->buf, to_copy + sizeof(cont)))
610 static void pending_req_free(struct pending_req *req)
613 g_source_remove(req->timeout);
618 static void close_stream(struct avdtp_stream *stream)
622 if (stream->io == NULL)
625 sock = g_io_channel_unix_get_fd(stream->io);
627 shutdown(sock, SHUT_RDWR);
629 g_io_channel_shutdown(stream->io, FALSE, NULL);
631 g_io_channel_unref(stream->io);
635 static gboolean stream_close_timeout(gpointer user_data)
637 struct avdtp_stream *stream = user_data;
639 DBG("Timed out waiting for peer to close the transport channel");
643 close_stream(stream);
648 static gboolean stream_open_timeout(gpointer user_data)
650 struct avdtp_stream *stream = user_data;
652 DBG("Timed out waiting for peer to open the transport channel");
656 stream->session->pending_open = NULL;
658 avdtp_abort(stream->session, stream);
663 static gboolean disconnect_timeout(gpointer user_data)
665 struct avdtp *session = user_data;
666 struct audio_device *dev;
667 gboolean stream_setup;
669 session->dc_timer = 0;
670 stream_setup = session->stream_setup;
671 session->stream_setup = FALSE;
673 dev = manager_get_device(&session->server->src, &session->dst, FALSE);
675 if (dev && dev->sink && stream_setup)
676 sink_setup_stream(dev->sink, session);
677 else if (dev && dev->source && stream_setup)
678 source_setup_stream(dev->source, session);
680 connection_lost(session, ETIMEDOUT);
685 static void remove_disconnect_timer(struct avdtp *session)
687 g_source_remove(session->dc_timer);
688 session->dc_timer = 0;
689 session->stream_setup = FALSE;
692 static void set_disconnect_timer(struct avdtp *session)
694 if (session->dc_timer)
695 remove_disconnect_timer(session);
697 if (session->device_disconnect) {
698 session->dc_timer = g_idle_add(disconnect_timeout, session);
702 session->dc_timer = g_timeout_add_seconds(DISCONNECT_TIMEOUT,
707 void avdtp_error_init(struct avdtp_error *err, uint8_t category, int id)
709 err->category = category;
711 if (category == AVDTP_ERRNO)
712 err->err.posix_errno = id;
714 err->err.error_code = id;
717 uint8_t avdtp_error_category(struct avdtp_error *err)
719 return err->category;
722 int avdtp_error_error_code(struct avdtp_error *err)
724 assert(err->category != AVDTP_ERRNO);
725 return err->err.error_code;
728 int avdtp_error_posix_errno(struct avdtp_error *err)
730 assert(err->category == AVDTP_ERRNO);
731 return err->err.posix_errno;
734 static struct avdtp_stream *find_stream_by_rseid(struct avdtp *session,
739 for (l = session->streams; l != NULL; l = g_slist_next(l)) {
740 struct avdtp_stream *stream = l->data;
742 if (stream->rseid == rseid)
749 static struct avdtp_remote_sep *find_remote_sep(GSList *seps, uint8_t seid)
753 for (l = seps; l != NULL; l = g_slist_next(l)) {
754 struct avdtp_remote_sep *sep = l->data;
756 if (sep->seid == seid)
763 static void avdtp_set_state(struct avdtp *session,
764 avdtp_session_state_t new_state)
767 struct audio_device *dev;
769 avdtp_session_state_t old_state = session->state;
771 session->state = new_state;
773 avdtp_get_peers(session, &src, &dst);
774 dev = manager_get_device(&src, &dst, FALSE);
776 error("avdtp_set_state(): no matching audio device");
780 for (l = avdtp_callbacks; l != NULL; l = l->next) {
781 struct avdtp_state_callback *cb = l->data;
782 cb->cb(dev, session, old_state, new_state, cb->user_data);
786 static void stream_free(struct avdtp_stream *stream)
788 struct avdtp_remote_sep *rsep;
790 stream->lsep->info.inuse = 0;
791 stream->lsep->stream = NULL;
793 rsep = find_remote_sep(stream->session->seps, stream->rseid);
798 g_source_remove(stream->timer);
801 close_stream(stream);
804 g_source_remove(stream->io_id);
806 g_slist_free_full(stream->callbacks, g_free);
807 g_slist_free_full(stream->caps, g_free);
812 static gboolean stream_timeout(gpointer user_data)
814 struct avdtp_stream *stream = user_data;
815 struct avdtp *session = stream->session;
817 if (avdtp_close(session, stream, FALSE) < 0)
818 error("stream_timeout: closing AVDTP stream failed");
820 stream->idle_timer = 0;
825 static gboolean transport_cb(GIOChannel *chan, GIOCondition cond,
828 struct avdtp_stream *stream = data;
829 struct avdtp_local_sep *sep = stream->lsep;
831 if (stream->close_int && sep->cfm && sep->cfm->close)
832 sep->cfm->close(stream->session, sep, stream, NULL,
835 if (!(cond & G_IO_NVAL))
836 close_stream(stream);
840 if (!stream->abort_int)
841 avdtp_sep_set_state(stream->session, sep, AVDTP_STATE_IDLE);
846 static int get_send_buffer_size(int sk)
849 socklen_t optlen = sizeof(size);
851 if (getsockopt(sk, SOL_SOCKET, SO_SNDBUF, &size, &optlen) < 0) {
853 error("getsockopt(SO_SNDBUF) failed: %s (%d)", strerror(-err),
859 * Doubled value is returned by getsockopt since kernel uses that
860 * space for its own purposes (see man 7 socket, bookkeeping overhead
866 static int set_send_buffer_size(int sk, int size)
868 socklen_t optlen = sizeof(size);
870 if (setsockopt(sk, SOL_SOCKET, SO_SNDBUF, &size, optlen) < 0) {
872 error("setsockopt(SO_SNDBUF) failed: %s (%d)", strerror(-err),
880 static void handle_transport_connect(struct avdtp *session, GIOChannel *io,
881 uint16_t imtu, uint16_t omtu)
883 struct avdtp_stream *stream = session->pending_open;
884 struct avdtp_local_sep *sep = stream->lsep;
885 int sk, buf_size, min_buf_size;
888 session->pending_open = NULL;
891 g_source_remove(stream->timer);
896 if (!stream->open_acp && sep->cfm && sep->cfm->open) {
897 struct avdtp_error err;
898 avdtp_error_init(&err, AVDTP_ERRNO, EIO);
899 sep->cfm->open(session, sep, NULL, &err,
905 if (stream->io == NULL)
906 stream->io = g_io_channel_ref(io);
911 /* Apply special settings only if local SEP is of type SRC */
912 if (sep->info.type != AVDTP_SEP_TYPE_SOURCE)
915 bt_io_set(stream->io, BT_IO_L2CAP, &err,
916 BT_IO_OPT_FLUSHABLE, TRUE,
919 error("Enabling flushable packets failed: %s", err->message);
922 DBG("Flushable packets enabled");
924 sk = g_io_channel_unix_get_fd(stream->io);
925 buf_size = get_send_buffer_size(sk);
929 DBG("sk %d, omtu %d, send buffer size %d", sk, omtu, buf_size);
930 min_buf_size = omtu * 2;
931 if (buf_size < min_buf_size) {
932 DBG("send buffer size to be increassed to %d",
934 set_send_buffer_size(sk, min_buf_size);
938 if (!stream->open_acp && sep->cfm && sep->cfm->open)
939 sep->cfm->open(session, sep, stream, NULL, sep->user_data);
941 avdtp_sep_set_state(session, sep, AVDTP_STATE_OPEN);
943 stream->io_id = g_io_add_watch(io, G_IO_ERR | G_IO_HUP | G_IO_NVAL,
944 (GIOFunc) transport_cb, stream);
947 static int pending_req_cmp(gconstpointer a, gconstpointer b)
949 const struct pending_req *req = a;
950 const struct avdtp_stream *stream = b;
952 if (req->stream == stream)
958 static void cleanup_queue(struct avdtp *session, struct avdtp_stream *stream)
961 struct pending_req *req;
963 while ((l = g_slist_find_custom(session->prio_queue, stream,
966 pending_req_free(req);
967 session->prio_queue = g_slist_remove(session->prio_queue, req);
970 while ((l = g_slist_find_custom(session->req_queue, stream,
973 pending_req_free(req);
974 session->req_queue = g_slist_remove(session->req_queue, req);
978 static void handle_unanswered_req(struct avdtp *session,
979 struct avdtp_stream *stream)
981 struct pending_req *req;
982 struct avdtp_local_sep *lsep;
983 struct avdtp_error err;
985 if (session->req->signal_id == AVDTP_ABORT) {
986 /* Avoid freeing the Abort request here */
987 DBG("handle_unanswered_req: Abort req, returning");
988 session->req->stream = NULL;
995 avdtp_error_init(&err, AVDTP_ERRNO, EIO);
999 switch (req->signal_id) {
1000 case AVDTP_RECONFIGURE:
1001 error("No reply to Reconfigure request");
1002 if (lsep && lsep->cfm && lsep->cfm->reconfigure)
1003 lsep->cfm->reconfigure(session, lsep, stream, &err,
1007 error("No reply to Open request");
1008 if (lsep && lsep->cfm && lsep->cfm->open)
1009 lsep->cfm->open(session, lsep, stream, &err,
1013 error("No reply to Start request");
1014 if (lsep && lsep->cfm && lsep->cfm->start)
1015 lsep->cfm->start(session, lsep, stream, &err,
1019 error("No reply to Suspend request");
1020 if (lsep && lsep->cfm && lsep->cfm->suspend)
1021 lsep->cfm->suspend(session, lsep, stream, &err,
1025 error("No reply to Close request");
1026 if (lsep && lsep->cfm && lsep->cfm->close)
1027 lsep->cfm->close(session, lsep, stream, &err,
1030 case AVDTP_SET_CONFIGURATION:
1031 error("No reply to SetConfiguration request");
1032 if (lsep && lsep->cfm && lsep->cfm->set_configuration)
1033 lsep->cfm->set_configuration(session, lsep, stream,
1034 &err, lsep->user_data);
1037 pending_req_free(req);
1040 static void avdtp_sep_set_state(struct avdtp *session,
1041 struct avdtp_local_sep *sep,
1042 avdtp_state_t state)
1044 struct avdtp_stream *stream = sep->stream;
1045 avdtp_state_t old_state;
1046 struct avdtp_error err, *err_ptr = NULL;
1050 error("Error changing sep state: stream not available");
1054 if (sep->state == state) {
1055 avdtp_error_init(&err, AVDTP_ERRNO, EIO);
1056 DBG("stream state change failed: %s", avdtp_strerror(&err));
1060 DBG("stream state changed: %s -> %s",
1061 avdtp_statestr(sep->state),
1062 avdtp_statestr(state));
1065 old_state = sep->state;
1069 case AVDTP_STATE_CONFIGURED:
1070 if (sep->info.type == AVDTP_SEP_TYPE_SINK)
1071 avdtp_delay_report(session, stream, stream->delay);
1073 case AVDTP_STATE_OPEN:
1074 stream->starting = FALSE;
1075 if (old_state > AVDTP_STATE_OPEN && session->auto_dc)
1076 stream->idle_timer = g_timeout_add_seconds(STREAM_TIMEOUT,
1080 case AVDTP_STATE_STREAMING:
1081 case AVDTP_STATE_CLOSING:
1082 case AVDTP_STATE_ABORTING:
1083 if (stream->idle_timer) {
1084 g_source_remove(stream->idle_timer);
1085 stream->idle_timer = 0;
1088 case AVDTP_STATE_IDLE:
1089 if (stream->idle_timer) {
1090 g_source_remove(stream->idle_timer);
1091 stream->idle_timer = 0;
1093 if (session->pending_open == stream)
1094 handle_transport_connect(session, NULL, 0, 0);
1095 if (session->req && session->req->stream == stream)
1096 handle_unanswered_req(session, stream);
1097 /* Remove pending commands for this stream from the queue */
1098 cleanup_queue(session, stream);
1104 l = stream->callbacks;
1106 struct stream_callback *cb = l->data;
1107 l = g_slist_next(l);
1108 cb->cb(stream, old_state, state, err_ptr, cb->user_data);
1111 if (state == AVDTP_STATE_IDLE &&
1112 g_slist_find(session->streams, stream)) {
1113 session->streams = g_slist_remove(session->streams, stream);
1114 stream_free(stream);
1118 static void finalize_discovery(struct avdtp *session, int err)
1120 struct avdtp_error avdtp_err;
1122 avdtp_error_init(&avdtp_err, AVDTP_ERRNO, err);
1124 if (!session->discov_cb)
1127 session->discov_cb(session, session->seps,
1128 err ? &avdtp_err : NULL,
1129 session->user_data);
1131 session->discov_cb = NULL;
1132 session->user_data = NULL;
1135 static void release_stream(struct avdtp_stream *stream, struct avdtp *session)
1137 struct avdtp_local_sep *sep = stream->lsep;
1139 if (sep->cfm && sep->cfm->abort &&
1140 (sep->state != AVDTP_STATE_ABORTING ||
1142 sep->cfm->abort(session, sep, stream, NULL, sep->user_data);
1144 avdtp_sep_set_state(session, sep, AVDTP_STATE_IDLE);
1147 static int avdtp_cancel_authorization(struct avdtp *session)
1149 struct audio_device *dev;
1151 if (session->state != AVDTP_SESSION_STATE_CONNECTING)
1154 dev = manager_get_device(&session->server->src, &session->dst, FALSE);
1158 return audio_device_cancel_authorization(dev, auth_cb, session);
1161 static void connection_lost(struct avdtp *session, int err)
1165 ba2str(&session->dst, address);
1166 DBG("Disconnected from %s", address);
1169 avdtp_cancel_authorization(session);
1171 session->free_lock = 1;
1173 finalize_discovery(session, err);
1175 g_slist_foreach(session->streams, (GFunc) release_stream, session);
1176 session->streams = NULL;
1178 session->free_lock = 0;
1181 g_io_channel_shutdown(session->io, FALSE, NULL);
1182 g_io_channel_unref(session->io);
1186 avdtp_set_state(session, AVDTP_SESSION_STATE_DISCONNECTED);
1188 if (session->io_id) {
1189 g_source_remove(session->io_id);
1193 if (session->dc_timer)
1194 remove_disconnect_timer(session);
1196 session->auto_dc = TRUE;
1198 if (session->ref != 1)
1199 error("connection_lost: ref count not 1 after all callbacks");
1201 avdtp_unref(session);
1204 void avdtp_unref(struct avdtp *session)
1206 struct avdtp_server *server;
1213 DBG("%p: ref=%d", session, session->ref);
1215 if (session->ref == 1) {
1216 if (session->state == AVDTP_SESSION_STATE_CONNECTING &&
1218 avdtp_cancel_authorization(session);
1219 g_io_channel_shutdown(session->io, TRUE, NULL);
1220 g_io_channel_unref(session->io);
1222 avdtp_set_state(session,
1223 AVDTP_SESSION_STATE_DISCONNECTED);
1227 set_disconnect_timer(session);
1228 else if (!session->free_lock) /* Drop the local ref if we
1233 if (session->ref > 0)
1236 server = session->server;
1238 DBG("%p: freeing session and removing from list", session);
1240 if (session->dc_timer)
1241 remove_disconnect_timer(session);
1243 server->sessions = g_slist_remove(server->sessions, session);
1246 pending_req_free(session->req);
1248 g_slist_free_full(session->seps, g_free);
1250 g_free(session->buf);
1255 struct avdtp *avdtp_ref(struct avdtp *session)
1258 DBG("%p: ref=%d", session, session->ref);
1259 if (session->dc_timer)
1260 remove_disconnect_timer(session);
1264 static struct avdtp_local_sep *find_local_sep_by_seid(struct avdtp_server *server,
1269 for (l = server->seps; l != NULL; l = g_slist_next(l)) {
1270 struct avdtp_local_sep *sep = l->data;
1272 if (sep->info.seid == seid)
1279 struct avdtp_remote_sep *avdtp_find_remote_sep(struct avdtp *session,
1280 struct avdtp_local_sep *lsep)
1284 if (lsep->info.inuse)
1287 for (l = session->seps; l != NULL; l = g_slist_next(l)) {
1288 struct avdtp_remote_sep *sep = l->data;
1289 struct avdtp_service_capability *cap;
1290 struct avdtp_media_codec_capability *codec_data;
1292 /* Type must be different: source <-> sink */
1293 if (sep->type == lsep->info.type)
1296 if (sep->media_type != lsep->info.media_type)
1303 codec_data = (void *) cap->data;
1305 if (codec_data->media_codec_type != lsep->codec)
1308 if (sep->stream == NULL)
1315 static GSList *caps_to_list(uint8_t *data, int size,
1316 struct avdtp_service_capability **codec,
1317 gboolean *delay_reporting)
1322 if (delay_reporting)
1323 *delay_reporting = FALSE;
1325 for (processed = 0, caps = NULL; processed + 2 <= size;) {
1326 struct avdtp_service_capability *cap;
1327 uint8_t length, category;
1332 if (processed + 2 + length > size) {
1333 error("Invalid capability data in getcap resp");
1337 cap = g_malloc(sizeof(struct avdtp_service_capability) +
1339 memcpy(cap, data, 2 + length);
1341 processed += 2 + length;
1344 caps = g_slist_append(caps, cap);
1346 if (category == AVDTP_MEDIA_CODEC &&
1348 sizeof(struct avdtp_media_codec_capability))
1350 else if (category == AVDTP_DELAY_REPORTING && delay_reporting)
1351 *delay_reporting = TRUE;
1357 static gboolean avdtp_unknown_cmd(struct avdtp *session, uint8_t transaction,
1360 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_GEN_REJECT,
1361 signal_id, NULL, 0);
1364 static gboolean avdtp_discover_cmd(struct avdtp *session, uint8_t transaction,
1365 void *buf, int size)
1368 unsigned int rsp_size, sep_count, i;
1369 struct seid_info *seps;
1372 sep_count = g_slist_length(session->server->seps);
1374 if (sep_count == 0) {
1375 uint8_t err = AVDTP_NOT_SUPPORTED_COMMAND;
1376 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1377 AVDTP_DISCOVER, &err, sizeof(err));
1380 rsp_size = sep_count * sizeof(struct seid_info);
1382 seps = g_new0(struct seid_info, sep_count);
1384 for (l = session->server->seps, i = 0; l != NULL; l = l->next, i++) {
1385 struct avdtp_local_sep *sep = l->data;
1387 memcpy(&seps[i], &sep->info, sizeof(struct seid_info));
1390 ret = avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1391 AVDTP_DISCOVER, seps, rsp_size);
1397 static gboolean avdtp_getcap_cmd(struct avdtp *session, uint8_t transaction,
1398 struct seid_req *req, unsigned int size,
1402 struct avdtp_local_sep *sep = NULL;
1403 unsigned int rsp_size;
1404 uint8_t err, buf[1024], *ptr = buf;
1407 cmd = get_all ? AVDTP_GET_ALL_CAPABILITIES : AVDTP_GET_CAPABILITIES;
1409 if (size < sizeof(struct seid_req)) {
1410 err = AVDTP_BAD_LENGTH;
1414 sep = find_local_sep_by_seid(session->server, req->acp_seid);
1416 err = AVDTP_BAD_ACP_SEID;
1420 if (get_all && session->server->version < 0x0103)
1421 return avdtp_unknown_cmd(session, transaction, cmd);
1423 if (!sep->ind->get_capability(session, sep, get_all, &caps,
1424 &err, sep->user_data))
1427 for (l = caps, rsp_size = 0; l != NULL; l = g_slist_next(l)) {
1428 struct avdtp_service_capability *cap = l->data;
1430 if (rsp_size + cap->length + 2 > sizeof(buf))
1433 memcpy(ptr, cap, cap->length + 2);
1434 rsp_size += cap->length + 2;
1435 ptr += cap->length + 2;
1442 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT, cmd,
1446 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT, cmd,
1450 static void setconf_cb(struct avdtp *session, struct avdtp_stream *stream,
1451 struct avdtp_error *err)
1453 struct conf_rej rej;
1454 struct avdtp_local_sep *sep;
1457 rej.error = AVDTP_UNSUPPORTED_CONFIGURATION;
1458 rej.category = err->err.error_code;
1459 avdtp_send(session, session->in.transaction,
1460 AVDTP_MSG_TYPE_REJECT, AVDTP_SET_CONFIGURATION,
1465 if (!avdtp_send(session, session->in.transaction, AVDTP_MSG_TYPE_ACCEPT,
1466 AVDTP_SET_CONFIGURATION, NULL, 0)) {
1467 stream_free(stream);
1472 sep->stream = stream;
1473 sep->info.inuse = 1;
1474 session->streams = g_slist_append(session->streams, stream);
1476 avdtp_sep_set_state(session, sep, AVDTP_STATE_CONFIGURED);
1479 static gboolean avdtp_setconf_cmd(struct avdtp *session, uint8_t transaction,
1480 struct setconf_req *req, unsigned int size)
1482 struct conf_rej rej;
1483 struct avdtp_local_sep *sep;
1484 struct avdtp_stream *stream;
1485 uint8_t err, category = 0x00;
1486 struct audio_device *dev;
1490 if (size < sizeof(struct setconf_req)) {
1491 error("Too short getcap request");
1495 sep = find_local_sep_by_seid(session->server, req->acp_seid);
1497 err = AVDTP_BAD_ACP_SEID;
1502 err = AVDTP_SEP_IN_USE;
1506 avdtp_get_peers(session, &src, &dst);
1507 dev = manager_get_device(&src, &dst, FALSE);
1509 error("Unable to get a audio device object");
1510 err = AVDTP_BAD_STATE;
1514 switch (sep->info.type) {
1515 case AVDTP_SEP_TYPE_SOURCE:
1517 btd_device_add_uuid(dev->btd_dev, A2DP_SINK_UUID);
1519 error("Unable to get a audio sink object");
1520 err = AVDTP_BAD_STATE;
1525 case AVDTP_SEP_TYPE_SINK:
1527 btd_device_add_uuid(dev->btd_dev, A2DP_SOURCE_UUID);
1529 error("Unable to get a audio source object");
1530 err = AVDTP_BAD_STATE;
1537 stream = g_new0(struct avdtp_stream, 1);
1538 stream->session = session;
1540 stream->rseid = req->int_seid;
1541 stream->caps = caps_to_list(req->caps,
1542 size - sizeof(struct setconf_req),
1544 &stream->delay_reporting);
1546 /* Verify that the Media Transport capability's length = 0. Reject otherwise */
1547 for (l = stream->caps; l != NULL; l = g_slist_next(l)) {
1548 struct avdtp_service_capability *cap = l->data;
1550 if (cap->category == AVDTP_MEDIA_TRANSPORT && cap->length != 0) {
1551 err = AVDTP_BAD_MEDIA_TRANSPORT_FORMAT;
1556 if (stream->delay_reporting && session->version < 0x0103)
1557 session->version = 0x0103;
1559 if (sep->ind && sep->ind->set_configuration) {
1560 if (!sep->ind->set_configuration(session, sep, stream,
1564 err = AVDTP_UNSUPPORTED_CONFIGURATION;
1569 if (!avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1570 AVDTP_SET_CONFIGURATION, NULL, 0)) {
1571 stream_free(stream);
1575 sep->stream = stream;
1576 sep->info.inuse = 1;
1577 session->streams = g_slist_append(session->streams, stream);
1579 avdtp_sep_set_state(session, sep, AVDTP_STATE_CONFIGURED);
1585 stream_free(stream);
1588 rej.category = category;
1589 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1590 AVDTP_SET_CONFIGURATION, &rej, sizeof(rej));
1593 static gboolean avdtp_getconf_cmd(struct avdtp *session, uint8_t transaction,
1594 struct seid_req *req, int size)
1597 struct avdtp_local_sep *sep = NULL;
1603 if (size < (int) sizeof(struct seid_req)) {
1604 error("Too short getconf request");
1608 memset(buf, 0, sizeof(buf));
1610 sep = find_local_sep_by_seid(session->server, req->acp_seid);
1612 err = AVDTP_BAD_ACP_SEID;
1615 if (!sep->stream || !sep->stream->caps) {
1616 err = AVDTP_UNSUPPORTED_CONFIGURATION;
1620 for (l = sep->stream->caps, rsp_size = 0; l != NULL; l = g_slist_next(l)) {
1621 struct avdtp_service_capability *cap = l->data;
1623 if (rsp_size + cap->length + 2 > (int) sizeof(buf))
1626 memcpy(ptr, cap, cap->length + 2);
1627 rsp_size += cap->length + 2;
1628 ptr += cap->length + 2;
1631 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1632 AVDTP_GET_CONFIGURATION, buf, rsp_size);
1635 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1636 AVDTP_GET_CONFIGURATION, &err, sizeof(err));
1639 static gboolean avdtp_reconf_cmd(struct avdtp *session, uint8_t transaction,
1640 struct seid_req *req, int size)
1642 return avdtp_unknown_cmd(session, transaction, AVDTP_RECONFIGURE);
1645 static gboolean avdtp_open_cmd(struct avdtp *session, uint8_t transaction,
1646 struct seid_req *req, unsigned int size)
1648 struct avdtp_local_sep *sep;
1649 struct avdtp_stream *stream;
1652 if (size < sizeof(struct seid_req)) {
1653 error("Too short abort request");
1657 sep = find_local_sep_by_seid(session->server, req->acp_seid);
1659 err = AVDTP_BAD_ACP_SEID;
1663 if (sep->state != AVDTP_STATE_CONFIGURED) {
1664 err = AVDTP_BAD_STATE;
1668 stream = sep->stream;
1670 if (sep->ind && sep->ind->open) {
1671 if (!sep->ind->open(session, sep, stream, &err,
1676 if (!avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1677 AVDTP_OPEN, NULL, 0))
1680 stream->open_acp = TRUE;
1681 session->pending_open = stream;
1682 stream->timer = g_timeout_add_seconds(REQ_TIMEOUT,
1683 stream_open_timeout,
1689 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1690 AVDTP_OPEN, &err, sizeof(err));
1693 static gboolean avdtp_start_cmd(struct avdtp *session, uint8_t transaction,
1694 struct start_req *req, unsigned int size)
1696 struct avdtp_local_sep *sep;
1697 struct avdtp_stream *stream;
1698 struct stream_rej rej;
1700 uint8_t err, failed_seid;
1703 if (size < sizeof(struct start_req)) {
1704 error("Too short start request");
1708 seid_count = 1 + size - sizeof(struct start_req);
1710 seid = &req->first_seid;
1712 for (i = 0; i < seid_count; i++, seid++) {
1713 failed_seid = seid->seid;
1715 sep = find_local_sep_by_seid(session->server,
1716 req->first_seid.seid);
1717 if (!sep || !sep->stream) {
1718 err = AVDTP_BAD_ACP_SEID;
1722 stream = sep->stream;
1724 /* Also reject start cmd if we already initiated start */
1725 if (sep->state != AVDTP_STATE_OPEN ||
1726 stream->starting == TRUE) {
1727 err = AVDTP_BAD_STATE;
1730 stream->starting = TRUE;
1732 if (sep->ind && sep->ind->start) {
1733 if (!sep->ind->start(session, sep, stream, &err,
1738 avdtp_sep_set_state(session, sep, AVDTP_STATE_STREAMING);
1741 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1742 AVDTP_START, NULL, 0);
1745 DBG("Rejecting (%d)", err);
1746 memset(&rej, 0, sizeof(rej));
1747 rej.acp_seid = failed_seid;
1749 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1750 AVDTP_START, &rej, sizeof(rej));
1753 static gboolean avdtp_close_cmd(struct avdtp *session, uint8_t transaction,
1754 struct seid_req *req, unsigned int size)
1756 struct avdtp_local_sep *sep;
1757 struct avdtp_stream *stream;
1760 if (size < sizeof(struct seid_req)) {
1761 error("Too short close request");
1765 sep = find_local_sep_by_seid(session->server, req->acp_seid);
1766 if (!sep || !sep->stream) {
1767 err = AVDTP_BAD_ACP_SEID;
1771 if (sep->state != AVDTP_STATE_OPEN &&
1772 sep->state != AVDTP_STATE_STREAMING) {
1773 err = AVDTP_BAD_STATE;
1777 stream = sep->stream;
1779 if (sep->ind && sep->ind->close) {
1780 if (!sep->ind->close(session, sep, stream, &err,
1785 avdtp_sep_set_state(session, sep, AVDTP_STATE_CLOSING);
1787 if (!avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1788 AVDTP_CLOSE, NULL, 0))
1791 stream->timer = g_timeout_add_seconds(REQ_TIMEOUT,
1792 stream_close_timeout,
1798 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1799 AVDTP_CLOSE, &err, sizeof(err));
1802 static gboolean avdtp_suspend_cmd(struct avdtp *session, uint8_t transaction,
1803 struct suspend_req *req, unsigned int size)
1805 struct avdtp_local_sep *sep;
1806 struct avdtp_stream *stream;
1807 struct stream_rej rej;
1809 uint8_t err, failed_seid;
1812 if (size < sizeof(struct suspend_req)) {
1813 error("Too short suspend request");
1817 seid_count = 1 + size - sizeof(struct suspend_req);
1819 seid = &req->first_seid;
1821 for (i = 0; i < seid_count; i++, seid++) {
1822 failed_seid = seid->seid;
1824 sep = find_local_sep_by_seid(session->server,
1825 req->first_seid.seid);
1826 if (!sep || !sep->stream) {
1827 err = AVDTP_BAD_ACP_SEID;
1831 stream = sep->stream;
1833 if (sep->state != AVDTP_STATE_STREAMING) {
1834 err = AVDTP_BAD_STATE;
1838 if (sep->ind && sep->ind->suspend) {
1839 if (!sep->ind->suspend(session, sep, stream, &err,
1844 avdtp_sep_set_state(session, sep, AVDTP_STATE_OPEN);
1847 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1848 AVDTP_SUSPEND, NULL, 0);
1851 memset(&rej, 0, sizeof(rej));
1852 rej.acp_seid = failed_seid;
1854 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1855 AVDTP_SUSPEND, &rej, sizeof(rej));
1858 static gboolean avdtp_abort_cmd(struct avdtp *session, uint8_t transaction,
1859 struct seid_req *req, unsigned int size)
1861 struct avdtp_local_sep *sep;
1865 if (size < sizeof(struct seid_req)) {
1866 error("Too short abort request");
1870 sep = find_local_sep_by_seid(session->server, req->acp_seid);
1871 if (!sep || !sep->stream) {
1872 err = AVDTP_BAD_ACP_SEID;
1876 if (sep->ind && sep->ind->abort) {
1877 if (!sep->ind->abort(session, sep, sep->stream, &err,
1882 ret = avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1883 AVDTP_ABORT, NULL, 0);
1885 avdtp_sep_set_state(session, sep, AVDTP_STATE_ABORTING);
1890 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1891 AVDTP_ABORT, &err, sizeof(err));
1894 static gboolean avdtp_secctl_cmd(struct avdtp *session, uint8_t transaction,
1895 struct seid_req *req, int size)
1897 return avdtp_unknown_cmd(session, transaction, AVDTP_SECURITY_CONTROL);
1900 static gboolean avdtp_delayreport_cmd(struct avdtp *session,
1901 uint8_t transaction,
1902 struct delay_req *req,
1905 struct avdtp_local_sep *sep;
1906 struct avdtp_stream *stream;
1909 if (size < sizeof(struct delay_req)) {
1910 error("Too short delay report request");
1914 sep = find_local_sep_by_seid(session->server, req->acp_seid);
1915 if (!sep || !sep->stream) {
1916 err = AVDTP_BAD_ACP_SEID;
1920 stream = sep->stream;
1922 if (sep->state != AVDTP_STATE_CONFIGURED &&
1923 sep->state != AVDTP_STATE_STREAMING) {
1924 err = AVDTP_BAD_STATE;
1928 stream->delay = ntohs(req->delay);
1930 if (sep->ind && sep->ind->delayreport) {
1931 if (!sep->ind->delayreport(session, sep, stream->rseid,
1932 stream->delay, &err,
1937 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1938 AVDTP_DELAY_REPORT, NULL, 0);
1941 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1942 AVDTP_DELAY_REPORT, &err, sizeof(err));
1945 static gboolean avdtp_parse_cmd(struct avdtp *session, uint8_t transaction,
1946 uint8_t signal_id, void *buf, int size)
1948 switch (signal_id) {
1949 case AVDTP_DISCOVER:
1950 DBG("Received DISCOVER_CMD");
1951 return avdtp_discover_cmd(session, transaction, buf, size);
1952 case AVDTP_GET_CAPABILITIES:
1953 DBG("Received GET_CAPABILITIES_CMD");
1954 return avdtp_getcap_cmd(session, transaction, buf, size,
1956 case AVDTP_GET_ALL_CAPABILITIES:
1957 DBG("Received GET_ALL_CAPABILITIES_CMD");
1958 return avdtp_getcap_cmd(session, transaction, buf, size, TRUE);
1959 case AVDTP_SET_CONFIGURATION:
1960 DBG("Received SET_CONFIGURATION_CMD");
1961 return avdtp_setconf_cmd(session, transaction, buf, size);
1962 case AVDTP_GET_CONFIGURATION:
1963 DBG("Received GET_CONFIGURATION_CMD");
1964 return avdtp_getconf_cmd(session, transaction, buf, size);
1965 case AVDTP_RECONFIGURE:
1966 DBG("Received RECONFIGURE_CMD");
1967 return avdtp_reconf_cmd(session, transaction, buf, size);
1969 DBG("Received OPEN_CMD");
1970 return avdtp_open_cmd(session, transaction, buf, size);
1972 DBG("Received START_CMD");
1973 return avdtp_start_cmd(session, transaction, buf, size);
1975 DBG("Received CLOSE_CMD");
1976 return avdtp_close_cmd(session, transaction, buf, size);
1978 DBG("Received SUSPEND_CMD");
1979 return avdtp_suspend_cmd(session, transaction, buf, size);
1981 DBG("Received ABORT_CMD");
1982 return avdtp_abort_cmd(session, transaction, buf, size);
1983 case AVDTP_SECURITY_CONTROL:
1984 DBG("Received SECURITY_CONTROL_CMD");
1985 return avdtp_secctl_cmd(session, transaction, buf, size);
1986 case AVDTP_DELAY_REPORT:
1987 DBG("Received DELAY_REPORT_CMD");
1988 return avdtp_delayreport_cmd(session, transaction, buf, size);
1990 DBG("Received unknown request id %u", signal_id);
1991 return avdtp_unknown_cmd(session, transaction, signal_id);
1995 enum avdtp_parse_result { PARSE_ERROR, PARSE_FRAGMENT, PARSE_SUCCESS };
1997 static enum avdtp_parse_result avdtp_parse_data(struct avdtp *session,
1998 void *buf, size_t size)
2000 struct avdtp_common_header *header = buf;
2001 struct avdtp_single_header *single = (void *) session->buf;
2002 struct avdtp_start_header *start = (void *) session->buf;
2006 switch (header->packet_type) {
2007 case AVDTP_PKT_TYPE_SINGLE:
2008 if (size < sizeof(*single)) {
2009 error("Received too small single packet (%zu bytes)", size);
2012 if (session->in.active) {
2013 error("SINGLE: Invalid AVDTP packet fragmentation");
2017 payload = session->buf + sizeof(*single);
2018 payload_size = size - sizeof(*single);
2020 session->in.active = TRUE;
2021 session->in.data_size = 0;
2022 session->in.no_of_packets = 1;
2023 session->in.transaction = header->transaction;
2024 session->in.message_type = header->message_type;
2025 session->in.signal_id = single->signal_id;
2028 case AVDTP_PKT_TYPE_START:
2029 if (size < sizeof(*start)) {
2030 error("Received too small start packet (%zu bytes)", size);
2033 if (session->in.active) {
2034 error("START: Invalid AVDTP packet fragmentation");
2038 session->in.active = TRUE;
2039 session->in.data_size = 0;
2040 session->in.transaction = header->transaction;
2041 session->in.message_type = header->message_type;
2042 session->in.no_of_packets = start->no_of_packets;
2043 session->in.signal_id = start->signal_id;
2045 payload = session->buf + sizeof(*start);
2046 payload_size = size - sizeof(*start);
2049 case AVDTP_PKT_TYPE_CONTINUE:
2050 if (size < sizeof(struct avdtp_continue_header)) {
2051 error("Received too small continue packet (%zu bytes)",
2055 if (!session->in.active) {
2056 error("CONTINUE: Invalid AVDTP packet fragmentation");
2059 if (session->in.transaction != header->transaction) {
2060 error("Continue transaction id doesn't match");
2063 if (session->in.no_of_packets <= 1) {
2064 error("Too few continue packets");
2068 payload = session->buf + sizeof(struct avdtp_continue_header);
2069 payload_size = size - sizeof(struct avdtp_continue_header);
2072 case AVDTP_PKT_TYPE_END:
2073 if (size < sizeof(struct avdtp_continue_header)) {
2074 error("Received too small end packet (%zu bytes)", size);
2077 if (!session->in.active) {
2078 error("END: Invalid AVDTP packet fragmentation");
2081 if (session->in.transaction != header->transaction) {
2082 error("End transaction id doesn't match");
2085 if (session->in.no_of_packets > 1) {
2086 error("Got an end packet too early");
2090 payload = session->buf + sizeof(struct avdtp_continue_header);
2091 payload_size = size - sizeof(struct avdtp_continue_header);
2095 error("Invalid AVDTP packet type 0x%02X", header->packet_type);
2099 if (session->in.data_size + payload_size >
2100 sizeof(session->in.buf)) {
2101 error("Not enough incoming buffer space!");
2105 memcpy(session->in.buf + session->in.data_size, payload, payload_size);
2106 session->in.data_size += payload_size;
2108 if (session->in.no_of_packets > 1) {
2109 session->in.no_of_packets--;
2110 DBG("Received AVDTP fragment. %d to go",
2111 session->in.no_of_packets);
2112 return PARSE_FRAGMENT;
2115 session->in.active = FALSE;
2117 return PARSE_SUCCESS;
2120 static gboolean session_cb(GIOChannel *chan, GIOCondition cond,
2123 struct avdtp *session = data;
2124 struct avdtp_common_header *header;
2130 if (cond & G_IO_NVAL)
2133 header = (void *) session->buf;
2135 if (cond & (G_IO_HUP | G_IO_ERR))
2138 fd = g_io_channel_unix_get_fd(chan);
2139 size = read(fd, session->buf, session->imtu);
2141 error("IO Channel read error");
2145 if ((size_t) size < sizeof(struct avdtp_common_header)) {
2146 error("Received too small packet (%zu bytes)", size);
2150 switch (avdtp_parse_data(session, session->buf, size)) {
2153 case PARSE_FRAGMENT:
2159 if (session->in.message_type == AVDTP_MSG_TYPE_COMMAND) {
2160 if (!avdtp_parse_cmd(session, session->in.transaction,
2161 session->in.signal_id,
2163 session->in.data_size)) {
2164 error("Unable to handle command. Disconnecting");
2168 if (session->ref == 1 && !session->streams && !session->req)
2169 set_disconnect_timer(session);
2171 if (session->streams && session->dc_timer)
2172 remove_disconnect_timer(session);
2177 if (session->req == NULL) {
2178 error("No pending request, ignoring message");
2182 if (header->transaction != session->req->transaction) {
2183 error("Transaction label doesn't match");
2187 if (session->in.signal_id != session->req->signal_id) {
2188 error("Response signal doesn't match");
2192 g_source_remove(session->req->timeout);
2193 session->req->timeout = 0;
2195 switch (header->message_type) {
2196 case AVDTP_MSG_TYPE_ACCEPT:
2197 if (!avdtp_parse_resp(session, session->req->stream,
2198 session->in.transaction,
2199 session->in.signal_id,
2201 session->in.data_size)) {
2202 error("Unable to parse accept response");
2206 case AVDTP_MSG_TYPE_REJECT:
2207 if (!avdtp_parse_rej(session, session->req->stream,
2208 session->in.transaction,
2209 session->in.signal_id,
2211 session->in.data_size)) {
2212 error("Unable to parse reject response");
2216 case AVDTP_MSG_TYPE_GEN_REJECT:
2217 error("Received a General Reject message");
2220 error("Unknown message type 0x%02X", header->message_type);
2224 pending_req_free(session->req);
2225 session->req = NULL;
2227 process_queue(session);
2232 connection_lost(session, EIO);
2237 static struct avdtp *find_session(GSList *list, const bdaddr_t *dst)
2239 for (; list != NULL; list = g_slist_next(list)) {
2240 struct avdtp *s = list->data;
2242 if (bacmp(dst, &s->dst))
2251 static uint16_t get_version(struct avdtp *session)
2253 struct btd_adapter *adapter;
2254 struct btd_device *device;
2255 const sdp_record_t *rec;
2257 sdp_data_t *proto_desc;
2259 uint16_t ver = 0x0100;
2261 adapter = manager_find_adapter(&session->server->src);
2265 ba2str(&session->dst, addr);
2266 device = adapter_find_device(adapter, addr);
2270 rec = btd_device_get_record(device, A2DP_SINK_UUID);
2272 rec = btd_device_get_record(device, A2DP_SOURCE_UUID);
2277 if (sdp_get_access_protos(rec, &protos) < 0)
2280 proto_desc = sdp_get_proto_desc(protos, AVDTP_UUID);
2281 if (proto_desc && proto_desc->dtd == SDP_UINT16)
2282 ver = proto_desc->val.uint16;
2284 sdp_list_foreach(protos, (sdp_list_func_t) sdp_list_free, NULL);
2285 sdp_list_free(protos, NULL);
2290 static struct avdtp *avdtp_get_internal(const bdaddr_t *src, const bdaddr_t *dst)
2292 struct avdtp_server *server;
2293 struct avdtp *session;
2295 assert(src != NULL);
2296 assert(dst != NULL);
2298 server = find_server(servers, src);
2302 session = find_session(server->sessions, dst);
2304 if (session->pending_auth)
2310 session = g_new0(struct avdtp, 1);
2312 session->server = server;
2313 bacpy(&session->dst, dst);
2315 /* We don't use avdtp_set_state() here since this isn't a state change
2316 * but just setting of the initial state */
2317 session->state = AVDTP_SESSION_STATE_DISCONNECTED;
2318 session->auto_dc = TRUE;
2320 session->version = get_version(session);
2322 server->sessions = g_slist_append(server->sessions, session);
2327 struct avdtp *avdtp_get(bdaddr_t *src, bdaddr_t *dst)
2329 struct avdtp *session;
2331 session = avdtp_get_internal(src, dst);
2336 return avdtp_ref(session);
2339 static void avdtp_connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
2341 struct avdtp *session = user_data;
2343 GError *gerr = NULL;
2346 error("%s", err->message);
2351 session->io = g_io_channel_ref(chan);
2353 bt_io_get(chan, BT_IO_L2CAP, &gerr,
2354 BT_IO_OPT_OMTU, &session->omtu,
2355 BT_IO_OPT_IMTU, &session->imtu,
2358 error("%s", gerr->message);
2363 ba2str(&session->dst, address);
2364 DBG("AVDTP: connected %s channel to %s",
2365 session->pending_open ? "transport" : "signaling",
2368 if (session->state == AVDTP_SESSION_STATE_CONNECTING) {
2369 DBG("AVDTP imtu=%u, omtu=%u", session->imtu, session->omtu);
2371 session->buf = g_malloc0(MAX(session->imtu, session->omtu));
2372 avdtp_set_state(session, AVDTP_SESSION_STATE_CONNECTED);
2375 g_source_remove(session->io_id);
2377 /* This watch should be low priority since otherwise the
2378 * connect callback might be dispatched before the session
2379 * callback if the kernel wakes us up at the same time for
2380 * them. This could happen if a headset is very quick in
2381 * sending the Start command after connecting the stream
2382 * transport channel.
2384 session->io_id = g_io_add_watch_full(chan,
2386 G_IO_IN | G_IO_ERR | G_IO_HUP
2388 (GIOFunc) session_cb, session,
2391 if (session->stream_setup) {
2392 set_disconnect_timer(session);
2393 avdtp_set_auto_disconnect(session, FALSE);
2395 } else if (session->pending_open)
2396 handle_transport_connect(session, chan, session->imtu,
2401 process_queue(session);
2406 if (session->pending_open) {
2407 struct avdtp_stream *stream = session->pending_open;
2409 handle_transport_connect(session, NULL, 0, 0);
2411 if (avdtp_abort(session, stream) < 0)
2412 avdtp_sep_set_state(session, stream->lsep,
2415 connection_lost(session, EIO);
2418 static void auth_cb(DBusError *derr, void *user_data)
2420 struct avdtp *session = user_data;
2423 if (derr && dbus_error_is_set(derr)) {
2424 error("Access denied: %s", derr->message);
2425 connection_lost(session, EACCES);
2429 if (!bt_io_accept(session->io, avdtp_connect_cb, session, NULL,
2431 error("bt_io_accept: %s", err->message);
2432 connection_lost(session, EACCES);
2437 /* This is so that avdtp_connect_cb will know to do the right thing
2438 * with respect to the disconnect timer */
2439 session->stream_setup = TRUE;
2442 static void avdtp_confirm_cb(GIOChannel *chan, gpointer data)
2444 struct avdtp *session;
2445 struct audio_device *dev;
2451 bt_io_get(chan, BT_IO_L2CAP, &err,
2452 BT_IO_OPT_SOURCE_BDADDR, &src,
2453 BT_IO_OPT_DEST_BDADDR, &dst,
2454 BT_IO_OPT_DEST, address,
2457 error("%s", err->message);
2462 DBG("AVDTP: incoming connect from %s", address);
2464 session = avdtp_get_internal(&src, &dst);
2468 /* This state (ie, session is already *connecting*) happens when the
2469 * device initiates a connect (really a config'd L2CAP channel) even
2470 * though there is a connect we initiated in progress. In sink.c &
2471 * source.c, this state is referred to as XCASE connect:connect.
2472 * Abort the device's channel in favor of our own.
2474 if (session->state == AVDTP_SESSION_STATE_CONNECTING) {
2475 DBG("connect already in progress (XCASE connect:connect)");
2479 if (session->pending_open && session->pending_open->open_acp) {
2480 if (!bt_io_accept(chan, avdtp_connect_cb, session, NULL, NULL))
2486 error("Refusing unexpected connect from %s", address);
2490 dev = manager_get_device(&src, &dst, FALSE);
2492 dev = manager_get_device(&src, &dst, TRUE);
2494 error("Unable to get audio device object for %s",
2498 btd_device_add_uuid(dev->btd_dev, ADVANCED_AUDIO_UUID);
2501 session->io = g_io_channel_ref(chan);
2502 avdtp_set_state(session, AVDTP_SESSION_STATE_CONNECTING);
2504 session->io_id = g_io_add_watch(chan, G_IO_ERR | G_IO_HUP | G_IO_NVAL,
2505 (GIOFunc) session_cb, session);
2507 perr = audio_device_request_authorization(dev, ADVANCED_AUDIO_UUID,
2510 avdtp_set_state(session, AVDTP_SESSION_STATE_DISCONNECTED);
2511 avdtp_unref(session);
2515 dev->auto_connect = auto_connect;
2520 g_io_channel_shutdown(chan, TRUE, NULL);
2523 static GIOChannel *l2cap_connect(struct avdtp *session)
2528 io = bt_io_connect(BT_IO_L2CAP, avdtp_connect_cb, session,
2530 BT_IO_OPT_SOURCE_BDADDR, &session->server->src,
2531 BT_IO_OPT_DEST_BDADDR, &session->dst,
2532 BT_IO_OPT_PSM, AVDTP_PSM,
2535 error("%s", err->message);
2543 static void queue_request(struct avdtp *session, struct pending_req *req,
2547 session->prio_queue = g_slist_append(session->prio_queue, req);
2549 session->req_queue = g_slist_append(session->req_queue, req);
2552 static uint8_t req_get_seid(struct pending_req *req)
2554 if (req->signal_id == AVDTP_DISCOVER)
2557 return ((struct seid_req *) (req->data))->acp_seid;
2560 static int cancel_request(struct avdtp *session, int err)
2562 struct pending_req *req;
2563 struct seid_req sreq;
2564 struct avdtp_local_sep *lsep;
2565 struct avdtp_stream *stream;
2567 struct avdtp_error averr;
2570 session->req = NULL;
2572 avdtp_error_init(&averr, AVDTP_ERRNO, err);
2574 seid = req_get_seid(req);
2576 stream = find_stream_by_rseid(session, seid);
2581 stream->abort_int = TRUE;
2582 lsep = stream->lsep;
2586 switch (req->signal_id) {
2587 case AVDTP_RECONFIGURE:
2588 error("Reconfigure: %s (%d)", strerror(err), err);
2589 if (lsep && lsep->cfm && lsep->cfm->reconfigure)
2590 lsep->cfm->reconfigure(session, lsep, stream, &averr,
2594 error("Open: %s (%d)", strerror(err), err);
2595 if (lsep && lsep->cfm && lsep->cfm->open)
2596 lsep->cfm->open(session, lsep, stream, &averr,
2600 error("Start: %s (%d)", strerror(err), err);
2601 if (lsep && lsep->cfm && lsep->cfm->start) {
2602 lsep->cfm->start(session, lsep, stream, &averr,
2605 stream->starting = FALSE;
2609 error("Suspend: %s (%d)", strerror(err), err);
2610 if (lsep && lsep->cfm && lsep->cfm->suspend)
2611 lsep->cfm->suspend(session, lsep, stream, &averr,
2615 error("Close: %s (%d)", strerror(err), err);
2616 if (lsep && lsep->cfm && lsep->cfm->close) {
2617 lsep->cfm->close(session, lsep, stream, &averr,
2620 stream->close_int = FALSE;
2623 case AVDTP_SET_CONFIGURATION:
2624 error("SetConfiguration: %s (%d)", strerror(err), err);
2625 if (lsep && lsep->cfm && lsep->cfm->set_configuration)
2626 lsep->cfm->set_configuration(session, lsep, stream,
2627 &averr, lsep->user_data);
2629 case AVDTP_DISCOVER:
2630 error("Discover: %s (%d)", strerror(err), err);
2632 case AVDTP_GET_CAPABILITIES:
2633 error("GetCapabilities: %s (%d)", strerror(err), err);
2636 error("Abort: %s (%d)", strerror(err), err);
2643 memset(&sreq, 0, sizeof(sreq));
2644 sreq.acp_seid = seid;
2646 err = send_request(session, TRUE, stream, AVDTP_ABORT, &sreq,
2649 error("Unable to send abort request");
2656 connection_lost(session, err);
2658 pending_req_free(req);
2662 static gboolean request_timeout(gpointer user_data)
2664 struct avdtp *session = user_data;
2666 cancel_request(session, ETIMEDOUT);
2671 static int send_req(struct avdtp *session, gboolean priority,
2672 struct pending_req *req)
2674 static int transaction = 0;
2677 if (session->state == AVDTP_SESSION_STATE_DISCONNECTED) {
2678 session->io = l2cap_connect(session);
2683 avdtp_set_state(session, AVDTP_SESSION_STATE_CONNECTING);
2686 if (session->state < AVDTP_SESSION_STATE_CONNECTED ||
2687 session->req != NULL) {
2688 queue_request(session, req, priority);
2692 req->transaction = transaction++;
2695 /* FIXME: Should we retry to send if the buffer
2696 was not totally sent or in case of EINTR? */
2697 if (!avdtp_send(session, req->transaction, AVDTP_MSG_TYPE_COMMAND,
2698 req->signal_id, req->data, req->data_size)) {
2705 req->timeout = g_timeout_add_seconds(req->signal_id == AVDTP_ABORT ?
2706 ABORT_TIMEOUT : REQ_TIMEOUT,
2717 static int send_request(struct avdtp *session, gboolean priority,
2718 struct avdtp_stream *stream, uint8_t signal_id,
2719 void *buffer, size_t size)
2721 struct pending_req *req;
2723 if (stream && stream->abort_int && signal_id != AVDTP_ABORT) {
2724 DBG("Unable to send requests while aborting");
2728 req = g_new0(struct pending_req, 1);
2729 req->signal_id = signal_id;
2730 req->data = g_malloc(size);
2731 memcpy(req->data, buffer, size);
2732 req->data_size = size;
2733 req->stream = stream;
2735 return send_req(session, priority, req);
2738 static gboolean avdtp_discover_resp(struct avdtp *session,
2739 struct discover_resp *resp, int size)
2744 gboolean getcap_pending = FALSE;
2746 if (session->version >= 0x0103 && session->server->version >= 0x0103)
2747 getcap_cmd = AVDTP_GET_ALL_CAPABILITIES;
2749 getcap_cmd = AVDTP_GET_CAPABILITIES;
2751 sep_count = size / sizeof(struct seid_info);
2753 for (i = 0; i < sep_count; i++) {
2754 struct avdtp_remote_sep *sep;
2755 struct avdtp_stream *stream;
2756 struct seid_req req;
2758 DBG("seid %d type %d media %d in use %d",
2759 resp->seps[i].seid, resp->seps[i].type,
2760 resp->seps[i].media_type, resp->seps[i].inuse);
2762 stream = find_stream_by_rseid(session, resp->seps[i].seid);
2764 sep = find_remote_sep(session->seps, resp->seps[i].seid);
2766 if (resp->seps[i].inuse && !stream)
2768 sep = g_new0(struct avdtp_remote_sep, 1);
2769 session->seps = g_slist_append(session->seps, sep);
2772 sep->stream = stream;
2773 sep->seid = resp->seps[i].seid;
2774 sep->type = resp->seps[i].type;
2775 sep->media_type = resp->seps[i].media_type;
2777 memset(&req, 0, sizeof(req));
2778 req.acp_seid = sep->seid;
2780 ret = send_request(session, TRUE, NULL, getcap_cmd,
2784 getcap_pending = TRUE;
2787 if (!getcap_pending)
2788 finalize_discovery(session, -ret);
2793 static gboolean avdtp_get_capabilities_resp(struct avdtp *session,
2794 struct getcap_resp *resp,
2797 struct avdtp_remote_sep *sep;
2800 /* Check for minimum required packet size includes:
2801 * 1. getcap resp header
2802 * 2. media transport capability (2 bytes)
2803 * 3. media codec capability type + length (2 bytes)
2804 * 4. the actual media codec elements
2806 if (size < (sizeof(struct getcap_resp) + 4 +
2807 sizeof(struct avdtp_media_codec_capability))) {
2808 error("Too short getcap resp packet");
2812 seid = ((struct seid_req *) session->req->data)->acp_seid;
2814 sep = find_remote_sep(session->seps, seid);
2816 DBG("seid %d type %d media %d", sep->seid,
2817 sep->type, sep->media_type);
2820 g_slist_free_full(sep->caps, g_free);
2823 sep->delay_reporting = FALSE;
2826 sep->caps = caps_to_list(resp->caps, size - sizeof(struct getcap_resp),
2827 &sep->codec, &sep->delay_reporting);
2832 static gboolean avdtp_set_configuration_resp(struct avdtp *session,
2833 struct avdtp_stream *stream,
2834 struct avdtp_single_header *resp,
2837 struct avdtp_local_sep *sep = stream->lsep;
2839 if (sep->cfm && sep->cfm->set_configuration)
2840 sep->cfm->set_configuration(session, sep, stream, NULL,
2843 avdtp_sep_set_state(session, sep, AVDTP_STATE_CONFIGURED);
2848 static gboolean avdtp_reconfigure_resp(struct avdtp *session,
2849 struct avdtp_stream *stream,
2850 struct avdtp_single_header *resp, int size)
2855 static gboolean avdtp_open_resp(struct avdtp *session, struct avdtp_stream *stream,
2856 struct seid_rej *resp, int size)
2858 struct avdtp_local_sep *sep = stream->lsep;
2860 stream->io = l2cap_connect(session);
2862 avdtp_sep_set_state(session, sep, AVDTP_STATE_IDLE);
2866 session->pending_open = stream;
2871 static gboolean avdtp_start_resp(struct avdtp *session,
2872 struct avdtp_stream *stream,
2873 struct seid_rej *resp, int size)
2875 struct avdtp_local_sep *sep = stream->lsep;
2877 if (sep->cfm && sep->cfm->start)
2878 sep->cfm->start(session, sep, stream, NULL, sep->user_data);
2880 /* We might be in STREAMING already if both sides send START_CMD at the
2881 * same time and the one in SNK role doesn't reject it as it should */
2882 if (sep->state != AVDTP_STATE_STREAMING)
2883 avdtp_sep_set_state(session, sep, AVDTP_STATE_STREAMING);
2888 static gboolean avdtp_close_resp(struct avdtp *session,
2889 struct avdtp_stream *stream,
2890 struct seid_rej *resp, int size)
2892 struct avdtp_local_sep *sep = stream->lsep;
2894 avdtp_sep_set_state(session, sep, AVDTP_STATE_CLOSING);
2896 close_stream(stream);
2901 static gboolean avdtp_suspend_resp(struct avdtp *session,
2902 struct avdtp_stream *stream,
2903 void *data, int size)
2905 struct avdtp_local_sep *sep = stream->lsep;
2907 avdtp_sep_set_state(session, sep, AVDTP_STATE_OPEN);
2909 if (sep->cfm && sep->cfm->suspend)
2910 sep->cfm->suspend(session, sep, stream, NULL, sep->user_data);
2915 static gboolean avdtp_abort_resp(struct avdtp *session,
2916 struct avdtp_stream *stream,
2917 struct seid_rej *resp, int size)
2919 struct avdtp_local_sep *sep = stream->lsep;
2921 avdtp_sep_set_state(session, sep, AVDTP_STATE_ABORTING);
2923 if (sep->cfm && sep->cfm->abort)
2924 sep->cfm->abort(session, sep, stream, NULL, sep->user_data);
2926 avdtp_sep_set_state(session, sep, AVDTP_STATE_IDLE);
2931 static gboolean avdtp_delay_report_resp(struct avdtp *session,
2932 struct avdtp_stream *stream,
2933 void *data, int size)
2935 struct avdtp_local_sep *sep = stream->lsep;
2937 if (sep->cfm && sep->cfm->delay_report)
2938 sep->cfm->delay_report(session, sep, stream, NULL, sep->user_data);
2943 static gboolean avdtp_parse_resp(struct avdtp *session,
2944 struct avdtp_stream *stream,
2945 uint8_t transaction, uint8_t signal_id,
2946 void *buf, int size)
2948 struct pending_req *next;
2949 const char *get_all = "";
2951 if (session->prio_queue)
2952 next = session->prio_queue->data;
2953 else if (session->req_queue)
2954 next = session->req_queue->data;
2958 switch (signal_id) {
2959 case AVDTP_DISCOVER:
2960 DBG("DISCOVER request succeeded");
2961 return avdtp_discover_resp(session, buf, size);
2962 case AVDTP_GET_ALL_CAPABILITIES:
2964 case AVDTP_GET_CAPABILITIES:
2965 DBG("GET_%sCAPABILITIES request succeeded", get_all);
2966 if (!avdtp_get_capabilities_resp(session, buf, size))
2968 if (!(next && (next->signal_id == AVDTP_GET_CAPABILITIES ||
2969 next->signal_id == AVDTP_GET_ALL_CAPABILITIES)))
2970 finalize_discovery(session, 0);
2974 /* The remaining commands require an existing stream so bail out
2975 * here if the stream got unexpectedly disconnected */
2977 DBG("AVDTP: stream was closed while waiting for reply");
2981 switch (signal_id) {
2982 case AVDTP_SET_CONFIGURATION:
2983 DBG("SET_CONFIGURATION request succeeded");
2984 return avdtp_set_configuration_resp(session, stream,
2986 case AVDTP_RECONFIGURE:
2987 DBG("RECONFIGURE request succeeded");
2988 return avdtp_reconfigure_resp(session, stream, buf, size);
2990 DBG("OPEN request succeeded");
2991 return avdtp_open_resp(session, stream, buf, size);
2993 DBG("SUSPEND request succeeded");
2994 return avdtp_suspend_resp(session, stream, buf, size);
2996 DBG("START request succeeded");
2997 return avdtp_start_resp(session, stream, buf, size);
2999 DBG("CLOSE request succeeded");
3000 return avdtp_close_resp(session, stream, buf, size);
3002 DBG("ABORT request succeeded");
3003 return avdtp_abort_resp(session, stream, buf, size);
3004 case AVDTP_DELAY_REPORT:
3005 DBG("DELAY_REPORT request succeeded");
3006 return avdtp_delay_report_resp(session, stream, buf, size);
3009 error("Unknown signal id in accept response: %u", signal_id);
3013 static gboolean seid_rej_to_err(struct seid_rej *rej, unsigned int size,
3014 struct avdtp_error *err)
3016 if (size < sizeof(struct seid_rej)) {
3017 error("Too small packet for seid_rej");
3021 avdtp_error_init(err, 0x00, rej->error);
3026 static gboolean conf_rej_to_err(struct conf_rej *rej, unsigned int size,
3027 struct avdtp_error *err)
3029 if (size < sizeof(struct conf_rej)) {
3030 error("Too small packet for conf_rej");
3034 avdtp_error_init(err, rej->category, rej->error);
3039 static gboolean stream_rej_to_err(struct stream_rej *rej, unsigned int size,
3040 struct avdtp_error *err,
3043 if (size < sizeof(struct stream_rej)) {
3044 error("Too small packet for stream_rej");
3048 avdtp_error_init(err, 0x00, rej->error);
3051 *acp_seid = rej->acp_seid;
3056 static gboolean avdtp_parse_rej(struct avdtp *session,
3057 struct avdtp_stream *stream,
3058 uint8_t transaction, uint8_t signal_id,
3059 void *buf, int size)
3061 struct avdtp_error err;
3063 struct avdtp_local_sep *sep = stream ? stream->lsep : NULL;
3065 switch (signal_id) {
3066 case AVDTP_DISCOVER:
3067 if (!seid_rej_to_err(buf, size, &err))
3069 error("DISCOVER request rejected: %s (%d)",
3070 avdtp_strerror(&err), err.err.error_code);
3072 case AVDTP_GET_CAPABILITIES:
3073 case AVDTP_GET_ALL_CAPABILITIES:
3074 if (!seid_rej_to_err(buf, size, &err))
3076 error("GET_CAPABILITIES request rejected: %s (%d)",
3077 avdtp_strerror(&err), err.err.error_code);
3080 if (!seid_rej_to_err(buf, size, &err))
3082 error("OPEN request rejected: %s (%d)",
3083 avdtp_strerror(&err), err.err.error_code);
3084 if (sep && sep->cfm && sep->cfm->open)
3085 sep->cfm->open(session, sep, stream, &err,
3088 case AVDTP_SET_CONFIGURATION:
3089 if (!conf_rej_to_err(buf, size, &err))
3091 error("SET_CONFIGURATION request rejected: %s (%d)",
3092 avdtp_strerror(&err), err.err.error_code);
3093 if (sep && sep->cfm && sep->cfm->set_configuration)
3094 sep->cfm->set_configuration(session, sep, stream,
3095 &err, sep->user_data);
3097 case AVDTP_RECONFIGURE:
3098 if (!conf_rej_to_err(buf, size, &err))
3100 error("RECONFIGURE request rejected: %s (%d)",
3101 avdtp_strerror(&err), err.err.error_code);
3102 if (sep && sep->cfm && sep->cfm->reconfigure)
3103 sep->cfm->reconfigure(session, sep, stream, &err,
3107 if (!stream_rej_to_err(buf, size, &err, &acp_seid))
3109 error("START request rejected: %s (%d)",
3110 avdtp_strerror(&err), err.err.error_code);
3111 if (sep && sep->cfm && sep->cfm->start) {
3112 sep->cfm->start(session, sep, stream, &err,
3114 stream->starting = FALSE;
3118 if (!stream_rej_to_err(buf, size, &err, &acp_seid))
3120 error("SUSPEND request rejected: %s (%d)",
3121 avdtp_strerror(&err), err.err.error_code);
3122 if (sep && sep->cfm && sep->cfm->suspend)
3123 sep->cfm->suspend(session, sep, stream, &err,
3127 if (!stream_rej_to_err(buf, size, &err, &acp_seid))
3129 error("CLOSE request rejected: %s (%d)",
3130 avdtp_strerror(&err), err.err.error_code);
3131 if (sep && sep->cfm && sep->cfm->close) {
3132 sep->cfm->close(session, sep, stream, &err,
3134 stream->close_int = FALSE;
3138 if (!stream_rej_to_err(buf, size, &err, &acp_seid))
3140 error("ABORT request rejected: %s (%d)",
3141 avdtp_strerror(&err), err.err.error_code);
3142 if (sep && sep->cfm && sep->cfm->abort)
3143 sep->cfm->abort(session, sep, stream, &err,
3146 case AVDTP_DELAY_REPORT:
3147 if (!stream_rej_to_err(buf, size, &err, &acp_seid))
3149 error("DELAY_REPORT request rejected: %s (%d)",
3150 avdtp_strerror(&err), err.err.error_code);
3151 if (sep && sep->cfm && sep->cfm->delay_report)
3152 sep->cfm->delay_report(session, sep, stream, &err,
3156 error("Unknown reject response signal id: %u", signal_id);
3161 gboolean avdtp_is_connected(const bdaddr_t *src, const bdaddr_t *dst)
3163 struct avdtp_server *server;
3164 struct avdtp *session;
3166 server = find_server(servers, src);
3170 session = find_session(server->sessions, dst);
3174 if (session->state != AVDTP_SESSION_STATE_DISCONNECTED)
3180 struct avdtp_service_capability *avdtp_stream_get_codec(
3181 struct avdtp_stream *stream)
3185 for (l = stream->caps; l; l = l->next) {
3186 struct avdtp_service_capability *cap = l->data;
3188 if (cap->category == AVDTP_MEDIA_CODEC)
3195 gboolean avdtp_stream_has_capability(struct avdtp_stream *stream,
3196 struct avdtp_service_capability *cap)
3199 struct avdtp_service_capability *stream_cap;
3201 for (l = stream->caps; l; l = g_slist_next(l)) {
3202 stream_cap = l->data;
3204 if (stream_cap->category != cap->category ||
3205 stream_cap->length != cap->length)
3208 if (memcmp(stream_cap->data, cap->data, cap->length) == 0)
3215 gboolean avdtp_stream_has_capabilities(struct avdtp_stream *stream,
3218 for (; caps; caps = g_slist_next(caps)) {
3219 struct avdtp_service_capability *cap = caps->data;
3221 if (!avdtp_stream_has_capability(stream, cap))
3228 struct avdtp_remote_sep *avdtp_stream_get_remote_sep(
3229 struct avdtp_stream *stream)
3231 return avdtp_get_remote_sep(stream->session, stream->rseid);
3234 gboolean avdtp_stream_get_transport(struct avdtp_stream *stream, int *sock,
3235 uint16_t *imtu, uint16_t *omtu,
3238 if (stream->io == NULL)
3242 *sock = g_io_channel_unix_get_fd(stream->io);
3245 *omtu = stream->omtu;
3248 *imtu = stream->imtu;
3251 *caps = stream->caps;
3256 static int process_queue(struct avdtp *session)
3259 struct pending_req *req;
3264 if (session->prio_queue)
3265 queue = &session->prio_queue;
3267 queue = &session->req_queue;
3275 *queue = g_slist_remove(*queue, req);
3277 return send_req(session, FALSE, req);
3280 struct avdtp_remote_sep *avdtp_get_remote_sep(struct avdtp *session,
3285 for (l = session->seps; l; l = l->next) {
3286 struct avdtp_remote_sep *sep = l->data;
3288 if (sep->seid == seid)
3295 uint8_t avdtp_get_seid(struct avdtp_remote_sep *sep)
3300 uint8_t avdtp_get_type(struct avdtp_remote_sep *sep)
3305 struct avdtp_service_capability *avdtp_get_codec(struct avdtp_remote_sep *sep)
3310 gboolean avdtp_get_delay_reporting(struct avdtp_remote_sep *sep)
3312 return sep->delay_reporting;
3315 struct avdtp_stream *avdtp_get_stream(struct avdtp_remote_sep *sep)
3320 struct avdtp_service_capability *avdtp_service_cap_new(uint8_t category,
3321 void *data, int length)
3323 struct avdtp_service_capability *cap;
3325 if (category < AVDTP_MEDIA_TRANSPORT || category > AVDTP_DELAY_REPORTING)
3328 cap = g_malloc(sizeof(struct avdtp_service_capability) + length);
3329 cap->category = category;
3330 cap->length = length;
3331 memcpy(cap->data, data, length);
3336 static gboolean process_discover(gpointer data)
3338 struct avdtp *session = data;
3340 finalize_discovery(session, 0);
3345 int avdtp_discover(struct avdtp *session, avdtp_discover_cb_t cb,
3350 if (session->discov_cb)
3353 if (session->seps) {
3354 session->discov_cb = cb;
3355 session->user_data = user_data;
3356 g_idle_add(process_discover, session);
3360 err = send_request(session, FALSE, NULL, AVDTP_DISCOVER, NULL, 0);
3362 session->discov_cb = cb;
3363 session->user_data = user_data;
3369 gboolean avdtp_stream_remove_cb(struct avdtp *session,
3370 struct avdtp_stream *stream,
3374 struct stream_callback *cb;
3379 for (cb = NULL, l = stream->callbacks; l != NULL; l = l->next) {
3380 struct stream_callback *tmp = l->data;
3381 if (tmp && tmp->id == id) {
3390 stream->callbacks = g_slist_remove(stream->callbacks, cb);
3396 unsigned int avdtp_stream_add_cb(struct avdtp *session,
3397 struct avdtp_stream *stream,
3398 avdtp_stream_state_cb cb, void *data)
3400 struct stream_callback *stream_cb;
3401 static unsigned int id = 0;
3403 stream_cb = g_new(struct stream_callback, 1);
3405 stream_cb->user_data = data;
3406 stream_cb->id = ++id;
3408 stream->callbacks = g_slist_append(stream->callbacks, stream_cb);
3410 return stream_cb->id;
3413 int avdtp_get_configuration(struct avdtp *session, struct avdtp_stream *stream)
3415 struct seid_req req;
3417 if (session->state < AVDTP_SESSION_STATE_CONNECTED)
3420 memset(&req, 0, sizeof(req));
3421 req.acp_seid = stream->rseid;
3423 return send_request(session, FALSE, stream, AVDTP_GET_CONFIGURATION,
3427 static void copy_capabilities(gpointer data, gpointer user_data)
3429 struct avdtp_service_capability *src_cap = data;
3430 struct avdtp_service_capability *dst_cap;
3431 GSList **l = user_data;
3433 dst_cap = avdtp_service_cap_new(src_cap->category, src_cap->data,
3436 *l = g_slist_append(*l, dst_cap);
3439 int avdtp_set_configuration(struct avdtp *session,
3440 struct avdtp_remote_sep *rsep,
3441 struct avdtp_local_sep *lsep,
3443 struct avdtp_stream **stream)
3445 struct setconf_req *req;
3446 struct avdtp_stream *new_stream;
3449 struct avdtp_service_capability *cap;
3452 if (session->state != AVDTP_SESSION_STATE_CONNECTED)
3455 if (!(lsep && rsep))
3458 DBG("%p: int_seid=%u, acp_seid=%u", session,
3459 lsep->info.seid, rsep->seid);
3461 new_stream = g_new0(struct avdtp_stream, 1);
3462 new_stream->session = session;
3463 new_stream->lsep = lsep;
3464 new_stream->rseid = rsep->seid;
3466 if (rsep->delay_reporting && lsep->delay_reporting) {
3467 struct avdtp_service_capability *delay_reporting;
3469 delay_reporting = avdtp_service_cap_new(AVDTP_DELAY_REPORTING,
3471 caps = g_slist_append(caps, delay_reporting);
3472 new_stream->delay_reporting = TRUE;
3475 g_slist_foreach(caps, copy_capabilities, &new_stream->caps);
3477 /* Calculate total size of request */
3478 for (l = caps, caps_len = 0; l != NULL; l = g_slist_next(l)) {
3480 caps_len += cap->length + 2;
3483 req = g_malloc0(sizeof(struct setconf_req) + caps_len);
3485 req->int_seid = lsep->info.seid;
3486 req->acp_seid = rsep->seid;
3488 /* Copy the capabilities into the request */
3489 for (l = caps, ptr = req->caps; l != NULL; l = g_slist_next(l)) {
3491 memcpy(ptr, cap, cap->length + 2);
3492 ptr += cap->length + 2;
3495 err = send_request(session, FALSE, new_stream,
3496 AVDTP_SET_CONFIGURATION, req,
3497 sizeof(struct setconf_req) + caps_len);
3499 stream_free(new_stream);
3501 lsep->info.inuse = 1;
3502 lsep->stream = new_stream;
3503 rsep->stream = new_stream;
3504 session->streams = g_slist_append(session->streams, new_stream);
3506 *stream = new_stream;
3514 int avdtp_reconfigure(struct avdtp *session, GSList *caps,
3515 struct avdtp_stream *stream)
3517 struct reconf_req *req;
3521 struct avdtp_service_capability *cap;
3523 if (!g_slist_find(session->streams, stream))
3526 if (stream->lsep->state != AVDTP_STATE_OPEN)
3529 /* Calculate total size of request */
3530 for (l = caps, caps_len = 0; l != NULL; l = g_slist_next(l)) {
3532 caps_len += cap->length + 2;
3535 req = g_malloc0(sizeof(struct reconf_req) + caps_len);
3537 req->acp_seid = stream->rseid;
3539 /* Copy the capabilities into the request */
3540 for (l = caps, ptr = req->caps; l != NULL; l = g_slist_next(l)) {
3542 memcpy(ptr, cap, cap->length + 2);
3543 ptr += cap->length + 2;
3546 err = send_request(session, FALSE, stream, AVDTP_RECONFIGURE, req,
3547 sizeof(*req) + caps_len);
3553 int avdtp_open(struct avdtp *session, struct avdtp_stream *stream)
3555 struct seid_req req;
3557 if (!g_slist_find(session->streams, stream))
3560 if (stream->lsep->state > AVDTP_STATE_CONFIGURED)
3563 memset(&req, 0, sizeof(req));
3564 req.acp_seid = stream->rseid;
3566 return send_request(session, FALSE, stream, AVDTP_OPEN,
3570 int avdtp_start(struct avdtp *session, struct avdtp_stream *stream)
3572 struct start_req req;
3575 if (!g_slist_find(session->streams, stream))
3578 if (stream->lsep->state != AVDTP_STATE_OPEN)
3581 if (stream->close_int == TRUE) {
3582 error("avdtp_start: rejecting start since close is initiated");
3586 if (stream->starting == TRUE) {
3587 DBG("stream already started");
3591 memset(&req, 0, sizeof(req));
3592 req.first_seid.seid = stream->rseid;
3594 ret = send_request(session, FALSE, stream, AVDTP_START,
3597 stream->starting = TRUE;
3602 int avdtp_close(struct avdtp *session, struct avdtp_stream *stream,
3605 struct seid_req req;
3608 if (!g_slist_find(session->streams, stream))
3611 if (stream->lsep->state < AVDTP_STATE_OPEN)
3614 if (stream->close_int == TRUE) {
3615 error("avdtp_close: rejecting since close is already initiated");
3619 if (immediate && session->req && stream == session->req->stream)
3620 return avdtp_abort(session, stream);
3622 memset(&req, 0, sizeof(req));
3623 req.acp_seid = stream->rseid;
3625 ret = send_request(session, FALSE, stream, AVDTP_CLOSE,
3628 stream->close_int = TRUE;
3633 int avdtp_suspend(struct avdtp *session, struct avdtp_stream *stream)
3635 struct seid_req req;
3637 if (!g_slist_find(session->streams, stream))
3640 if (stream->lsep->state <= AVDTP_STATE_OPEN || stream->close_int)
3643 memset(&req, 0, sizeof(req));
3644 req.acp_seid = stream->rseid;
3646 return send_request(session, FALSE, stream, AVDTP_SUSPEND,
3650 int avdtp_abort(struct avdtp *session, struct avdtp_stream *stream)
3652 struct seid_req req;
3655 if (!g_slist_find(session->streams, stream))
3658 if (stream->lsep->state == AVDTP_STATE_ABORTING)
3661 if (session->req && stream == session->req->stream)
3662 return cancel_request(session, ECANCELED);
3664 memset(&req, 0, sizeof(req));
3665 req.acp_seid = stream->rseid;
3667 ret = send_request(session, TRUE, stream, AVDTP_ABORT,
3670 stream->abort_int = TRUE;
3675 int avdtp_delay_report(struct avdtp *session, struct avdtp_stream *stream,
3678 struct delay_req req;
3680 if (!g_slist_find(session->streams, stream))
3683 if (stream->lsep->state != AVDTP_STATE_CONFIGURED &&
3684 stream->lsep->state != AVDTP_STATE_STREAMING)
3687 if (!stream->delay_reporting || session->version < 0x0103 ||
3688 session->server->version < 0x0103)
3691 stream->delay = delay;
3693 memset(&req, 0, sizeof(req));
3694 req.acp_seid = stream->rseid;
3695 req.delay = htons(delay);
3697 return send_request(session, TRUE, stream, AVDTP_DELAY_REPORT,
3701 struct avdtp_local_sep *avdtp_register_sep(const bdaddr_t *src, uint8_t type,
3704 gboolean delay_reporting,
3705 struct avdtp_sep_ind *ind,
3706 struct avdtp_sep_cfm *cfm,
3709 struct avdtp_server *server;
3710 struct avdtp_local_sep *sep;
3712 server = find_server(servers, src);
3716 if (g_slist_length(server->seps) > MAX_SEID)
3719 sep = g_new0(struct avdtp_local_sep, 1);
3721 sep->state = AVDTP_STATE_IDLE;
3722 sep->info.seid = g_slist_length(server->seps) + 1;
3723 sep->info.type = type;
3724 sep->info.media_type = media_type;
3725 sep->codec = codec_type;
3728 sep->user_data = user_data;
3729 sep->server = server;
3730 sep->delay_reporting = TRUE;
3732 DBG("SEP %p registered: type:%d codec:%d seid:%d", sep,
3733 sep->info.type, sep->codec, sep->info.seid);
3734 server->seps = g_slist_append(server->seps, sep);
3739 int avdtp_unregister_sep(struct avdtp_local_sep *sep)
3741 struct avdtp_server *server;
3746 server = sep->server;
3747 server->seps = g_slist_remove(server->seps, sep);
3750 release_stream(sep->stream, sep->stream->session);
3752 DBG("SEP %p unregistered: type:%d codec:%d seid:%d", sep,
3753 sep->info.type, sep->codec, sep->info.seid);
3760 static GIOChannel *avdtp_server_socket(const bdaddr_t *src, gboolean master)
3765 io = bt_io_listen(BT_IO_L2CAP, NULL, avdtp_confirm_cb,
3767 BT_IO_OPT_SOURCE_BDADDR, src,
3768 BT_IO_OPT_PSM, AVDTP_PSM,
3769 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
3770 BT_IO_OPT_MASTER, master,
3773 error("%s", err->message);
3780 const char *avdtp_strerror(struct avdtp_error *err)
3782 if (err->category == AVDTP_ERRNO)
3783 return strerror(err->err.posix_errno);
3785 switch(err->err.error_code) {
3786 case AVDTP_BAD_HEADER_FORMAT:
3787 return "Bad Header Format";
3788 case AVDTP_BAD_LENGTH:
3789 return "Bad Packet Length";
3790 case AVDTP_BAD_ACP_SEID:
3791 return "Bad Acceptor SEID";
3792 case AVDTP_SEP_IN_USE:
3793 return "Stream End Point in Use";
3794 case AVDTP_SEP_NOT_IN_USE:
3795 return "Stream End Point Not in Use";
3796 case AVDTP_BAD_SERV_CATEGORY:
3797 return "Bad Service Category";
3798 case AVDTP_BAD_PAYLOAD_FORMAT:
3799 return "Bad Payload format";
3800 case AVDTP_NOT_SUPPORTED_COMMAND:
3801 return "Command Not Supported";
3802 case AVDTP_INVALID_CAPABILITIES:
3803 return "Invalid Capabilities";
3804 case AVDTP_BAD_RECOVERY_TYPE:
3805 return "Bad Recovery Type";
3806 case AVDTP_BAD_MEDIA_TRANSPORT_FORMAT:
3807 return "Bad Media Transport Format";
3808 case AVDTP_BAD_RECOVERY_FORMAT:
3809 return "Bad Recovery Format";
3810 case AVDTP_BAD_ROHC_FORMAT:
3811 return "Bad Header Compression Format";
3812 case AVDTP_BAD_CP_FORMAT:
3813 return "Bad Content Protetion Format";
3814 case AVDTP_BAD_MULTIPLEXING_FORMAT:
3815 return "Bad Multiplexing Format";
3816 case AVDTP_UNSUPPORTED_CONFIGURATION:
3817 return "Configuration not supported";
3818 case AVDTP_BAD_STATE:
3821 return "Unknow error";
3825 avdtp_state_t avdtp_sep_get_state(struct avdtp_local_sep *sep)
3830 void avdtp_get_peers(struct avdtp *session, bdaddr_t *src, bdaddr_t *dst)
3833 bacpy(src, &session->server->src);
3835 bacpy(dst, &session->dst);
3838 int avdtp_init(const bdaddr_t *src, GKeyFile *config, uint16_t *version)
3841 gboolean tmp, master = TRUE;
3842 struct avdtp_server *server;
3843 uint16_t ver = 0x0102;
3848 tmp = g_key_file_get_boolean(config, "General",
3851 DBG("audio.conf: %s", err->message);
3852 g_clear_error(&err);
3856 tmp = g_key_file_get_boolean(config, "General", "AutoConnect",
3859 g_clear_error(&err);
3863 if (g_key_file_get_boolean(config, "A2DP", "DelayReporting", NULL))
3867 server = g_new0(struct avdtp_server, 1);
3871 server->version = ver;
3874 *version = server->version;
3876 server->io = avdtp_server_socket(src, master);
3882 bacpy(&server->src, src);
3884 servers = g_slist_append(servers, server);
3889 void avdtp_exit(const bdaddr_t *src)
3891 struct avdtp_server *server;
3894 server = find_server(servers, src);
3898 l = server->sessions;
3900 struct avdtp *session = l->data;
3903 /* value of l pointer should be updated before invoking
3904 * connection_lost since it internally uses avdtp_unref
3905 * which operates on server->session list as well
3907 connection_lost(session, -ECONNABORTED);
3910 servers = g_slist_remove(servers, server);
3912 g_io_channel_shutdown(server->io, TRUE, NULL);
3913 g_io_channel_unref(server->io);
3917 gboolean avdtp_has_stream(struct avdtp *session, struct avdtp_stream *stream)
3919 return g_slist_find(session->streams, stream) ? TRUE : FALSE;
3922 void avdtp_set_auto_disconnect(struct avdtp *session, gboolean auto_dc)
3924 session->auto_dc = auto_dc;
3927 gboolean avdtp_stream_setup_active(struct avdtp *session)
3929 return session->stream_setup;
3932 void avdtp_set_device_disconnect(struct avdtp *session, gboolean dev_dc)
3934 session->device_disconnect = dev_dc;
3937 unsigned int avdtp_add_state_cb(avdtp_session_state_cb cb, void *user_data)
3939 struct avdtp_state_callback *state_cb;
3940 static unsigned int id = 0;
3942 state_cb = g_new(struct avdtp_state_callback, 1);
3944 state_cb->user_data = user_data;
3945 state_cb->id = ++id;
3947 avdtp_callbacks = g_slist_append(avdtp_callbacks, state_cb);
3949 return state_cb->id;
3952 gboolean avdtp_remove_state_cb(unsigned int id)
3956 for (l = avdtp_callbacks; l != NULL; l = l->next) {
3957 struct avdtp_state_callback *cb = l->data;
3958 if (cb && cb->id == id) {
3959 avdtp_callbacks = g_slist_remove(avdtp_callbacks, cb);