1 /* 2 * 3 * BlueZ - Bluetooth protocol stack for Linux 4 * 5 * Copyright (C) 2006-2007 Nokia Corporation 6 * Copyright (C) 2004-2009 Marcel Holtmann <marcel (at) holtmann.org> 7 * 8 * 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. 13 * 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. 18 * 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 22 * 23 */ 24 25 #ifdef HAVE_CONFIG_H 26 #include <config.h> 27 #endif 28 29 #include <stdio.h> 30 #include <stdint.h> 31 #include <errno.h> 32 #include <unistd.h> 33 #include <assert.h> 34 #include <signal.h> 35 #include <netinet/in.h> 36 37 #include <bluetooth/bluetooth.h> 38 #include <bluetooth/sdp.h> 39 40 #include <glib.h> 41 #include <dbus/dbus.h> 42 43 #include "logging.h" 44 45 #include "../src/adapter.h" 46 #include "../src/device.h" 47 48 #include "device.h" 49 #include "manager.h" 50 #include "control.h" 51 #include "avdtp.h" 52 #include "glib-helper.h" 53 #include "btio.h" 54 #include "sink.h" 55 #include "source.h" 56 57 #include <bluetooth/l2cap.h> 58 59 #define AVDTP_PSM 25 60 61 #define MAX_SEID 0x3E 62 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 74 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 79 80 #define AVDTP_MSG_TYPE_COMMAND 0x00 81 #define AVDTP_MSG_TYPE_ACCEPT 0x02 82 #define AVDTP_MSG_TYPE_REJECT 0x03 83 84 #define REQ_TIMEOUT 4 85 #define DISCONNECT_TIMEOUT 1 86 #define STREAM_TIMEOUT 20 87 88 #if __BYTE_ORDER == __LITTLE_ENDIAN 89 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)); 95 96 struct avdtp_single_header { 97 uint8_t message_type:2; 98 uint8_t packet_type:2; 99 uint8_t transaction:4; 100 uint8_t signal_id:6; 101 uint8_t rfa0:2; 102 } __attribute__ ((packed)); 103 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; 109 uint8_t signal_id:6; 110 uint8_t rfa0:2; 111 } __attribute__ ((packed)); 112 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)); 118 119 struct seid_info { 120 uint8_t rfa0:1; 121 uint8_t inuse:1; 122 uint8_t seid:6; 123 uint8_t rfa2:3; 124 uint8_t type:1; 125 uint8_t media_type:4; 126 } __attribute__ ((packed)); 127 128 struct seid { 129 uint8_t rfa0:2; 130 uint8_t seid:6; 131 } __attribute__ ((packed)); 132 133 #elif __BYTE_ORDER == __BIG_ENDIAN 134 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)); 140 141 struct avdtp_single_header { 142 uint8_t transaction:4; 143 uint8_t packet_type:2; 144 uint8_t message_type:2; 145 uint8_t rfa0:2; 146 uint8_t signal_id:6; 147 } __attribute__ ((packed)); 148 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; 154 uint8_t rfa0:2; 155 uint8_t signal_id:6; 156 } __attribute__ ((packed)); 157 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)); 163 164 struct seid_info { 165 uint8_t seid:6; 166 uint8_t inuse:1; 167 uint8_t rfa0:1; 168 uint8_t media_type:4; 169 uint8_t type:1; 170 uint8_t rfa2:3; 171 } __attribute__ ((packed)); 172 173 struct seid { 174 uint8_t seid:6; 175 uint8_t rfa0:2; 176 } __attribute__ ((packed)); 177 178 #else 179 #error "Unknown byte order" 180 #endif 181 182 /* packets */ 183 184 struct discover_resp { 185 struct seid_info seps[0]; 186 } __attribute__ ((packed)); 187 188 struct getcap_resp { 189 uint8_t caps[0]; 190 } __attribute__ ((packed)); 191 192 struct start_req { 193 struct seid first_seid; 194 struct seid other_seids[0]; 195 } __attribute__ ((packed)); 196 197 struct suspend_req { 198 struct seid first_seid; 199 struct seid other_seids[0]; 200 } __attribute__ ((packed)); 201 202 struct seid_rej { 203 uint8_t error; 204 } __attribute__ ((packed)); 205 206 struct conf_rej { 207 uint8_t category; 208 uint8_t error; 209 } __attribute__ ((packed)); 210 211 #if __BYTE_ORDER == __LITTLE_ENDIAN 212 213 struct seid_req { 214 uint8_t rfa0:2; 215 uint8_t acp_seid:6; 216 } __attribute__ ((packed)); 217 218 struct setconf_req { 219 uint8_t rfa0:2; 220 uint8_t acp_seid:6; 221 uint8_t rfa1:2; 222 uint8_t int_seid:6; 223 224 uint8_t caps[0]; 225 } __attribute__ ((packed)); 226 227 struct stream_rej { 228 uint8_t rfa0:2; 229 uint8_t acp_seid:6; 230 uint8_t error; 231 } __attribute__ ((packed)); 232 233 struct reconf_req { 234 uint8_t rfa0:2; 235 uint8_t acp_seid:6; 236 237 uint8_t serv_cap; 238 uint8_t serv_cap_len; 239 240 uint8_t caps[0]; 241 } __attribute__ ((packed)); 242 243 #elif __BYTE_ORDER == __BIG_ENDIAN 244 245 struct seid_req { 246 uint8_t acp_seid:6; 247 uint8_t rfa0:2; 248 } __attribute__ ((packed)); 249 250 struct setconf_req { 251 uint8_t acp_seid:6; 252 uint8_t rfa0:2; 253 uint8_t int_seid:6; 254 uint8_t rfa1:2; 255 256 uint8_t caps[0]; 257 } __attribute__ ((packed)); 258 259 struct stream_rej { 260 uint8_t acp_seid:6; 261 uint8_t rfa0:2; 262 uint8_t error; 263 } __attribute__ ((packed)); 264 265 struct reconf_req { 266 uint8_t acp_seid:6; 267 uint8_t rfa0:2; 268 269 uint8_t serv_cap; 270 uint8_t serv_cap_len; 271 272 uint8_t caps[0]; 273 } __attribute__ ((packed)); 274 275 #else 276 #error "Unknown byte order" 277 #endif 278 279 struct in_buf { 280 gboolean active; 281 int no_of_packets; 282 uint8_t transaction; 283 uint8_t message_type; 284 uint8_t signal_id; 285 uint8_t buf[1024]; 286 uint8_t data_size; 287 }; 288 289 struct pending_req { 290 uint8_t transaction; 291 uint8_t signal_id; 292 void *data; 293 size_t data_size; 294 struct avdtp_stream *stream; /* Set if the request targeted a stream */ 295 guint timeout; 296 }; 297 298 struct avdtp_remote_sep { 299 uint8_t seid; 300 uint8_t type; 301 uint8_t media_type; 302 struct avdtp_service_capability *codec; 303 GSList *caps; /* of type struct avdtp_service_capability */ 304 struct avdtp_stream *stream; 305 }; 306 307 struct avdtp_server { 308 bdaddr_t src; 309 GIOChannel *io; 310 GSList *seps; 311 GSList *sessions; 312 }; 313 314 struct avdtp_local_sep { 315 avdtp_state_t state; 316 struct avdtp_stream *stream; 317 struct seid_info info; 318 uint8_t codec; 319 GSList *caps; 320 struct avdtp_sep_ind *ind; 321 struct avdtp_sep_cfm *cfm; 322 void *user_data; 323 struct avdtp_server *server; 324 }; 325 326 struct stream_callback { 327 avdtp_stream_state_cb cb; 328 void *user_data; 329 unsigned int id; 330 }; 331 332 struct avdtp_state_callback { 333 avdtp_session_state_cb cb; 334 void *user_data; 335 unsigned int id; 336 }; 337 338 struct avdtp_stream { 339 GIOChannel *io; 340 uint16_t imtu; 341 uint16_t omtu; 342 struct avdtp *session; 343 struct avdtp_local_sep *lsep; 344 uint8_t rseid; 345 GSList *caps; 346 GSList *callbacks; 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 */ 353 gboolean abort_int; /* If we are in INT role for Abort */ 354 guint idle_timer; 355 }; 356 357 /* Structure describing an AVDTP connection between two devices */ 358 359 struct avdtp { 360 int ref; 361 int free_lock; 362 363 struct avdtp_server *server; 364 bdaddr_t dst; 365 366 avdtp_session_state_t state; 367 368 /* True if the session should be automatically disconnected */ 369 gboolean auto_dc; 370 371 GIOChannel *io; 372 guint io_id; 373 374 GSList *seps; /* Elements of type struct avdtp_remote_sep * */ 375 376 GSList *streams; /* Elements of type struct avdtp_stream * */ 377 378 GSList *req_queue; /* Elements of type struct pending_req * */ 379 GSList *prio_queue; /* Same as req_queue but is processed before it */ 380 381 struct avdtp_stream *pending_open; 382 383 uint16_t imtu; 384 uint16_t omtu; 385 386 struct in_buf in; 387 388 char *buf; 389 390 avdtp_discover_cb_t discov_cb; 391 void *user_data; 392 393 struct pending_req *req; 394 395 guint dc_timer; 396 397 /* Attempt stream setup instead of disconnecting */ 398 gboolean stream_setup; 399 400 DBusPendingCall *pending_auth; 401 }; 402 403 static GSList *servers = NULL; 404 405 static GSList *avdtp_callbacks = NULL; 406 407 static gboolean auto_connect = TRUE; 408 409 static int send_request(struct avdtp *session, gboolean priority, 410 struct avdtp_stream *stream, uint8_t signal_id, 411 void *buffer, size_t size); 412 static gboolean avdtp_parse_resp(struct avdtp *session, 413 struct avdtp_stream *stream, 414 uint8_t transaction, uint8_t signal_id, 415 void *buf, int size); 416 static gboolean avdtp_parse_rej(struct avdtp *session, 417 struct avdtp_stream *stream, 418 uint8_t transaction, uint8_t signal_id, 419 void *buf, int size); 420 static int process_queue(struct avdtp *session); 421 static void connection_lost(struct avdtp *session, int err); 422 static void avdtp_sep_set_state(struct avdtp *session, 423 struct avdtp_local_sep *sep, 424 avdtp_state_t state); 425 426 static struct avdtp_server *find_server(GSList *list, const bdaddr_t *src) 427 { 428 GSList *l; 429 430 for (l = list; l; l = l->next) { 431 struct avdtp_server *server = l->data; 432 433 if (bacmp(&server->src, src) == 0) 434 return server; 435 } 436 437 return NULL; 438 } 439 440 static const char *avdtp_statestr(avdtp_state_t state) 441 { 442 switch (state) { 443 case AVDTP_STATE_IDLE: 444 return "IDLE"; 445 case AVDTP_STATE_CONFIGURED: 446 return "CONFIGURED"; 447 case AVDTP_STATE_OPEN: 448 return "OPEN"; 449 case AVDTP_STATE_STREAMING: 450 return "STREAMING"; 451 case AVDTP_STATE_CLOSING: 452 return "CLOSING"; 453 case AVDTP_STATE_ABORTING: 454 return "ABORTING"; 455 default: 456 return "<unknown state>"; 457 } 458 } 459 460 static gboolean try_send(int sk, void *data, size_t len) 461 { 462 int err; 463 464 do { 465 err = send(sk, data, len, 0); 466 } while (err < 0 && errno == EINTR); 467 468 if (err < 0) { 469 error("send: %s (%d)", strerror(errno), errno); 470 return FALSE; 471 } else if ((size_t) err != len) { 472 error("try_send: complete buffer not sent (%d/%zu bytes)", 473 err, len); 474 return FALSE; 475 } 476 477 return TRUE; 478 } 479 480 static gboolean avdtp_send(struct avdtp *session, uint8_t transaction, 481 uint8_t message_type, uint8_t signal_id, 482 void *data, size_t len) 483 { 484 unsigned int cont_fragments, sent; 485 struct avdtp_start_header start; 486 struct avdtp_continue_header cont; 487 int sock; 488 489 if (session->io == NULL) { 490 error("avdtp_send: session is closed"); 491 return FALSE; 492 } 493 494 sock = g_io_channel_unix_get_fd(session->io); 495 496 /* Single packet - no fragmentation */ 497 if (sizeof(struct avdtp_single_header) + len <= session->omtu) { 498 struct avdtp_single_header single; 499 500 memset(&single, 0, sizeof(single)); 501 502 single.transaction = transaction; 503 single.packet_type = AVDTP_PKT_TYPE_SINGLE; 504 single.message_type = message_type; 505 single.signal_id = signal_id; 506 507 memcpy(session->buf, &single, sizeof(single)); 508 memcpy(session->buf + sizeof(single), data, len); 509 510 return try_send(sock, session->buf, sizeof(single) + len); 511 } 512 513 /* Count the number of needed fragments */ 514 cont_fragments = (len - (session->omtu - sizeof(start))) / 515 (session->omtu - sizeof(cont)) + 1; 516 517 debug("avdtp_send: %zu bytes split into %d fragments", len, 518 cont_fragments + 1); 519 520 /* Send the start packet */ 521 memset(&start, 0, sizeof(start)); 522 start.transaction = transaction; 523 start.packet_type = AVDTP_PKT_TYPE_START; 524 start.message_type = message_type; 525 start.no_of_packets = cont_fragments + 1; 526 start.signal_id = signal_id; 527 528 memcpy(session->buf, &start, sizeof(start)); 529 memcpy(session->buf + sizeof(start), data, 530 session->omtu - sizeof(start)); 531 532 if (!try_send(sock, session->buf, session->omtu)) 533 return FALSE; 534 535 debug("avdtp_send: first packet with %zu bytes sent", 536 session->omtu - sizeof(start)); 537 538 sent = session->omtu - sizeof(start); 539 540 /* Send the continue fragments and the end packet */ 541 while (sent < len) { 542 int left, to_copy; 543 544 left = len - sent; 545 if (left + sizeof(cont) > session->omtu) { 546 cont.packet_type = AVDTP_PKT_TYPE_CONTINUE; 547 to_copy = session->omtu - sizeof(cont); 548 debug("avdtp_send: sending continue with %d bytes", 549 to_copy); 550 } else { 551 cont.packet_type = AVDTP_PKT_TYPE_END; 552 to_copy = left; 553 debug("avdtp_send: sending end with %d bytes", 554 to_copy); 555 } 556 557 cont.transaction = transaction; 558 cont.message_type = message_type; 559 560 memcpy(session->buf, &cont, sizeof(cont)); 561 memcpy(session->buf + sizeof(cont), data + sent, to_copy); 562 563 if (!try_send(sock, session->buf, to_copy + sizeof(cont))) 564 return FALSE; 565 566 sent += to_copy; 567 } 568 569 return TRUE; 570 } 571 572 static void pending_req_free(struct pending_req *req) 573 { 574 if (req->timeout) 575 g_source_remove(req->timeout); 576 g_free(req->data); 577 g_free(req); 578 } 579 580 static void close_stream(struct avdtp_stream *stream) 581 { 582 int sock; 583 584 if (stream->io == NULL) 585 return; 586 587 sock = g_io_channel_unix_get_fd(stream->io); 588 589 shutdown(sock, SHUT_RDWR); 590 591 g_io_channel_shutdown(stream->io, FALSE, NULL); 592 593 g_io_channel_unref(stream->io); 594 stream->io = NULL; 595 } 596 597 static gboolean stream_close_timeout(gpointer user_data) 598 { 599 struct avdtp_stream *stream = user_data; 600 601 debug("Timed out waiting for peer to close the transport channel"); 602 603 stream->timer = 0; 604 605 close_stream(stream); 606 607 return FALSE; 608 } 609 610 static gboolean stream_open_timeout(gpointer user_data) 611 { 612 struct avdtp_stream *stream = user_data; 613 614 debug("Timed out waiting for peer to open the transport channel"); 615 616 stream->timer = 0; 617 618 stream->session->pending_open = NULL; 619 620 avdtp_abort(stream->session, stream); 621 622 return FALSE; 623 } 624 625 static gboolean disconnect_timeout(gpointer user_data) 626 { 627 struct avdtp *session = user_data; 628 struct audio_device *dev; 629 gboolean stream_setup; 630 631 session->dc_timer = 0; 632 stream_setup = session->stream_setup; 633 session->stream_setup = FALSE; 634 635 dev = manager_get_device(&session->server->src, &session->dst, FALSE); 636 637 if (dev && dev->sink && stream_setup) 638 sink_setup_stream(dev->sink, session); 639 else if (dev && dev->source && stream_setup) 640 source_setup_stream(dev->source, session); 641 else 642 connection_lost(session, ETIMEDOUT); 643 644 return FALSE; 645 } 646 647 static void remove_disconnect_timer(struct avdtp *session) 648 { 649 g_source_remove(session->dc_timer); 650 session->dc_timer = 0; 651 session->stream_setup = FALSE; 652 } 653 654 static void set_disconnect_timer(struct avdtp *session) 655 { 656 if (session->dc_timer) 657 remove_disconnect_timer(session); 658 659 session->dc_timer = g_timeout_add_seconds(DISCONNECT_TIMEOUT, 660 disconnect_timeout, 661 session); 662 } 663 664 void avdtp_error_init(struct avdtp_error *err, uint8_t type, int id) 665 { 666 err->type = type; 667 switch (type) { 668 case AVDTP_ERROR_ERRNO: 669 err->err.posix_errno = id; 670 break; 671 case AVDTP_ERROR_ERROR_CODE: 672 err->err.error_code = id; 673 break; 674 } 675 } 676 677 avdtp_error_type_t avdtp_error_type(struct avdtp_error *err) 678 { 679 return err->type; 680 } 681 682 int avdtp_error_error_code(struct avdtp_error *err) 683 { 684 assert(err->type == AVDTP_ERROR_ERROR_CODE); 685 return err->err.error_code; 686 } 687 688 int avdtp_error_posix_errno(struct avdtp_error *err) 689 { 690 assert(err->type == AVDTP_ERROR_ERRNO); 691 return err->err.posix_errno; 692 } 693 694 static struct avdtp_stream *find_stream_by_rseid(struct avdtp *session, 695 uint8_t rseid) 696 { 697 GSList *l; 698 699 for (l = session->streams; l != NULL; l = g_slist_next(l)) { 700 struct avdtp_stream *stream = l->data; 701 702 if (stream->rseid == rseid) 703 return stream; 704 } 705 706 return NULL; 707 } 708 709 static struct avdtp_remote_sep *find_remote_sep(GSList *seps, uint8_t seid) 710 { 711 GSList *l; 712 713 for (l = seps; l != NULL; l = g_slist_next(l)) { 714 struct avdtp_remote_sep *sep = l->data; 715 716 if (sep->seid == seid) 717 return sep; 718 } 719 720 return NULL; 721 } 722 723 static void avdtp_set_state(struct avdtp *session, 724 avdtp_session_state_t new_state) 725 { 726 GSList *l; 727 struct audio_device *dev; 728 bdaddr_t src, dst; 729 avdtp_session_state_t old_state = session->state; 730 731 session->state = new_state; 732 733 avdtp_get_peers(session, &src, &dst); 734 dev = manager_get_device(&src, &dst, FALSE); 735 if (dev == NULL) { 736 error("avdtp_set_state(): no matching audio device"); 737 return; 738 } 739 740 for (l = avdtp_callbacks; l != NULL; l = l->next) { 741 struct avdtp_state_callback *cb = l->data; 742 cb->cb(dev, session, old_state, new_state, cb->user_data); 743 } 744 } 745 746 static void stream_free(struct avdtp_stream *stream) 747 { 748 struct avdtp_remote_sep *rsep; 749 750 stream->lsep->info.inuse = 0; 751 stream->lsep->stream = NULL; 752 753 rsep = find_remote_sep(stream->session->seps, stream->rseid); 754 if (rsep) 755 rsep->stream = NULL; 756 757 if (stream->timer) 758 g_source_remove(stream->timer); 759 760 if (stream->io) 761 g_io_channel_unref(stream->io); 762 763 if (stream->io_id) 764 g_source_remove(stream->io_id); 765 766 g_slist_foreach(stream->callbacks, (GFunc) g_free, NULL); 767 g_slist_free(stream->callbacks); 768 769 g_slist_foreach(stream->caps, (GFunc) g_free, NULL); 770 g_slist_free(stream->caps); 771 772 g_free(stream); 773 } 774 775 static gboolean stream_timeout(gpointer user_data) 776 { 777 struct avdtp_stream *stream = user_data; 778 struct avdtp *session = stream->session; 779 780 avdtp_close(session, stream); 781 782 stream->idle_timer = 0; 783 784 return FALSE; 785 } 786 787 static gboolean transport_cb(GIOChannel *chan, GIOCondition cond, 788 gpointer data) 789 { 790 struct avdtp_stream *stream = data; 791 struct avdtp_local_sep *sep = stream->lsep; 792 793 if (stream->close_int && sep->cfm && sep->cfm->close) 794 sep->cfm->close(stream->session, sep, stream, NULL, 795 sep->user_data); 796 797 if (!(cond & G_IO_NVAL)) 798 close_stream(stream); 799 800 stream->io_id = 0; 801 802 if (!stream->abort_int) 803 avdtp_sep_set_state(stream->session, sep, AVDTP_STATE_IDLE); 804 805 return FALSE; 806 } 807 808 static void handle_transport_connect(struct avdtp *session, GIOChannel *io, 809 uint16_t imtu, uint16_t omtu) 810 { 811 struct avdtp_stream *stream = session->pending_open; 812 struct avdtp_local_sep *sep = stream->lsep; 813 814 session->pending_open = NULL; 815 816 if (stream->timer) { 817 g_source_remove(stream->timer); 818 stream->timer = 0; 819 } 820 821 if (io == NULL) { 822 if (!stream->open_acp && sep->cfm && sep->cfm->open) { 823 struct avdtp_error err; 824 avdtp_error_init(&err, AVDTP_ERROR_ERRNO, EIO); 825 sep->cfm->open(session, sep, NULL, &err, 826 sep->user_data); 827 } 828 return; 829 } 830 831 stream->io = g_io_channel_ref(io); 832 stream->omtu = omtu; 833 stream->imtu = imtu; 834 835 if (!stream->open_acp && sep->cfm && sep->cfm->open) 836 sep->cfm->open(session, sep, stream, NULL, sep->user_data); 837 838 avdtp_sep_set_state(session, sep, AVDTP_STATE_OPEN); 839 840 stream->io_id = g_io_add_watch(io, G_IO_ERR | G_IO_HUP | G_IO_NVAL, 841 (GIOFunc) transport_cb, stream); 842 } 843 844 static int pending_req_cmp(gconstpointer a, gconstpointer b) 845 { 846 const struct pending_req *req = a; 847 const struct avdtp_stream *stream = b; 848 849 if (req->stream == stream) 850 return 0; 851 852 return -1; 853 } 854 855 static void cleanup_queue(struct avdtp *session, struct avdtp_stream *stream) 856 { 857 GSList *l; 858 struct pending_req *req; 859 860 while ((l = g_slist_find_custom(session->prio_queue, stream, 861 pending_req_cmp))) { 862 req = l->data; 863 pending_req_free(req); 864 session->prio_queue = g_slist_remove(session->prio_queue, req); 865 } 866 867 while ((l = g_slist_find_custom(session->req_queue, stream, 868 pending_req_cmp))) { 869 req = l->data; 870 pending_req_free(req); 871 session->req_queue = g_slist_remove(session->req_queue, req); 872 } 873 } 874 875 static void avdtp_sep_set_state(struct avdtp *session, 876 struct avdtp_local_sep *sep, 877 avdtp_state_t state) 878 { 879 struct avdtp_stream *stream = sep->stream; 880 avdtp_state_t old_state; 881 struct avdtp_error err, *err_ptr = NULL; 882 GSList *l; 883 884 if (!stream) { 885 error("Error changing sep state: stream not available"); 886 return; 887 } 888 889 if (sep->state == state) { 890 avdtp_error_init(&err, AVDTP_ERROR_ERRNO, EIO); 891 debug("stream state change failed: %s", avdtp_strerror(&err)); 892 err_ptr = &err; 893 } else { 894 err_ptr = NULL; 895 debug("stream state changed: %s -> %s", 896 avdtp_statestr(sep->state), 897 avdtp_statestr(state)); 898 } 899 900 old_state = sep->state; 901 sep->state = state; 902 903 for (l = stream->callbacks; l != NULL; l = g_slist_next(l)) { 904 struct stream_callback *cb = l->data; 905 cb->cb(stream, old_state, state, err_ptr, cb->user_data); 906 } 907 908 switch (state) { 909 case AVDTP_STATE_OPEN: 910 if (old_state > AVDTP_STATE_OPEN && session->auto_dc) 911 stream->idle_timer = g_timeout_add_seconds(STREAM_TIMEOUT, 912 stream_timeout, 913 stream); 914 break; 915 case AVDTP_STATE_STREAMING: 916 case AVDTP_STATE_CLOSING: 917 case AVDTP_STATE_ABORTING: 918 if (stream->idle_timer) { 919 g_source_remove(stream->idle_timer); 920 stream->idle_timer = 0; 921 } 922 break; 923 case AVDTP_STATE_IDLE: 924 if (stream->idle_timer) { 925 g_source_remove(stream->idle_timer); 926 stream->idle_timer = 0; 927 } 928 session->streams = g_slist_remove(session->streams, stream); 929 if (session->pending_open == stream) 930 handle_transport_connect(session, NULL, 0, 0); 931 if (session->req && session->req->stream == stream) 932 session->req->stream = NULL; 933 /* Remove pending commands for this stream from the queue */ 934 cleanup_queue(session, stream); 935 stream_free(stream); 936 if (session->ref == 1 && !session->streams) 937 set_disconnect_timer(session); 938 break; 939 default: 940 break; 941 } 942 } 943 944 static void finalize_discovery(struct avdtp *session, int err) 945 { 946 struct avdtp_error avdtp_err; 947 948 avdtp_error_init(&avdtp_err, AVDTP_ERROR_ERRNO, err); 949 950 if (!session->discov_cb) 951 return; 952 953 session->discov_cb(session, session->seps, 954 err ? &avdtp_err : NULL, 955 session->user_data); 956 957 session->discov_cb = NULL; 958 session->user_data = NULL; 959 } 960 961 static void release_stream(struct avdtp_stream *stream, struct avdtp *session) 962 { 963 struct avdtp_local_sep *sep = stream->lsep; 964 965 if (sep->cfm && sep->cfm->abort && 966 (sep->state != AVDTP_STATE_ABORTING || 967 stream->abort_int)) 968 sep->cfm->abort(session, sep, stream, NULL, sep->user_data); 969 970 avdtp_sep_set_state(session, sep, AVDTP_STATE_IDLE); 971 } 972 973 static void connection_lost(struct avdtp *session, int err) 974 { 975 char address[18]; 976 977 ba2str(&session->dst, address); 978 debug("Disconnected from %s", address); 979 980 if (session->state == AVDTP_SESSION_STATE_CONNECTING && err != EACCES) 981 btd_cancel_authorization(&session->server->src, &session->dst); 982 983 session->free_lock = 1; 984 985 finalize_discovery(session, err); 986 987 g_slist_foreach(session->streams, (GFunc) release_stream, session); 988 session->streams = NULL; 989 990 session->free_lock = 0; 991 992 if (session->io) { 993 g_io_channel_shutdown(session->io, FALSE, NULL); 994 g_io_channel_unref(session->io); 995 session->io = NULL; 996 } 997 998 avdtp_set_state(session, AVDTP_SESSION_STATE_DISCONNECTED); 999 1000 if (session->io_id) { 1001 g_source_remove(session->io_id); 1002 session->io_id = 0; 1003 } 1004 1005 if (session->dc_timer) 1006 remove_disconnect_timer(session); 1007 1008 session->auto_dc = TRUE; 1009 1010 if (session->ref != 1) 1011 error("connection_lost: ref count not 1 after all callbacks"); 1012 else 1013 avdtp_unref(session); 1014 } 1015 1016 void avdtp_unref(struct avdtp *session) 1017 { 1018 struct avdtp_server *server; 1019 1020 if (!session) 1021 return; 1022 1023 session->ref--; 1024 1025 debug("avdtp_unref(%p): ref=%d", session, session->ref); 1026 1027 if (session->ref == 1) { 1028 if (session->state == AVDTP_SESSION_STATE_CONNECTING && 1029 session->io) { 1030 btd_cancel_authorization(&session->server->src, 1031 &session->dst); 1032 g_io_channel_shutdown(session->io, TRUE, NULL); 1033 g_io_channel_unref(session->io); 1034 session->io = NULL; 1035 } 1036 1037 if (session->io) 1038 set_disconnect_timer(session); 1039 else if (!session->free_lock) /* Drop the local ref if we 1040 aren't connected */ 1041 session->ref--; 1042 } 1043 1044 if (session->ref > 0) 1045 return; 1046 1047 server = session->server; 1048 1049 debug("avdtp_unref(%p): freeing session and removing from list", 1050 session); 1051 1052 if (session->dc_timer) 1053 remove_disconnect_timer(session); 1054 1055 server->sessions = g_slist_remove(server->sessions, session); 1056 1057 if (session->req) 1058 pending_req_free(session->req); 1059 1060 g_slist_foreach(session->seps, (GFunc) g_free, NULL); 1061 g_slist_free(session->seps); 1062 1063 g_free(session->buf); 1064 1065 g_free(session); 1066 } 1067 1068 struct avdtp *avdtp_ref(struct avdtp *session) 1069 { 1070 session->ref++; 1071 debug("avdtp_ref(%p): ref=%d", session, session->ref); 1072 if (session->dc_timer) 1073 remove_disconnect_timer(session); 1074 return session; 1075 } 1076 1077 static struct avdtp_local_sep *find_local_sep_by_seid(struct avdtp_server *server, 1078 uint8_t seid) 1079 { 1080 GSList *l; 1081 1082 for (l = server->seps; l != NULL; l = g_slist_next(l)) { 1083 struct avdtp_local_sep *sep = l->data; 1084 1085 if (sep->info.seid == seid) 1086 return sep; 1087 } 1088 1089 return NULL; 1090 } 1091 1092 static struct avdtp_local_sep *find_local_sep(struct avdtp_server *server, 1093 uint8_t type, 1094 uint8_t media_type, 1095 uint8_t codec) 1096 { 1097 GSList *l; 1098 1099 for (l = server->seps; l != NULL; l = g_slist_next(l)) { 1100 struct avdtp_local_sep *sep = l->data; 1101 1102 if (sep->info.inuse) 1103 continue; 1104 1105 if (sep->info.type == type && 1106 sep->info.media_type == media_type && 1107 sep->codec == codec) 1108 return sep; 1109 } 1110 1111 return NULL; 1112 } 1113 1114 static GSList *caps_to_list(uint8_t *data, int size, 1115 struct avdtp_service_capability **codec) 1116 { 1117 GSList *caps; 1118 int processed; 1119 1120 for (processed = 0, caps = NULL; processed + 2 < size;) { 1121 struct avdtp_service_capability *cap; 1122 uint8_t length, category; 1123 1124 category = data[0]; 1125 length = data[1]; 1126 1127 if (processed + 2 + length > size) { 1128 error("Invalid capability data in getcap resp"); 1129 break; 1130 } 1131 1132 cap = g_malloc(sizeof(struct avdtp_service_capability) + 1133 length); 1134 memcpy(cap, data, 2 + length); 1135 1136 processed += 2 + length; 1137 data += 2 + length; 1138 1139 caps = g_slist_append(caps, cap); 1140 1141 if (category == AVDTP_MEDIA_CODEC && 1142 length >= 1143 sizeof(struct avdtp_media_codec_capability)) 1144 *codec = cap; 1145 } 1146 1147 return caps; 1148 } 1149 1150 static gboolean avdtp_unknown_cmd(struct avdtp *session, uint8_t transaction, 1151 void *buf, int size) 1152 { 1153 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT, 1154 0, NULL, 0); 1155 } 1156 1157 static gboolean avdtp_discover_cmd(struct avdtp *session, uint8_t transaction, 1158 void *buf, int size) 1159 { 1160 GSList *l; 1161 unsigned int rsp_size, sep_count, i; 1162 struct seid_info *seps; 1163 gboolean ret; 1164 1165 sep_count = g_slist_length(session->server->seps); 1166 1167 if (sep_count == 0) { 1168 uint8_t err = AVDTP_NOT_SUPPORTED_COMMAND; 1169 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT, 1170 AVDTP_DISCOVER, &err, sizeof(err)); 1171 } 1172 1173 rsp_size = sep_count * sizeof(struct seid_info); 1174 1175 seps = g_new0(struct seid_info, sep_count); 1176 1177 for (l = session->server->seps, i = 0; l != NULL; l = l->next, i++) { 1178 struct avdtp_local_sep *sep = l->data; 1179 1180 memcpy(&seps[i], &sep->info, sizeof(struct seid_info)); 1181 } 1182 1183 ret = avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT, 1184 AVDTP_DISCOVER, seps, rsp_size); 1185 g_free(seps); 1186 1187 return ret; 1188 } 1189 1190 static gboolean avdtp_getcap_cmd(struct avdtp *session, uint8_t transaction, 1191 struct seid_req *req, unsigned int size) 1192 { 1193 GSList *l, *caps; 1194 struct avdtp_local_sep *sep = NULL; 1195 unsigned int rsp_size; 1196 uint8_t err, buf[1024], *ptr = buf; 1197 1198 if (size < sizeof(struct seid_req)) { 1199 err = AVDTP_BAD_LENGTH; 1200 goto failed; 1201 } 1202 1203 sep = find_local_sep_by_seid(session->server, req->acp_seid); 1204 if (!sep) { 1205 err = AVDTP_BAD_ACP_SEID; 1206 goto failed; 1207 } 1208 1209 if (!sep->ind->get_capability(session, sep, &caps, &err, 1210 sep->user_data)) 1211 goto failed; 1212 1213 for (l = caps, rsp_size = 0; l != NULL; l = g_slist_next(l)) { 1214 struct avdtp_service_capability *cap = l->data; 1215 1216 if (rsp_size + cap->length + 2 > sizeof(buf)) 1217 break; 1218 1219 memcpy(ptr, cap, cap->length + 2); 1220 rsp_size += cap->length + 2; 1221 ptr += cap->length + 2; 1222 1223 g_free(cap); 1224 } 1225 1226 g_slist_free(caps); 1227 1228 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT, 1229 AVDTP_GET_CAPABILITIES, buf, rsp_size); 1230 1231 failed: 1232 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT, 1233 AVDTP_GET_CAPABILITIES, &err, sizeof(err)); 1234 } 1235 1236 static gboolean avdtp_setconf_cmd(struct avdtp *session, uint8_t transaction, 1237 struct setconf_req *req, unsigned int size) 1238 { 1239 struct conf_rej rej; 1240 struct avdtp_local_sep *sep; 1241 struct avdtp_stream *stream; 1242 uint8_t err, category = 0x00; 1243 struct audio_device *dev; 1244 bdaddr_t src, dst; 1245 GSList *l; 1246 1247 if (size < sizeof(struct setconf_req)) { 1248 error("Too short getcap request"); 1249 return FALSE; 1250 } 1251 1252 sep = find_local_sep_by_seid(session->server, req->acp_seid); 1253 if (!sep) { 1254 err = AVDTP_BAD_ACP_SEID; 1255 goto failed; 1256 } 1257 1258 if (sep->stream) { 1259 err = AVDTP_SEP_IN_USE; 1260 goto failed; 1261 } 1262 1263 avdtp_get_peers(session, &src, &dst); 1264 dev = manager_get_device(&src, &dst, FALSE); 1265 if (!dev) { 1266 error("Unable to get a audio device object"); 1267 goto failed; 1268 } 1269 1270 switch (sep->info.type) { 1271 case AVDTP_SEP_TYPE_SOURCE: 1272 if (!dev->sink) { 1273 btd_device_add_uuid(dev->btd_dev, A2DP_SINK_UUID); 1274 if (!dev->sink) { 1275 error("Unable to get a audio sink object"); 1276 goto failed; 1277 } 1278 } 1279 break; 1280 case AVDTP_SEP_TYPE_SINK: 1281 /* Do source_init() here when it's implemented */ 1282 break; 1283 } 1284 1285 stream = g_new0(struct avdtp_stream, 1); 1286 stream->session = session; 1287 stream->lsep = sep; 1288 stream->rseid = req->int_seid; 1289 stream->caps = caps_to_list(req->caps, 1290 size - sizeof(struct setconf_req), 1291 &stream->codec); 1292 1293 /* Verify that the Media Transport capability's length = 0. Reject otherwise */ 1294 for (l = stream->caps; l != NULL; l = g_slist_next(l)) { 1295 struct avdtp_service_capability *cap = l->data; 1296 1297 if (cap->category == AVDTP_MEDIA_TRANSPORT && cap->length != 0) { 1298 err = AVDTP_BAD_MEDIA_TRANSPORT_FORMAT; 1299 goto failed_stream; 1300 } 1301 } 1302 1303 if (sep->ind && sep->ind->set_configuration) { 1304 if (!sep->ind->set_configuration(session, sep, stream, 1305 stream->caps, &err, 1306 &category, 1307 sep->user_data)) 1308 goto failed_stream; 1309 } 1310 1311 if (!avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT, 1312 AVDTP_SET_CONFIGURATION, NULL, 0)) { 1313 stream_free(stream); 1314 return FALSE; 1315 } 1316 1317 sep->stream = stream; 1318 session->streams = g_slist_append(session->streams, stream); 1319 1320 avdtp_sep_set_state(session, sep, AVDTP_STATE_CONFIGURED); 1321 1322 return TRUE; 1323 1324 failed_stream: 1325 stream_free(stream); 1326 failed: 1327 rej.error = err; 1328 rej.category = category; 1329 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT, 1330 AVDTP_SET_CONFIGURATION, &rej, sizeof(rej)); 1331 } 1332 1333 static gboolean avdtp_getconf_cmd(struct avdtp *session, uint8_t transaction, 1334 struct seid_req *req, int size) 1335 { 1336 GSList *l; 1337 struct avdtp_local_sep *sep = NULL; 1338 int rsp_size; 1339 uint8_t err; 1340 uint8_t buf[1024]; 1341 uint8_t *ptr = buf; 1342 1343 if (size < (int) sizeof(struct seid_req)) { 1344 error("Too short getconf request"); 1345 return FALSE; 1346 } 1347 1348 memset(buf, 0, sizeof(buf)); 1349 1350 sep = find_local_sep_by_seid(session->server, req->acp_seid); 1351 if (!sep) { 1352 err = AVDTP_BAD_ACP_SEID; 1353 goto failed; 1354 } 1355 if (!sep->stream || !sep->stream->caps) { 1356 err = AVDTP_UNSUPPORTED_CONFIGURATION; 1357 goto failed; 1358 } 1359 1360 for (l = sep->stream->caps, rsp_size = 0; l != NULL; l = g_slist_next(l)) { 1361 struct avdtp_service_capability *cap = l->data; 1362 1363 if (rsp_size + cap->length + 2 > (int) sizeof(buf)) 1364 break; 1365 1366 memcpy(ptr, cap, cap->length + 2); 1367 rsp_size += cap->length + 2; 1368 ptr += cap->length + 2; 1369 } 1370 1371 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT, 1372 AVDTP_GET_CONFIGURATION, buf, rsp_size); 1373 1374 failed: 1375 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT, 1376 AVDTP_GET_CONFIGURATION, &err, sizeof(err)); 1377 } 1378 1379 static gboolean avdtp_reconf_cmd(struct avdtp *session, uint8_t transaction, 1380 struct seid_req *req, int size) 1381 { 1382 return avdtp_unknown_cmd(session, transaction, (void *) req, size); 1383 } 1384 1385 static gboolean avdtp_open_cmd(struct avdtp *session, uint8_t transaction, 1386 struct seid_req *req, unsigned int size) 1387 { 1388 struct avdtp_local_sep *sep; 1389 struct avdtp_stream *stream; 1390 uint8_t err; 1391 1392 if (size < sizeof(struct seid_req)) { 1393 error("Too short abort request"); 1394 return FALSE; 1395 } 1396 1397 sep = find_local_sep_by_seid(session->server, req->acp_seid); 1398 if (!sep) { 1399 err = AVDTP_BAD_ACP_SEID; 1400 goto failed; 1401 } 1402 1403 if (sep->state != AVDTP_STATE_CONFIGURED) { 1404 err = AVDTP_BAD_STATE; 1405 goto failed; 1406 } 1407 1408 stream = sep->stream; 1409 1410 if (sep->ind && sep->ind->open) { 1411 if (!sep->ind->open(session, sep, stream, &err, 1412 sep->user_data)) 1413 goto failed; 1414 } 1415 1416 if (!avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT, 1417 AVDTP_OPEN, NULL, 0)) 1418 return FALSE; 1419 1420 stream->open_acp = TRUE; 1421 session->pending_open = stream; 1422 stream->timer = g_timeout_add_seconds(REQ_TIMEOUT, 1423 stream_open_timeout, 1424 stream); 1425 1426 return TRUE; 1427 1428 failed: 1429 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT, 1430 AVDTP_OPEN, &err, sizeof(err)); 1431 } 1432 1433 static gboolean avdtp_start_cmd(struct avdtp *session, uint8_t transaction, 1434 struct start_req *req, unsigned int size) 1435 { 1436 struct avdtp_local_sep *sep; 1437 struct avdtp_stream *stream; 1438 struct stream_rej rej; 1439 struct seid *seid; 1440 uint8_t err, failed_seid; 1441 int seid_count, i; 1442 1443 if (size < sizeof(struct start_req)) { 1444 error("Too short start request"); 1445 return FALSE; 1446 } 1447 1448 seid_count = 1 + size - sizeof(struct start_req); 1449 1450 seid = &req->first_seid; 1451 1452 for (i = 0; i < seid_count; i++, seid++) { 1453 failed_seid = seid->seid; 1454 1455 sep = find_local_sep_by_seid(session->server, 1456 req->first_seid.seid); 1457 if (!sep || !sep->stream) { 1458 err = AVDTP_BAD_ACP_SEID; 1459 goto failed; 1460 } 1461 1462 stream = sep->stream; 1463 1464 if (sep->state != AVDTP_STATE_OPEN) { 1465 err = AVDTP_BAD_STATE; 1466 goto failed; 1467 } 1468 1469 if (sep->ind && sep->ind->start) { 1470 if (!sep->ind->start(session, sep, stream, &err, 1471 sep->user_data)) 1472 goto failed; 1473 } 1474 1475 avdtp_sep_set_state(session, sep, AVDTP_STATE_STREAMING); 1476 } 1477 1478 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT, 1479 AVDTP_START, NULL, 0); 1480 1481 failed: 1482 memset(&rej, 0, sizeof(rej)); 1483 rej.acp_seid = failed_seid; 1484 rej.error = err; 1485 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT, 1486 AVDTP_START, &rej, sizeof(rej)); 1487 } 1488 1489 static gboolean avdtp_close_cmd(struct avdtp *session, uint8_t transaction, 1490 struct seid_req *req, unsigned int size) 1491 { 1492 struct avdtp_local_sep *sep; 1493 struct avdtp_stream *stream; 1494 uint8_t err; 1495 1496 if (size < sizeof(struct seid_req)) { 1497 error("Too short close request"); 1498 return FALSE; 1499 } 1500 1501 sep = find_local_sep_by_seid(session->server, req->acp_seid); 1502 if (!sep || !sep->stream) { 1503 err = AVDTP_BAD_ACP_SEID; 1504 goto failed; 1505 } 1506 1507 if (sep->state != AVDTP_STATE_OPEN && 1508 sep->state != AVDTP_STATE_STREAMING) { 1509 err = AVDTP_BAD_STATE; 1510 goto failed; 1511 } 1512 1513 stream = sep->stream; 1514 1515 if (sep->ind && sep->ind->close) { 1516 if (!sep->ind->close(session, sep, stream, &err, 1517 sep->user_data)) 1518 goto failed; 1519 } 1520 1521 avdtp_sep_set_state(session, sep, AVDTP_STATE_CLOSING); 1522 1523 if (!avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT, 1524 AVDTP_CLOSE, NULL, 0)) 1525 return FALSE; 1526 1527 stream->timer = g_timeout_add_seconds(REQ_TIMEOUT, 1528 stream_close_timeout, 1529 stream); 1530 1531 return TRUE; 1532 1533 failed: 1534 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT, 1535 AVDTP_CLOSE, &err, sizeof(err)); 1536 } 1537 1538 static gboolean avdtp_suspend_cmd(struct avdtp *session, uint8_t transaction, 1539 struct suspend_req *req, unsigned int size) 1540 { 1541 struct avdtp_local_sep *sep; 1542 struct avdtp_stream *stream; 1543 struct stream_rej rej; 1544 struct seid *seid; 1545 uint8_t err, failed_seid; 1546 int seid_count, i; 1547 1548 if (size < sizeof(struct suspend_req)) { 1549 error("Too short suspend request"); 1550 return FALSE; 1551 } 1552 1553 seid_count = 1 + size - sizeof(struct suspend_req); 1554 1555 seid = &req->first_seid; 1556 1557 for (i = 0; i < seid_count; i++, seid++) { 1558 failed_seid = seid->seid; 1559 1560 sep = find_local_sep_by_seid(session->server, 1561 req->first_seid.seid); 1562 if (!sep || !sep->stream) { 1563 err = AVDTP_BAD_ACP_SEID; 1564 goto failed; 1565 } 1566 1567 stream = sep->stream; 1568 1569 if (sep->state != AVDTP_STATE_STREAMING) { 1570 err = AVDTP_BAD_STATE; 1571 goto failed; 1572 } 1573 1574 if (sep->ind && sep->ind->suspend) { 1575 if (!sep->ind->suspend(session, sep, stream, &err, 1576 sep->user_data)) 1577 goto failed; 1578 } 1579 1580 avdtp_sep_set_state(session, sep, AVDTP_STATE_OPEN); 1581 } 1582 1583 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT, 1584 AVDTP_SUSPEND, NULL, 0); 1585 1586 failed: 1587 memset(&rej, 0, sizeof(rej)); 1588 rej.acp_seid = failed_seid; 1589 rej.error = err; 1590 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT, 1591 AVDTP_SUSPEND, &rej, sizeof(rej)); 1592 } 1593 1594 static gboolean avdtp_abort_cmd(struct avdtp *session, uint8_t transaction, 1595 struct seid_req *req, unsigned int size) 1596 { 1597 struct avdtp_local_sep *sep; 1598 uint8_t err; 1599 gboolean ret; 1600 1601 if (size < sizeof(struct seid_req)) { 1602 error("Too short abort request"); 1603 return FALSE; 1604 } 1605 1606 sep = find_local_sep_by_seid(session->server, req->acp_seid); 1607 if (!sep || !sep->stream) { 1608 err = AVDTP_BAD_ACP_SEID; 1609 goto failed; 1610 } 1611 1612 if (sep->ind && sep->ind->abort) { 1613 if (!sep->ind->abort(session, sep, sep->stream, &err, 1614 sep->user_data)) 1615 goto failed; 1616 } 1617 1618 ret = avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT, 1619 AVDTP_ABORT, NULL, 0); 1620 if (ret) 1621 avdtp_sep_set_state(session, sep, AVDTP_STATE_ABORTING); 1622 1623 return ret; 1624 1625 failed: 1626 return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT, 1627 AVDTP_ABORT, &err, sizeof(err)); 1628 } 1629 1630 static gboolean avdtp_secctl_cmd(struct avdtp *session, uint8_t transaction, 1631 struct seid_req *req, int size) 1632 { 1633 return avdtp_unknown_cmd(session, transaction, (void *) req, size); 1634 } 1635 1636 static gboolean avdtp_parse_cmd(struct avdtp *session, uint8_t transaction, 1637 uint8_t signal_id, void *buf, int size) 1638 { 1639 switch (signal_id) { 1640 case AVDTP_DISCOVER: 1641 debug("Received DISCOVER_CMD"); 1642 return avdtp_discover_cmd(session, transaction, buf, size); 1643 case AVDTP_GET_CAPABILITIES: 1644 debug("Received GET_CAPABILITIES_CMD"); 1645 return avdtp_getcap_cmd(session, transaction, buf, size); 1646 case AVDTP_SET_CONFIGURATION: 1647 debug("Received SET_CONFIGURATION_CMD"); 1648 return avdtp_setconf_cmd(session, transaction, buf, size); 1649 case AVDTP_GET_CONFIGURATION: 1650 debug("Received GET_CONFIGURATION_CMD"); 1651 return avdtp_getconf_cmd(session, transaction, buf, size); 1652 case AVDTP_RECONFIGURE: 1653 debug("Received RECONFIGURE_CMD"); 1654 return avdtp_reconf_cmd(session, transaction, buf, size); 1655 case AVDTP_OPEN: 1656 debug("Received OPEN_CMD"); 1657 return avdtp_open_cmd(session, transaction, buf, size); 1658 case AVDTP_START: 1659 debug("Received START_CMD"); 1660 return avdtp_start_cmd(session, transaction, buf, size); 1661 case AVDTP_CLOSE: 1662 debug("Received CLOSE_CMD"); 1663 return avdtp_close_cmd(session, transaction, buf, size); 1664 case AVDTP_SUSPEND: 1665 debug("Received SUSPEND_CMD"); 1666 return avdtp_suspend_cmd(session, transaction, buf, size); 1667 case AVDTP_ABORT: 1668 debug("Received ABORT_CMD"); 1669 return avdtp_abort_cmd(session, transaction, buf, size); 1670 case AVDTP_SECURITY_CONTROL: 1671 debug("Received SECURITY_CONTROL_CMD"); 1672 return avdtp_secctl_cmd(session, transaction, buf, size); 1673 default: 1674 debug("Received unknown request id %u", signal_id); 1675 return avdtp_unknown_cmd(session, transaction, buf, size); 1676 } 1677 } 1678 1679 enum avdtp_parse_result { PARSE_ERROR, PARSE_FRAGMENT, PARSE_SUCCESS }; 1680 1681 static enum avdtp_parse_result avdtp_parse_data(struct avdtp *session, 1682 void *buf, size_t size) 1683 { 1684 struct avdtp_common_header *header = buf; 1685 struct avdtp_single_header *single = (void *) session->buf; 1686 struct avdtp_start_header *start = (void *) session->buf; 1687 void *payload; 1688 gsize payload_size; 1689 1690 switch (header->packet_type) { 1691 case AVDTP_PKT_TYPE_SINGLE: 1692 if (size < sizeof(*single)) { 1693 error("Received too small single packet (%zu bytes)", size); 1694 return PARSE_ERROR; 1695 } 1696 if (session->in.active) { 1697 error("SINGLE: Invalid AVDTP packet fragmentation"); 1698 return PARSE_ERROR; 1699 } 1700 1701 payload = session->buf + sizeof(*single); 1702 payload_size = size - sizeof(*single); 1703 1704 session->in.active = TRUE; 1705 session->in.data_size = 0; 1706 session->in.no_of_packets = 1; 1707 session->in.transaction = header->transaction; 1708 session->in.message_type = header->message_type; 1709 session->in.signal_id = single->signal_id; 1710 1711 break; 1712 case AVDTP_PKT_TYPE_START: 1713 if (size < sizeof(*start)) { 1714 error("Received too small start packet (%zu bytes)", size); 1715 return PARSE_ERROR; 1716 } 1717 if (session->in.active) { 1718 error("START: Invalid AVDTP packet fragmentation"); 1719 return PARSE_ERROR; 1720 } 1721 1722 session->in.active = TRUE; 1723 session->in.data_size = 0; 1724 session->in.transaction = header->transaction; 1725 session->in.message_type = header->message_type; 1726 session->in.no_of_packets = start->no_of_packets; 1727 session->in.signal_id = start->signal_id; 1728 1729 payload = session->buf + sizeof(*start); 1730 payload_size = size - sizeof(*start); 1731 1732 break; 1733 case AVDTP_PKT_TYPE_CONTINUE: 1734 if (size < sizeof(struct avdtp_continue_header)) { 1735 error("Received too small continue packet (%zu bytes)", 1736 size); 1737 return PARSE_ERROR; 1738 } 1739 if (!session->in.active) { 1740 error("CONTINUE: Invalid AVDTP packet fragmentation"); 1741 return PARSE_ERROR; 1742 } 1743 if (session->in.transaction != header->transaction) { 1744 error("Continue transaction id doesn't match"); 1745 return PARSE_ERROR; 1746 } 1747 if (session->in.no_of_packets <= 1) { 1748 error("Too few continue packets"); 1749 return PARSE_ERROR; 1750 } 1751 1752 payload = session->buf + sizeof(struct avdtp_continue_header); 1753 payload_size = size - sizeof(struct avdtp_continue_header); 1754 1755 break; 1756 case AVDTP_PKT_TYPE_END: 1757 if (size < sizeof(struct avdtp_continue_header)) { 1758 error("Received too small end packet (%zu bytes)", size); 1759 return PARSE_ERROR; 1760 } 1761 if (!session->in.active) { 1762 error("END: Invalid AVDTP packet fragmentation"); 1763 return PARSE_ERROR; 1764 } 1765 if (session->in.transaction != header->transaction) { 1766 error("End transaction id doesn't match"); 1767 return PARSE_ERROR; 1768 } 1769 if (session->in.no_of_packets > 1) { 1770 error("Got an end packet too early"); 1771 return PARSE_ERROR; 1772 } 1773 1774 payload = session->buf + sizeof(struct avdtp_continue_header); 1775 payload_size = size - sizeof(struct avdtp_continue_header); 1776 1777 break; 1778 default: 1779 error("Invalid AVDTP packet type 0x%02X", header->packet_type); 1780 return PARSE_ERROR; 1781 } 1782 1783 if (session->in.data_size + payload_size > 1784 sizeof(session->in.buf)) { 1785 error("Not enough incoming buffer space!"); 1786 return PARSE_ERROR; 1787 } 1788 1789 memcpy(session->in.buf + session->in.data_size, payload, payload_size); 1790 session->in.data_size += payload_size; 1791 1792 if (session->in.no_of_packets > 1) { 1793 session->in.no_of_packets--; 1794 debug("Received AVDTP fragment. %d to go", 1795 session->in.no_of_packets); 1796 return PARSE_FRAGMENT; 1797 } 1798 1799 session->in.active = FALSE; 1800 1801 return PARSE_SUCCESS; 1802 } 1803 1804 static gboolean session_cb(GIOChannel *chan, GIOCondition cond, 1805 gpointer data) 1806 { 1807 struct avdtp *session = data; 1808 struct avdtp_common_header *header; 1809 gsize size; 1810 1811 debug("session_cb"); 1812 1813 if (cond & G_IO_NVAL) 1814 return FALSE; 1815 1816 header = (void *) session->buf; 1817 1818 if (cond & (G_IO_HUP | G_IO_ERR)) 1819 goto failed; 1820 1821 if (g_io_channel_read(chan, session->buf, session->imtu, &size) 1822 != G_IO_ERROR_NONE) { 1823 error("IO Channel read error"); 1824 goto failed; 1825 } 1826 1827 if (size < sizeof(struct avdtp_common_header)) { 1828 error("Received too small packet (%zu bytes)", size); 1829 goto failed; 1830 } 1831 1832 switch (avdtp_parse_data(session, session->buf, size)) { 1833 case PARSE_ERROR: 1834 goto failed; 1835 case PARSE_FRAGMENT: 1836 return TRUE; 1837 case PARSE_SUCCESS: 1838 break; 1839 } 1840 1841 if (session->in.message_type == AVDTP_MSG_TYPE_COMMAND) { 1842 if (!avdtp_parse_cmd(session, session->in.transaction, 1843 session->in.signal_id, 1844 session->in.buf, 1845 session->in.data_size)) { 1846 error("Unable to handle command. Disconnecting"); 1847 goto failed; 1848 } 1849 1850 if (session->ref == 1 && !session->streams && !session->req) 1851 set_disconnect_timer(session); 1852 1853 if (session->streams && session->dc_timer) 1854 remove_disconnect_timer(session); 1855 1856 return TRUE; 1857 } 1858 1859 if (session->req == NULL) { 1860 error("No pending request, ignoring message"); 1861 return TRUE; 1862 } 1863 1864 if (header->transaction != session->req->transaction) { 1865 error("Transaction label doesn't match"); 1866 return TRUE; 1867 } 1868 1869 if (session->in.signal_id != session->req->signal_id) { 1870 error("Reponse signal doesn't match"); 1871 return TRUE; 1872 } 1873 1874 g_source_remove(session->req->timeout); 1875 session->req->timeout = 0; 1876 1877 switch (header->message_type) { 1878 case AVDTP_MSG_TYPE_ACCEPT: 1879 if (!avdtp_parse_resp(session, session->req->stream, 1880 session->in.transaction, 1881 session->in.signal_id, 1882 session->in.buf, 1883 session->in.data_size)) { 1884 error("Unable to parse accept response"); 1885 goto failed; 1886 } 1887 break; 1888 case AVDTP_MSG_TYPE_REJECT: 1889 if (!avdtp_parse_rej(session, session->req->stream, 1890 session->in.transaction, 1891 session->in.signal_id, 1892 session->in.buf, 1893 session->in.data_size)) { 1894 error("Unable to parse reject response"); 1895 goto failed; 1896 } 1897 break; 1898 default: 1899 error("Unknown message type 0x%02X", header->message_type); 1900 break; 1901 } 1902 1903 pending_req_free(session->req); 1904 session->req = NULL; 1905 1906 process_queue(session); 1907 1908 return TRUE; 1909 1910 failed: 1911 connection_lost(session, EIO); 1912 1913 return FALSE; 1914 } 1915 1916 static struct avdtp *find_session(GSList *list, const bdaddr_t *dst) 1917 { 1918 GSList *l; 1919 1920 for (l = list; l != NULL; l = g_slist_next(l)) { 1921 struct avdtp *s = l->data; 1922 1923 if (bacmp(dst, &s->dst)) 1924 continue; 1925 1926 return s; 1927 } 1928 1929 return NULL; 1930 } 1931 1932 static struct avdtp *avdtp_get_internal(const bdaddr_t *src, const bdaddr_t *dst) 1933 { 1934 struct avdtp_server *server; 1935 struct avdtp *session; 1936 1937 assert(src != NULL); 1938 assert(dst != NULL); 1939 1940 server = find_server(servers, src); 1941 if (server == NULL) 1942 return NULL; 1943 1944 session = find_session(server->sessions, dst); 1945 if (session) { 1946 if (session->pending_auth) 1947 return NULL; 1948 else 1949 return session; 1950 } 1951 1952 session = g_new0(struct avdtp, 1); 1953 1954 session->server = server; 1955 bacpy(&session->dst, dst); 1956 session->ref = 1; 1957 /* We don't use avdtp_set_state() here since this isn't a state change 1958 * but just setting of the initial state */ 1959 session->state = AVDTP_SESSION_STATE_DISCONNECTED; 1960 session->auto_dc = TRUE; 1961 1962 server->sessions = g_slist_append(server->sessions, session); 1963 1964 return session; 1965 } 1966 1967 struct avdtp *avdtp_get(bdaddr_t *src, bdaddr_t *dst) 1968 { 1969 struct avdtp *session; 1970 1971 session = avdtp_get_internal(src, dst); 1972 1973 if (!session) 1974 return NULL; 1975 1976 return avdtp_ref(session); 1977 } 1978 1979 static void avdtp_connect_cb(GIOChannel *chan, GError *err, gpointer user_data) 1980 { 1981 struct avdtp *session = user_data; 1982 char address[18]; 1983 GError *gerr = NULL; 1984 1985 if (err) { 1986 error("%s", err->message); 1987 goto failed; 1988 } 1989 1990 if (!session->io) 1991 session->io = g_io_channel_ref(chan); 1992 1993 bt_io_get(chan, BT_IO_L2CAP, &gerr, 1994 BT_IO_OPT_OMTU, &session->omtu, 1995 BT_IO_OPT_IMTU, &session->imtu, 1996 BT_IO_OPT_INVALID); 1997 if (gerr) { 1998 error("%s", gerr->message); 1999 g_error_free(gerr); 2000 goto failed; 2001 } 2002 2003 ba2str(&session->dst, address); 2004 debug("AVDTP: connected %s channel to %s", 2005 session->pending_open ? "transport" : "signaling", 2006 address); 2007 2008 if (session->state == AVDTP_SESSION_STATE_CONNECTING) { 2009 debug("AVDTP imtu=%u, omtu=%u", session->imtu, session->omtu); 2010 2011 session->buf = g_malloc0(session->imtu); 2012 avdtp_set_state(session, AVDTP_SESSION_STATE_CONNECTED); 2013 2014 if (session->io_id) 2015 g_source_remove(session->io_id); 2016 2017 /* This watch should be low priority since otherwise the 2018 * connect callback might be dispatched before the session 2019 * callback if the kernel wakes us up at the same time for 2020 * them. This could happen if a headset is very quick in 2021 * sending the Start command after connecting the stream 2022 * transport channel. 2023 */ 2024 session->io_id = g_io_add_watch_full(chan, 2025 G_PRIORITY_LOW, 2026 G_IO_IN | G_IO_ERR | G_IO_HUP 2027 | G_IO_NVAL, 2028 (GIOFunc) session_cb, session, 2029 NULL); 2030 2031 if (session->stream_setup) { 2032 set_disconnect_timer(session); 2033 avdtp_set_auto_disconnect(session, FALSE); 2034 } 2035 } else if (session->pending_open) 2036 handle_transport_connect(session, chan, session->imtu, 2037 session->omtu); 2038 else 2039 goto failed; 2040 2041 process_queue(session); 2042 2043 return; 2044 2045 failed: 2046 if (session->pending_open) { 2047 struct avdtp_stream *stream = session->pending_open; 2048 2049 handle_transport_connect(session, NULL, 0, 0); 2050 2051 if (avdtp_abort(session, stream) < 0) 2052 avdtp_sep_set_state(session, stream->lsep, 2053 AVDTP_STATE_IDLE); 2054 } else 2055 connection_lost(session, EIO); 2056 2057 return; 2058 } 2059 2060 static void auth_cb(DBusError *derr, void *user_data) 2061 { 2062 struct avdtp *session = user_data; 2063 GError *err = NULL; 2064 2065 if (derr && dbus_error_is_set(derr)) { 2066 error("Access denied: %s", derr->message); 2067 connection_lost(session, EACCES); 2068 return; 2069 } 2070 2071 if (!bt_io_accept(session->io, avdtp_connect_cb, session, NULL, 2072 &err)) { 2073 error("bt_io_accept: %s", err->message); 2074 connection_lost(session, EACCES); 2075 g_error_free(err); 2076 return; 2077 } 2078 2079 /* This is so that avdtp_connect_cb will know to do the right thing 2080 * with respect to the disconnect timer */ 2081 session->stream_setup = TRUE; 2082 } 2083 2084 static void avdtp_confirm_cb(GIOChannel *chan, gpointer data) 2085 { 2086 struct avdtp *session; 2087 struct audio_device *dev; 2088 char address[18]; 2089 bdaddr_t src, dst; 2090 int perr; 2091 GError *err = NULL; 2092 2093 bt_io_get(chan, BT_IO_L2CAP, &err, 2094 BT_IO_OPT_SOURCE_BDADDR, &src, 2095 BT_IO_OPT_DEST_BDADDR, &dst, 2096 BT_IO_OPT_DEST, address, 2097 BT_IO_OPT_INVALID); 2098 if (err) { 2099 error("%s", err->message); 2100 g_error_free(err); 2101 goto drop; 2102 } 2103 2104 debug("AVDTP: incoming connect from %s", address); 2105 2106 session = avdtp_get_internal(&src, &dst); 2107 if (!session) 2108 goto drop; 2109 2110 /* This state (ie, session is already *connecting*) happens when the 2111 * device initiates a connect (really a config'd L2CAP channel) even 2112 * though there is a connect we initiated in progress. In sink.c & 2113 * source.c, this state is referred to as XCASE connect:connect. 2114 * Abort the device's channel in favor of our own. 2115 */ 2116 if (session->state == AVDTP_SESSION_STATE_CONNECTING) { 2117 debug("avdtp_confirm_cb: connect already in progress" 2118 " (XCASE connect:connect)"); 2119 goto drop; 2120 } 2121 2122 if (session->pending_open && session->pending_open->open_acp) { 2123 if (!bt_io_accept(chan, avdtp_connect_cb, session, NULL, NULL)) 2124 goto drop; 2125 return; 2126 } 2127 2128 if (session->io) { 2129 error("Refusing unexpected connect from %s", address); 2130 goto drop; 2131 } 2132 2133 dev = manager_get_device(&src, &dst, FALSE); 2134 if (!dev) { 2135 dev = manager_get_device(&src, &dst, TRUE); 2136 if (!dev) { 2137 error("Unable to get audio device object for %s", 2138 address); 2139 goto drop; 2140 } 2141 btd_device_add_uuid(dev->btd_dev, ADVANCED_AUDIO_UUID); 2142 } 2143 2144 session->io = g_io_channel_ref(chan); 2145 avdtp_set_state(session, AVDTP_SESSION_STATE_CONNECTING); 2146 2147 session->io_id = g_io_add_watch(chan, G_IO_ERR | G_IO_HUP | G_IO_NVAL, 2148 (GIOFunc) session_cb, session); 2149 2150 perr = audio_device_request_authorization(dev, ADVANCED_AUDIO_UUID, 2151 auth_cb, session); 2152 if (perr < 0) { 2153 avdtp_unref(session); 2154 goto drop; 2155 } 2156 2157 dev->auto_connect = auto_connect; 2158 2159 return; 2160 2161 drop: 2162 g_io_channel_shutdown(chan, TRUE, NULL); 2163 } 2164 2165 static int l2cap_connect(struct avdtp *session) 2166 { 2167 GError *err = NULL; 2168 GIOChannel *io; 2169 2170 io = bt_io_connect(BT_IO_L2CAP, avdtp_connect_cb, session, 2171 NULL, &err, 2172 BT_IO_OPT_SOURCE_BDADDR, &session->server->src, 2173 BT_IO_OPT_DEST_BDADDR, &session->dst, 2174 BT_IO_OPT_PSM, AVDTP_PSM, 2175 BT_IO_OPT_INVALID); 2176 if (!io) { 2177 error("%s", err->message); 2178 g_error_free(err); 2179 return -EIO; 2180 } 2181 2182 g_io_channel_unref(io); 2183 2184 return 0; 2185 } 2186 2187 static void queue_request(struct avdtp *session, struct pending_req *req, 2188 gboolean priority) 2189 { 2190 if (priority) 2191 session->prio_queue = g_slist_append(session->prio_queue, req); 2192 else 2193 session->req_queue = g_slist_append(session->req_queue, req); 2194 } 2195 2196 static uint8_t req_get_seid(struct pending_req *req) 2197 { 2198 if (req->signal_id == AVDTP_DISCOVER) 2199 return 0; 2200 2201 return ((struct seid_req *) (req->data))->acp_seid; 2202 } 2203 2204 static gboolean request_timeout(gpointer user_data) 2205 { 2206 struct avdtp *session = user_data; 2207 struct pending_req *req; 2208 struct seid_req sreq; 2209 struct avdtp_local_sep *lsep; 2210 struct avdtp_stream *stream; 2211 uint8_t seid; 2212 struct avdtp_error err; 2213 2214 req = session->req; 2215 session->req = NULL; 2216 2217 avdtp_error_init(&err, AVDTP_ERROR_ERRNO, ETIMEDOUT); 2218 2219 seid = req_get_seid(req); 2220 if (seid) 2221 stream = find_stream_by_rseid(session, seid); 2222 else 2223 stream = NULL; 2224 2225 if (stream) 2226 lsep = stream->lsep; 2227 else 2228 lsep = NULL; 2229 2230 switch (req->signal_id) { 2231 case AVDTP_RECONFIGURE: 2232 error("Reconfigure request timed out"); 2233 if (lsep && lsep->cfm && lsep->cfm->reconfigure) 2234 lsep->cfm->reconfigure(session, lsep, stream, &err, 2235 lsep->user_data); 2236 break; 2237 case AVDTP_OPEN: 2238 error("Open request timed out"); 2239 if (lsep && lsep->cfm && lsep->cfm->open) 2240 lsep->cfm->open(session, lsep, stream, &err, 2241 lsep->user_data); 2242 break; 2243 case AVDTP_START: 2244 error("Start request timed out"); 2245 if (lsep && lsep->cfm && lsep->cfm->start) 2246 lsep->cfm->start(session, lsep, stream, &err, 2247 lsep->user_data); 2248 break; 2249 case AVDTP_SUSPEND: 2250 error("Suspend request timed out"); 2251 if (lsep && lsep->cfm && lsep->cfm->suspend) 2252 lsep->cfm->suspend(session, lsep, stream, &err, 2253 lsep->user_data); 2254 break; 2255 case AVDTP_CLOSE: 2256 error("Close request timed out"); 2257 if (lsep && lsep->cfm && lsep->cfm->close) { 2258 lsep->cfm->close(session, lsep, stream, &err, 2259 lsep->user_data); 2260 if (stream) 2261 stream->close_int = FALSE; 2262 } 2263 break; 2264 case AVDTP_SET_CONFIGURATION: 2265 error("SetConfiguration request timed out"); 2266 if (lsep && lsep->cfm && lsep->cfm->set_configuration) 2267 lsep->cfm->set_configuration(session, lsep, stream, 2268 &err, lsep->user_data); 2269 goto failed; 2270 case AVDTP_DISCOVER: 2271 error("Discover request timed out"); 2272 goto failed; 2273 case AVDTP_GET_CAPABILITIES: 2274 error("GetCapabilities request timed out"); 2275 goto failed; 2276 case AVDTP_ABORT: 2277 error("Abort request timed out"); 2278 goto failed; 2279 } 2280 2281 if (!stream) 2282 goto failed; 2283 2284 memset(&sreq, 0, sizeof(sreq)); 2285 sreq.acp_seid = seid; 2286 2287 if (send_request(session, TRUE, stream, AVDTP_ABORT, 2288 &sreq, sizeof(sreq)) < 0) { 2289 error("Unable to send abort request"); 2290 goto failed; 2291 } 2292 2293 stream->abort_int = TRUE; 2294 2295 goto done; 2296 2297 failed: 2298 connection_lost(session, ETIMEDOUT); 2299 done: 2300 pending_req_free(req); 2301 return FALSE; 2302 } 2303 2304 static int send_req(struct avdtp *session, gboolean priority, 2305 struct pending_req *req) 2306 { 2307 static int transaction = 0; 2308 int err; 2309 2310 if (session->state == AVDTP_SESSION_STATE_DISCONNECTED) { 2311 err = l2cap_connect(session); 2312 if (err < 0) 2313 goto failed; 2314 avdtp_set_state(session, AVDTP_SESSION_STATE_CONNECTING); 2315 } 2316 2317 if (session->state < AVDTP_SESSION_STATE_CONNECTED || 2318 session->req != NULL) { 2319 queue_request(session, req, priority); 2320 return 0; 2321 } 2322 2323 req->transaction = transaction++; 2324 transaction %= 16; 2325 2326 /* FIXME: Should we retry to send if the buffer 2327 was not totally sent or in case of EINTR? */ 2328 if (!avdtp_send(session, req->transaction, AVDTP_MSG_TYPE_COMMAND, 2329 req->signal_id, req->data, req->data_size)) { 2330 err = -EIO; 2331 goto failed; 2332 } 2333 2334 2335 session->req = req; 2336 2337 req->timeout = g_timeout_add_seconds(REQ_TIMEOUT, 2338 request_timeout, 2339 session); 2340 return 0; 2341 2342 failed: 2343 g_free(req->data); 2344 g_free(req); 2345 return err; 2346 } 2347 2348 static int send_request(struct avdtp *session, gboolean priority, 2349 struct avdtp_stream *stream, uint8_t signal_id, 2350 void *buffer, size_t size) 2351 { 2352 struct pending_req *req; 2353 2354 req = g_new0(struct pending_req, 1); 2355 req->signal_id = signal_id; 2356 req->data = g_malloc(size); 2357 memcpy(req->data, buffer, size); 2358 req->data_size = size; 2359 req->stream = stream; 2360 2361 return send_req(session, priority, req); 2362 } 2363 2364 static gboolean avdtp_discover_resp(struct avdtp *session, 2365 struct discover_resp *resp, int size) 2366 { 2367 int sep_count, i; 2368 2369 sep_count = size / sizeof(struct seid_info); 2370 2371 for (i = 0; i < sep_count; i++) { 2372 struct avdtp_remote_sep *sep; 2373 struct avdtp_stream *stream; 2374 struct seid_req req; 2375 int ret; 2376 2377 debug("seid %d type %d media %d in use %d", 2378 resp->seps[i].seid, resp->seps[i].type, 2379 resp->seps[i].media_type, resp->seps[i].inuse); 2380 2381 stream = find_stream_by_rseid(session, resp->seps[i].seid); 2382 2383 sep = find_remote_sep(session->seps, resp->seps[i].seid); 2384 if (!sep) { 2385 if (resp->seps[i].inuse && !stream) 2386 continue; 2387 sep = g_new0(struct avdtp_remote_sep, 1); 2388 session->seps = g_slist_append(session->seps, sep); 2389 } 2390 2391 sep->stream = stream; 2392 sep->seid = resp->seps[i].seid; 2393 sep->type = resp->seps[i].type; 2394 sep->media_type = resp->seps[i].media_type; 2395 2396 memset(&req, 0, sizeof(req)); 2397 req.acp_seid = sep->seid; 2398 2399 ret = send_request(session, TRUE, NULL, 2400 AVDTP_GET_CAPABILITIES, 2401 &req, sizeof(req)); 2402 if (ret < 0) { 2403 finalize_discovery(session, -ret); 2404 break; 2405 } 2406 } 2407 2408 return TRUE; 2409 } 2410 2411 static gboolean avdtp_get_capabilities_resp(struct avdtp *session, 2412 struct getcap_resp *resp, 2413 unsigned int size) 2414 { 2415 struct avdtp_remote_sep *sep; 2416 uint8_t seid; 2417 2418 /* Check for minimum required packet size includes: 2419 * 1. getcap resp header 2420 * 2. media transport capability (2 bytes) 2421 * 3. media codec capability type + length (2 bytes) 2422 * 4. the actual media codec elements 2423 * */ 2424 if (size < (sizeof(struct getcap_resp) + 4 + 2425 sizeof(struct avdtp_media_codec_capability))) { 2426 error("Too short getcap resp packet"); 2427 return FALSE; 2428 } 2429 2430 seid = ((struct seid_req *) session->req->data)->acp_seid; 2431 2432 sep = find_remote_sep(session->seps, seid); 2433 2434 debug("seid %d type %d media %d", sep->seid, 2435 sep->type, sep->media_type); 2436 2437 if (sep->caps) { 2438 g_slist_foreach(sep->caps, (GFunc) g_free, NULL); 2439 g_slist_free(sep->caps); 2440 sep->caps = NULL; 2441 sep->codec = NULL; 2442 } 2443 2444 sep->caps = caps_to_list(resp->caps, size - sizeof(struct getcap_resp), 2445 &sep->codec); 2446 2447 return TRUE; 2448 } 2449 2450 static gboolean avdtp_set_configuration_resp(struct avdtp *session, 2451 struct avdtp_stream *stream, 2452 struct avdtp_single_header *resp, 2453 int size) 2454 { 2455 struct avdtp_local_sep *sep = stream->lsep; 2456 2457 if (sep->cfm && sep->cfm->set_configuration) 2458 sep->cfm->set_configuration(session, sep, stream, NULL, 2459 sep->user_data); 2460 2461 avdtp_sep_set_state(session, sep, AVDTP_STATE_CONFIGURED); 2462 2463 return TRUE; 2464 } 2465 2466 static gboolean avdtp_reconfigure_resp(struct avdtp *session, 2467 struct avdtp_stream *stream, 2468 struct avdtp_single_header *resp, int size) 2469 { 2470 return TRUE; 2471 } 2472 2473 static gboolean avdtp_open_resp(struct avdtp *session, struct avdtp_stream *stream, 2474 struct seid_rej *resp, int size) 2475 { 2476 struct avdtp_local_sep *sep = stream->lsep; 2477 2478 if (l2cap_connect(session) < 0) { 2479 avdtp_sep_set_state(session, sep, AVDTP_STATE_IDLE); 2480 return FALSE; 2481 } 2482 2483 session->pending_open = stream; 2484 2485 return TRUE; 2486 } 2487 2488 static gboolean avdtp_start_resp(struct avdtp *session, 2489 struct avdtp_stream *stream, 2490 struct seid_rej *resp, int size) 2491 { 2492 struct avdtp_local_sep *sep = stream->lsep; 2493 2494 if (sep->cfm && sep->cfm->start) 2495 sep->cfm->start(session, sep, stream, NULL, sep->user_data); 2496 2497 /* We might be in STREAMING already if both sides send START_CMD at the 2498 * same time and the one in SNK role doesn't reject it as it should */ 2499 if (sep->state != AVDTP_STATE_STREAMING) 2500 avdtp_sep_set_state(session, sep, AVDTP_STATE_STREAMING); 2501 2502 return TRUE; 2503 } 2504 2505 static gboolean avdtp_close_resp(struct avdtp *session, 2506 struct avdtp_stream *stream, 2507 struct seid_rej *resp, int size) 2508 { 2509 struct avdtp_local_sep *sep = stream->lsep; 2510 2511 avdtp_sep_set_state(session, sep, AVDTP_STATE_CLOSING); 2512 2513 close_stream(stream); 2514 2515 return TRUE; 2516 } 2517 2518 static gboolean avdtp_suspend_resp(struct avdtp *session, 2519 struct avdtp_stream *stream, 2520 void *data, int size) 2521 { 2522 struct avdtp_local_sep *sep = stream->lsep; 2523 2524 avdtp_sep_set_state(session, sep, AVDTP_STATE_OPEN); 2525 2526 if (sep->cfm && sep->cfm->suspend) 2527 sep->cfm->suspend(session, sep, stream, NULL, sep->user_data); 2528 2529 return TRUE; 2530 } 2531 2532 static gboolean avdtp_abort_resp(struct avdtp *session, 2533 struct avdtp_stream *stream, 2534 struct seid_rej *resp, int size) 2535 { 2536 struct avdtp_local_sep *sep = stream->lsep; 2537 2538 avdtp_sep_set_state(session, sep, AVDTP_STATE_ABORTING); 2539 2540 if (sep->cfm && sep->cfm->abort) 2541 sep->cfm->abort(session, sep, stream, NULL, sep->user_data); 2542 2543 avdtp_sep_set_state(session, sep, AVDTP_STATE_IDLE); 2544 2545 return TRUE; 2546 } 2547 2548 static gboolean avdtp_parse_resp(struct avdtp *session, 2549 struct avdtp_stream *stream, 2550 uint8_t transaction, uint8_t signal_id, 2551 void *buf, int size) 2552 { 2553 struct pending_req *next; 2554 2555 if (session->prio_queue) 2556 next = session->prio_queue->data; 2557 else if (session->req_queue) 2558 next = session->req_queue->data; 2559 else 2560 next = NULL; 2561 2562 switch (signal_id) { 2563 case AVDTP_DISCOVER: 2564 debug("DISCOVER request succeeded"); 2565 return avdtp_discover_resp(session, buf, size); 2566 case AVDTP_GET_CAPABILITIES: 2567 debug("GET_CAPABILITIES request succeeded"); 2568 if (!avdtp_get_capabilities_resp(session, buf, size)) 2569 return FALSE; 2570 if (!(next && next->signal_id == AVDTP_GET_CAPABILITIES)) 2571 finalize_discovery(session, 0); 2572 return TRUE; 2573 } 2574 2575 /* The remaining commands require an existing stream so bail out 2576 * here if the stream got unexpectedly disconnected */ 2577 if (!stream) { 2578 debug("AVDTP: stream was closed while waiting for reply"); 2579 return TRUE; 2580 } 2581 2582 switch (signal_id) { 2583 case AVDTP_SET_CONFIGURATION: 2584 debug("SET_CONFIGURATION request succeeded"); 2585 return avdtp_set_configuration_resp(session, stream, 2586 buf, size); 2587 case AVDTP_RECONFIGURE: 2588 debug("RECONFIGURE request succeeded"); 2589 return avdtp_reconfigure_resp(session, stream, buf, size); 2590 case AVDTP_OPEN: 2591 debug("OPEN request succeeded"); 2592 return avdtp_open_resp(session, stream, buf, size); 2593 case AVDTP_SUSPEND: 2594 debug("SUSPEND request succeeded"); 2595 return avdtp_suspend_resp(session, stream, buf, size); 2596 case AVDTP_START: 2597 debug("START request succeeded"); 2598 return avdtp_start_resp(session, stream, buf, size); 2599 case AVDTP_CLOSE: 2600 debug("CLOSE request succeeded"); 2601 return avdtp_close_resp(session, stream, buf, size); 2602 case AVDTP_ABORT: 2603 debug("ABORT request succeeded"); 2604 return avdtp_abort_resp(session, stream, buf, size); 2605 } 2606 2607 error("Unknown signal id in accept response: %u", signal_id); 2608 return TRUE; 2609 } 2610 2611 static gboolean seid_rej_to_err(struct seid_rej *rej, unsigned int size, 2612 struct avdtp_error *err) 2613 { 2614 if (size < sizeof(struct seid_rej)) { 2615 error("Too small packet for seid_rej"); 2616 return FALSE; 2617 } 2618 2619 avdtp_error_init(err, AVDTP_ERROR_ERROR_CODE, rej->error); 2620 2621 return TRUE; 2622 } 2623 2624 static gboolean conf_rej_to_err(struct conf_rej *rej, unsigned int size, 2625 struct avdtp_error *err, uint8_t *category) 2626 { 2627 if (size < sizeof(struct conf_rej)) { 2628 error("Too small packet for conf_rej"); 2629 return FALSE; 2630 } 2631 2632 avdtp_error_init(err, AVDTP_ERROR_ERROR_CODE, rej->error); 2633 2634 if (category) 2635 *category = rej->category; 2636 2637 return TRUE; 2638 } 2639 2640 static gboolean stream_rej_to_err(struct stream_rej *rej, unsigned int size, 2641 struct avdtp_error *err, 2642 uint8_t *acp_seid) 2643 { 2644 if (size < sizeof(struct stream_rej)) { 2645 error("Too small packet for stream_rej"); 2646 return FALSE; 2647 } 2648 2649 avdtp_error_init(err, AVDTP_ERROR_ERROR_CODE, rej->error); 2650 2651 if (acp_seid) 2652 *acp_seid = rej->acp_seid; 2653 2654 return TRUE; 2655 } 2656 2657 static gboolean avdtp_parse_rej(struct avdtp *session, 2658 struct avdtp_stream *stream, 2659 uint8_t transaction, uint8_t signal_id, 2660 void *buf, int size) 2661 { 2662 struct avdtp_error err; 2663 uint8_t acp_seid, category; 2664 struct avdtp_local_sep *sep = stream ? stream->lsep : NULL; 2665 2666 switch (signal_id) { 2667 case AVDTP_DISCOVER: 2668 if (!seid_rej_to_err(buf, size, &err)) 2669 return FALSE; 2670 error("DISCOVER request rejected: %s (%d)", 2671 avdtp_strerror(&err), err.err.error_code); 2672 return TRUE; 2673 case AVDTP_GET_CAPABILITIES: 2674 if (!seid_rej_to_err(buf, size, &err)) 2675 return FALSE; 2676 error("GET_CAPABILITIES request rejected: %s (%d)", 2677 avdtp_strerror(&err), err.err.error_code); 2678 return TRUE; 2679 case AVDTP_OPEN: 2680 if (!seid_rej_to_err(buf, size, &err)) 2681 return FALSE; 2682 error("OPEN request rejected: %s (%d)", 2683 avdtp_strerror(&err), err.err.error_code); 2684 if (sep && sep->cfm && sep->cfm->open) 2685 sep->cfm->open(session, sep, stream, &err, 2686 sep->user_data); 2687 return TRUE; 2688 case AVDTP_SET_CONFIGURATION: 2689 if (!conf_rej_to_err(buf, size, &err, &category)) 2690 return FALSE; 2691 error("SET_CONFIGURATION request rejected: %s (%d)", 2692 avdtp_strerror(&err), err.err.error_code); 2693 if (sep && sep->cfm && sep->cfm->set_configuration) 2694 sep->cfm->set_configuration(session, sep, stream, 2695 &err, sep->user_data); 2696 return TRUE; 2697 case AVDTP_RECONFIGURE: 2698 if (!conf_rej_to_err(buf, size, &err, &category)) 2699 return FALSE; 2700 error("RECONFIGURE request rejected: %s (%d)", 2701 avdtp_strerror(&err), err.err.error_code); 2702 if (sep && sep->cfm && sep->cfm->reconfigure) 2703 sep->cfm->reconfigure(session, sep, stream, &err, 2704 sep->user_data); 2705 return TRUE; 2706 case AVDTP_START: 2707 if (!stream_rej_to_err(buf, size, &err, &acp_seid)) 2708 return FALSE; 2709 error("START request rejected: %s (%d)", 2710 avdtp_strerror(&err), err.err.error_code); 2711 if (sep && sep->cfm && sep->cfm->start) 2712 sep->cfm->start(session, sep, stream, &err, 2713 sep->user_data); 2714 return TRUE; 2715 case AVDTP_SUSPEND: 2716 if (!stream_rej_to_err(buf, size, &err, &acp_seid)) 2717 return FALSE; 2718 error("SUSPEND request rejected: %s (%d)", 2719 avdtp_strerror(&err), err.err.error_code); 2720 if (sep && sep->cfm && sep->cfm->suspend) 2721 sep->cfm->suspend(session, sep, stream, &err, 2722 sep->user_data); 2723 return TRUE; 2724 case AVDTP_CLOSE: 2725 if (!stream_rej_to_err(buf, size, &err, &acp_seid)) 2726 return FALSE; 2727 error("CLOSE request rejected: %s (%d)", 2728 avdtp_strerror(&err), err.err.error_code); 2729 if (sep && sep->cfm && sep->cfm->close) { 2730 sep->cfm->close(session, sep, stream, &err, 2731 sep->user_data); 2732 stream->close_int = FALSE; 2733 } 2734 return TRUE; 2735 case AVDTP_ABORT: 2736 if (!stream_rej_to_err(buf, size, &err, &acp_seid)) 2737 return FALSE; 2738 error("ABORT request rejected: %s (%d)", 2739 avdtp_strerror(&err), err.err.error_code); 2740 if (sep && sep->cfm && sep->cfm->abort) 2741 sep->cfm->abort(session, sep, stream, &err, 2742 sep->user_data); 2743 return TRUE; 2744 default: 2745 error("Unknown reject response signal id: %u", signal_id); 2746 return TRUE; 2747 } 2748 } 2749 2750 gboolean avdtp_is_connected(const bdaddr_t *src, const bdaddr_t *dst) 2751 { 2752 struct avdtp_server *server; 2753 struct avdtp *session; 2754 2755 server = find_server(servers, src); 2756 if (!server) 2757 return FALSE; 2758 2759 session = find_session(server->sessions, dst); 2760 if (!session) 2761 return FALSE; 2762 2763 if (session->state != AVDTP_SESSION_STATE_DISCONNECTED) 2764 return TRUE; 2765 2766 return FALSE; 2767 } 2768 2769 struct avdtp_service_capability *avdtp_stream_get_codec( 2770 struct avdtp_stream *stream) 2771 { 2772 GSList *l; 2773 2774 for (l = stream->caps; l; l = l->next) { 2775 struct avdtp_service_capability *cap = l->data; 2776 2777 if (cap->category == AVDTP_MEDIA_CODEC) 2778 return cap; 2779 } 2780 2781 return NULL; 2782 } 2783 2784 gboolean avdtp_stream_has_capability(struct avdtp_stream *stream, 2785 struct avdtp_service_capability *cap) 2786 { 2787 GSList *l; 2788 struct avdtp_service_capability *stream_cap; 2789 2790 for (l = stream->caps; l; l = g_slist_next(l)) { 2791 stream_cap = l->data; 2792 2793 if (stream_cap->category != cap->category || 2794 stream_cap->length != cap->length) 2795 continue; 2796 2797 if (memcmp(stream_cap->data, cap->data, cap->length) == 0) 2798 return TRUE; 2799 } 2800 2801 return FALSE; 2802 } 2803 2804 gboolean avdtp_stream_has_capabilities(struct avdtp_stream *stream, 2805 GSList *caps) 2806 { 2807 GSList *l; 2808 2809 for (l = caps; l; l = g_slist_next(l)) { 2810 struct avdtp_service_capability *cap = l->data; 2811 2812 if (!avdtp_stream_has_capability(stream, cap)) 2813 return FALSE; 2814 } 2815 2816 return TRUE; 2817 } 2818 2819 gboolean avdtp_stream_get_transport(struct avdtp_stream *stream, int *sock, 2820 uint16_t *imtu, uint16_t *omtu, 2821 GSList **caps) 2822 { 2823 if (stream->io == NULL) 2824 return FALSE; 2825 2826 if (sock) 2827 *sock = g_io_channel_unix_get_fd(stream->io); 2828 2829 if (omtu) 2830 *omtu = stream->omtu; 2831 2832 if (imtu) 2833 *imtu = stream->imtu; 2834 2835 if (caps) 2836 *caps = stream->caps; 2837 2838 return TRUE; 2839 } 2840 2841 static int process_queue(struct avdtp *session) 2842 { 2843 GSList **queue, *l; 2844 struct pending_req *req; 2845 2846 if (session->req) 2847 return 0; 2848 2849 if (session->prio_queue) 2850 queue = &session->prio_queue; 2851 else 2852 queue = &session->req_queue; 2853 2854 if (!*queue) 2855 return 0; 2856 2857 l = *queue; 2858 req = l->data; 2859 2860 *queue = g_slist_remove(*queue, req); 2861 2862 return send_req(session, FALSE, req); 2863 } 2864 2865 struct avdtp_remote_sep *avdtp_get_remote_sep(struct avdtp *session, 2866 uint8_t seid) 2867 { 2868 GSList *l; 2869 2870 for (l = session->seps; l; l = l->next) { 2871 struct avdtp_remote_sep *sep = l->data; 2872 2873 if (sep->seid == seid) 2874 return sep; 2875 } 2876 2877 return NULL; 2878 } 2879 2880 uint8_t avdtp_get_seid(struct avdtp_remote_sep *sep) 2881 { 2882 return sep->seid; 2883 } 2884 2885 uint8_t avdtp_get_type(struct avdtp_remote_sep *sep) 2886 { 2887 return sep->type; 2888 } 2889 2890 struct avdtp_service_capability *avdtp_get_codec(struct avdtp_remote_sep *sep) 2891 { 2892 return sep->codec; 2893 } 2894 2895 struct avdtp_stream *avdtp_get_stream(struct avdtp_remote_sep *sep) 2896 { 2897 return sep->stream; 2898 } 2899 2900 struct avdtp_service_capability *avdtp_service_cap_new(uint8_t category, 2901 void *data, int length) 2902 { 2903 struct avdtp_service_capability *cap; 2904 2905 if (category < AVDTP_MEDIA_TRANSPORT || category > AVDTP_MEDIA_CODEC) 2906 return NULL; 2907 2908 cap = g_malloc(sizeof(struct avdtp_service_capability) + length); 2909 cap->category = category; 2910 cap->length = length; 2911 memcpy(cap->data, data, length); 2912 2913 return cap; 2914 } 2915 2916 static gboolean process_discover(gpointer data) 2917 { 2918 struct avdtp *session = data; 2919 2920 finalize_discovery(session, 0); 2921 2922 return FALSE; 2923 } 2924 2925 int avdtp_discover(struct avdtp *session, avdtp_discover_cb_t cb, 2926 void *user_data) 2927 { 2928 int ret; 2929 2930 if (session->discov_cb) 2931 return -EBUSY; 2932 2933 if (session->seps) { 2934 session->discov_cb = cb; 2935 session->user_data = user_data; 2936 g_idle_add(process_discover, session); 2937 return 0; 2938 } 2939 2940 ret = send_request(session, FALSE, NULL, AVDTP_DISCOVER, NULL, 0); 2941 if (ret == 0) { 2942 session->discov_cb = cb; 2943 session->user_data = user_data; 2944 } 2945 2946 return ret; 2947 } 2948 2949 int avdtp_get_seps(struct avdtp *session, uint8_t acp_type, uint8_t media_type, 2950 uint8_t codec, struct avdtp_local_sep **lsep, 2951 struct avdtp_remote_sep **rsep) 2952 { 2953 GSList *l; 2954 uint8_t int_type; 2955 2956 int_type = acp_type == AVDTP_SEP_TYPE_SINK ? 2957 AVDTP_SEP_TYPE_SOURCE : AVDTP_SEP_TYPE_SINK; 2958 2959 *lsep = find_local_sep(session->server, int_type, media_type, codec); 2960 if (!*lsep) 2961 return -EINVAL; 2962 2963 for (l = session->seps; l != NULL; l = g_slist_next(l)) { 2964 struct avdtp_remote_sep *sep = l->data; 2965 struct avdtp_service_capability *cap; 2966 struct avdtp_media_codec_capability *codec_data; 2967 2968 if (sep->type != acp_type) 2969 continue; 2970 2971 if (sep->media_type != media_type) 2972 continue; 2973 2974 if (!sep->codec) 2975 continue; 2976 2977 cap = sep->codec; 2978 codec_data = (void *) cap->data; 2979 2980 if (codec_data->media_codec_type != codec) 2981 continue; 2982 2983 if (!sep->stream) { 2984 *rsep = sep; 2985 return 0; 2986 } 2987 } 2988 2989 return -EINVAL; 2990 } 2991 2992 gboolean avdtp_stream_remove_cb(struct avdtp *session, 2993 struct avdtp_stream *stream, 2994 unsigned int id) 2995 { 2996 GSList *l; 2997 struct stream_callback *cb; 2998 2999 if (!stream) 3000 return FALSE; 3001 3002 for (cb = NULL, l = stream->callbacks; l != NULL; l = l->next) { 3003 struct stream_callback *tmp = l->data; 3004 if (tmp && tmp->id == id) { 3005 cb = tmp; 3006 break; 3007 } 3008 } 3009 3010 if (!cb) 3011 return FALSE; 3012 3013 stream->callbacks = g_slist_remove(stream->callbacks, cb); 3014 g_free(cb); 3015 3016 return TRUE; 3017 } 3018 3019 unsigned int avdtp_stream_add_cb(struct avdtp *session, 3020 struct avdtp_stream *stream, 3021 avdtp_stream_state_cb cb, void *data) 3022 { 3023 struct stream_callback *stream_cb; 3024 static unsigned int id = 0; 3025 3026 stream_cb = g_new(struct stream_callback, 1); 3027 stream_cb->cb = cb; 3028 stream_cb->user_data = data; 3029 stream_cb->id = ++id; 3030 3031 stream->callbacks = g_slist_append(stream->callbacks, stream_cb);; 3032 3033 return stream_cb->id; 3034 } 3035 3036 int avdtp_get_configuration(struct avdtp *session, struct avdtp_stream *stream) 3037 { 3038 struct seid_req req; 3039 3040 if (session->state < AVDTP_SESSION_STATE_CONNECTED) 3041 return -EINVAL; 3042 3043 memset(&req, 0, sizeof(req)); 3044 req.acp_seid = stream->rseid; 3045 3046 return send_request(session, FALSE, stream, AVDTP_GET_CONFIGURATION, 3047 &req, sizeof(req)); 3048 } 3049 3050 static void copy_capabilities(gpointer data, gpointer user_data) 3051 { 3052 struct avdtp_service_capability *src_cap = data; 3053 struct avdtp_service_capability *dst_cap; 3054 GSList **l = user_data; 3055 3056 dst_cap = avdtp_service_cap_new(src_cap->category, src_cap->data, 3057 src_cap->length); 3058 3059 *l = g_slist_append(*l, dst_cap); 3060 } 3061 3062 int avdtp_set_configuration(struct avdtp *session, 3063 struct avdtp_remote_sep *rsep, 3064 struct avdtp_local_sep *lsep, 3065 GSList *caps, 3066 struct avdtp_stream **stream) 3067 { 3068 struct setconf_req *req; 3069 struct avdtp_stream *new_stream; 3070 unsigned char *ptr; 3071 int ret, caps_len; 3072 struct avdtp_service_capability *cap; 3073 GSList *l; 3074 3075 if (session->state != AVDTP_SESSION_STATE_CONNECTED) 3076 return -ENOTCONN; 3077 3078 if (!(lsep && rsep)) 3079 return -EINVAL; 3080 3081 debug("avdtp_set_configuration(%p): int_seid=%u, acp_seid=%u", 3082 session, lsep->info.seid, rsep->seid); 3083 3084 new_stream = g_new0(struct avdtp_stream, 1); 3085 new_stream->session = session; 3086 new_stream->lsep = lsep; 3087 new_stream->rseid = rsep->seid; 3088 3089 g_slist_foreach(caps, copy_capabilities, &new_stream->caps); 3090 3091 /* Calculate total size of request */ 3092 for (l = caps, caps_len = 0; l != NULL; l = g_slist_next(l)) { 3093 cap = l->data; 3094 caps_len += cap->length + 2; 3095 } 3096 3097 req = g_malloc0(sizeof(struct setconf_req) + caps_len); 3098 3099 req->int_seid = lsep->info.seid; 3100 req->acp_seid = rsep->seid; 3101 3102 /* Copy the capabilities into the request */ 3103 for (l = caps, ptr = req->caps; l != NULL; l = g_slist_next(l)) { 3104 cap = l->data; 3105 memcpy(ptr, cap, cap->length + 2); 3106 ptr += cap->length + 2; 3107 } 3108 3109 ret = send_request(session, FALSE, new_stream, 3110 AVDTP_SET_CONFIGURATION, req, 3111 sizeof(struct setconf_req) + caps_len); 3112 if (ret < 0) 3113 stream_free(new_stream); 3114 else { 3115 lsep->info.inuse = 1; 3116 lsep->stream = new_stream; 3117 rsep->stream = new_stream; 3118 session->streams = g_slist_append(session->streams, new_stream); 3119 if (stream) 3120 *stream = new_stream; 3121 } 3122 3123 g_free(req); 3124 3125 return ret; 3126 } 3127 3128 int avdtp_reconfigure(struct avdtp *session, GSList *caps, 3129 struct avdtp_stream *stream) 3130 { 3131 struct reconf_req *req; 3132 unsigned char *ptr; 3133 int caps_len, err; 3134 GSList *l; 3135 struct avdtp_service_capability *cap; 3136 3137 if (!g_slist_find(session->streams, stream)) 3138 return -EINVAL; 3139 3140 if (stream->lsep->state != AVDTP_STATE_OPEN) 3141 return -EINVAL; 3142 3143 /* Calculate total size of request */ 3144 for (l = caps, caps_len = 0; l != NULL; l = g_slist_next(l)) { 3145 cap = l->data; 3146 caps_len += cap->length + 2; 3147 } 3148 3149 req = g_malloc0(sizeof(struct reconf_req) + caps_len); 3150 3151 req->acp_seid = stream->rseid; 3152 3153 /* Copy the capabilities into the request */ 3154 for (l = caps, ptr = req->caps; l != NULL; l = g_slist_next(l)) { 3155 cap = l->data; 3156 memcpy(ptr, cap, cap->length + 2); 3157 ptr += cap->length + 2; 3158 } 3159 3160 err = send_request(session, FALSE, stream, AVDTP_RECONFIGURE, req, 3161 sizeof(*req) + caps_len); 3162 g_free(req); 3163 3164 return err; 3165 } 3166 3167 int avdtp_open(struct avdtp *session, struct avdtp_stream *stream) 3168 { 3169 struct seid_req req; 3170 3171 if (!g_slist_find(session->streams, stream)) 3172 return -EINVAL; 3173 3174 if (stream->lsep->state > AVDTP_STATE_CONFIGURED) 3175 return -EINVAL; 3176 3177 memset(&req, 0, sizeof(req)); 3178 req.acp_seid = stream->rseid; 3179 3180 return send_request(session, FALSE, stream, AVDTP_OPEN, 3181 &req, sizeof(req)); 3182 } 3183 3184 int avdtp_start(struct avdtp *session, struct avdtp_stream *stream) 3185 { 3186 struct start_req req; 3187 3188 if (!g_slist_find(session->streams, stream)) 3189 return -EINVAL; 3190 3191 if (stream->lsep->state != AVDTP_STATE_OPEN) 3192 return -EINVAL; 3193 3194 if (stream->close_int == TRUE) { 3195 error("avdtp_start: rejecting start since close is initiated"); 3196 return -EINVAL; 3197 } 3198 3199 memset(&req, 0, sizeof(req)); 3200 req.first_seid.seid = stream->rseid; 3201 3202 return send_request(session, FALSE, stream, AVDTP_START, 3203 &req, sizeof(req)); 3204 } 3205 3206 int avdtp_close(struct avdtp *session, struct avdtp_stream *stream) 3207 { 3208 struct seid_req req; 3209 int ret; 3210 3211 if (!g_slist_find(session->streams, stream)) 3212 return -EINVAL; 3213 3214 if (stream->lsep->state < AVDTP_STATE_OPEN) 3215 return -EINVAL; 3216 3217 if (stream->close_int == TRUE) { 3218 error("avdtp_close: rejecting since close is already initiated"); 3219 return -EINVAL; 3220 } 3221 3222 memset(&req, 0, sizeof(req)); 3223 req.acp_seid = stream->rseid; 3224 3225 ret = send_request(session, FALSE, stream, AVDTP_CLOSE, 3226 &req, sizeof(req)); 3227 if (ret == 0) 3228 stream->close_int = TRUE; 3229 3230 return ret; 3231 } 3232 3233 int avdtp_suspend(struct avdtp *session, struct avdtp_stream *stream) 3234 { 3235 struct seid_req req; 3236 3237 if (!g_slist_find(session->streams, stream)) 3238 return -EINVAL; 3239 3240 if (stream->lsep->state <= AVDTP_STATE_OPEN || stream->close_int) 3241 return -EINVAL; 3242 3243 memset(&req, 0, sizeof(req)); 3244 req.acp_seid = stream->rseid; 3245 3246 return send_request(session, FALSE, stream, AVDTP_SUSPEND, 3247 &req, sizeof(req)); 3248 } 3249 3250 int avdtp_abort(struct avdtp *session, struct avdtp_stream *stream) 3251 { 3252 struct seid_req req; 3253 int ret; 3254 3255 if (!g_slist_find(session->streams, stream)) 3256 return -EINVAL; 3257 3258 if (stream->lsep->state <= AVDTP_STATE_OPEN) 3259 return -EINVAL; 3260 3261 memset(&req, 0, sizeof(req)); 3262 req.acp_seid = stream->rseid; 3263 3264 ret = send_request(session, TRUE, stream, AVDTP_ABORT, 3265 &req, sizeof(req)); 3266 if (ret == 0) 3267 stream->abort_int = TRUE; 3268 3269 return ret; 3270 } 3271 3272 struct avdtp_local_sep *avdtp_register_sep(const bdaddr_t *src, uint8_t type, 3273 uint8_t media_type, 3274 uint8_t codec_type, 3275 struct avdtp_sep_ind *ind, 3276 struct avdtp_sep_cfm *cfm, 3277 void *user_data) 3278 { 3279 struct avdtp_server *server; 3280 struct avdtp_local_sep *sep; 3281 3282 server = find_server(servers, src); 3283 if (!server) 3284 return NULL; 3285 3286 if (g_slist_length(server->seps) > MAX_SEID) 3287 return NULL; 3288 3289 sep = g_new0(struct avdtp_local_sep, 1); 3290 3291 sep->state = AVDTP_STATE_IDLE; 3292 sep->info.seid = g_slist_length(server->seps) + 1; 3293 sep->info.type = type; 3294 sep->info.media_type = media_type; 3295 sep->codec = codec_type; 3296 sep->ind = ind; 3297 sep->cfm = cfm; 3298 sep->user_data = user_data; 3299 sep->server = server; 3300 3301 debug("SEP %p registered: type:%d codec:%d seid:%d", sep, 3302 sep->info.type, sep->codec, sep->info.seid); 3303 server->seps = g_slist_append(server->seps, sep); 3304 3305 return sep; 3306 } 3307 3308 int avdtp_unregister_sep(struct avdtp_local_sep *sep) 3309 { 3310 struct avdtp_server *server; 3311 3312 if (!sep) 3313 return -EINVAL; 3314 3315 server = sep->server; 3316 server->seps = g_slist_remove(server->seps, sep); 3317 3318 if (sep->stream) 3319 release_stream(sep->stream, sep->stream->session); 3320 3321 g_free(sep); 3322 3323 return 0; 3324 } 3325 3326 static GIOChannel *avdtp_server_socket(const bdaddr_t *src, gboolean master) 3327 { 3328 GError *err = NULL; 3329 GIOChannel *io; 3330 3331 io = bt_io_listen(BT_IO_L2CAP, NULL, avdtp_confirm_cb, 3332 NULL, NULL, &err, 3333 BT_IO_OPT_SOURCE_BDADDR, src, 3334 BT_IO_OPT_PSM, AVDTP_PSM, 3335 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM, 3336 BT_IO_OPT_MASTER, master, 3337 BT_IO_OPT_INVALID); 3338 if (!io) { 3339 error("%s", err->message); 3340 g_error_free(err); 3341 } 3342 3343 return io; 3344 } 3345 3346 const char *avdtp_strerror(struct avdtp_error *err) 3347 { 3348 if (err->type == AVDTP_ERROR_ERRNO) 3349 return strerror(err->err.posix_errno); 3350 3351 switch(err->err.error_code) { 3352 case AVDTP_BAD_HEADER_FORMAT: 3353 return "Bad Header Format"; 3354 case AVDTP_BAD_LENGTH: 3355 return "Bad Packet Lenght"; 3356 case AVDTP_BAD_ACP_SEID: 3357 return "Bad Acceptor SEID"; 3358 case AVDTP_SEP_IN_USE: 3359 return "Stream End Point in Use"; 3360 case AVDTP_SEP_NOT_IN_USE: 3361 return "Stream End Point Not in Use"; 3362 case AVDTP_BAD_SERV_CATEGORY: 3363 return "Bad Service Category"; 3364 case AVDTP_BAD_PAYLOAD_FORMAT: 3365 return "Bad Payload format"; 3366 case AVDTP_NOT_SUPPORTED_COMMAND: 3367 return "Command Not Supported"; 3368 case AVDTP_INVALID_CAPABILITIES: 3369 return "Invalid Capabilities"; 3370 case AVDTP_BAD_RECOVERY_TYPE: 3371 return "Bad Recovery Type"; 3372 case AVDTP_BAD_MEDIA_TRANSPORT_FORMAT: 3373 return "Bad Media Transport Format"; 3374 case AVDTP_BAD_RECOVERY_FORMAT: 3375 return "Bad Recovery Format"; 3376 case AVDTP_BAD_ROHC_FORMAT: 3377 return "Bad Header Compression Format"; 3378 case AVDTP_BAD_CP_FORMAT: 3379 return "Bad Content Protetion Format"; 3380 case AVDTP_BAD_MULTIPLEXING_FORMAT: 3381 return "Bad Multiplexing Format"; 3382 case AVDTP_UNSUPPORTED_CONFIGURATION: 3383 return "Configuration not supported"; 3384 case AVDTP_BAD_STATE: 3385 return "Bad State"; 3386 default: 3387 return "Unknow error"; 3388 } 3389 } 3390 3391 avdtp_state_t avdtp_sep_get_state(struct avdtp_local_sep *sep) 3392 { 3393 return sep->state; 3394 } 3395 3396 void avdtp_get_peers(struct avdtp *session, bdaddr_t *src, bdaddr_t *dst) 3397 { 3398 if (src) 3399 bacpy(src, &session->server->src); 3400 if (dst) 3401 bacpy(dst, &session->dst); 3402 } 3403 3404 int avdtp_init(const bdaddr_t *src, GKeyFile *config) 3405 { 3406 GError *err = NULL; 3407 gboolean tmp, master = TRUE; 3408 struct avdtp_server *server; 3409 3410 if (config) { 3411 tmp = g_key_file_get_boolean(config, "General", 3412 "Master", &err); 3413 if (err) { 3414 debug("audio.conf: %s", err->message); 3415 g_clear_error(&err); 3416 } else 3417 master = tmp; 3418 3419 tmp = g_key_file_get_boolean(config, "General", "AutoConnect", 3420 &err); 3421 if (err) 3422 g_clear_error(&err); 3423 else 3424 auto_connect = tmp; 3425 } 3426 3427 server = g_new0(struct avdtp_server, 1); 3428 if (!server) 3429 return -ENOMEM; 3430 3431 server->io = avdtp_server_socket(src, master); 3432 if (!server->io) { 3433 g_free(server); 3434 return -1; 3435 } 3436 3437 bacpy(&server->src, src); 3438 3439 servers = g_slist_append(servers, server); 3440 3441 return 0; 3442 } 3443 3444 void avdtp_exit(const bdaddr_t *src) 3445 { 3446 struct avdtp_server *server; 3447 GSList *l; 3448 3449 server = find_server(servers, src); 3450 if (!server) 3451 return; 3452 3453 for (l = server->sessions; l; l = l->next) { 3454 struct avdtp *session = l->data; 3455 3456 connection_lost(session, -ECONNABORTED); 3457 } 3458 3459 servers = g_slist_remove(servers, server); 3460 3461 g_io_channel_shutdown(server->io, TRUE, NULL); 3462 g_io_channel_unref(server->io); 3463 g_free(server); 3464 } 3465 3466 gboolean avdtp_has_stream(struct avdtp *session, struct avdtp_stream *stream) 3467 { 3468 return g_slist_find(session->streams, stream) ? TRUE : FALSE; 3469 } 3470 3471 void avdtp_set_auto_disconnect(struct avdtp *session, gboolean auto_dc) 3472 { 3473 session->auto_dc = auto_dc; 3474 } 3475 3476 gboolean avdtp_stream_setup_active(struct avdtp *session) 3477 { 3478 return session->stream_setup; 3479 } 3480 3481 unsigned int avdtp_add_state_cb(avdtp_session_state_cb cb, void *user_data) 3482 { 3483 struct avdtp_state_callback *state_cb; 3484 static unsigned int id = 0; 3485 3486 state_cb = g_new(struct avdtp_state_callback, 1); 3487 state_cb->cb = cb; 3488 state_cb->user_data = user_data; 3489 state_cb->id = ++id; 3490 3491 avdtp_callbacks = g_slist_append(avdtp_callbacks, state_cb);; 3492 3493 return state_cb->id; 3494 } 3495 3496 gboolean avdtp_remove_state_cb(unsigned int id) 3497 { 3498 GSList *l; 3499 3500 for (l = avdtp_callbacks; l != NULL; l = l->next) { 3501 struct avdtp_state_callback *cb = l->data; 3502 if (cb && cb->id == id) { 3503 avdtp_callbacks = g_slist_remove(avdtp_callbacks, cb); 3504 g_free(cb); 3505 return TRUE; 3506 } 3507 } 3508 3509 return FALSE; 3510 } 3511