3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2006-2007 Nokia Corporation
6 * Copyright (C) 2004-2009 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
35 #include <netinet/in.h>
37 #include <bluetooth/bluetooth.h>
38 #include <bluetooth/sdp.h>
41 #include <dbus/dbus.h>
45 #include "../src/adapter.h"
46 #include "../src/device.h"
52 #include "glib-helper.h"
57 #include <bluetooth/l2cap.h>
63 #define AVDTP_DISCOVER 0x01
64 #define AVDTP_GET_CAPABILITIES 0x02
65 #define AVDTP_SET_CONFIGURATION 0x03
66 #define AVDTP_GET_CONFIGURATION 0x04
67 #define AVDTP_RECONFIGURE 0x05
68 #define AVDTP_OPEN 0x06
69 #define AVDTP_START 0x07
70 #define AVDTP_CLOSE 0x08
71 #define AVDTP_SUSPEND 0x09
72 #define AVDTP_ABORT 0x0A
73 #define AVDTP_SECURITY_CONTROL 0x0B
75 #define AVDTP_PKT_TYPE_SINGLE 0x00
76 #define AVDTP_PKT_TYPE_START 0x01
77 #define AVDTP_PKT_TYPE_CONTINUE 0x02
78 #define AVDTP_PKT_TYPE_END 0x03
80 #define AVDTP_MSG_TYPE_COMMAND 0x00
81 #define AVDTP_MSG_TYPE_ACCEPT 0x02
82 #define AVDTP_MSG_TYPE_REJECT 0x03
85 #define DISCONNECT_TIMEOUT 1
86 #define STREAM_TIMEOUT 20
88 #if __BYTE_ORDER == __LITTLE_ENDIAN
90 struct avdtp_common_header {
91 uint8_t message_type:2;
92 uint8_t packet_type:2;
93 uint8_t transaction:4;
94 } __attribute__ ((packed));
96 struct avdtp_single_header {
97 uint8_t message_type:2;
98 uint8_t packet_type:2;
99 uint8_t transaction:4;
102 } __attribute__ ((packed));
104 struct avdtp_start_header {
105 uint8_t message_type:2;
106 uint8_t packet_type:2;
107 uint8_t transaction:4;
108 uint8_t no_of_packets;
111 } __attribute__ ((packed));
113 struct avdtp_continue_header {
114 uint8_t message_type:2;
115 uint8_t packet_type:2;
116 uint8_t transaction:4;
117 } __attribute__ ((packed));
125 uint8_t media_type:4;
126 } __attribute__ ((packed));
131 } __attribute__ ((packed));
133 #elif __BYTE_ORDER == __BIG_ENDIAN
135 struct avdtp_common_header {
136 uint8_t transaction:4;
137 uint8_t packet_type:2;
138 uint8_t message_type:2;
139 } __attribute__ ((packed));
141 struct avdtp_single_header {
142 uint8_t transaction:4;
143 uint8_t packet_type:2;
144 uint8_t message_type:2;
147 } __attribute__ ((packed));
149 struct avdtp_start_header {
150 uint8_t transaction:4;
151 uint8_t packet_type:2;
152 uint8_t message_type:2;
153 uint8_t no_of_packets;
156 } __attribute__ ((packed));
158 struct avdtp_continue_header {
159 uint8_t transaction:4;
160 uint8_t packet_type:2;
161 uint8_t message_type:2;
162 } __attribute__ ((packed));
168 uint8_t media_type:4;
171 } __attribute__ ((packed));
176 } __attribute__ ((packed));
179 #error "Unknown byte order"
184 struct discover_resp {
185 struct seid_info seps[0];
186 } __attribute__ ((packed));
190 } __attribute__ ((packed));
193 struct seid first_seid;
194 struct seid other_seids[0];
195 } __attribute__ ((packed));
198 struct seid first_seid;
199 struct seid other_seids[0];
200 } __attribute__ ((packed));
204 } __attribute__ ((packed));
209 } __attribute__ ((packed));
211 #if __BYTE_ORDER == __LITTLE_ENDIAN
216 } __attribute__ ((packed));
225 } __attribute__ ((packed));
231 } __attribute__ ((packed));
238 uint8_t serv_cap_len;
241 } __attribute__ ((packed));
243 #elif __BYTE_ORDER == __BIG_ENDIAN
248 } __attribute__ ((packed));
257 } __attribute__ ((packed));
263 } __attribute__ ((packed));
270 uint8_t serv_cap_len;
273 } __attribute__ ((packed));
276 #error "Unknown byte order"
283 uint8_t message_type;
294 struct avdtp_stream *stream; /* Set if the request targeted a stream */
298 struct avdtp_remote_sep {
302 struct avdtp_service_capability *codec;
303 GSList *caps; /* of type struct avdtp_service_capability */
304 struct avdtp_stream *stream;
307 struct avdtp_server {
314 struct avdtp_local_sep {
316 struct avdtp_stream *stream;
317 struct seid_info info;
320 struct avdtp_sep_ind *ind;
321 struct avdtp_sep_cfm *cfm;
323 struct avdtp_server *server;
326 struct stream_callback {
327 avdtp_stream_state_cb cb;
332 struct avdtp_state_callback {
333 avdtp_session_state_cb cb;
338 struct avdtp_stream {
342 struct avdtp *session;
343 struct avdtp_local_sep *lsep;
347 struct avdtp_service_capability *codec;
348 guint io_id; /* Transport GSource ID */
349 guint timer; /* Waiting for other side to close or open
350 the transport channel */
351 gboolean open_acp; /* If we are in ACT role for Open */
352 gboolean close_int; /* If we are in INT role for Close */
356 /* Structure describing an AVDTP connection between two devices */
362 struct avdtp_server *server;
365 avdtp_session_state_t state;
367 /* True if the session should be automatically disconnected */
373 GSList *seps; /* Elements of type struct avdtp_remote_sep * */
375 GSList *streams; /* Elements of type struct avdtp_stream * */
377 GSList *req_queue; /* Elements of type struct pending_req * */
378 GSList *prio_queue; /* Same as req_queue but is processed before it */
380 struct avdtp_stream *pending_open;
389 avdtp_discover_cb_t discov_cb;
392 struct pending_req *req;
396 /* Attempt stream setup instead of disconnecting */
397 gboolean stream_setup;
399 DBusPendingCall *pending_auth;
402 static GSList *servers = NULL;
404 static GSList *avdtp_callbacks = NULL;
406 static gboolean auto_connect = TRUE;
408 static int send_request(struct avdtp *session, gboolean priority,
409 struct avdtp_stream *stream, uint8_t signal_id,
410 void *buffer, size_t size);
411 static gboolean avdtp_parse_resp(struct avdtp *session,
412 struct avdtp_stream *stream,
413 uint8_t transaction, uint8_t signal_id,
414 void *buf, int size);
415 static gboolean avdtp_parse_rej(struct avdtp *session,
416 struct avdtp_stream *stream,
417 uint8_t transaction, uint8_t signal_id,
418 void *buf, int size);
419 static int process_queue(struct avdtp *session);
420 static void connection_lost(struct avdtp *session, int err);
421 static void avdtp_sep_set_state(struct avdtp *session,
422 struct avdtp_local_sep *sep,
423 avdtp_state_t state);
425 static struct avdtp_server *find_server(GSList *list, const bdaddr_t *src)
429 for (l = list; l; l = l->next) {
430 struct avdtp_server *server = l->data;
432 if (bacmp(&server->src, src) == 0)
439 static const char *avdtp_statestr(avdtp_state_t state)
442 case AVDTP_STATE_IDLE:
444 case AVDTP_STATE_CONFIGURED:
446 case AVDTP_STATE_OPEN:
448 case AVDTP_STATE_STREAMING:
450 case AVDTP_STATE_CLOSING:
452 case AVDTP_STATE_ABORTING:
455 return "<unknown state>";
459 static gboolean try_send(int sk, void *data, size_t len)
464 err = send(sk, data, len, 0);
465 } while (err < 0 && errno == EINTR);
468 error("send: %s (%d)", strerror(errno), errno);
470 } else if ((size_t) err != len) {
471 error("try_send: complete buffer not sent (%d/%zu bytes)",
479 static gboolean avdtp_send(struct avdtp *session, uint8_t transaction,
480 uint8_t message_type, uint8_t signal_id,
481 void *data, size_t len)
483 unsigned int cont_fragments, sent;
484 struct avdtp_start_header start;
485 struct avdtp_continue_header cont;
488 if (session->io == NULL) {
489 error("avdtp_send: session is closed");
493 sock = g_io_channel_unix_get_fd(session->io);
495 /* Single packet - no fragmentation */
496 if (sizeof(struct avdtp_single_header) + len <= session->omtu) {
497 struct avdtp_single_header single;
499 memset(&single, 0, sizeof(single));
501 single.transaction = transaction;
502 single.packet_type = AVDTP_PKT_TYPE_SINGLE;
503 single.message_type = message_type;
504 single.signal_id = signal_id;
506 memcpy(session->buf, &single, sizeof(single));
507 memcpy(session->buf + sizeof(single), data, len);
509 return try_send(sock, session->buf, sizeof(single) + len);
512 /* Count the number of needed fragments */
513 cont_fragments = (len - (session->omtu - sizeof(start))) /
514 (session->omtu - sizeof(cont)) + 1;
516 debug("avdtp_send: %zu bytes split into %d fragments", len,
519 /* Send the start packet */
520 memset(&start, 0, sizeof(start));
521 start.transaction = transaction;
522 start.packet_type = AVDTP_PKT_TYPE_START;
523 start.message_type = message_type;
524 start.no_of_packets = cont_fragments + 1;
525 start.signal_id = signal_id;
527 memcpy(session->buf, &start, sizeof(start));
528 memcpy(session->buf + sizeof(start), data,
529 session->omtu - sizeof(start));
531 if (!try_send(sock, session->buf, session->omtu))
534 debug("avdtp_send: first packet with %zu bytes sent",
535 session->omtu - sizeof(start));
537 sent = session->omtu - sizeof(start);
539 /* Send the continue fragments and the end packet */
544 if (left + sizeof(cont) > session->omtu) {
545 cont.packet_type = AVDTP_PKT_TYPE_CONTINUE;
546 to_copy = session->omtu - sizeof(cont);
547 debug("avdtp_send: sending continue with %d bytes",
550 cont.packet_type = AVDTP_PKT_TYPE_END;
552 debug("avdtp_send: sending end with %d bytes",
556 cont.transaction = transaction;
557 cont.message_type = message_type;
559 memcpy(session->buf, &cont, sizeof(cont));
560 memcpy(session->buf + sizeof(cont), data + sent, to_copy);
562 if (!try_send(sock, session->buf, to_copy + sizeof(cont)))
571 static void pending_req_free(struct pending_req *req)
574 g_source_remove(req->timeout);
579 static void close_stream(struct avdtp_stream *stream)
583 if (stream->io == NULL)
586 sock = g_io_channel_unix_get_fd(stream->io);
588 shutdown(sock, SHUT_RDWR);
590 g_io_channel_shutdown(stream->io, FALSE, NULL);
593 static gboolean stream_close_timeout(gpointer user_data)
595 struct avdtp_stream *stream = user_data;
597 debug("Timed out waiting for peer to close the transport channel");
601 close_stream(stream);
606 static gboolean stream_open_timeout(gpointer user_data)
608 struct avdtp_stream *stream = user_data;
610 debug("Timed out waiting for peer to open the transport channel");
614 stream->session->pending_open = NULL;
616 avdtp_abort(stream->session, stream);
621 static gboolean disconnect_timeout(gpointer user_data)
623 struct avdtp *session = user_data;
624 struct audio_device *dev;
625 gboolean stream_setup;
627 session->dc_timer = 0;
628 stream_setup = session->stream_setup;
629 session->stream_setup = FALSE;
631 dev = manager_get_device(&session->server->src, &session->dst, FALSE);
633 if (dev && dev->sink && stream_setup)
634 sink_setup_stream(dev->sink, session);
635 else if (dev && dev->source && stream_setup)
636 source_setup_stream(dev->source, session);
638 connection_lost(session, ETIMEDOUT);
643 static void remove_disconnect_timer(struct avdtp *session)
645 g_source_remove(session->dc_timer);
646 session->dc_timer = 0;
647 session->stream_setup = FALSE;
650 static void set_disconnect_timer(struct avdtp *session)
652 if (session->dc_timer)
653 remove_disconnect_timer(session);
655 session->dc_timer = g_timeout_add_seconds(DISCONNECT_TIMEOUT,
660 void avdtp_error_init(struct avdtp_error *err, uint8_t type, int id)
664 case AVDTP_ERROR_ERRNO:
665 err->err.posix_errno = id;
667 case AVDTP_ERROR_ERROR_CODE:
668 err->err.error_code = id;
673 avdtp_error_type_t avdtp_error_type(struct avdtp_error *err)
678 int avdtp_error_error_code(struct avdtp_error *err)
680 assert(err->type == AVDTP_ERROR_ERROR_CODE);
681 return err->err.error_code;
684 int avdtp_error_posix_errno(struct avdtp_error *err)
686 assert(err->type == AVDTP_ERROR_ERRNO);
687 return err->err.posix_errno;
690 static struct avdtp_stream *find_stream_by_rseid(struct avdtp *session,
695 for (l = session->streams; l != NULL; l = g_slist_next(l)) {
696 struct avdtp_stream *stream = l->data;
698 if (stream->rseid == rseid)
705 static struct avdtp_remote_sep *find_remote_sep(GSList *seps, uint8_t seid)
709 for (l = seps; l != NULL; l = g_slist_next(l)) {
710 struct avdtp_remote_sep *sep = l->data;
712 if (sep->seid == seid)
719 static void avdtp_set_state(struct avdtp *session,
720 avdtp_session_state_t new_state)
723 struct audio_device *dev;
725 avdtp_session_state_t old_state = session->state;
727 session->state = new_state;
729 avdtp_get_peers(session, &src, &dst);
730 dev = manager_get_device(&src, &dst, FALSE);
732 error("avdtp_set_state(): no matching audio device");
736 for (l = avdtp_callbacks; l != NULL; l = l->next) {
737 struct avdtp_state_callback *cb = l->data;
738 cb->cb(dev, session, old_state, new_state, cb->user_data);
742 static void stream_free(struct avdtp_stream *stream)
744 struct avdtp_remote_sep *rsep;
746 stream->lsep->info.inuse = 0;
747 stream->lsep->stream = NULL;
749 rsep = find_remote_sep(stream->session->seps, stream->rseid);
754 g_source_remove(stream->timer);
757 g_io_channel_unref(stream->io);
760 g_source_remove(stream->io_id);
762 g_slist_foreach(stream->callbacks, (GFunc) g_free, NULL);
763 g_slist_free(stream->callbacks);
765 g_slist_foreach(stream->caps, (GFunc) g_free, NULL);
766 g_slist_free(stream->caps);
771 static gboolean stream_timeout(gpointer user_data)
773 struct avdtp_stream *stream = user_data;
774 struct avdtp *session = stream->session;
776 avdtp_close(session, stream);
778 stream->idle_timer = 0;
783 static gboolean transport_cb(GIOChannel *chan, GIOCondition cond,
786 struct avdtp_stream *stream = data;
787 struct avdtp_local_sep *sep = stream->lsep;
789 if (stream->close_int && sep->cfm && sep->cfm->close)
790 sep->cfm->close(stream->session, sep, stream, NULL,
793 if (!(cond & G_IO_NVAL))
794 close_stream(stream);
796 avdtp_sep_set_state(stream->session, sep, AVDTP_STATE_IDLE);
801 static void handle_transport_connect(struct avdtp *session, GIOChannel *io,
802 uint16_t imtu, uint16_t omtu)
804 struct avdtp_stream *stream = session->pending_open;
805 struct avdtp_local_sep *sep = stream->lsep;
807 session->pending_open = NULL;
810 g_source_remove(stream->timer);
815 if (!stream->open_acp && sep->cfm && sep->cfm->open) {
816 struct avdtp_error err;
817 avdtp_error_init(&err, AVDTP_ERROR_ERRNO, EIO);
818 sep->cfm->open(session, sep, NULL, &err,
824 stream->io = g_io_channel_ref(io);
828 if (!stream->open_acp && sep->cfm && sep->cfm->open)
829 sep->cfm->open(session, sep, stream, NULL, sep->user_data);
831 avdtp_sep_set_state(session, sep, AVDTP_STATE_OPEN);
833 stream->io_id = g_io_add_watch(io, G_IO_ERR | G_IO_HUP | G_IO_NVAL,
834 (GIOFunc) transport_cb, stream);
837 static int pending_req_cmp(gconstpointer a, gconstpointer b)
839 const struct pending_req *req = a;
840 const struct avdtp_stream *stream = b;
842 if (req->stream == stream)
848 static void cleanup_queue(struct avdtp *session, struct avdtp_stream *stream)
851 struct pending_req *req;
853 while ((l = g_slist_find_custom(session->prio_queue, stream,
856 pending_req_free(req);
857 session->prio_queue = g_slist_remove(session->prio_queue, req);
860 while ((l = g_slist_find_custom(session->req_queue, stream,
863 pending_req_free(req);
864 session->req_queue = g_slist_remove(session->req_queue, req);
868 static void avdtp_sep_set_state(struct avdtp *session,
869 struct avdtp_local_sep *sep,
872 struct avdtp_stream *stream = sep->stream;
873 avdtp_state_t old_state;
874 struct avdtp_error err, *err_ptr = NULL;
878 error("Error changing sep state: stream not available");
882 if (sep->state == state) {
883 avdtp_error_init(&err, AVDTP_ERROR_ERRNO, EIO);
884 debug("stream state change failed: %s", avdtp_strerror(&err));
888 debug("stream state changed: %s -> %s",
889 avdtp_statestr(sep->state),
890 avdtp_statestr(state));
893 old_state = sep->state;
896 for (l = stream->callbacks; l != NULL; l = g_slist_next(l)) {
897 struct stream_callback *cb = l->data;
898 cb->cb(stream, old_state, state, err_ptr, cb->user_data);
902 case AVDTP_STATE_OPEN:
903 if (old_state > AVDTP_STATE_OPEN && session->auto_dc)
904 stream->idle_timer = g_timeout_add_seconds(STREAM_TIMEOUT,
908 case AVDTP_STATE_STREAMING:
909 case AVDTP_STATE_CLOSING:
910 case AVDTP_STATE_ABORTING:
911 if (stream->idle_timer) {
912 g_source_remove(stream->idle_timer);
913 stream->idle_timer = 0;
916 case AVDTP_STATE_IDLE:
917 if (stream->idle_timer) {
918 g_source_remove(stream->idle_timer);
919 stream->idle_timer = 0;
921 session->streams = g_slist_remove(session->streams, stream);
922 if (session->pending_open == stream)
923 handle_transport_connect(session, NULL, 0, 0);
924 if (session->req && session->req->stream == stream)
925 session->req->stream = NULL;
926 /* Remove pending commands for this stream from the queue */
927 cleanup_queue(session, stream);
929 if (session->ref == 1 && !session->streams)
930 set_disconnect_timer(session);
937 static void finalize_discovery(struct avdtp *session, int err)
939 struct avdtp_error avdtp_err;
941 avdtp_error_init(&avdtp_err, AVDTP_ERROR_ERRNO, err);
943 if (!session->discov_cb)
946 session->discov_cb(session, session->seps,
947 err ? &avdtp_err : NULL,
950 session->discov_cb = NULL;
951 session->user_data = NULL;
954 static void release_stream(struct avdtp_stream *stream, struct avdtp *session)
956 struct avdtp_local_sep *sep = stream->lsep;
958 if (sep->cfm && sep->cfm->abort)
959 sep->cfm->abort(session, sep, stream, NULL, sep->user_data);
961 avdtp_sep_set_state(session, sep, AVDTP_STATE_IDLE);
964 static void connection_lost(struct avdtp *session, int err)
968 ba2str(&session->dst, address);
969 debug("Disconnected from %s", address);
971 if (session->state == AVDTP_SESSION_STATE_CONNECTING && err != EACCES)
972 btd_cancel_authorization(&session->server->src, &session->dst);
974 session->free_lock = 1;
976 finalize_discovery(session, err);
978 g_slist_foreach(session->streams, (GFunc) release_stream, session);
979 session->streams = NULL;
981 session->free_lock = 0;
984 g_io_channel_shutdown(session->io, FALSE, NULL);
985 g_io_channel_unref(session->io);
989 avdtp_set_state(session, AVDTP_SESSION_STATE_DISCONNECTED);
991 if (session->io_id) {
992 g_source_remove(session->io_id);
996 if (session->dc_timer)
997 remove_disconnect_timer(session);
999 session->auto_dc = TRUE;
1001 if (session->ref != 1)
1002 error("connection_lost: ref count not 1 after all callbacks");
1004 avdtp_unref(session);
1007 void avdtp_unref(struct avdtp *session)
1009 struct avdtp_server *server;
1016 debug("avdtp_unref(%p): ref=%d", session, session->ref);
1018 if (session->ref == 1) {
1019 if (session->state == AVDTP_SESSION_STATE_CONNECTING &&
1021 g_io_channel_shutdown(session->io, TRUE, NULL);
1022 g_io_channel_unref(session->io);
1027 set_disconnect_timer(session);
1028 else if (!session->free_lock) /* Drop the local ref if we
1033 if (session->ref > 0)
1036 server = session->server;
1038 debug("avdtp_unref(%p): freeing session and removing from list",
1041 if (session->dc_timer)
1042 remove_disconnect_timer(session);
1044 server->sessions = g_slist_remove(server->sessions, session);
1047 pending_req_free(session->req);
1049 g_slist_foreach(session->seps, (GFunc) g_free, NULL);
1050 g_slist_free(session->seps);
1052 g_free(session->buf);
1057 struct avdtp *avdtp_ref(struct avdtp *session)
1060 debug("avdtp_ref(%p): ref=%d", session, session->ref);
1061 if (session->dc_timer)
1062 remove_disconnect_timer(session);
1066 static struct avdtp_local_sep *find_local_sep_by_seid(struct avdtp_server *server,
1071 for (l = server->seps; l != NULL; l = g_slist_next(l)) {
1072 struct avdtp_local_sep *sep = l->data;
1074 if (sep->info.seid == seid)
1081 static struct avdtp_local_sep *find_local_sep(struct avdtp_server *server,
1088 for (l = server->seps; l != NULL; l = g_slist_next(l)) {
1089 struct avdtp_local_sep *sep = l->data;
1091 if (sep->info.inuse)
1094 if (sep->info.type == type &&
1095 sep->info.media_type == media_type &&
1096 sep->codec == codec)
1103 static GSList *caps_to_list(uint8_t *data, int size,
1104 struct avdtp_service_capability **codec)
1109 for (processed = 0, caps = NULL; processed + 2 < size;) {
1110 struct avdtp_service_capability *cap;
1111 uint8_t length, category;
1116 if (processed + 2 + length > size) {
1117 error("Invalid capability data in getcap resp");
1121 cap = g_malloc(sizeof(struct avdtp_service_capability) +
1123 memcpy(cap, data, 2 + length);
1125 processed += 2 + length;
1128 caps = g_slist_append(caps, cap);
1130 if (category == AVDTP_MEDIA_CODEC &&
1132 sizeof(struct avdtp_media_codec_capability))
1139 static gboolean avdtp_unknown_cmd(struct avdtp *session, uint8_t transaction,
1140 void *buf, int size)
1142 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1146 static gboolean avdtp_discover_cmd(struct avdtp *session, uint8_t transaction,
1147 void *buf, int size)
1150 unsigned int rsp_size, sep_count, i;
1151 struct seid_info *seps;
1154 sep_count = g_slist_length(session->server->seps);
1156 if (sep_count == 0) {
1157 uint8_t err = AVDTP_NOT_SUPPORTED_COMMAND;
1158 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1159 AVDTP_DISCOVER, &err, sizeof(err));
1162 rsp_size = sep_count * sizeof(struct seid_info);
1164 seps = g_new0(struct seid_info, sep_count);
1166 for (l = session->server->seps, i = 0; l != NULL; l = l->next, i++) {
1167 struct avdtp_local_sep *sep = l->data;
1169 memcpy(&seps[i], &sep->info, sizeof(struct seid_info));
1172 ret = avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1173 AVDTP_DISCOVER, seps, rsp_size);
1179 static gboolean avdtp_getcap_cmd(struct avdtp *session, uint8_t transaction,
1180 struct seid_req *req, unsigned int size)
1183 struct avdtp_local_sep *sep = NULL;
1184 unsigned int rsp_size;
1185 uint8_t err, buf[1024], *ptr = buf;
1187 if (size < sizeof(struct seid_req)) {
1188 err = AVDTP_BAD_LENGTH;
1192 sep = find_local_sep_by_seid(session->server, req->acp_seid);
1194 err = AVDTP_BAD_ACP_SEID;
1198 if (!sep->ind->get_capability(session, sep, &caps, &err,
1202 for (l = caps, rsp_size = 0; l != NULL; l = g_slist_next(l)) {
1203 struct avdtp_service_capability *cap = l->data;
1205 if (rsp_size + cap->length + 2 > sizeof(buf))
1208 memcpy(ptr, cap, cap->length + 2);
1209 rsp_size += cap->length + 2;
1210 ptr += cap->length + 2;
1217 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1218 AVDTP_GET_CAPABILITIES, buf, rsp_size);
1221 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1222 AVDTP_GET_CAPABILITIES, &err, sizeof(err));
1225 static gboolean avdtp_setconf_cmd(struct avdtp *session, uint8_t transaction,
1226 struct setconf_req *req, unsigned int size)
1228 struct conf_rej rej;
1229 struct avdtp_local_sep *sep;
1230 struct avdtp_stream *stream;
1231 uint8_t err, category = 0x00;
1232 struct audio_device *dev;
1236 if (size < sizeof(struct setconf_req)) {
1237 error("Too short getcap request");
1241 sep = find_local_sep_by_seid(session->server, req->acp_seid);
1243 err = AVDTP_BAD_ACP_SEID;
1248 err = AVDTP_SEP_IN_USE;
1252 avdtp_get_peers(session, &src, &dst);
1253 dev = manager_get_device(&src, &dst, FALSE);
1255 error("Unable to get a audio device object");
1259 switch (sep->info.type) {
1260 case AVDTP_SEP_TYPE_SOURCE:
1262 btd_device_add_uuid(dev->btd_dev, A2DP_SINK_UUID);
1264 error("Unable to get a audio sink object");
1269 case AVDTP_SEP_TYPE_SINK:
1270 /* Do source_init() here when it's implemented */
1274 stream = g_new0(struct avdtp_stream, 1);
1275 stream->session = session;
1277 stream->rseid = req->int_seid;
1278 stream->caps = caps_to_list(req->caps,
1279 size - sizeof(struct setconf_req),
1282 /* Verify that the Media Transport capability's length = 0. Reject otherwise */
1283 for (l = stream->caps; l != NULL; l = g_slist_next(l)) {
1284 struct avdtp_service_capability *cap = l->data;
1286 if (cap->category == AVDTP_MEDIA_TRANSPORT && cap->length != 0) {
1287 err = AVDTP_BAD_MEDIA_TRANSPORT_FORMAT;
1292 if (sep->ind && sep->ind->set_configuration) {
1293 if (!sep->ind->set_configuration(session, sep, stream,
1297 stream_free(stream);
1302 if (!avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1303 AVDTP_SET_CONFIGURATION, NULL, 0)) {
1304 stream_free(stream);
1308 sep->stream = stream;
1309 session->streams = g_slist_append(session->streams, stream);
1311 avdtp_sep_set_state(session, sep, AVDTP_STATE_CONFIGURED);
1317 rej.category = category;
1318 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1319 AVDTP_SET_CONFIGURATION, &rej, sizeof(rej));
1322 static gboolean avdtp_getconf_cmd(struct avdtp *session, uint8_t transaction,
1323 struct seid_req *req, int size)
1326 struct avdtp_local_sep *sep = NULL;
1332 if (size < (int) sizeof(struct seid_req)) {
1333 error("Too short getconf request");
1337 memset(buf, 0, sizeof(buf));
1339 sep = find_local_sep_by_seid(session->server, req->acp_seid);
1341 err = AVDTP_BAD_ACP_SEID;
1344 if (!sep->stream || !sep->stream->caps) {
1345 err = AVDTP_UNSUPPORTED_CONFIGURATION;
1349 for (l = sep->stream->caps, rsp_size = 0; l != NULL; l = g_slist_next(l)) {
1350 struct avdtp_service_capability *cap = l->data;
1352 if (rsp_size + cap->length + 2 > (int) sizeof(buf))
1355 memcpy(ptr, cap, cap->length + 2);
1356 rsp_size += cap->length + 2;
1357 ptr += cap->length + 2;
1360 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1361 AVDTP_GET_CONFIGURATION, buf, rsp_size);
1364 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1365 AVDTP_GET_CONFIGURATION, &err, sizeof(err));
1368 static gboolean avdtp_reconf_cmd(struct avdtp *session, uint8_t transaction,
1369 struct seid_req *req, int size)
1371 return avdtp_unknown_cmd(session, transaction, (void *) req, size);
1374 static gboolean avdtp_open_cmd(struct avdtp *session, uint8_t transaction,
1375 struct seid_req *req, unsigned int size)
1377 struct avdtp_local_sep *sep;
1378 struct avdtp_stream *stream;
1381 if (size < sizeof(struct seid_req)) {
1382 error("Too short abort request");
1386 sep = find_local_sep_by_seid(session->server, req->acp_seid);
1388 err = AVDTP_BAD_ACP_SEID;
1392 if (sep->state != AVDTP_STATE_CONFIGURED) {
1393 err = AVDTP_BAD_STATE;
1397 stream = sep->stream;
1399 if (sep->ind && sep->ind->open) {
1400 if (!sep->ind->open(session, sep, stream, &err,
1405 if (!avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1406 AVDTP_OPEN, NULL, 0))
1409 stream->open_acp = TRUE;
1410 session->pending_open = stream;
1411 stream->timer = g_timeout_add_seconds(REQ_TIMEOUT,
1412 stream_open_timeout,
1418 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1419 AVDTP_OPEN, &err, sizeof(err));
1422 static gboolean avdtp_start_cmd(struct avdtp *session, uint8_t transaction,
1423 struct start_req *req, unsigned int size)
1425 struct avdtp_local_sep *sep;
1426 struct avdtp_stream *stream;
1427 struct stream_rej rej;
1429 uint8_t err, failed_seid;
1432 if (size < sizeof(struct start_req)) {
1433 error("Too short start request");
1437 seid_count = 1 + size - sizeof(struct start_req);
1439 seid = &req->first_seid;
1441 for (i = 0; i < seid_count; i++, seid++) {
1442 failed_seid = seid->seid;
1444 sep = find_local_sep_by_seid(session->server,
1445 req->first_seid.seid);
1446 if (!sep || !sep->stream) {
1447 err = AVDTP_BAD_ACP_SEID;
1451 stream = sep->stream;
1453 if (sep->state != AVDTP_STATE_OPEN) {
1454 err = AVDTP_BAD_STATE;
1458 if (sep->ind && sep->ind->start) {
1459 if (!sep->ind->start(session, sep, stream, &err,
1464 avdtp_sep_set_state(session, sep, AVDTP_STATE_STREAMING);
1467 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1468 AVDTP_START, NULL, 0);
1471 memset(&rej, 0, sizeof(rej));
1472 rej.acp_seid = failed_seid;
1474 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1475 AVDTP_START, &rej, sizeof(rej));
1478 static gboolean avdtp_close_cmd(struct avdtp *session, uint8_t transaction,
1479 struct seid_req *req, unsigned int size)
1481 struct avdtp_local_sep *sep;
1482 struct avdtp_stream *stream;
1485 if (size < sizeof(struct seid_req)) {
1486 error("Too short close request");
1490 sep = find_local_sep_by_seid(session->server, req->acp_seid);
1491 if (!sep || !sep->stream) {
1492 err = AVDTP_BAD_ACP_SEID;
1496 if (sep->state != AVDTP_STATE_OPEN &&
1497 sep->state != AVDTP_STATE_STREAMING) {
1498 err = AVDTP_BAD_STATE;
1502 stream = sep->stream;
1504 if (sep->ind && sep->ind->close) {
1505 if (!sep->ind->close(session, sep, stream, &err,
1510 avdtp_sep_set_state(session, sep, AVDTP_STATE_CLOSING);
1512 if (!avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1513 AVDTP_CLOSE, NULL, 0))
1516 stream->timer = g_timeout_add_seconds(REQ_TIMEOUT,
1517 stream_close_timeout,
1523 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1524 AVDTP_CLOSE, &err, sizeof(err));
1527 static gboolean avdtp_suspend_cmd(struct avdtp *session, uint8_t transaction,
1528 struct suspend_req *req, unsigned int size)
1530 struct avdtp_local_sep *sep;
1531 struct avdtp_stream *stream;
1532 struct stream_rej rej;
1534 uint8_t err, failed_seid;
1537 if (size < sizeof(struct suspend_req)) {
1538 error("Too short suspend request");
1542 seid_count = 1 + size - sizeof(struct suspend_req);
1544 seid = &req->first_seid;
1546 for (i = 0; i < seid_count; i++, seid++) {
1547 failed_seid = seid->seid;
1549 sep = find_local_sep_by_seid(session->server,
1550 req->first_seid.seid);
1551 if (!sep || !sep->stream) {
1552 err = AVDTP_BAD_ACP_SEID;
1556 stream = sep->stream;
1558 if (sep->state != AVDTP_STATE_STREAMING) {
1559 err = AVDTP_BAD_STATE;
1563 if (sep->ind && sep->ind->suspend) {
1564 if (!sep->ind->suspend(session, sep, stream, &err,
1569 avdtp_sep_set_state(session, sep, AVDTP_STATE_OPEN);
1572 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1573 AVDTP_SUSPEND, NULL, 0);
1576 memset(&rej, 0, sizeof(rej));
1577 rej.acp_seid = failed_seid;
1579 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1580 AVDTP_SUSPEND, &rej, sizeof(rej));
1583 static gboolean avdtp_abort_cmd(struct avdtp *session, uint8_t transaction,
1584 struct seid_req *req, unsigned int size)
1586 struct avdtp_local_sep *sep;
1590 if (size < sizeof(struct seid_req)) {
1591 error("Too short abort request");
1595 sep = find_local_sep_by_seid(session->server, req->acp_seid);
1596 if (!sep || !sep->stream) {
1597 err = AVDTP_BAD_ACP_SEID;
1601 if (sep->ind && sep->ind->abort) {
1602 if (!sep->ind->abort(session, sep, sep->stream, &err,
1607 ret = avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
1608 AVDTP_ABORT, NULL, 0);
1610 avdtp_sep_set_state(session, sep, AVDTP_STATE_ABORTING);
1615 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
1616 AVDTP_ABORT, &err, sizeof(err));
1619 static gboolean avdtp_secctl_cmd(struct avdtp *session, uint8_t transaction,
1620 struct seid_req *req, int size)
1622 return avdtp_unknown_cmd(session, transaction, (void *) req, size);
1625 static gboolean avdtp_parse_cmd(struct avdtp *session, uint8_t transaction,
1626 uint8_t signal_id, void *buf, int size)
1628 switch (signal_id) {
1629 case AVDTP_DISCOVER:
1630 debug("Received DISCOVER_CMD");
1631 return avdtp_discover_cmd(session, transaction, buf, size);
1632 case AVDTP_GET_CAPABILITIES:
1633 debug("Received GET_CAPABILITIES_CMD");
1634 return avdtp_getcap_cmd(session, transaction, buf, size);
1635 case AVDTP_SET_CONFIGURATION:
1636 debug("Received SET_CONFIGURATION_CMD");
1637 return avdtp_setconf_cmd(session, transaction, buf, size);
1638 case AVDTP_GET_CONFIGURATION:
1639 debug("Received GET_CONFIGURATION_CMD");
1640 return avdtp_getconf_cmd(session, transaction, buf, size);
1641 case AVDTP_RECONFIGURE:
1642 debug("Received RECONFIGURE_CMD");
1643 return avdtp_reconf_cmd(session, transaction, buf, size);
1645 debug("Received OPEN_CMD");
1646 return avdtp_open_cmd(session, transaction, buf, size);
1648 debug("Received START_CMD");
1649 return avdtp_start_cmd(session, transaction, buf, size);
1651 debug("Received CLOSE_CMD");
1652 return avdtp_close_cmd(session, transaction, buf, size);
1654 debug("Received SUSPEND_CMD");
1655 return avdtp_suspend_cmd(session, transaction, buf, size);
1657 debug("Received ABORT_CMD");
1658 return avdtp_abort_cmd(session, transaction, buf, size);
1659 case AVDTP_SECURITY_CONTROL:
1660 debug("Received SECURITY_CONTROL_CMD");
1661 return avdtp_secctl_cmd(session, transaction, buf, size);
1663 debug("Received unknown request id %u", signal_id);
1664 return avdtp_unknown_cmd(session, transaction, buf, size);
1668 enum avdtp_parse_result { PARSE_ERROR, PARSE_FRAGMENT, PARSE_SUCCESS };
1670 static enum avdtp_parse_result avdtp_parse_data(struct avdtp *session,
1671 void *buf, size_t size)
1673 struct avdtp_common_header *header = buf;
1674 struct avdtp_single_header *single = (void *) session->buf;
1675 struct avdtp_start_header *start = (void *) session->buf;
1679 switch (header->packet_type) {
1680 case AVDTP_PKT_TYPE_SINGLE:
1681 if (size < sizeof(*single)) {
1682 error("Received too small single packet (%zu bytes)", size);
1685 if (session->in.active) {
1686 error("SINGLE: Invalid AVDTP packet fragmentation");
1690 payload = session->buf + sizeof(*single);
1691 payload_size = size - sizeof(*single);
1693 session->in.active = TRUE;
1694 session->in.data_size = 0;
1695 session->in.no_of_packets = 1;
1696 session->in.transaction = header->transaction;
1697 session->in.message_type = header->message_type;
1698 session->in.signal_id = single->signal_id;
1701 case AVDTP_PKT_TYPE_START:
1702 if (size < sizeof(*start)) {
1703 error("Received too small start packet (%zu bytes)", size);
1706 if (session->in.active) {
1707 error("START: Invalid AVDTP packet fragmentation");
1711 session->in.active = TRUE;
1712 session->in.data_size = 0;
1713 session->in.transaction = header->transaction;
1714 session->in.message_type = header->message_type;
1715 session->in.no_of_packets = start->no_of_packets;
1716 session->in.signal_id = start->signal_id;
1718 payload = session->buf + sizeof(*start);
1719 payload_size = size - sizeof(*start);
1722 case AVDTP_PKT_TYPE_CONTINUE:
1723 if (size < sizeof(struct avdtp_continue_header)) {
1724 error("Received too small continue packet (%zu bytes)",
1728 if (!session->in.active) {
1729 error("CONTINUE: Invalid AVDTP packet fragmentation");
1732 if (session->in.transaction != header->transaction) {
1733 error("Continue transaction id doesn't match");
1736 if (session->in.no_of_packets <= 1) {
1737 error("Too few continue packets");
1741 payload = session->buf + sizeof(struct avdtp_continue_header);
1742 payload_size = size - sizeof(struct avdtp_continue_header);
1745 case AVDTP_PKT_TYPE_END:
1746 if (size < sizeof(struct avdtp_continue_header)) {
1747 error("Received too small end packet (%zu bytes)", size);
1750 if (!session->in.active) {
1751 error("END: Invalid AVDTP packet fragmentation");
1754 if (session->in.transaction != header->transaction) {
1755 error("End transaction id doesn't match");
1758 if (session->in.no_of_packets > 1) {
1759 error("Got an end packet too early");
1763 payload = session->buf + sizeof(struct avdtp_continue_header);
1764 payload_size = size - sizeof(struct avdtp_continue_header);
1768 error("Invalid AVDTP packet type 0x%02X", header->packet_type);
1772 if (session->in.data_size + payload_size >
1773 sizeof(session->in.buf)) {
1774 error("Not enough incoming buffer space!");
1778 memcpy(session->in.buf + session->in.data_size, payload, payload_size);
1779 session->in.data_size += payload_size;
1781 if (session->in.no_of_packets > 1) {
1782 session->in.no_of_packets--;
1783 debug("Received AVDTP fragment. %d to go",
1784 session->in.no_of_packets);
1785 return PARSE_FRAGMENT;
1788 session->in.active = FALSE;
1790 return PARSE_SUCCESS;
1793 static gboolean session_cb(GIOChannel *chan, GIOCondition cond,
1796 struct avdtp *session = data;
1797 struct avdtp_common_header *header;
1800 debug("session_cb");
1802 if (cond & G_IO_NVAL)
1805 header = (void *) session->buf;
1807 if (cond & (G_IO_HUP | G_IO_ERR))
1810 if (g_io_channel_read(chan, session->buf, session->imtu, &size)
1811 != G_IO_ERROR_NONE) {
1812 error("IO Channel read error");
1816 if (size < sizeof(struct avdtp_common_header)) {
1817 error("Received too small packet (%zu bytes)", size);
1821 switch (avdtp_parse_data(session, session->buf, size)) {
1824 case PARSE_FRAGMENT:
1830 if (session->in.message_type == AVDTP_MSG_TYPE_COMMAND) {
1831 if (!avdtp_parse_cmd(session, session->in.transaction,
1832 session->in.signal_id,
1834 session->in.data_size)) {
1835 error("Unable to handle command. Disconnecting");
1839 if (session->ref == 1 && !session->streams && !session->req)
1840 set_disconnect_timer(session);
1842 if (session->streams && session->dc_timer)
1843 remove_disconnect_timer(session);
1848 if (session->req == NULL) {
1849 error("No pending request, ignoring message");
1853 if (header->transaction != session->req->transaction) {
1854 error("Transaction label doesn't match");
1858 if (session->in.signal_id != session->req->signal_id) {
1859 error("Reponse signal doesn't match");
1863 g_source_remove(session->req->timeout);
1864 session->req->timeout = 0;
1866 switch (header->message_type) {
1867 case AVDTP_MSG_TYPE_ACCEPT:
1868 if (!avdtp_parse_resp(session, session->req->stream,
1869 session->in.transaction,
1870 session->in.signal_id,
1872 session->in.data_size)) {
1873 error("Unable to parse accept response");
1877 case AVDTP_MSG_TYPE_REJECT:
1878 if (!avdtp_parse_rej(session, session->req->stream,
1879 session->in.transaction,
1880 session->in.signal_id,
1882 session->in.data_size)) {
1883 error("Unable to parse reject response");
1888 error("Unknown message type 0x%02X", header->message_type);
1892 pending_req_free(session->req);
1893 session->req = NULL;
1895 process_queue(session);
1900 connection_lost(session, EIO);
1905 static struct avdtp *find_session(GSList *list, const bdaddr_t *dst)
1909 for (l = list; l != NULL; l = g_slist_next(l)) {
1910 struct avdtp *s = l->data;
1912 if (bacmp(dst, &s->dst))
1921 static struct avdtp *avdtp_get_internal(const bdaddr_t *src, const bdaddr_t *dst)
1923 struct avdtp_server *server;
1924 struct avdtp *session;
1926 assert(src != NULL);
1927 assert(dst != NULL);
1929 server = find_server(servers, src);
1933 session = find_session(server->sessions, dst);
1935 if (session->pending_auth)
1941 session = g_new0(struct avdtp, 1);
1943 session->server = server;
1944 bacpy(&session->dst, dst);
1946 /* We don't use avdtp_set_state() here since this isn't a state change
1947 * but just setting of the initial state */
1948 session->state = AVDTP_SESSION_STATE_DISCONNECTED;
1949 session->auto_dc = TRUE;
1951 server->sessions = g_slist_append(server->sessions, session);
1956 struct avdtp *avdtp_get(bdaddr_t *src, bdaddr_t *dst)
1958 struct avdtp *session;
1960 session = avdtp_get_internal(src, dst);
1965 return avdtp_ref(session);
1968 static void avdtp_connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
1970 struct avdtp *session = user_data;
1972 GError *gerr = NULL;
1975 error("%s", err->message);
1980 session->io = g_io_channel_ref(chan);
1982 bt_io_get(chan, BT_IO_L2CAP, &gerr,
1983 BT_IO_OPT_OMTU, &session->omtu,
1984 BT_IO_OPT_IMTU, &session->imtu,
1987 error("%s", gerr->message);
1992 ba2str(&session->dst, address);
1993 debug("AVDTP: connected %s channel to %s",
1994 session->pending_open ? "transport" : "signaling",
1997 if (session->state == AVDTP_SESSION_STATE_CONNECTING) {
1998 debug("AVDTP imtu=%u, omtu=%u", session->imtu, session->omtu);
2000 session->buf = g_malloc0(session->imtu);
2001 avdtp_set_state(session, AVDTP_SESSION_STATE_CONNECTED);
2004 g_source_remove(session->io_id);
2006 /* This watch should be low priority since otherwise the
2007 * connect callback might be dispatched before the session
2008 * callback if the kernel wakes us up at the same time for
2009 * them. This could happen if a headset is very quick in
2010 * sending the Start command after connecting the stream
2011 * transport channel.
2013 session->io_id = g_io_add_watch_full(chan,
2015 G_IO_IN | G_IO_ERR | G_IO_HUP
2017 (GIOFunc) session_cb, session,
2020 if (session->stream_setup) {
2021 set_disconnect_timer(session);
2022 avdtp_set_auto_disconnect(session, FALSE);
2024 } else if (session->pending_open)
2025 handle_transport_connect(session, chan, session->imtu,
2030 process_queue(session);
2035 if (session->pending_open) {
2036 struct avdtp_stream *stream = session->pending_open;
2038 handle_transport_connect(session, NULL, 0, 0);
2040 if (avdtp_abort(session, stream) < 0)
2041 avdtp_sep_set_state(session, stream->lsep,
2044 connection_lost(session, EIO);
2049 static void auth_cb(DBusError *derr, void *user_data)
2051 struct avdtp *session = user_data;
2054 if (derr && dbus_error_is_set(derr)) {
2055 error("Access denied: %s", derr->message);
2056 connection_lost(session, EACCES);
2060 if (!bt_io_accept(session->io, avdtp_connect_cb, session, NULL,
2062 error("bt_io_accept: %s", err->message);
2063 connection_lost(session, EACCES);
2068 /* This is so that avdtp_connect_cb will know to do the right thing
2069 * with respect to the disconnect timer */
2070 session->stream_setup = TRUE;
2073 static void avdtp_confirm_cb(GIOChannel *chan, gpointer data)
2075 struct avdtp *session;
2076 struct audio_device *dev;
2082 bt_io_get(chan, BT_IO_L2CAP, &err,
2083 BT_IO_OPT_SOURCE_BDADDR, &src,
2084 BT_IO_OPT_DEST_BDADDR, &dst,
2085 BT_IO_OPT_DEST, address,
2088 error("%s", err->message);
2093 debug("AVDTP: incoming connect from %s", address);
2095 session = avdtp_get_internal(&src, &dst);
2099 if (session->pending_open && session->pending_open->open_acp) {
2100 if (!bt_io_accept(chan, avdtp_connect_cb, session, NULL, NULL))
2106 error("Refusing unexpected connect from %s", address);
2110 dev = manager_get_device(&src, &dst, FALSE);
2112 dev = manager_get_device(&src, &dst, TRUE);
2114 error("Unable to get audio device object for %s",
2118 btd_device_add_uuid(dev->btd_dev, ADVANCED_AUDIO_UUID);
2121 session->io = g_io_channel_ref(chan);
2122 avdtp_set_state(session, AVDTP_SESSION_STATE_CONNECTING);
2124 session->io_id = g_io_add_watch(chan, G_IO_ERR | G_IO_HUP | G_IO_NVAL,
2125 (GIOFunc) session_cb, session);
2126 perr = audio_device_request_authorization(dev, ADVANCED_AUDIO_UUID,
2129 avdtp_unref(session);
2133 dev->auto_connect = auto_connect;
2138 g_io_channel_shutdown(chan, TRUE, NULL);
2141 static int l2cap_connect(struct avdtp *session)
2146 io = bt_io_connect(BT_IO_L2CAP, avdtp_connect_cb, session,
2148 BT_IO_OPT_SOURCE_BDADDR, &session->server->src,
2149 BT_IO_OPT_DEST_BDADDR, &session->dst,
2150 BT_IO_OPT_PSM, AVDTP_PSM,
2153 error("%s", err->message);
2158 g_io_channel_unref(io);
2163 static void queue_request(struct avdtp *session, struct pending_req *req,
2167 session->prio_queue = g_slist_append(session->prio_queue, req);
2169 session->req_queue = g_slist_append(session->req_queue, req);
2172 static uint8_t req_get_seid(struct pending_req *req)
2174 if (req->signal_id == AVDTP_DISCOVER)
2177 return ((struct seid_req *) (req->data))->acp_seid;
2180 static gboolean request_timeout(gpointer user_data)
2182 struct avdtp *session = user_data;
2183 struct pending_req *req;
2184 struct seid_req sreq;
2185 struct avdtp_local_sep *lsep;
2186 struct avdtp_stream *stream;
2188 struct avdtp_error err;
2191 session->req = NULL;
2193 avdtp_error_init(&err, AVDTP_ERROR_ERRNO, ETIMEDOUT);
2195 seid = req_get_seid(req);
2197 stream = find_stream_by_rseid(session, seid);
2202 lsep = stream->lsep;
2206 switch (req->signal_id) {
2207 case AVDTP_RECONFIGURE:
2208 error("Reconfigure request timed out");
2209 if (lsep && lsep->cfm && lsep->cfm->reconfigure)
2210 lsep->cfm->reconfigure(session, lsep, stream, &err,
2214 error("Open request timed out");
2215 if (lsep && lsep->cfm && lsep->cfm->open)
2216 lsep->cfm->open(session, lsep, stream, &err,
2220 error("Start request timed out");
2221 if (lsep && lsep->cfm && lsep->cfm->start)
2222 lsep->cfm->start(session, lsep, stream, &err,
2226 error("Suspend request timed out");
2227 if (lsep && lsep->cfm && lsep->cfm->suspend)
2228 lsep->cfm->suspend(session, lsep, stream, &err,
2232 error("Close request timed out");
2233 if (lsep && lsep->cfm && lsep->cfm->close) {
2234 lsep->cfm->close(session, lsep, stream, &err,
2237 stream->close_int = FALSE;
2240 case AVDTP_SET_CONFIGURATION:
2241 error("SetConfiguration request timed out");
2242 if (lsep && lsep->cfm && lsep->cfm->set_configuration)
2243 lsep->cfm->set_configuration(session, lsep, stream,
2244 &err, lsep->user_data);
2246 case AVDTP_DISCOVER:
2247 error("Discover request timed out");
2249 case AVDTP_GET_CAPABILITIES:
2250 error("GetCapabilities request timed out");
2253 error("Abort request timed out");
2257 memset(&sreq, 0, sizeof(sreq));
2258 sreq.acp_seid = seid;
2260 if (send_request(session, TRUE, stream, AVDTP_ABORT,
2261 &sreq, sizeof(sreq)) < 0) {
2262 error("Unable to send abort request");
2269 connection_lost(session, ETIMEDOUT);
2271 pending_req_free(req);
2275 static int send_req(struct avdtp *session, gboolean priority,
2276 struct pending_req *req)
2278 static int transaction = 0;
2281 if (session->state == AVDTP_SESSION_STATE_DISCONNECTED) {
2282 err = l2cap_connect(session);
2285 avdtp_set_state(session, AVDTP_SESSION_STATE_CONNECTING);
2288 if (session->state < AVDTP_SESSION_STATE_CONNECTED ||
2289 session->req != NULL) {
2290 queue_request(session, req, priority);
2294 req->transaction = transaction++;
2297 /* FIXME: Should we retry to send if the buffer
2298 was not totally sent or in case of EINTR? */
2299 if (!avdtp_send(session, req->transaction, AVDTP_MSG_TYPE_COMMAND,
2300 req->signal_id, req->data, req->data_size)) {
2308 req->timeout = g_timeout_add_seconds(REQ_TIMEOUT,
2319 static int send_request(struct avdtp *session, gboolean priority,
2320 struct avdtp_stream *stream, uint8_t signal_id,
2321 void *buffer, size_t size)
2323 struct pending_req *req;
2325 req = g_new0(struct pending_req, 1);
2326 req->signal_id = signal_id;
2327 req->data = g_malloc(size);
2328 memcpy(req->data, buffer, size);
2329 req->data_size = size;
2330 req->stream = stream;
2332 return send_req(session, priority, req);
2335 static gboolean avdtp_discover_resp(struct avdtp *session,
2336 struct discover_resp *resp, int size)
2340 sep_count = size / sizeof(struct seid_info);
2342 for (i = 0; i < sep_count; i++) {
2343 struct avdtp_remote_sep *sep;
2344 struct avdtp_stream *stream;
2345 struct seid_req req;
2348 debug("seid %d type %d media %d in use %d",
2349 resp->seps[i].seid, resp->seps[i].type,
2350 resp->seps[i].media_type, resp->seps[i].inuse);
2352 stream = find_stream_by_rseid(session, resp->seps[i].seid);
2354 sep = find_remote_sep(session->seps, resp->seps[i].seid);
2356 if (resp->seps[i].inuse && !stream)
2358 sep = g_new0(struct avdtp_remote_sep, 1);
2359 session->seps = g_slist_append(session->seps, sep);
2362 sep->stream = stream;
2363 sep->seid = resp->seps[i].seid;
2364 sep->type = resp->seps[i].type;
2365 sep->media_type = resp->seps[i].media_type;
2367 memset(&req, 0, sizeof(req));
2368 req.acp_seid = sep->seid;
2370 ret = send_request(session, TRUE, NULL,
2371 AVDTP_GET_CAPABILITIES,
2374 finalize_discovery(session, -ret);
2382 static gboolean avdtp_get_capabilities_resp(struct avdtp *session,
2383 struct getcap_resp *resp,
2386 struct avdtp_remote_sep *sep;
2389 /* Check for minimum required packet size includes:
2390 * 1. getcap resp header
2391 * 2. media transport capability (2 bytes)
2392 * 3. media codec capability type + length (2 bytes)
2393 * 4. the actual media codec elements
2395 if (size < (sizeof(struct getcap_resp) + 4 +
2396 sizeof(struct avdtp_media_codec_capability))) {
2397 error("Too short getcap resp packet");
2401 seid = ((struct seid_req *) session->req->data)->acp_seid;
2403 sep = find_remote_sep(session->seps, seid);
2405 debug("seid %d type %d media %d", sep->seid,
2406 sep->type, sep->media_type);
2409 g_slist_foreach(sep->caps, (GFunc) g_free, NULL);
2410 g_slist_free(sep->caps);
2415 sep->caps = caps_to_list(resp->caps, size - sizeof(struct getcap_resp),
2421 static gboolean avdtp_set_configuration_resp(struct avdtp *session,
2422 struct avdtp_stream *stream,
2423 struct avdtp_single_header *resp,
2426 struct avdtp_local_sep *sep = stream->lsep;
2428 if (sep->cfm && sep->cfm->set_configuration)
2429 sep->cfm->set_configuration(session, sep, stream, NULL,
2432 avdtp_sep_set_state(session, sep, AVDTP_STATE_CONFIGURED);
2437 static gboolean avdtp_reconfigure_resp(struct avdtp *session,
2438 struct avdtp_stream *stream,
2439 struct avdtp_single_header *resp, int size)
2444 static gboolean avdtp_open_resp(struct avdtp *session, struct avdtp_stream *stream,
2445 struct seid_rej *resp, int size)
2447 struct avdtp_local_sep *sep = stream->lsep;
2449 if (l2cap_connect(session) < 0) {
2450 avdtp_sep_set_state(session, sep, AVDTP_STATE_IDLE);
2454 session->pending_open = stream;
2459 static gboolean avdtp_start_resp(struct avdtp *session,
2460 struct avdtp_stream *stream,
2461 struct seid_rej *resp, int size)
2463 struct avdtp_local_sep *sep = stream->lsep;
2465 if (sep->cfm && sep->cfm->start)
2466 sep->cfm->start(session, sep, stream, NULL, sep->user_data);
2468 /* We might be in STREAMING already if both sides send START_CMD at the
2469 * same time and the one in SNK role doesn't reject it as it should */
2470 if (sep->state != AVDTP_STATE_STREAMING)
2471 avdtp_sep_set_state(session, sep, AVDTP_STATE_STREAMING);
2476 static gboolean avdtp_close_resp(struct avdtp *session,
2477 struct avdtp_stream *stream,
2478 struct seid_rej *resp, int size)
2480 struct avdtp_local_sep *sep = stream->lsep;
2482 avdtp_sep_set_state(session, sep, AVDTP_STATE_CLOSING);
2484 close_stream(stream);
2489 static gboolean avdtp_suspend_resp(struct avdtp *session,
2490 struct avdtp_stream *stream,
2491 void *data, int size)
2493 struct avdtp_local_sep *sep = stream->lsep;
2495 avdtp_sep_set_state(session, sep, AVDTP_STATE_OPEN);
2497 if (sep->cfm && sep->cfm->suspend)
2498 sep->cfm->suspend(session, sep, stream, NULL, sep->user_data);
2503 static gboolean avdtp_abort_resp(struct avdtp *session,
2504 struct avdtp_stream *stream,
2505 struct seid_rej *resp, int size)
2507 struct avdtp_local_sep *sep = stream->lsep;
2509 if (sep->cfm && sep->cfm->abort)
2510 sep->cfm->abort(session, sep, stream, NULL, sep->user_data);
2512 avdtp_sep_set_state(session, sep, AVDTP_STATE_IDLE);
2517 static gboolean avdtp_parse_resp(struct avdtp *session,
2518 struct avdtp_stream *stream,
2519 uint8_t transaction, uint8_t signal_id,
2520 void *buf, int size)
2522 struct pending_req *next;
2524 if (session->prio_queue)
2525 next = session->prio_queue->data;
2526 else if (session->req_queue)
2527 next = session->req_queue->data;
2531 switch (signal_id) {
2532 case AVDTP_DISCOVER:
2533 debug("DISCOVER request succeeded");
2534 return avdtp_discover_resp(session, buf, size);
2535 case AVDTP_GET_CAPABILITIES:
2536 debug("GET_CAPABILITIES request succeeded");
2537 if (!avdtp_get_capabilities_resp(session, buf, size))
2539 if (!(next && next->signal_id == AVDTP_GET_CAPABILITIES))
2540 finalize_discovery(session, 0);
2542 case AVDTP_SET_CONFIGURATION:
2543 debug("SET_CONFIGURATION request succeeded");
2544 return avdtp_set_configuration_resp(session, stream,
2546 case AVDTP_RECONFIGURE:
2547 debug("RECONFIGURE request succeeded");
2548 return avdtp_reconfigure_resp(session, stream, buf, size);
2550 debug("OPEN request succeeded");
2551 return avdtp_open_resp(session, stream, buf, size);
2553 debug("SUSPEND request succeeded");
2554 return avdtp_suspend_resp(session, stream, buf, size);
2556 debug("START request succeeded");
2557 return avdtp_start_resp(session, stream, buf, size);
2559 debug("CLOSE request succeeded");
2560 return avdtp_close_resp(session, stream, buf, size);
2562 debug("ABORT request succeeded");
2563 return avdtp_abort_resp(session, stream, buf, size);
2566 error("Unknown signal id in accept response: %u", signal_id);
2570 static gboolean seid_rej_to_err(struct seid_rej *rej, unsigned int size,
2571 struct avdtp_error *err)
2573 if (size < sizeof(struct seid_rej)) {
2574 error("Too small packet for seid_rej");
2578 avdtp_error_init(err, AVDTP_ERROR_ERROR_CODE, rej->error);
2583 static gboolean conf_rej_to_err(struct conf_rej *rej, unsigned int size,
2584 struct avdtp_error *err, uint8_t *category)
2586 if (size < sizeof(struct conf_rej)) {
2587 error("Too small packet for conf_rej");
2591 avdtp_error_init(err, AVDTP_ERROR_ERROR_CODE, rej->error);
2594 *category = rej->category;
2599 static gboolean stream_rej_to_err(struct stream_rej *rej, unsigned int size,
2600 struct avdtp_error *err,
2603 if (size < sizeof(struct stream_rej)) {
2604 error("Too small packet for stream_rej");
2608 avdtp_error_init(err, AVDTP_ERROR_ERROR_CODE, rej->error);
2611 *acp_seid = rej->acp_seid;
2616 static gboolean avdtp_parse_rej(struct avdtp *session,
2617 struct avdtp_stream *stream,
2618 uint8_t transaction, uint8_t signal_id,
2619 void *buf, int size)
2621 struct avdtp_error err;
2622 uint8_t acp_seid, category;
2623 struct avdtp_local_sep *sep = stream ? stream->lsep : NULL;
2625 switch (signal_id) {
2626 case AVDTP_DISCOVER:
2627 if (!seid_rej_to_err(buf, size, &err))
2629 error("DISCOVER request rejected: %s (%d)",
2630 avdtp_strerror(&err), err.err.error_code);
2632 case AVDTP_GET_CAPABILITIES:
2633 if (!seid_rej_to_err(buf, size, &err))
2635 error("GET_CAPABILITIES request rejected: %s (%d)",
2636 avdtp_strerror(&err), err.err.error_code);
2639 if (!seid_rej_to_err(buf, size, &err))
2641 error("OPEN request rejected: %s (%d)",
2642 avdtp_strerror(&err), err.err.error_code);
2643 if (sep && sep->cfm && sep->cfm->open)
2644 sep->cfm->open(session, sep, stream, &err,
2647 case AVDTP_SET_CONFIGURATION:
2648 if (!conf_rej_to_err(buf, size, &err, &category))
2650 error("SET_CONFIGURATION request rejected: %s (%d)",
2651 avdtp_strerror(&err), err.err.error_code);
2652 if (sep && sep->cfm && sep->cfm->set_configuration)
2653 sep->cfm->set_configuration(session, sep, stream,
2654 &err, sep->user_data);
2656 case AVDTP_RECONFIGURE:
2657 if (!conf_rej_to_err(buf, size, &err, &category))
2659 error("RECONFIGURE request rejected: %s (%d)",
2660 avdtp_strerror(&err), err.err.error_code);
2661 if (sep && sep->cfm && sep->cfm->reconfigure)
2662 sep->cfm->reconfigure(session, sep, stream, &err,
2666 if (!stream_rej_to_err(buf, size, &err, &acp_seid))
2668 error("START request rejected: %s (%d)",
2669 avdtp_strerror(&err), err.err.error_code);
2670 if (sep && sep->cfm && sep->cfm->start)
2671 sep->cfm->start(session, sep, stream, &err,
2675 if (!stream_rej_to_err(buf, size, &err, &acp_seid))
2677 error("SUSPEND request rejected: %s (%d)",
2678 avdtp_strerror(&err), err.err.error_code);
2679 if (sep && sep->cfm && sep->cfm->suspend)
2680 sep->cfm->suspend(session, sep, stream, &err,
2684 if (!stream_rej_to_err(buf, size, &err, &acp_seid))
2686 error("CLOSE request rejected: %s (%d)",
2687 avdtp_strerror(&err), err.err.error_code);
2688 if (sep && sep->cfm && sep->cfm->close) {
2689 sep->cfm->close(session, sep, stream, &err,
2691 stream->close_int = FALSE;
2695 if (!stream_rej_to_err(buf, size, &err, &acp_seid))
2697 error("ABORT request rejected: %s (%d)",
2698 avdtp_strerror(&err), err.err.error_code);
2699 if (sep && sep->cfm && sep->cfm->abort)
2700 sep->cfm->abort(session, sep, stream, &err,
2704 error("Unknown reject response signal id: %u", signal_id);
2709 gboolean avdtp_is_connected(const bdaddr_t *src, const bdaddr_t *dst)
2711 struct avdtp_server *server;
2712 struct avdtp *session;
2714 server = find_server(servers, src);
2718 session = find_session(server->sessions, dst);
2722 if (session->state != AVDTP_SESSION_STATE_DISCONNECTED)
2728 struct avdtp_service_capability *avdtp_stream_get_codec(
2729 struct avdtp_stream *stream)
2733 for (l = stream->caps; l; l = l->next) {
2734 struct avdtp_service_capability *cap = l->data;
2736 if (cap->category == AVDTP_MEDIA_CODEC)
2743 gboolean avdtp_stream_has_capability(struct avdtp_stream *stream,
2744 struct avdtp_service_capability *cap)
2747 struct avdtp_service_capability *stream_cap;
2749 for (l = stream->caps; l; l = g_slist_next(l)) {
2750 stream_cap = l->data;
2752 if (stream_cap->category != cap->category ||
2753 stream_cap->length != cap->length)
2756 if (memcmp(stream_cap->data, cap->data, cap->length) == 0)
2763 gboolean avdtp_stream_has_capabilities(struct avdtp_stream *stream,
2768 for (l = caps; l; l = g_slist_next(l)) {
2769 struct avdtp_service_capability *cap = l->data;
2771 if (!avdtp_stream_has_capability(stream, cap))
2778 gboolean avdtp_stream_get_transport(struct avdtp_stream *stream, int *sock,
2779 uint16_t *imtu, uint16_t *omtu,
2782 if (stream->io == NULL)
2786 *sock = g_io_channel_unix_get_fd(stream->io);
2789 *omtu = stream->omtu;
2792 *imtu = stream->imtu;
2795 *caps = stream->caps;
2800 static int process_queue(struct avdtp *session)
2803 struct pending_req *req;
2808 if (session->prio_queue)
2809 queue = &session->prio_queue;
2811 queue = &session->req_queue;
2819 *queue = g_slist_remove(*queue, req);
2821 return send_req(session, FALSE, req);
2824 struct avdtp_remote_sep *avdtp_get_remote_sep(struct avdtp *session,
2829 for (l = session->seps; l; l = l->next) {
2830 struct avdtp_remote_sep *sep = l->data;
2832 if (sep->seid == seid)
2839 uint8_t avdtp_get_seid(struct avdtp_remote_sep *sep)
2844 uint8_t avdtp_get_type(struct avdtp_remote_sep *sep)
2849 struct avdtp_service_capability *avdtp_get_codec(struct avdtp_remote_sep *sep)
2854 struct avdtp_stream *avdtp_get_stream(struct avdtp_remote_sep *sep)
2859 struct avdtp_service_capability *avdtp_service_cap_new(uint8_t category,
2860 void *data, int length)
2862 struct avdtp_service_capability *cap;
2864 if (category < AVDTP_MEDIA_TRANSPORT || category > AVDTP_MEDIA_CODEC)
2867 cap = g_malloc(sizeof(struct avdtp_service_capability) + length);
2868 cap->category = category;
2869 cap->length = length;
2870 memcpy(cap->data, data, length);
2875 static gboolean process_discover(gpointer data)
2877 struct avdtp *session = data;
2879 finalize_discovery(session, 0);
2884 int avdtp_discover(struct avdtp *session, avdtp_discover_cb_t cb,
2889 if (session->discov_cb)
2892 if (session->seps) {
2893 session->discov_cb = cb;
2894 session->user_data = user_data;
2895 g_idle_add(process_discover, session);
2899 ret = send_request(session, FALSE, NULL, AVDTP_DISCOVER, NULL, 0);
2901 session->discov_cb = cb;
2902 session->user_data = user_data;
2908 int avdtp_get_seps(struct avdtp *session, uint8_t acp_type, uint8_t media_type,
2909 uint8_t codec, struct avdtp_local_sep **lsep,
2910 struct avdtp_remote_sep **rsep)
2915 int_type = acp_type == AVDTP_SEP_TYPE_SINK ?
2916 AVDTP_SEP_TYPE_SOURCE : AVDTP_SEP_TYPE_SINK;
2918 *lsep = find_local_sep(session->server, int_type, media_type, codec);
2922 for (l = session->seps; l != NULL; l = g_slist_next(l)) {
2923 struct avdtp_remote_sep *sep = l->data;
2924 struct avdtp_service_capability *cap;
2925 struct avdtp_media_codec_capability *codec_data;
2927 if (sep->type != acp_type)
2930 if (sep->media_type != media_type)
2937 codec_data = (void *) cap->data;
2939 if (codec_data->media_codec_type != codec)
2951 gboolean avdtp_stream_remove_cb(struct avdtp *session,
2952 struct avdtp_stream *stream,
2956 struct stream_callback *cb;
2961 for (cb = NULL, l = stream->callbacks; l != NULL; l = l->next) {
2962 struct stream_callback *tmp = l->data;
2963 if (tmp && tmp->id == id) {
2972 stream->callbacks = g_slist_remove(stream->callbacks, cb);
2978 unsigned int avdtp_stream_add_cb(struct avdtp *session,
2979 struct avdtp_stream *stream,
2980 avdtp_stream_state_cb cb, void *data)
2982 struct stream_callback *stream_cb;
2983 static unsigned int id = 0;
2985 stream_cb = g_new(struct stream_callback, 1);
2987 stream_cb->user_data = data;
2988 stream_cb->id = ++id;
2990 stream->callbacks = g_slist_append(stream->callbacks, stream_cb);;
2992 return stream_cb->id;
2995 int avdtp_get_configuration(struct avdtp *session, struct avdtp_stream *stream)
2997 struct seid_req req;
2999 if (session->state < AVDTP_SESSION_STATE_CONNECTED)
3002 memset(&req, 0, sizeof(req));
3003 req.acp_seid = stream->rseid;
3005 return send_request(session, FALSE, stream, AVDTP_GET_CONFIGURATION,
3009 static void copy_capabilities(gpointer data, gpointer user_data)
3011 struct avdtp_service_capability *src_cap = data;
3012 struct avdtp_service_capability *dst_cap;
3013 GSList **l = user_data;
3015 dst_cap = avdtp_service_cap_new(src_cap->category, src_cap->data,
3018 *l = g_slist_append(*l, dst_cap);
3021 int avdtp_set_configuration(struct avdtp *session,
3022 struct avdtp_remote_sep *rsep,
3023 struct avdtp_local_sep *lsep,
3025 struct avdtp_stream **stream)
3027 struct setconf_req *req;
3028 struct avdtp_stream *new_stream;
3031 struct avdtp_service_capability *cap;
3034 if (session->state != AVDTP_SESSION_STATE_CONNECTED)
3037 if (!(lsep && rsep))
3040 debug("avdtp_set_configuration(%p): int_seid=%u, acp_seid=%u",
3041 session, lsep->info.seid, rsep->seid);
3043 new_stream = g_new0(struct avdtp_stream, 1);
3044 new_stream->session = session;
3045 new_stream->lsep = lsep;
3046 new_stream->rseid = rsep->seid;
3048 g_slist_foreach(caps, copy_capabilities, &new_stream->caps);
3050 /* Calculate total size of request */
3051 for (l = caps, caps_len = 0; l != NULL; l = g_slist_next(l)) {
3053 caps_len += cap->length + 2;
3056 req = g_malloc0(sizeof(struct setconf_req) + caps_len);
3058 req->int_seid = lsep->info.seid;
3059 req->acp_seid = rsep->seid;
3061 /* Copy the capabilities into the request */
3062 for (l = caps, ptr = req->caps; l != NULL; l = g_slist_next(l)) {
3064 memcpy(ptr, cap, cap->length + 2);
3065 ptr += cap->length + 2;
3068 ret = send_request(session, FALSE, new_stream,
3069 AVDTP_SET_CONFIGURATION, req,
3070 sizeof(struct setconf_req) + caps_len);
3072 stream_free(new_stream);
3074 lsep->info.inuse = 1;
3075 lsep->stream = new_stream;
3076 rsep->stream = new_stream;
3077 session->streams = g_slist_append(session->streams, new_stream);
3079 *stream = new_stream;
3087 int avdtp_reconfigure(struct avdtp *session, GSList *caps,
3088 struct avdtp_stream *stream)
3090 struct reconf_req *req;
3094 struct avdtp_service_capability *cap;
3096 if (!g_slist_find(session->streams, stream))
3099 if (stream->lsep->state != AVDTP_STATE_OPEN)
3102 /* Calculate total size of request */
3103 for (l = caps, caps_len = 0; l != NULL; l = g_slist_next(l)) {
3105 caps_len += cap->length + 2;
3108 req = g_malloc0(sizeof(struct reconf_req) + caps_len);
3110 req->acp_seid = stream->rseid;
3112 /* Copy the capabilities into the request */
3113 for (l = caps, ptr = req->caps; l != NULL; l = g_slist_next(l)) {
3115 memcpy(ptr, cap, cap->length + 2);
3116 ptr += cap->length + 2;
3119 err = send_request(session, FALSE, stream, AVDTP_RECONFIGURE, req,
3120 sizeof(*req) + caps_len);
3126 int avdtp_open(struct avdtp *session, struct avdtp_stream *stream)
3128 struct seid_req req;
3130 if (!g_slist_find(session->streams, stream))
3133 if (stream->lsep->state > AVDTP_STATE_CONFIGURED)
3136 memset(&req, 0, sizeof(req));
3137 req.acp_seid = stream->rseid;
3139 return send_request(session, FALSE, stream, AVDTP_OPEN,
3143 int avdtp_start(struct avdtp *session, struct avdtp_stream *stream)
3145 struct start_req req;
3147 if (!g_slist_find(session->streams, stream))
3150 if (stream->lsep->state != AVDTP_STATE_OPEN)
3153 if (stream->close_int == TRUE) {
3154 error("avdtp_start: rejecting start since close is initiated");
3158 memset(&req, 0, sizeof(req));
3159 req.first_seid.seid = stream->rseid;
3161 return send_request(session, FALSE, stream, AVDTP_START,
3165 int avdtp_close(struct avdtp *session, struct avdtp_stream *stream)
3167 struct seid_req req;
3170 if (!g_slist_find(session->streams, stream))
3173 if (stream->lsep->state < AVDTP_STATE_OPEN)
3176 if (stream->close_int == TRUE) {
3177 error("avdtp_close: rejecting since close is already initiated");
3181 memset(&req, 0, sizeof(req));
3182 req.acp_seid = stream->rseid;
3184 ret = send_request(session, FALSE, stream, AVDTP_CLOSE,
3187 stream->close_int = TRUE;
3192 int avdtp_suspend(struct avdtp *session, struct avdtp_stream *stream)
3194 struct seid_req req;
3196 if (!g_slist_find(session->streams, stream))
3199 if (stream->lsep->state <= AVDTP_STATE_OPEN)
3202 memset(&req, 0, sizeof(req));
3203 req.acp_seid = stream->rseid;
3205 return send_request(session, FALSE, stream, AVDTP_SUSPEND,
3209 int avdtp_abort(struct avdtp *session, struct avdtp_stream *stream)
3211 struct seid_req req;
3214 if (!g_slist_find(session->streams, stream))
3217 if (stream->lsep->state <= AVDTP_STATE_OPEN)
3220 memset(&req, 0, sizeof(req));
3221 req.acp_seid = stream->rseid;
3223 ret = send_request(session, TRUE, stream, AVDTP_ABORT,
3226 avdtp_sep_set_state(session, stream->lsep,
3227 AVDTP_STATE_ABORTING);
3232 struct avdtp_local_sep *avdtp_register_sep(const bdaddr_t *src, uint8_t type,
3235 struct avdtp_sep_ind *ind,
3236 struct avdtp_sep_cfm *cfm,
3239 struct avdtp_server *server;
3240 struct avdtp_local_sep *sep;
3242 server = find_server(servers, src);
3246 if (g_slist_length(server->seps) > MAX_SEID)
3249 sep = g_new0(struct avdtp_local_sep, 1);
3251 sep->state = AVDTP_STATE_IDLE;
3252 sep->info.seid = g_slist_length(server->seps) + 1;
3253 sep->info.type = type;
3254 sep->info.media_type = media_type;
3255 sep->codec = codec_type;
3258 sep->user_data = user_data;
3259 sep->server = server;
3261 debug("SEP %p registered: type:%d codec:%d seid:%d", sep,
3262 sep->info.type, sep->codec, sep->info.seid);
3263 server->seps = g_slist_append(server->seps, sep);
3268 int avdtp_unregister_sep(struct avdtp_local_sep *sep)
3270 struct avdtp_server *server;
3275 server = sep->server;
3276 server->seps = g_slist_remove(server->seps, sep);
3279 release_stream(sep->stream, sep->stream->session);
3286 static GIOChannel *avdtp_server_socket(const bdaddr_t *src, gboolean master)
3291 io = bt_io_listen(BT_IO_L2CAP, NULL, avdtp_confirm_cb,
3293 BT_IO_OPT_SOURCE_BDADDR, src,
3294 BT_IO_OPT_PSM, AVDTP_PSM,
3295 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
3296 BT_IO_OPT_MASTER, master,
3299 error("%s", err->message);
3306 const char *avdtp_strerror(struct avdtp_error *err)
3308 if (err->type == AVDTP_ERROR_ERRNO)
3309 return strerror(err->err.posix_errno);
3311 switch(err->err.error_code) {
3312 case AVDTP_BAD_HEADER_FORMAT:
3313 return "Bad Header Format";
3314 case AVDTP_BAD_LENGTH:
3315 return "Bad Packet Lenght";
3316 case AVDTP_BAD_ACP_SEID:
3317 return "Bad Acceptor SEID";
3318 case AVDTP_SEP_IN_USE:
3319 return "Stream End Point in Use";
3320 case AVDTP_SEP_NOT_IN_USE:
3321 return "Stream End Point Not in Use";
3322 case AVDTP_BAD_SERV_CATEGORY:
3323 return "Bad Service Category";
3324 case AVDTP_BAD_PAYLOAD_FORMAT:
3325 return "Bad Payload format";
3326 case AVDTP_NOT_SUPPORTED_COMMAND:
3327 return "Command Not Supported";
3328 case AVDTP_INVALID_CAPABILITIES:
3329 return "Invalid Capabilities";
3330 case AVDTP_BAD_RECOVERY_TYPE:
3331 return "Bad Recovery Type";
3332 case AVDTP_BAD_MEDIA_TRANSPORT_FORMAT:
3333 return "Bad Media Transport Format";
3334 case AVDTP_BAD_RECOVERY_FORMAT:
3335 return "Bad Recovery Format";
3336 case AVDTP_BAD_ROHC_FORMAT:
3337 return "Bad Header Compression Format";
3338 case AVDTP_BAD_CP_FORMAT:
3339 return "Bad Content Protetion Format";
3340 case AVDTP_BAD_MULTIPLEXING_FORMAT:
3341 return "Bad Multiplexing Format";
3342 case AVDTP_UNSUPPORTED_CONFIGURATION:
3343 return "Configuration not supported";
3344 case AVDTP_BAD_STATE:
3347 return "Unknow error";
3351 avdtp_state_t avdtp_sep_get_state(struct avdtp_local_sep *sep)
3356 void avdtp_get_peers(struct avdtp *session, bdaddr_t *src, bdaddr_t *dst)
3359 bacpy(src, &session->server->src);
3361 bacpy(dst, &session->dst);
3364 int avdtp_init(const bdaddr_t *src, GKeyFile *config)
3367 gboolean tmp, master = TRUE;
3368 struct avdtp_server *server;
3371 tmp = g_key_file_get_boolean(config, "General",
3374 debug("audio.conf: %s", err->message);
3375 g_clear_error(&err);
3379 tmp = g_key_file_get_boolean(config, "General", "AutoConnect",
3382 g_clear_error(&err);
3387 server = g_new0(struct avdtp_server, 1);
3391 server->io = avdtp_server_socket(src, master);
3397 bacpy(&server->src, src);
3399 servers = g_slist_append(servers, server);
3404 void avdtp_exit(const bdaddr_t *src)
3406 struct avdtp_server *server;
3409 server = find_server(servers, src);
3413 for (l = server->sessions; l; l = l->next) {
3414 struct avdtp *session = l->data;
3416 connection_lost(session, -ECONNABORTED);
3419 servers = g_slist_remove(servers, server);
3421 g_io_channel_shutdown(server->io, TRUE, NULL);
3422 g_io_channel_unref(server->io);
3426 gboolean avdtp_has_stream(struct avdtp *session, struct avdtp_stream *stream)
3428 return g_slist_find(session->streams, stream) ? TRUE : FALSE;
3431 void avdtp_set_auto_disconnect(struct avdtp *session, gboolean auto_dc)
3433 session->auto_dc = auto_dc;
3436 gboolean avdtp_stream_setup_active(struct avdtp *session)
3438 return session->stream_setup;
3441 unsigned int avdtp_add_state_cb(avdtp_session_state_cb cb, void *user_data)
3443 struct avdtp_state_callback *state_cb;
3444 static unsigned int id = 0;
3446 state_cb = g_new(struct avdtp_state_callback, 1);
3448 state_cb->user_data = user_data;
3449 state_cb->id = ++id;
3451 avdtp_callbacks = g_slist_append(avdtp_callbacks, state_cb);;
3453 return state_cb->id;
3456 gboolean avdtp_remove_state_cb(unsigned int id)
3460 for (l = avdtp_callbacks; l != NULL; l = l->next) {
3461 struct avdtp_state_callback *cb = l->data;
3462 if (cb && cb->id == id) {
3463 avdtp_callbacks = g_slist_remove(avdtp_callbacks, cb);