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
37 #include <sys/types.h>
40 #include <netinet/in.h>
44 #include "lib/bluetooth.h"
46 #include "lib/l2cap.h"
49 #include "btio/btio.h"
50 #include "src/adapter.h"
51 #include "src/device.h"
53 #include "src/error.h"
54 #include "src/uinput.h"
59 /* AV/C Panel 1.23, page 76:
60 * command with the pressed value is valid for two seconds
62 #define AVC_PRESS_TIMEOUT 2
64 #define QUIRK_NO_RELEASE 1 << 0
67 #define AVCTP_COMMAND 0
68 #define AVCTP_RESPONSE 1
71 #define AVCTP_PACKET_SINGLE 0
72 #define AVCTP_PACKET_START 1
73 #define AVCTP_PACKET_CONTINUE 2
74 #define AVCTP_PACKET_END 3
76 #if __BYTE_ORDER == __LITTLE_ENDIAN
81 uint8_t packet_type:2;
82 uint8_t transaction:4;
84 } __attribute__ ((packed));
85 #define AVCTP_HEADER_LENGTH 3
91 uint8_t subunit_type:5;
93 } __attribute__ ((packed));
95 #elif __BYTE_ORDER == __BIG_ENDIAN
98 uint8_t transaction:4;
99 uint8_t packet_type:2;
103 } __attribute__ ((packed));
104 #define AVCTP_HEADER_LENGTH 3
109 uint8_t subunit_type:5;
110 uint8_t subunit_id:3;
112 } __attribute__ ((packed));
115 #error "Unknown byte order"
118 struct avctp_state_callback {
120 struct btd_device *dev;
125 struct avctp_server {
126 struct btd_adapter *adapter;
127 GIOChannel *control_io;
128 GIOChannel *browsing_io;
132 struct avctp_control_req {
133 struct avctp_pending_req *p;
138 uint16_t operand_count;
143 struct avctp_browsing_req {
144 struct avctp_pending_req *p;
146 uint16_t operand_count;
147 avctp_browsing_rsp_cb func;
151 typedef int (*avctp_process_cb) (void *data);
153 struct avctp_pending_req {
154 struct avctp_channel *chan;
158 avctp_process_cb process;
160 GDestroyNotify destroy;
163 struct avctp_channel {
164 struct avctp *session;
172 struct avctp_pending_req *p;
176 GDestroyNotify destroy;
185 struct avctp_server *server;
186 struct btd_device *device;
193 unsigned int passthrough_id;
194 unsigned int unit_id;
195 unsigned int subunit_id;
197 struct avctp_channel *control;
198 struct avctp_channel *browsing;
200 struct avctp_passthrough_handler *handler;
202 uint8_t key_quirks[256];
203 struct key_pressed key;
207 struct avctp_passthrough_handler {
208 avctp_passthrough_cb cb;
213 struct avctp_pdu_handler {
215 avctp_control_pdu_cb cb;
220 struct avctp_browsing_pdu_handler {
221 avctp_browsing_pdu_cb cb;
224 GDestroyNotify destroy;
232 { "SELECT", AVC_SELECT, KEY_SELECT },
233 { "UP", AVC_UP, KEY_UP },
234 { "DOWN", AVC_DOWN, KEY_DOWN },
235 { "LEFT", AVC_LEFT, KEY_LEFT },
236 { "RIGHT", AVC_RIGHT, KEY_RIGHT },
237 { "ROOT MENU", AVC_ROOT_MENU, KEY_MENU },
238 { "CONTENTS MENU", AVC_CONTENTS_MENU, KEY_PROGRAM },
239 { "FAVORITE MENU", AVC_FAVORITE_MENU, KEY_FAVORITES },
240 { "EXIT", AVC_EXIT, KEY_EXIT },
241 { "ON DEMAND MENU", AVC_ON_DEMAND_MENU, KEY_MENU },
242 { "APPS MENU", AVC_APPS_MENU, KEY_MENU },
243 { "0", AVC_0, KEY_0 },
244 { "1", AVC_1, KEY_1 },
245 { "2", AVC_2, KEY_2 },
246 { "3", AVC_3, KEY_3 },
247 { "4", AVC_4, KEY_4 },
248 { "5", AVC_5, KEY_5 },
249 { "6", AVC_6, KEY_6 },
250 { "7", AVC_7, KEY_7 },
251 { "8", AVC_8, KEY_8 },
252 { "9", AVC_9, KEY_9 },
253 { "DOT", AVC_DOT, KEY_DOT },
254 { "ENTER", AVC_ENTER, KEY_ENTER },
255 { "CHANNEL UP", AVC_CHANNEL_UP, KEY_CHANNELUP },
256 { "CHANNEL DOWN", AVC_CHANNEL_DOWN, KEY_CHANNELDOWN },
257 { "CHANNEL PREVIOUS", AVC_CHANNEL_PREVIOUS, KEY_LAST },
258 { "INPUT SELECT", AVC_INPUT_SELECT, KEY_CONFIG },
259 { "INFO", AVC_INFO, KEY_INFO },
260 { "HELP", AVC_HELP, KEY_HELP },
261 { "POWER", AVC_POWER, KEY_POWER2 },
262 { "VOLUME UP", AVC_VOLUME_UP, KEY_VOLUMEUP },
263 { "VOLUME DOWN", AVC_VOLUME_DOWN, KEY_VOLUMEDOWN },
264 { "MUTE", AVC_MUTE, KEY_MUTE },
265 { "PLAY", AVC_PLAY, KEY_PLAYCD },
266 { "STOP", AVC_STOP, KEY_STOPCD },
267 { "PAUSE", AVC_PAUSE, KEY_PAUSECD },
268 { "FORWARD", AVC_FORWARD, KEY_NEXTSONG },
269 { "BACKWARD", AVC_BACKWARD, KEY_PREVIOUSSONG },
270 { "RECORD", AVC_RECORD, KEY_RECORD },
271 { "REWIND", AVC_REWIND, KEY_REWIND },
272 { "FAST FORWARD", AVC_FAST_FORWARD, KEY_FASTFORWARD },
273 { "LIST", AVC_LIST, KEY_LIST },
274 { "F1", AVC_F1, KEY_F1 },
275 { "F2", AVC_F2, KEY_F2 },
276 { "F3", AVC_F3, KEY_F3 },
277 { "F4", AVC_F4, KEY_F4 },
278 { "F5", AVC_F5, KEY_F5 },
279 { "F6", AVC_F6, KEY_F6 },
280 { "F7", AVC_F7, KEY_F7 },
281 { "F8", AVC_F8, KEY_F8 },
282 { "F9", AVC_F9, KEY_F9 },
283 { "RED", AVC_RED, KEY_RED },
284 { "GREEN", AVC_GREEN, KEY_GREEN },
285 { "BLUE", AVC_BLUE, KEY_BLUE },
286 { "YELLOW", AVC_YELLOW, KEY_YELLOW },
290 static GSList *callbacks = NULL;
291 static GSList *servers = NULL;
293 static void auth_cb(DBusError *derr, void *user_data);
294 static gboolean process_queue(gpointer user_data);
295 static gboolean avctp_passthrough_rsp(struct avctp *session, uint8_t code,
296 uint8_t subunit, uint8_t *operands,
297 size_t operand_count, void *user_data);
299 static int send_event(int fd, uint16_t type, uint16_t code, int32_t value)
301 struct uinput_event event;
303 memset(&event, 0, sizeof(event));
308 return write(fd, &event, sizeof(event));
311 static void send_key(int fd, uint16_t key, int pressed)
316 send_event(fd, EV_KEY, key, pressed);
317 send_event(fd, EV_SYN, SYN_REPORT, 0);
320 static gboolean auto_release(gpointer user_data)
322 struct avctp *session = user_data;
324 session->key.timer = 0;
326 DBG("AV/C: key press timeout");
328 send_key(session->uinput, session->key.op, 0);
333 static void handle_press(struct avctp *session, uint16_t op)
335 if (session->key.timer > 0) {
336 g_source_remove(session->key.timer);
338 /* Only auto release if keys are different */
339 if (session->key.op == op)
342 send_key(session->uinput, session->key.op, 0);
345 session->key.op = op;
347 send_key(session->uinput, op, 1);
350 session->key.timer = g_timeout_add_seconds(AVC_PRESS_TIMEOUT,
351 auto_release, session);
354 static void handle_release(struct avctp *session, uint16_t op)
356 if (session->key.timer > 0) {
357 g_source_remove(session->key.timer);
358 session->key.timer = 0;
361 send_key(session->uinput, op, 0);
363 #ifdef __TIZEN_PATCH__
364 extern void avrcp_stop_position_timer(void);
367 static size_t handle_panel_passthrough(struct avctp *session,
368 uint8_t transaction, uint8_t *code,
369 uint8_t *subunit, uint8_t *operands,
370 size_t operand_count, void *user_data)
372 struct avctp_passthrough_handler *handler = session->handler;
376 if (*code != AVC_CTYPE_CONTROL || *subunit != AVC_SUBUNIT_PANEL) {
377 *code = AVC_CTYPE_REJECTED;
378 return operand_count;
381 if (operand_count == 0)
384 if (operands[0] & 0x80) {
392 if (session->key.timer == 0 && handler != NULL) {
393 if (handler->cb(session, operands[0] & 0x7F,
394 pressed, handler->user_data))
398 for (i = 0; key_map[i].name != NULL; i++) {
401 if ((operands[0] & 0x7F) != key_map[i].avc)
404 DBG("AV/C: %s %s", key_map[i].name, status);
406 key_quirks = session->key_quirks[key_map[i].avc];
408 if (key_quirks & QUIRK_NO_RELEASE) {
410 DBG("AV/C: Ignoring release");
414 DBG("AV/C: treating key press as press + release");
415 send_key(session->uinput, key_map[i].uinput, 1);
416 send_key(session->uinput, key_map[i].uinput, 0);
421 handle_press(session, key_map[i].uinput);
422 #ifdef __TIZEN_PATCH__
423 if (key_map[i].avc == AVC_REWIND)
424 avrcp_stop_position_timer();
427 handle_release(session, key_map[i].uinput);
432 if (key_map[i].name == NULL) {
433 DBG("AV/C: unknown button 0x%02X %s",
434 operands[0] & 0x7F, status);
435 *code = AVC_CTYPE_NOT_IMPLEMENTED;
436 return operand_count;
440 *code = AVC_CTYPE_ACCEPTED;
441 return operand_count;
444 static size_t handle_unit_info(struct avctp *session,
445 uint8_t transaction, uint8_t *code,
446 uint8_t *subunit, uint8_t *operands,
447 size_t operand_count, void *user_data)
449 if (*code != AVC_CTYPE_STATUS) {
450 *code = AVC_CTYPE_REJECTED;
454 *code = AVC_CTYPE_STABLE;
456 /* The first operand should be 0x07 for the UNITINFO response.
457 * Neither AVRCP (section 22.1, page 117) nor AVC Digital
458 * Interface Command Set (section 9.2.1, page 45) specs
459 * explain this value but both use it */
460 if (operand_count >= 1)
462 if (operand_count >= 2)
463 operands[1] = AVC_SUBUNIT_PANEL << 3;
465 DBG("reply to AVC_OP_UNITINFO");
467 return operand_count;
470 static size_t handle_subunit_info(struct avctp *session,
471 uint8_t transaction, uint8_t *code,
472 uint8_t *subunit, uint8_t *operands,
473 size_t operand_count, void *user_data)
475 if (*code != AVC_CTYPE_STATUS) {
476 *code = AVC_CTYPE_REJECTED;
480 *code = AVC_CTYPE_STABLE;
482 /* The first operand should be 0x07 for the UNITINFO response.
483 * Neither AVRCP (section 22.1, page 117) nor AVC Digital
484 * Interface Command Set (section 9.2.1, page 45) specs
485 * explain this value but both use it */
486 if (operand_count >= 2)
487 operands[1] = AVC_SUBUNIT_PANEL << 3;
489 DBG("reply to AVC_OP_SUBUNITINFO");
491 return operand_count;
494 static struct avctp_pdu_handler *find_handler(GSList *list, uint8_t opcode)
496 for (; list; list = list->next) {
497 struct avctp_pdu_handler *handler = list->data;
499 if (handler->opcode == opcode)
506 static void pending_destroy(gpointer data, gpointer user_data)
508 struct avctp_pending_req *req = data;
511 req->destroy(req->data);
513 if (req->timeout > 0)
514 g_source_remove(req->timeout);
519 static void avctp_channel_destroy(struct avctp_channel *chan)
521 g_io_channel_shutdown(chan->io, TRUE, NULL);
522 g_io_channel_unref(chan->io);
525 g_source_remove(chan->watch);
528 pending_destroy(chan->p, NULL);
530 if (chan->process_id > 0)
531 g_source_remove(chan->process_id);
536 g_free(chan->buffer);
537 g_queue_foreach(chan->queue, pending_destroy, NULL);
538 g_queue_free(chan->queue);
539 g_slist_foreach(chan->processed, pending_destroy, NULL);
540 g_slist_free(chan->processed);
541 g_slist_free_full(chan->handlers, g_free);
545 static void avctp_disconnected(struct avctp *session)
547 struct avctp_server *server;
552 if (session->browsing)
553 avctp_channel_destroy(session->browsing);
555 if (session->control)
556 avctp_channel_destroy(session->control);
558 if (session->auth_id != 0) {
559 btd_cancel_authorization(session->auth_id);
560 session->auth_id = 0;
563 if (session->key.timer > 0)
564 g_source_remove(session->key.timer);
566 if (session->uinput >= 0) {
569 ba2str(device_get_address(session->device), address);
570 DBG("AVCTP: closing uinput for %s", address);
572 ioctl(session->uinput, UI_DEV_DESTROY);
573 close(session->uinput);
574 session->uinput = -1;
577 server = session->server;
578 server->sessions = g_slist_remove(server->sessions, session);
579 btd_device_unref(session->device);
583 static void avctp_set_state(struct avctp *session, avctp_state_t new_state,
587 avctp_state_t old_state = session->state;
589 session->state = new_state;
591 for (l = callbacks; l != NULL; l = l->next) {
592 struct avctp_state_callback *cb = l->data;
594 if (cb->dev && cb->dev != session->device)
597 cb->cb(session->device, old_state, new_state, err,
602 case AVCTP_STATE_DISCONNECTED:
603 DBG("AVCTP Disconnected");
604 avctp_disconnected(session);
606 case AVCTP_STATE_CONNECTING:
607 DBG("AVCTP Connecting");
609 case AVCTP_STATE_CONNECTED:
610 DBG("AVCTP Connected");
612 case AVCTP_STATE_BROWSING_CONNECTING:
613 DBG("AVCTP Browsing Connecting");
615 case AVCTP_STATE_BROWSING_CONNECTED:
616 DBG("AVCTP Browsing Connected");
619 error("Invalid AVCTP state %d", new_state);
624 static int avctp_send(struct avctp_channel *control, uint8_t transaction,
625 uint8_t cr, uint8_t code,
626 uint8_t subunit, uint8_t opcode,
627 uint8_t *operands, size_t operand_count)
629 struct avctp_header *avctp;
630 struct avc_header *avc;
635 iov[0].iov_base = control->buffer;
636 iov[0].iov_len = sizeof(*avctp) + sizeof(*avc);
637 iov[1].iov_base = operands;
638 iov[1].iov_len = operand_count;
640 if (control->omtu < (iov[0].iov_len + iov[1].iov_len))
643 sk = g_io_channel_unix_get_fd(control->io);
645 memset(control->buffer, 0, iov[0].iov_len);
647 avctp = (void *) control->buffer;
648 avc = (void *) avctp + sizeof(*avctp);
650 avctp->transaction = transaction;
651 avctp->packet_type = AVCTP_PACKET_SINGLE;
653 avctp->pid = htons(AV_REMOTE_SVCLASS_ID);
656 avc->subunit_type = subunit;
657 avc->opcode = opcode;
659 memset(&msg, 0, sizeof(msg));
663 if (sendmsg(sk, &msg, 0) < 0)
669 static int avctp_browsing_send(struct avctp_channel *browsing,
670 uint8_t transaction, uint8_t cr,
671 uint8_t *operands, size_t operand_count)
673 struct avctp_header *avctp;
678 iov[0].iov_base = browsing->buffer;
679 iov[0].iov_len = sizeof(*avctp);
680 iov[1].iov_base = operands;
681 iov[1].iov_len = operand_count;
683 if (browsing->omtu < (iov[0].iov_len + iov[1].iov_len))
686 sk = g_io_channel_unix_get_fd(browsing->io);
688 memset(browsing->buffer, 0, iov[0].iov_len);
690 avctp = (void *) browsing->buffer;
692 avctp->transaction = transaction;
693 avctp->packet_type = AVCTP_PACKET_SINGLE;
695 avctp->pid = htons(AV_REMOTE_SVCLASS_ID);
697 memset(&msg, 0, sizeof(msg));
701 if (sendmsg(sk, &msg, 0) < 0)
707 static void control_req_destroy(void *data)
709 struct avctp_control_req *req = data;
710 struct avctp_pending_req *p = req->p;
711 struct avctp *session = p->chan->session;
713 if (p->err == 0 || req->func == NULL)
716 req->func(session, AVC_CTYPE_REJECTED, req->subunit, NULL, 0,
720 g_free(req->operands);
724 static void browsing_req_destroy(void *data)
726 struct avctp_browsing_req *req = data;
727 struct avctp_pending_req *p = req->p;
728 struct avctp *session = p->chan->session;
730 if (p->err == 0 || req->func == NULL)
733 req->func(session, NULL, 0, req->user_data);
736 g_free(req->operands);
740 static gboolean req_timeout(gpointer user_data)
742 struct avctp_channel *chan = user_data;
743 struct avctp_pending_req *p = chan->p;
745 DBG("transaction %u", p->transaction);
750 pending_destroy(p, NULL);
753 if (chan->process_id == 0)
754 chan->process_id = g_idle_add(process_queue, chan);
759 static int process_control(void *data)
761 struct avctp_control_req *req = data;
762 struct avctp_pending_req *p = req->p;
764 return avctp_send(p->chan, p->transaction, AVCTP_COMMAND, req->code,
765 req->subunit, req->op,
766 req->operands, req->operand_count);
769 static int process_browsing(void *data)
771 struct avctp_browsing_req *req = data;
772 struct avctp_pending_req *p = req->p;
774 return avctp_browsing_send(p->chan, p->transaction, AVCTP_COMMAND,
775 req->operands, req->operand_count);
778 static gboolean process_queue(void *user_data)
780 struct avctp_channel *chan = user_data;
781 struct avctp_pending_req *p = chan->p;
783 chan->process_id = 0;
788 while ((p = g_queue_pop_head(chan->queue))) {
790 if (p->process(p->data) == 0)
793 pending_destroy(p, NULL);
800 p->timeout = g_timeout_add_seconds(2, req_timeout, chan);
806 static void control_response(struct avctp_channel *control,
807 struct avctp_header *avctp,
808 struct avc_header *avc,
810 size_t operand_count)
812 struct avctp_pending_req *p = control->p;
813 struct avctp_control_req *req;
816 if (p && p->transaction == avctp->transaction) {
817 control->processed = g_slist_prepend(control->processed, p);
819 if (p->timeout > 0) {
820 g_source_remove(p->timeout);
826 if (control->process_id == 0)
827 control->process_id = g_idle_add(process_queue,
831 for (l = control->processed; l; l = l->next) {
835 if (p->transaction != avctp->transaction)
838 if (req->func && req->func(control->session, avc->code,
840 operands, operand_count,
844 control->processed = g_slist_remove(control->processed, p);
845 pending_destroy(p, NULL);
851 static void browsing_response(struct avctp_channel *browsing,
852 struct avctp_header *avctp,
854 size_t operand_count)
856 struct avctp_pending_req *p = browsing->p;
857 struct avctp_browsing_req *req;
860 if (p && p->transaction == avctp->transaction) {
861 browsing->processed = g_slist_prepend(browsing->processed, p);
863 if (p->timeout > 0) {
864 g_source_remove(p->timeout);
870 if (browsing->process_id == 0)
871 browsing->process_id = g_idle_add(process_queue,
875 for (l = browsing->processed; l; l = l->next) {
879 if (p->transaction != avctp->transaction)
882 if (req->func && req->func(browsing->session, operands,
883 operand_count, req->user_data))
886 browsing->processed = g_slist_remove(browsing->processed, p);
887 pending_destroy(p, NULL);
893 static gboolean session_browsing_cb(GIOChannel *chan, GIOCondition cond,
896 struct avctp *session = data;
897 struct avctp_channel *browsing = session->browsing;
898 uint8_t *buf = browsing->buffer;
900 struct avctp_header *avctp;
901 int sock, ret, packet_size, operand_count;
902 struct avctp_browsing_pdu_handler *handler;
904 if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL))
907 sock = g_io_channel_unix_get_fd(chan);
909 ret = read(sock, buf, browsing->imtu);
913 avctp = (struct avctp_header *) buf;
915 if (avctp->packet_type != AVCTP_PACKET_SINGLE)
918 operands = buf + AVCTP_HEADER_LENGTH;
919 ret -= AVCTP_HEADER_LENGTH;
922 if (avctp->cr == AVCTP_RESPONSE) {
923 browsing_response(browsing, avctp, operands, operand_count);
927 packet_size = AVCTP_HEADER_LENGTH;
928 avctp->cr = AVCTP_RESPONSE;
930 handler = g_slist_nth_data(browsing->handlers, 0);
931 if (handler == NULL) {
932 DBG("handler not found");
933 packet_size += avrcp_browsing_general_reject(operands);
937 packet_size += handler->cb(session, avctp->transaction,
938 operands, operand_count,
942 if (packet_size != 0) {
943 ret = write(sock, buf, packet_size);
944 if (ret != packet_size)
951 DBG("AVCTP Browsing: disconnected");
952 avctp_set_state(session, AVCTP_STATE_CONNECTED, 0);
954 if (session->browsing) {
955 avctp_channel_destroy(session->browsing);
956 session->browsing = NULL;
962 static gboolean session_cb(GIOChannel *chan, GIOCondition cond, gpointer data)
964 struct avctp *session = data;
965 struct avctp_channel *control = session->control;
966 uint8_t *buf = control->buffer;
967 uint8_t *operands, code, subunit;
968 struct avctp_header *avctp;
969 struct avc_header *avc;
970 int ret, packet_size, operand_count, sock;
971 struct avctp_pdu_handler *handler;
973 if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL))
976 sock = g_io_channel_unix_get_fd(chan);
978 ret = read(sock, buf, control->imtu);
982 if (ret < AVCTP_HEADER_LENGTH) {
983 error("Too small AVCTP packet");
987 avctp = (struct avctp_header *) buf;
989 ret -= AVCTP_HEADER_LENGTH;
990 if (ret < AVC_HEADER_LENGTH) {
991 error("Too small AVC packet");
995 avc = (struct avc_header *) (buf + AVCTP_HEADER_LENGTH);
997 ret -= AVC_HEADER_LENGTH;
999 operands = (uint8_t *) avc + AVC_HEADER_LENGTH;
1000 operand_count = ret;
1002 if (avctp->cr == AVCTP_RESPONSE) {
1003 control_response(control, avctp, avc, operands, operand_count);
1007 packet_size = AVCTP_HEADER_LENGTH + AVC_HEADER_LENGTH;
1008 avctp->cr = AVCTP_RESPONSE;
1010 if (avctp->packet_type != AVCTP_PACKET_SINGLE) {
1011 avc->code = AVC_CTYPE_NOT_IMPLEMENTED;
1015 if (avctp->pid != htons(AV_REMOTE_SVCLASS_ID)) {
1017 packet_size = AVCTP_HEADER_LENGTH;
1021 handler = find_handler(control->handlers, avc->opcode);
1023 DBG("handler not found for 0x%02x", avc->opcode);
1024 packet_size += avrcp_handle_vendor_reject(&code, operands);
1030 subunit = avc->subunit_type;
1032 packet_size += handler->cb(session, avctp->transaction, &code,
1033 &subunit, operands, operand_count,
1034 handler->user_data);
1037 avc->subunit_type = subunit;
1040 ret = write(sock, buf, packet_size);
1041 if (ret != packet_size)
1047 DBG("AVCTP session %p got disconnected", session);
1048 avctp_set_state(session, AVCTP_STATE_DISCONNECTED, -EIO);
1052 static int uinput_create(char *name)
1054 struct uinput_dev dev;
1057 fd = open("/dev/uinput", O_RDWR);
1059 fd = open("/dev/input/uinput", O_RDWR);
1061 fd = open("/dev/misc/uinput", O_RDWR);
1064 error("Can't open input device: %s (%d)",
1065 strerror(-err), -err);
1071 memset(&dev, 0, sizeof(dev));
1073 strncpy(dev.name, name, UINPUT_MAX_NAME_SIZE - 1);
1075 dev.id.bustype = BUS_BLUETOOTH;
1076 dev.id.vendor = 0x0000;
1077 dev.id.product = 0x0000;
1078 dev.id.version = 0x0000;
1080 if (write(fd, &dev, sizeof(dev)) < 0) {
1082 error("Can't write device information: %s (%d)",
1083 strerror(-err), -err);
1088 ioctl(fd, UI_SET_EVBIT, EV_KEY);
1089 ioctl(fd, UI_SET_EVBIT, EV_REL);
1090 ioctl(fd, UI_SET_EVBIT, EV_REP);
1091 ioctl(fd, UI_SET_EVBIT, EV_SYN);
1093 for (i = 0; key_map[i].name != NULL; i++)
1094 ioctl(fd, UI_SET_KEYBIT, key_map[i].uinput);
1096 if (ioctl(fd, UI_DEV_CREATE, NULL) < 0) {
1098 error("Can't create uinput device: %s (%d)",
1099 strerror(-err), -err);
1104 send_event(fd, EV_REP, REP_DELAY, 300);
1109 static void init_uinput(struct avctp *session)
1111 char address[18], name[248 + 1];
1113 device_get_name(session->device, name, sizeof(name));
1114 if (g_str_equal(name, "Nokia CK-20W")) {
1115 session->key_quirks[AVC_FORWARD] |= QUIRK_NO_RELEASE;
1116 session->key_quirks[AVC_BACKWARD] |= QUIRK_NO_RELEASE;
1117 session->key_quirks[AVC_PLAY] |= QUIRK_NO_RELEASE;
1118 session->key_quirks[AVC_PAUSE] |= QUIRK_NO_RELEASE;
1121 ba2str(device_get_address(session->device), address);
1122 session->uinput = uinput_create(address);
1123 if (session->uinput < 0)
1124 error("AVRCP: failed to init uinput for %s", address);
1126 DBG("AVRCP: uinput initialized for %s", address);
1129 static struct avctp_channel *avctp_channel_create(struct avctp *session,
1131 GDestroyNotify destroy)
1133 struct avctp_channel *chan;
1135 chan = g_new0(struct avctp_channel, 1);
1136 chan->session = session;
1137 chan->io = g_io_channel_ref(io);
1138 chan->queue = g_queue_new();
1139 chan->destroy = destroy;
1144 static void handler_free(void *data)
1146 struct avctp_browsing_pdu_handler *handler = data;
1148 if (handler->destroy)
1149 handler->destroy(handler->user_data);
1154 static void avctp_destroy_browsing(void *data)
1156 struct avctp_channel *chan = data;
1158 g_slist_free_full(chan->handlers, handler_free);
1160 chan->handlers = NULL;
1163 static void avctp_connect_browsing_cb(GIOChannel *chan, GError *err,
1166 struct avctp *session = data;
1167 struct avctp_channel *browsing = session->browsing;
1169 uint16_t imtu, omtu;
1170 GError *gerr = NULL;
1173 error("Browsing: %s", err->message);
1177 bt_io_get(chan, &gerr,
1178 BT_IO_OPT_DEST, &address,
1179 BT_IO_OPT_IMTU, &imtu,
1180 BT_IO_OPT_OMTU, &omtu,
1183 error("%s", gerr->message);
1184 g_io_channel_shutdown(chan, TRUE, NULL);
1185 g_io_channel_unref(chan);
1190 DBG("AVCTP Browsing: connected to %s", address);
1192 if (browsing == NULL) {
1193 browsing = avctp_channel_create(session, chan,
1194 avctp_destroy_browsing);
1195 session->browsing = browsing;
1198 browsing->imtu = imtu;
1199 browsing->omtu = omtu;
1200 browsing->buffer = g_malloc0(MAX(imtu, omtu));
1201 browsing->watch = g_io_add_watch(session->browsing->io,
1202 G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
1203 (GIOFunc) session_browsing_cb, session);
1205 avctp_set_state(session, AVCTP_STATE_BROWSING_CONNECTED, 0);
1207 /* Process any request that was pending the connection to complete */
1208 if (browsing->process_id == 0 && !g_queue_is_empty(browsing->queue))
1209 browsing->process_id = g_idle_add(process_queue, browsing);
1214 avctp_set_state(session, AVCTP_STATE_CONNECTED, 0);
1216 if (session->browsing) {
1217 avctp_channel_destroy(session->browsing);
1218 session->browsing = NULL;
1222 static void avctp_connect_cb(GIOChannel *chan, GError *err, gpointer data)
1224 struct avctp *session = data;
1226 uint16_t imtu, omtu;
1227 GError *gerr = NULL;
1230 avctp_set_state(session, AVCTP_STATE_DISCONNECTED, -EIO);
1231 error("%s", err->message);
1235 bt_io_get(chan, &gerr,
1236 BT_IO_OPT_DEST, &address,
1237 BT_IO_OPT_IMTU, &imtu,
1238 BT_IO_OPT_IMTU, &omtu,
1241 avctp_set_state(session, AVCTP_STATE_DISCONNECTED, -EIO);
1242 error("%s", gerr->message);
1247 DBG("AVCTP: connected to %s", address);
1249 if (session->control == NULL)
1250 session->control = avctp_channel_create(session, chan, NULL);
1252 session->control->imtu = imtu;
1253 session->control->omtu = omtu;
1254 session->control->buffer = g_malloc0(MAX(imtu, omtu));
1255 session->control->watch = g_io_add_watch(session->control->io,
1256 G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
1257 (GIOFunc) session_cb, session);
1259 session->passthrough_id = avctp_register_pdu_handler(session,
1261 handle_panel_passthrough,
1263 session->unit_id = avctp_register_pdu_handler(session,
1267 session->subunit_id = avctp_register_pdu_handler(session,
1269 handle_subunit_info,
1272 init_uinput(session);
1274 avctp_set_state(session, AVCTP_STATE_CONNECTED, 0);
1277 static void auth_cb(DBusError *derr, void *user_data)
1279 struct avctp *session = user_data;
1282 session->auth_id = 0;
1284 if (session->control->watch > 0) {
1285 g_source_remove(session->control->watch);
1286 session->control->watch = 0;
1289 if (derr && dbus_error_is_set(derr)) {
1290 error("Access denied: %s", derr->message);
1291 avctp_set_state(session, AVCTP_STATE_DISCONNECTED, -EIO);
1295 if (!bt_io_accept(session->control->io, avctp_connect_cb, session,
1297 error("bt_io_accept: %s", err->message);
1299 avctp_set_state(session, AVCTP_STATE_DISCONNECTED, -EIO);
1303 static struct avctp_server *find_server(GSList *list, struct btd_adapter *a)
1305 for (; list; list = list->next) {
1306 struct avctp_server *server = list->data;
1308 if (server->adapter == a)
1315 static struct avctp *find_session(GSList *list, struct btd_device *device)
1317 for (; list != NULL; list = g_slist_next(list)) {
1318 struct avctp *s = list->data;
1320 if (s->device == device)
1327 static struct avctp *avctp_get_internal(struct btd_device *device)
1329 struct avctp_server *server;
1330 struct avctp *session;
1332 server = find_server(servers, device_get_adapter(device));
1336 session = find_session(server->sessions, device);
1340 session = g_new0(struct avctp, 1);
1342 session->server = server;
1343 session->device = btd_device_ref(device);
1344 session->state = AVCTP_STATE_DISCONNECTED;
1345 session->uinput = -1;
1347 server->sessions = g_slist_append(server->sessions, session);
1352 static void avctp_control_confirm(struct avctp *session, GIOChannel *chan,
1353 struct btd_device *dev)
1355 const bdaddr_t *src;
1356 const bdaddr_t *dst;
1358 if (session->control != NULL) {
1359 error("Control: Refusing unexpected connect");
1360 g_io_channel_shutdown(chan, TRUE, NULL);
1363 * Close AVCTP channel if remote tried connect
1365 * AVRCP SPEC V1.5 4.1.1 Connection Establishment
1367 avctp_set_state(session, AVCTP_STATE_DISCONNECTED, -EAGAIN);
1371 avctp_set_state(session, AVCTP_STATE_CONNECTING, 0);
1372 session->control = avctp_channel_create(session, chan, NULL);
1374 src = btd_adapter_get_address(device_get_adapter(dev));
1375 dst = device_get_address(dev);
1377 #ifdef __TIZEN_PATCH__
1378 session->auth_id = btd_request_authorization(src, dst,
1382 session->auth_id = btd_request_authorization(src, dst,
1386 if (session->auth_id == 0)
1389 session->control->watch = g_io_add_watch(chan, G_IO_ERR | G_IO_HUP |
1390 G_IO_NVAL, session_cb, session);
1394 avctp_set_state(session, AVCTP_STATE_DISCONNECTED, -EIO);
1397 static void avctp_browsing_confirm(struct avctp *session, GIOChannel *chan,
1398 struct btd_device *dev)
1402 if (session->control == NULL || session->browsing != NULL) {
1403 error("Browsing: Refusing unexpected connect");
1404 g_io_channel_shutdown(chan, TRUE, NULL);
1408 if (bt_io_accept(chan, avctp_connect_browsing_cb, session, NULL,
1410 avctp_set_state(session, AVCTP_STATE_BROWSING_CONNECTING, 0);
1414 error("Browsing: %s", err->message);
1420 static void avctp_confirm_cb(GIOChannel *chan, gpointer data)
1422 struct avctp *session;
1427 struct btd_device *device;
1429 bt_io_get(chan, &err,
1430 BT_IO_OPT_SOURCE_BDADDR, &src,
1431 BT_IO_OPT_DEST_BDADDR, &dst,
1432 BT_IO_OPT_DEST, address,
1433 BT_IO_OPT_PSM, &psm,
1436 error("%s", err->message);
1438 g_io_channel_shutdown(chan, TRUE, NULL);
1442 DBG("AVCTP: incoming connect from %s", address);
1444 device = btd_adapter_find_device(adapter_find(&src), &dst,
1449 session = avctp_get_internal(device);
1450 if (session == NULL)
1453 if (btd_device_get_service(device, AVRCP_REMOTE_UUID) == NULL)
1454 btd_device_add_uuid(device, AVRCP_REMOTE_UUID);
1456 if (btd_device_get_service(device, AVRCP_TARGET_UUID) == NULL)
1457 btd_device_add_uuid(device, AVRCP_TARGET_UUID);
1460 case AVCTP_CONTROL_PSM:
1461 avctp_control_confirm(session, chan, device);
1463 case AVCTP_BROWSING_PSM:
1464 avctp_browsing_confirm(session, chan, device);
1471 static GIOChannel *avctp_server_socket(const bdaddr_t *src, gboolean master,
1472 uint8_t mode, uint16_t psm)
1477 io = bt_io_listen(NULL, avctp_confirm_cb, NULL,
1479 BT_IO_OPT_SOURCE_BDADDR, src,
1481 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
1482 BT_IO_OPT_MASTER, master,
1483 BT_IO_OPT_MODE, mode,
1486 error("%s", err->message);
1493 int avctp_register(struct btd_adapter *adapter, gboolean master)
1495 struct avctp_server *server;
1496 const bdaddr_t *src = btd_adapter_get_address(adapter);
1498 server = g_new0(struct avctp_server, 1);
1500 server->control_io = avctp_server_socket(src, master, L2CAP_MODE_BASIC,
1502 if (!server->control_io) {
1506 server->browsing_io = avctp_server_socket(src, master, L2CAP_MODE_ERTM,
1507 AVCTP_BROWSING_PSM);
1508 if (!server->browsing_io) {
1509 if (server->control_io) {
1510 g_io_channel_shutdown(server->control_io, TRUE, NULL);
1511 g_io_channel_unref(server->control_io);
1512 server->control_io = NULL;
1518 server->adapter = btd_adapter_ref(adapter);
1520 servers = g_slist_append(servers, server);
1525 void avctp_unregister(struct btd_adapter *adapter)
1527 struct avctp_server *server;
1529 server = find_server(servers, adapter);
1533 while (server->sessions)
1534 avctp_disconnected(server->sessions->data);
1536 servers = g_slist_remove(servers, server);
1538 g_io_channel_shutdown(server->browsing_io, TRUE, NULL);
1539 g_io_channel_unref(server->browsing_io);
1540 server->browsing_io = NULL;
1542 g_io_channel_shutdown(server->control_io, TRUE, NULL);
1543 g_io_channel_unref(server->control_io);
1544 btd_adapter_unref(server->adapter);
1548 static struct avctp_pending_req *pending_create(struct avctp_channel *chan,
1549 avctp_process_cb process,
1551 GDestroyNotify destroy)
1553 struct avctp_pending_req *p;
1556 if (!chan->processed)
1559 tmp = g_slist_copy(chan->processed);
1561 /* Find first unused transaction id */
1562 for (l = tmp; l; l = g_slist_next(l)) {
1563 struct avctp_pending_req *req = l->data;
1565 if (req->transaction == chan->transaction) {
1566 chan->transaction++;
1567 chan->transaction %= 16;
1568 tmp = g_slist_delete_link(tmp, l);
1576 p = g_new0(struct avctp_pending_req, 1);
1578 p->transaction = chan->transaction;
1579 p->process = process;
1581 p->destroy = destroy;
1583 chan->transaction++;
1584 chan->transaction %= 16;
1589 static int avctp_send_req(struct avctp *session, uint8_t code,
1590 uint8_t subunit, uint8_t opcode,
1591 uint8_t *operands, size_t operand_count,
1592 avctp_rsp_cb func, void *user_data)
1594 struct avctp_channel *control = session->control;
1595 struct avctp_pending_req *p;
1596 struct avctp_control_req *req;
1598 if (control == NULL)
1601 req = g_new0(struct avctp_control_req, 1);
1603 req->subunit = subunit;
1606 req->operands = g_memdup(operands, operand_count);
1607 req->operand_count = operand_count;
1608 req->user_data = user_data;
1610 p = pending_create(control, process_control, req, control_req_destroy);
1614 g_queue_push_tail(control->queue, p);
1616 if (control->process_id == 0)
1617 control->process_id = g_idle_add(process_queue, control);
1622 int avctp_send_browsing_req(struct avctp *session,
1623 uint8_t *operands, size_t operand_count,
1624 avctp_browsing_rsp_cb func, void *user_data)
1626 struct avctp_channel *browsing = session->browsing;
1627 struct avctp_pending_req *p;
1628 struct avctp_browsing_req *req;
1630 if (browsing == NULL)
1633 req = g_new0(struct avctp_browsing_req, 1);
1635 req->operands = g_memdup(operands, operand_count);
1636 req->operand_count = operand_count;
1637 req->user_data = user_data;
1639 p = pending_create(browsing, process_browsing, req,
1640 browsing_req_destroy);
1644 g_queue_push_tail(browsing->queue, p);
1646 /* Connection did not complete, delay process of the request */
1647 if (browsing->watch == 0)
1650 if (browsing->process_id == 0)
1651 browsing->process_id = g_idle_add(process_queue, browsing);
1656 static const char *op2str(uint8_t op)
1660 for (i = 0; key_map[i].name != NULL; i++) {
1661 if ((op & 0x7F) == key_map[i].avc)
1662 return key_map[i].name;
1668 static int avctp_passthrough_press(struct avctp *session, uint8_t op)
1670 uint8_t operands[2];
1672 DBG("%s", op2str(op));
1674 /* Button pressed */
1675 operands[0] = op & 0x7f;
1678 return avctp_send_req(session, AVC_CTYPE_CONTROL,
1679 AVC_SUBUNIT_PANEL, AVC_OP_PASSTHROUGH,
1680 operands, sizeof(operands),
1681 avctp_passthrough_rsp, NULL);
1684 static int avctp_passthrough_release(struct avctp *session, uint8_t op)
1686 uint8_t operands[2];
1688 DBG("%s", op2str(op));
1690 /* Button released */
1691 operands[0] = op | 0x80;
1694 return avctp_send_req(session, AVC_CTYPE_CONTROL,
1695 AVC_SUBUNIT_PANEL, AVC_OP_PASSTHROUGH,
1696 operands, sizeof(operands),
1700 static gboolean repeat_timeout(gpointer user_data)
1702 struct avctp *session = user_data;
1704 avctp_passthrough_release(session, session->key.op);
1705 avctp_passthrough_press(session, session->key.op);
1710 static void release_pressed(struct avctp *session)
1712 avctp_passthrough_release(session, session->key.op);
1714 if (session->key.timer > 0)
1715 g_source_remove(session->key.timer);
1717 session->key.timer = 0;
1720 static bool set_pressed(struct avctp *session, uint8_t op)
1722 if (session->key.timer > 0) {
1723 if (session->key.op == op)
1725 release_pressed(session);
1728 if (op != AVC_FAST_FORWARD && op != AVC_REWIND)
1731 session->key.op = op;
1732 session->key.timer = g_timeout_add_seconds(AVC_PRESS_TIMEOUT,
1739 static gboolean avctp_passthrough_rsp(struct avctp *session, uint8_t code,
1740 uint8_t subunit, uint8_t *operands,
1741 size_t operand_count, void *user_data)
1743 if (code != AVC_CTYPE_ACCEPTED)
1746 if (set_pressed(session, operands[0]))
1749 avctp_passthrough_release(session, operands[0]);
1754 int avctp_send_passthrough(struct avctp *session, uint8_t op)
1756 /* Auto release if key pressed */
1757 if (session->key.timer > 0)
1758 release_pressed(session);
1760 return avctp_passthrough_press(session, op);
1763 int avctp_send_vendordep(struct avctp *session, uint8_t transaction,
1764 uint8_t code, uint8_t subunit,
1765 uint8_t *operands, size_t operand_count)
1767 struct avctp_channel *control = session->control;
1769 if (control == NULL)
1772 return avctp_send(control, transaction, AVCTP_RESPONSE, code, subunit,
1773 AVC_OP_VENDORDEP, operands, operand_count);
1776 int avctp_send_vendordep_req(struct avctp *session, uint8_t code,
1777 uint8_t subunit, uint8_t *operands,
1778 size_t operand_count,
1779 avctp_rsp_cb func, void *user_data)
1781 return avctp_send_req(session, code, subunit, AVC_OP_VENDORDEP,
1782 operands, operand_count,
1786 unsigned int avctp_add_state_cb(struct btd_device *dev, avctp_state_cb cb,
1789 struct avctp_state_callback *state_cb;
1790 static unsigned int id = 0;
1792 state_cb = g_new(struct avctp_state_callback, 1);
1794 state_cb->dev = dev;
1795 state_cb->id = ++id;
1796 state_cb->user_data = user_data;
1798 callbacks = g_slist_append(callbacks, state_cb);
1800 return state_cb->id;
1803 gboolean avctp_remove_state_cb(unsigned int id)
1807 for (l = callbacks; l != NULL; l = l->next) {
1808 struct avctp_state_callback *cb = l->data;
1809 if (cb && cb->id == id) {
1810 callbacks = g_slist_remove(callbacks, cb);
1819 unsigned int avctp_register_passthrough_handler(struct avctp *session,
1820 avctp_passthrough_cb cb,
1823 struct avctp_channel *control = session->control;
1824 struct avctp_passthrough_handler *handler;
1825 static unsigned int id = 0;
1827 if (control == NULL || session->handler != NULL)
1830 handler = g_new(struct avctp_passthrough_handler, 1);
1832 handler->user_data = user_data;
1835 session->handler = handler;
1840 bool avctp_unregister_passthrough_handler(unsigned int id)
1844 for (l = servers; l; l = l->next) {
1845 struct avctp_server *server = l->data;
1848 for (s = server->sessions; s; s = s->next) {
1849 struct avctp *session = s->data;
1851 if (session->handler == NULL)
1854 if (session->handler->id == id) {
1855 g_free(session->handler);
1856 session->handler = NULL;
1865 unsigned int avctp_register_pdu_handler(struct avctp *session, uint8_t opcode,
1866 avctp_control_pdu_cb cb,
1869 struct avctp_channel *control = session->control;
1870 struct avctp_pdu_handler *handler;
1871 static unsigned int id = 0;
1873 if (control == NULL)
1876 handler = find_handler(control->handlers, opcode);
1880 handler = g_new(struct avctp_pdu_handler, 1);
1881 handler->opcode = opcode;
1883 handler->user_data = user_data;
1886 control->handlers = g_slist_append(control->handlers, handler);
1891 unsigned int avctp_register_browsing_pdu_handler(struct avctp *session,
1892 avctp_browsing_pdu_cb cb,
1894 GDestroyNotify destroy)
1896 struct avctp_channel *browsing = session->browsing;
1897 struct avctp_browsing_pdu_handler *handler;
1898 static unsigned int id = 0;
1900 if (browsing == NULL)
1903 if (browsing->handlers != NULL)
1906 handler = g_new(struct avctp_browsing_pdu_handler, 1);
1908 handler->user_data = user_data;
1910 handler->destroy = destroy;
1912 browsing->handlers = g_slist_append(browsing->handlers, handler);
1917 gboolean avctp_unregister_pdu_handler(unsigned int id)
1921 for (l = servers; l; l = l->next) {
1922 struct avctp_server *server = l->data;
1925 for (s = server->sessions; s; s = s->next) {
1926 struct avctp *session = s->data;
1927 struct avctp_channel *control = session->control;
1930 if (control == NULL)
1933 for (h = control->handlers; h; h = h->next) {
1934 struct avctp_pdu_handler *handler = h->data;
1936 if (handler->id != id)
1939 control->handlers = g_slist_remove(
1951 gboolean avctp_unregister_browsing_pdu_handler(unsigned int id)
1955 for (l = servers; l; l = l->next) {
1956 struct avctp_server *server = l->data;
1959 for (s = server->sessions; s; s = s->next) {
1960 struct avctp *session = s->data;
1961 struct avctp_channel *browsing = session->browsing;
1964 if (browsing == NULL)
1967 for (h = browsing->handlers; h; h = h->next) {
1968 struct avctp_browsing_pdu_handler *handler =
1971 if (handler->id != id)
1974 browsing->handlers = g_slist_remove(
1986 struct avctp *avctp_connect(struct btd_device *device)
1988 struct avctp *session;
1991 const bdaddr_t *src;
1993 session = avctp_get_internal(device);
1997 if (session->state > AVCTP_STATE_DISCONNECTED)
2000 avctp_set_state(session, AVCTP_STATE_CONNECTING, 0);
2002 src = btd_adapter_get_address(session->server->adapter);
2004 io = bt_io_connect(avctp_connect_cb, session, NULL, &err,
2005 BT_IO_OPT_SOURCE_BDADDR, src,
2006 BT_IO_OPT_DEST_BDADDR,
2007 device_get_address(session->device),
2008 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
2009 BT_IO_OPT_PSM, AVCTP_CONTROL_PSM,
2012 avctp_set_state(session, AVCTP_STATE_DISCONNECTED, -EIO);
2013 error("%s", err->message);
2018 session->control = avctp_channel_create(session, io, NULL);
2019 session->initiator = true;
2020 g_io_channel_unref(io);
2025 int avctp_connect_browsing(struct avctp *session)
2027 const bdaddr_t *src;
2031 if (session->state != AVCTP_STATE_CONNECTED)
2034 if (session->browsing != NULL)
2037 avctp_set_state(session, AVCTP_STATE_BROWSING_CONNECTING, 0);
2039 src = btd_adapter_get_address(session->server->adapter);
2041 io = bt_io_connect(avctp_connect_browsing_cb, session, NULL, &err,
2042 BT_IO_OPT_SOURCE_BDADDR, src,
2043 BT_IO_OPT_DEST_BDADDR,
2044 device_get_address(session->device),
2045 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
2046 BT_IO_OPT_PSM, AVCTP_BROWSING_PSM,
2047 BT_IO_OPT_MODE, L2CAP_MODE_ERTM,
2050 error("%s", err->message);
2055 session->browsing = avctp_channel_create(session, io,
2056 avctp_destroy_browsing);
2057 g_io_channel_unref(io);
2062 void avctp_disconnect(struct avctp *session)
2064 if (session->state == AVCTP_STATE_DISCONNECTED)
2067 avctp_set_state(session, AVCTP_STATE_DISCONNECTED, -EIO);
2070 struct avctp *avctp_get(struct btd_device *device)
2072 return avctp_get_internal(device);
2075 bool avctp_is_initiator(struct avctp *session)
2077 return session->initiator;