3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2006-2010 Nokia Corporation
6 * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
7 * Copyright (C) 2011 Texas Instruments, Inc.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
36 #include <sys/types.h>
39 #include <netinet/in.h>
41 #include <bluetooth/bluetooth.h>
42 #include <bluetooth/sdp.h>
47 #include "../src/device.h"
57 #define QUIRK_NO_RELEASE 1 << 0
60 #define AVCTP_COMMAND 0
61 #define AVCTP_RESPONSE 1
64 #define AVCTP_PACKET_SINGLE 0
65 #define AVCTP_PACKET_START 1
66 #define AVCTP_PACKET_CONTINUE 2
67 #define AVCTP_PACKET_END 3
69 #if __BYTE_ORDER == __LITTLE_ENDIAN
74 uint8_t packet_type:2;
75 uint8_t transaction:4;
77 } __attribute__ ((packed));
78 #define AVCTP_HEADER_LENGTH 3
84 uint8_t subunit_type:5;
86 } __attribute__ ((packed));
88 #elif __BYTE_ORDER == __BIG_ENDIAN
91 uint8_t transaction:4;
92 uint8_t packet_type:2;
96 } __attribute__ ((packed));
97 #define AVCTP_HEADER_LENGTH 3
102 uint8_t subunit_type:5;
103 uint8_t subunit_id:3;
105 } __attribute__ ((packed));
108 #error "Unknown byte order"
111 struct avctp_state_callback {
117 struct avctp_server {
124 struct avctp_server *server;
136 uint8_t key_quirks[256];
139 struct avctp_pdu_handler {
151 { "PLAY", PLAY_OP, KEY_PLAYCD },
152 { "STOP", STAVC_OP_OP, KEY_STOPCD },
153 { "PAUSE", PAUSE_OP, KEY_PAUSECD },
154 { "FORWARD", FORWARD_OP, KEY_NEXTSONG },
155 { "BACKWARD", BACKWARD_OP, KEY_PREVIOUSSONG },
156 { "REWIND", REWIND_OP, KEY_REWIND },
157 { "FAST FORWARD", FAST_FORWARD_OP, KEY_FASTFORWARD },
161 static GSList *callbacks = NULL;
162 static GSList *servers = NULL;
163 static GSList *handlers = NULL;
165 static void auth_cb(DBusError *derr, void *user_data);
167 static int send_event(int fd, uint16_t type, uint16_t code, int32_t value)
169 struct uinput_event event;
171 memset(&event, 0, sizeof(event));
176 return write(fd, &event, sizeof(event));
179 static void send_key(int fd, uint16_t key, int pressed)
184 send_event(fd, EV_KEY, key, pressed);
185 send_event(fd, EV_SYN, SYN_REPORT, 0);
188 static size_t handle_panel_passthrough(struct avctp *session,
189 uint8_t transaction, uint8_t *code,
190 uint8_t *subunit, uint8_t *operands,
191 size_t operand_count, void *user_data)
196 if (*code != AVC_CTYPE_CONTROL || *subunit != AVC_SUBUNIT_PANEL) {
197 *code = AVC_CTYPE_REJECTED;
201 if (operand_count == 0)
204 if (operands[0] & 0x80) {
212 for (i = 0; key_map[i].name != NULL; i++) {
215 if ((operands[0] & 0x7F) != key_map[i].avc)
218 DBG("AV/C: %s %s", key_map[i].name, status);
220 key_quirks = session->key_quirks[key_map[i].avc];
222 if (key_quirks & QUIRK_NO_RELEASE) {
224 DBG("AV/C: Ignoring release");
228 DBG("AV/C: treating key press as press + release");
229 send_key(session->uinput, key_map[i].uinput, 1);
230 send_key(session->uinput, key_map[i].uinput, 0);
234 send_key(session->uinput, key_map[i].uinput, pressed);
238 if (key_map[i].name == NULL)
239 DBG("AV/C: unknown button 0x%02X %s",
240 operands[0] & 0x7F, status);
243 *code = AVC_CTYPE_ACCEPTED;
244 return operand_count;
247 static size_t handle_unit_info(struct avctp *session,
248 uint8_t transaction, uint8_t *code,
249 uint8_t *subunit, uint8_t *operands,
250 size_t operand_count, void *user_data)
252 if (*code != AVC_CTYPE_STATUS) {
253 *code = AVC_CTYPE_REJECTED;
257 *code = AVC_CTYPE_STABLE;
259 /* The first operand should be 0x07 for the UNITINFO response.
260 * Neither AVRCP (section 22.1, page 117) nor AVC Digital
261 * Interface Command Set (section 9.2.1, page 45) specs
262 * explain this value but both use it */
263 if (operand_count >= 1)
265 if (operand_count >= 2)
266 operands[1] = AVC_SUBUNIT_PANEL << 3;
268 DBG("reply to AVC_OP_UNITINFO");
273 static size_t handle_subunit_info(struct avctp *session,
274 uint8_t transaction, uint8_t *code,
275 uint8_t *subunit, uint8_t *operands,
276 size_t operand_count, void *user_data)
278 if (*code != AVC_CTYPE_STATUS) {
279 *code = AVC_CTYPE_REJECTED;
283 *code = AVC_CTYPE_STABLE;
285 /* The first operand should be 0x07 for the UNITINFO response.
286 * Neither AVRCP (section 22.1, page 117) nor AVC Digital
287 * Interface Command Set (section 9.2.1, page 45) specs
288 * explain this value but both use it */
289 if (operand_count >= 2)
290 operands[1] = AVC_SUBUNIT_PANEL << 3;
292 DBG("reply to AVC_OP_SUBUNITINFO");
297 static struct avctp_pdu_handler *find_handler(GSList *list, uint8_t opcode)
299 for (; list; list = list->next) {
300 struct avctp_pdu_handler *handler = list->data;
302 if (handler->opcode == opcode)
309 static void avctp_disconnected(struct avctp *session)
311 struct avctp_server *server = session->server;
317 g_io_channel_shutdown(session->io, TRUE, NULL);
318 g_io_channel_unref(session->io);
322 if (session->io_id) {
323 g_source_remove(session->io_id);
326 if (session->state == AVCTP_STATE_CONNECTING) {
327 struct audio_device *dev;
329 dev = manager_get_device(&session->server->src,
330 &session->dst, FALSE);
331 audio_device_cancel_authorization(dev, auth_cb,
336 if (session->uinput >= 0) {
339 ba2str(&session->dst, address);
340 DBG("AVCTP: closing uinput for %s", address);
342 ioctl(session->uinput, UI_DEV_DESTROY);
343 close(session->uinput);
344 session->uinput = -1;
347 server->sessions = g_slist_remove(server->sessions, session);
351 static void avctp_set_state(struct avctp *session, avctp_state_t new_state)
354 struct audio_device *dev;
355 avctp_state_t old_state = session->state;
357 dev = manager_get_device(&session->server->src, &session->dst, FALSE);
359 error("avdtp_set_state(): no matching audio device");
363 session->state = new_state;
365 for (l = callbacks; l != NULL; l = l->next) {
366 struct avctp_state_callback *cb = l->data;
367 cb->cb(dev, old_state, new_state, cb->user_data);
371 case AVCTP_STATE_DISCONNECTED:
372 DBG("AVCTP Disconnected");
374 avctp_disconnected(session);
376 if (old_state != AVCTP_STATE_CONNECTED)
379 if (!audio_device_is_active(dev, NULL))
380 audio_device_set_authorized(dev, FALSE);
383 case AVCTP_STATE_CONNECTING:
384 DBG("AVCTP Connecting");
386 case AVCTP_STATE_CONNECTED:
387 DBG("AVCTP Connected");
390 error("Invalid AVCTP state %d", new_state);
395 static gboolean session_cb(GIOChannel *chan, GIOCondition cond,
398 struct avctp *session = data;
399 uint8_t buf[1024], *operands, code, subunit;
400 struct avctp_header *avctp;
401 struct avc_header *avc;
402 int ret, packet_size, operand_count, sock;
403 struct avctp_pdu_handler *handler;
405 if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL))
408 sock = g_io_channel_unix_get_fd(session->io);
410 ret = read(sock, buf, sizeof(buf));
414 DBG("Got %d bytes of data for AVCTP session %p", ret, session);
416 if ((unsigned int) ret < sizeof(struct avctp_header)) {
417 error("Too small AVCTP packet");
421 avctp = (struct avctp_header *) buf;
423 DBG("AVCTP transaction %u, packet type %u, C/R %u, IPID %u, "
425 avctp->transaction, avctp->packet_type,
426 avctp->cr, avctp->ipid, ntohs(avctp->pid));
428 ret -= sizeof(struct avctp_header);
429 if ((unsigned int) ret < sizeof(struct avc_header)) {
430 error("Too small AVCTP packet");
434 avc = (struct avc_header *) (buf + sizeof(struct avctp_header));
436 ret -= sizeof(struct avc_header);
438 operands = buf + sizeof(struct avctp_header) + sizeof(struct avc_header);
441 DBG("AV/C %s 0x%01X, subunit_type 0x%02X, subunit_id 0x%01X, "
442 "opcode 0x%02X, %d operands",
443 avctp->cr ? "response" : "command",
444 avc->code, avc->subunit_type, avc->subunit_id,
445 avc->opcode, operand_count);
447 if (avctp->cr == AVCTP_RESPONSE)
450 packet_size = AVCTP_HEADER_LENGTH + AVC_HEADER_LENGTH;
451 avctp->cr = AVCTP_RESPONSE;
453 if (avctp->packet_type != AVCTP_PACKET_SINGLE) {
454 avc->code = AVC_CTYPE_NOT_IMPLEMENTED;
458 if (avctp->pid != htons(AV_REMOTE_SVCLASS_ID)) {
460 avc->code = AVC_CTYPE_REJECTED;
464 handler = find_handler(handlers, avc->opcode);
466 DBG("handler not found for 0x%02x", avc->opcode);
467 avc->code = AVC_CTYPE_REJECTED;
472 subunit = avc->subunit_type;
474 packet_size += handler->cb(session, avctp->transaction, &code,
475 &subunit, operands, operand_count,
479 avc->subunit_type = subunit;
482 ret = write(sock, buf, packet_size);
483 if (ret != packet_size)
489 DBG("AVCTP session %p got disconnected", session);
490 avctp_set_state(session, AVCTP_STATE_DISCONNECTED);
494 static int uinput_create(char *name)
496 struct uinput_dev dev;
499 fd = open("/dev/uinput", O_RDWR);
501 fd = open("/dev/input/uinput", O_RDWR);
503 fd = open("/dev/misc/uinput", O_RDWR);
506 error("Can't open input device: %s (%d)",
507 strerror(-err), -err);
513 memset(&dev, 0, sizeof(dev));
515 strncpy(dev.name, name, UINPUT_MAX_NAME_SIZE - 1);
517 dev.id.bustype = BUS_BLUETOOTH;
518 dev.id.vendor = 0x0000;
519 dev.id.product = 0x0000;
520 dev.id.version = 0x0000;
522 if (write(fd, &dev, sizeof(dev)) < 0) {
524 error("Can't write device information: %s (%d)",
525 strerror(-err), -err);
530 ioctl(fd, UI_SET_EVBIT, EV_KEY);
531 ioctl(fd, UI_SET_EVBIT, EV_REL);
532 ioctl(fd, UI_SET_EVBIT, EV_REP);
533 ioctl(fd, UI_SET_EVBIT, EV_SYN);
535 for (i = 0; key_map[i].name != NULL; i++)
536 ioctl(fd, UI_SET_KEYBIT, key_map[i].uinput);
538 if (ioctl(fd, UI_DEV_CREATE, NULL) < 0) {
540 error("Can't create uinput device: %s (%d)",
541 strerror(-err), -err);
549 static void init_uinput(struct avctp *session)
551 struct audio_device *dev;
552 char address[18], name[248 + 1];
554 dev = manager_get_device(&session->server->src, &session->dst, FALSE);
556 device_get_name(dev->btd_dev, name, sizeof(name));
557 if (g_str_equal(name, "Nokia CK-20W")) {
558 session->key_quirks[FORWARD_OP] |= QUIRK_NO_RELEASE;
559 session->key_quirks[BACKWARD_OP] |= QUIRK_NO_RELEASE;
560 session->key_quirks[PLAY_OP] |= QUIRK_NO_RELEASE;
561 session->key_quirks[PAUSE_OP] |= QUIRK_NO_RELEASE;
564 ba2str(&session->dst, address);
566 session->uinput = uinput_create(address);
567 if (session->uinput < 0)
568 error("AVRCP: failed to init uinput for %s", address);
570 DBG("AVRCP: uinput initialized for %s", address);
573 static void avctp_connect_cb(GIOChannel *chan, GError *err, gpointer data)
575 struct avctp *session = data;
581 avctp_set_state(session, AVCTP_STATE_DISCONNECTED);
582 error("%s", err->message);
586 bt_io_get(chan, BT_IO_L2CAP, &gerr,
587 BT_IO_OPT_DEST, &address,
588 BT_IO_OPT_IMTU, &imtu,
591 avctp_set_state(session, AVCTP_STATE_DISCONNECTED);
592 error("%s", gerr->message);
597 DBG("AVCTP: connected to %s", address);
600 session->io = g_io_channel_ref(chan);
602 init_uinput(session);
604 avctp_set_state(session, AVCTP_STATE_CONNECTED);
606 session->io_id = g_io_add_watch(chan,
607 G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
608 (GIOFunc) session_cb, session);
611 static void auth_cb(DBusError *derr, void *user_data)
613 struct avctp *session = user_data;
616 if (session->io_id) {
617 g_source_remove(session->io_id);
621 if (derr && dbus_error_is_set(derr)) {
622 error("Access denied: %s", derr->message);
623 avctp_set_state(session, AVCTP_STATE_DISCONNECTED);
627 if (!bt_io_accept(session->io, avctp_connect_cb, session,
629 error("bt_io_accept: %s", err->message);
631 avctp_set_state(session, AVCTP_STATE_DISCONNECTED);
635 static struct avctp_server *find_server(GSList *list, const bdaddr_t *src)
637 for (; list; list = list->next) {
638 struct avctp_server *server = list->data;
640 if (bacmp(&server->src, src) == 0)
647 static struct avctp *find_session(GSList *list, const bdaddr_t *dst)
649 for (; list != NULL; list = g_slist_next(list)) {
650 struct avctp *s = list->data;
652 if (bacmp(dst, &s->dst))
661 static struct avctp *avctp_get_internal(const bdaddr_t *src,
664 struct avctp_server *server;
665 struct avctp *session;
670 server = find_server(servers, src);
674 session = find_session(server->sessions, dst);
678 session = g_new0(struct avctp, 1);
680 session->server = server;
681 bacpy(&session->dst, dst);
682 session->state = AVCTP_STATE_DISCONNECTED;
684 server->sessions = g_slist_append(server->sessions, session);
689 static void avctp_confirm_cb(GIOChannel *chan, gpointer data)
691 struct avctp *session;
692 struct audio_device *dev;
697 bt_io_get(chan, BT_IO_L2CAP, &err,
698 BT_IO_OPT_SOURCE_BDADDR, &src,
699 BT_IO_OPT_DEST_BDADDR, &dst,
700 BT_IO_OPT_DEST, address,
703 error("%s", err->message);
705 g_io_channel_shutdown(chan, TRUE, NULL);
709 DBG("AVCTP: incoming connect from %s", address);
711 session = avctp_get_internal(&src, &dst);
715 dev = manager_get_device(&src, &dst, FALSE);
717 dev = manager_get_device(&src, &dst, TRUE);
719 error("Unable to get audio device object for %s",
725 if (dev->control == NULL) {
726 btd_device_add_uuid(dev->btd_dev, AVRCP_REMOTE_UUID);
727 if (dev->control == NULL)
732 error("Refusing unexpected connect from %s", address);
736 avctp_set_state(session, AVCTP_STATE_CONNECTING);
737 session->io = g_io_channel_ref(chan);
739 if (audio_device_request_authorization(dev, AVRCP_TARGET_UUID,
740 auth_cb, session) < 0)
743 session->io_id = g_io_add_watch(chan, G_IO_ERR | G_IO_HUP | G_IO_NVAL,
744 session_cb, session);
748 if (!session || !session->io)
749 g_io_channel_shutdown(chan, TRUE, NULL);
751 avctp_set_state(session, AVCTP_STATE_DISCONNECTED);
754 static GIOChannel *avctp_server_socket(const bdaddr_t *src, gboolean master)
759 io = bt_io_listen(BT_IO_L2CAP, NULL, avctp_confirm_cb, NULL,
761 BT_IO_OPT_SOURCE_BDADDR, src,
762 BT_IO_OPT_PSM, AVCTP_PSM,
763 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
764 BT_IO_OPT_MASTER, master,
767 error("%s", err->message);
774 static unsigned int passthrough_id = 0;
775 static unsigned int unit_id = 0;
776 static unsigned int subunit_id = 0;
778 int avctp_register(const bdaddr_t *src, gboolean master)
780 struct avctp_server *server;
782 server = g_new0(struct avctp_server, 1);
786 server->io = avctp_server_socket(src, master);
792 bacpy(&server->src, src);
794 servers = g_slist_append(servers, server);
797 passthrough_id = avctp_register_pdu_handler(AVC_OP_PASSTHROUGH,
798 handle_panel_passthrough, NULL);
801 unit_id = avctp_register_pdu_handler(AVC_OP_UNITINFO, handle_unit_info,
805 subunit_id = avctp_register_pdu_handler(AVC_OP_SUBUNITINFO,
806 handle_subunit_info, NULL);
811 void avctp_unregister(const bdaddr_t *src)
813 struct avctp_server *server;
815 server = find_server(servers, src);
819 while (server->sessions)
820 avctp_disconnected(server->sessions->data);
822 servers = g_slist_remove(servers, server);
824 g_io_channel_shutdown(server->io, TRUE, NULL);
825 g_io_channel_unref(server->io);
831 if (passthrough_id) {
832 avctp_unregister_pdu_handler(passthrough_id);
837 avctp_unregister_pdu_handler(unit_id);
842 avctp_unregister_pdu_handler(subunit_id);
847 int avctp_send_passthrough(struct avctp *session, uint8_t op)
849 unsigned char buf[AVCTP_HEADER_LENGTH + AVC_HEADER_LENGTH + 2];
850 struct avctp_header *avctp = (void *) buf;
851 struct avc_header *avc = (void *) &buf[AVCTP_HEADER_LENGTH];
852 uint8_t *operands = &buf[AVCTP_HEADER_LENGTH + AVC_HEADER_LENGTH];
854 static uint8_t transaction = 0;
856 if (session->state != AVCTP_STATE_CONNECTED)
859 memset(buf, 0, sizeof(buf));
861 avctp->transaction = transaction++;
862 avctp->packet_type = AVCTP_PACKET_SINGLE;
863 avctp->cr = AVCTP_COMMAND;
864 avctp->pid = htons(AV_REMOTE_SVCLASS_ID);
866 avc->code = AVC_CTYPE_CONTROL;
867 avc->subunit_type = AVC_SUBUNIT_PANEL;
868 avc->opcode = AVC_OP_PASSTHROUGH;
870 operands[0] = op & 0x7f;
873 sk = g_io_channel_unix_get_fd(session->io);
875 if (write(sk, buf, sizeof(buf)) < 0)
879 avctp->transaction = transaction++;
882 if (write(sk, buf, sizeof(buf)) < 0)
888 int avctp_send_vendordep(struct avctp *session, uint8_t transaction,
889 uint8_t code, uint8_t subunit,
890 uint8_t *operands, size_t operand_count)
893 struct avctp_header *avctp;
894 struct avc_header *avc;
899 if (session->state != AVCTP_STATE_CONNECTED)
902 sk = g_io_channel_unix_get_fd(session->io);
903 size = AVCTP_HEADER_LENGTH + AVC_HEADER_LENGTH + operand_count;
904 buf = g_malloc0(size);
906 avctp = (void *) buf;
907 avc = (void *) &buf[AVCTP_HEADER_LENGTH];
908 pdu = (void *) &buf[AVCTP_HEADER_LENGTH + AVC_HEADER_LENGTH];
910 avctp->transaction = transaction;
911 avctp->packet_type = AVCTP_PACKET_SINGLE;
912 avctp->cr = AVCTP_RESPONSE;
913 avctp->pid = htons(AV_REMOTE_SVCLASS_ID);
916 avc->subunit_type = subunit;
917 avc->opcode = AVC_OP_VENDORDEP;
919 memcpy(pdu, operands, operand_count);
921 if (write(sk, buf, size) < 0)
928 unsigned int avctp_add_state_cb(avctp_state_cb cb, void *user_data)
930 struct avctp_state_callback *state_cb;
931 static unsigned int id = 0;
933 state_cb = g_new(struct avctp_state_callback, 1);
935 state_cb->user_data = user_data;
938 callbacks = g_slist_append(callbacks, state_cb);
943 gboolean avctp_remove_state_cb(unsigned int id)
947 for (l = callbacks; l != NULL; l = l->next) {
948 struct avctp_state_callback *cb = l->data;
949 if (cb && cb->id == id) {
950 callbacks = g_slist_remove(callbacks, cb);
959 unsigned int avctp_register_pdu_handler(uint8_t opcode, avctp_pdu_cb cb,
962 struct avctp_pdu_handler *handler;
963 static unsigned int id = 0;
965 handler = find_handler(handlers, opcode);
969 handler = g_new(struct avctp_pdu_handler, 1);
970 handler->opcode = opcode;
972 handler->user_data = user_data;
975 handlers = g_slist_append(handlers, handler);
980 gboolean avctp_unregister_pdu_handler(unsigned int id)
984 for (l = handlers; l != NULL; l = l->next) {
985 struct avctp_pdu_handler *handler = l->data;
987 if (handler->id == id) {
988 handlers = g_slist_remove(handlers, handler);
997 struct avctp *avctp_connect(const bdaddr_t *src, const bdaddr_t *dst)
999 struct avctp *session;
1003 session = avctp_get_internal(src, dst);
1007 if (session->state > AVCTP_STATE_DISCONNECTED)
1010 avctp_set_state(session, AVCTP_STATE_CONNECTING);
1012 io = bt_io_connect(BT_IO_L2CAP, avctp_connect_cb, session, NULL, &err,
1013 BT_IO_OPT_SOURCE_BDADDR, &session->server->src,
1014 BT_IO_OPT_DEST_BDADDR, &session->dst,
1015 BT_IO_OPT_PSM, AVCTP_PSM,
1018 avctp_set_state(session, AVCTP_STATE_DISCONNECTED);
1019 error("%s", err->message);
1029 void avctp_disconnect(struct avctp *session)
1034 avctp_set_state(session, AVCTP_STATE_DISCONNECTED);
1037 struct avctp *avctp_get(const bdaddr_t *src, const bdaddr_t *dst)
1039 return avctp_get_internal(src, dst);