3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2009-2010 Marcel Holtmann <marcel@holtmann.org>
6 * Copyright (C) 2009-2010 Nokia Corporation
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
34 #include <sys/types.h>
35 #include <sys/socket.h>
39 #include "lib/bluetooth.h"
40 #include "lib/l2cap.h"
41 #include "lib/rfcomm.h"
47 #define BT_FLUSHABLE 8
50 #define ERROR_FAILED(gerr, str, err) \
51 g_set_error(gerr, BT_IO_ERROR, err, \
52 str ": %s (%d)", strerror(err), err)
54 #define DEFAULT_DEFER_TIMEOUT 30
87 GDestroyNotify destroy;
93 GDestroyNotify destroy;
100 GDestroyNotify destroy;
103 static BtIOType bt_io_get_type(GIOChannel *io, GError **gerr)
105 int sk = g_io_channel_unix_get_fd(io);
106 int domain, proto, err;
110 len = sizeof(domain);
111 err = getsockopt(sk, SOL_SOCKET, SO_DOMAIN, &domain, &len);
113 ERROR_FAILED(gerr, "getsockopt(SO_DOMAIN)", errno);
114 return BT_IO_INVALID;
117 if (domain != AF_BLUETOOTH) {
118 g_set_error(gerr, BT_IO_ERROR, EINVAL,
119 "BtIO socket domain not AF_BLUETOOTH");
120 return BT_IO_INVALID;
125 err = getsockopt(sk, SOL_SOCKET, SO_PROTOCOL, &proto, &len);
127 ERROR_FAILED(gerr, "getsockopt(SO_PROTOCOL)", errno);
128 return BT_IO_INVALID;
139 g_set_error(gerr, BT_IO_ERROR, EINVAL,
140 "Unknown BtIO socket type");
141 return BT_IO_INVALID;
145 static void server_remove(struct server *server)
148 server->destroy(server->user_data);
152 static void connect_remove(struct connect *conn)
155 conn->destroy(conn->user_data);
159 static void accept_remove(struct accept *accept)
162 accept->destroy(accept->user_data);
166 static gboolean check_nval(GIOChannel *io)
170 memset(&fds, 0, sizeof(fds));
171 fds.fd = g_io_channel_unix_get_fd(io);
172 fds.events = POLLNVAL;
174 if (poll(&fds, 1, 0) > 0 && (fds.revents & POLLNVAL))
180 static gboolean accept_cb(GIOChannel *io, GIOCondition cond,
183 struct accept *accept = user_data;
186 /* If the user aborted this accept attempt */
187 if ((cond & G_IO_NVAL) || check_nval(io))
190 if (cond & (G_IO_HUP | G_IO_ERR)) {
191 int err, sk_err, sock = g_io_channel_unix_get_fd(io);
192 socklen_t len = sizeof(sk_err);
194 if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &sk_err, &len) < 0)
200 ERROR_FAILED(&gerr, "HUP or ERR on socket", -err);
203 accept->connect(io, gerr, accept->user_data);
205 g_clear_error(&gerr);
210 static gboolean connect_cb(GIOChannel *io, GIOCondition cond,
213 struct connect *conn = user_data;
215 int err, sk_err, sock;
216 socklen_t len = sizeof(sk_err);
218 /* If the user aborted this connect attempt */
219 if ((cond & G_IO_NVAL) || check_nval(io))
222 sock = g_io_channel_unix_get_fd(io);
224 if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &sk_err, &len) < 0)
230 ERROR_FAILED(&gerr, "connect error", -err);
232 conn->connect(io, gerr, conn->user_data);
234 g_clear_error(&gerr);
239 static gboolean server_cb(GIOChannel *io, GIOCondition cond,
242 struct server *server = user_data;
243 int srv_sock, cli_sock;
246 /* If the user closed the server */
247 if ((cond & G_IO_NVAL) || check_nval(io))
250 srv_sock = g_io_channel_unix_get_fd(io);
252 cli_sock = accept(srv_sock, NULL, NULL);
256 cli_io = g_io_channel_unix_new(cli_sock);
258 g_io_channel_set_close_on_unref(cli_io, TRUE);
259 g_io_channel_set_flags(cli_io, G_IO_FLAG_NONBLOCK, NULL);
262 server->confirm(cli_io, server->user_data);
264 server->connect(cli_io, NULL, server->user_data);
266 g_io_channel_unref(cli_io);
271 static void server_add(GIOChannel *io, BtIOConnect connect,
272 BtIOConfirm confirm, gpointer user_data,
273 GDestroyNotify destroy)
275 struct server *server;
278 server = g_new0(struct server, 1);
279 server->connect = connect;
280 server->confirm = confirm;
281 server->user_data = user_data;
282 server->destroy = destroy;
284 cond = G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
285 g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, server_cb, server,
286 (GDestroyNotify) server_remove);
289 static void connect_add(GIOChannel *io, BtIOConnect connect,
290 gpointer user_data, GDestroyNotify destroy)
292 struct connect *conn;
295 conn = g_new0(struct connect, 1);
296 conn->connect = connect;
297 conn->user_data = user_data;
298 conn->destroy = destroy;
300 cond = G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
301 g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, connect_cb, conn,
302 (GDestroyNotify) connect_remove);
305 static void accept_add(GIOChannel *io, BtIOConnect connect, gpointer user_data,
306 GDestroyNotify destroy)
308 struct accept *accept;
311 accept = g_new0(struct accept, 1);
312 accept->connect = connect;
313 accept->user_data = user_data;
314 accept->destroy = destroy;
316 cond = G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
317 g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, accept_cb, accept,
318 (GDestroyNotify) accept_remove);
321 static int l2cap_bind(int sock, const bdaddr_t *src, uint8_t src_type,
322 uint16_t psm, uint16_t cid, GError **err)
324 struct sockaddr_l2 addr;
326 memset(&addr, 0, sizeof(addr));
327 addr.l2_family = AF_BLUETOOTH;
328 bacpy(&addr.l2_bdaddr, src);
331 addr.l2_cid = htobs(cid);
333 addr.l2_psm = htobs(psm);
335 addr.l2_bdaddr_type = src_type;
337 if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
339 ERROR_FAILED(err, "l2cap_bind", errno);
346 static int l2cap_connect(int sock, const bdaddr_t *dst, uint8_t dst_type,
347 uint16_t psm, uint16_t cid)
350 struct sockaddr_l2 addr;
352 memset(&addr, 0, sizeof(addr));
353 addr.l2_family = AF_BLUETOOTH;
354 bacpy(&addr.l2_bdaddr, dst);
356 addr.l2_cid = htobs(cid);
358 addr.l2_psm = htobs(psm);
360 addr.l2_bdaddr_type = dst_type;
362 err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
363 if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
369 static int l2cap_set_master(int sock, int master)
375 if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags, &len) < 0)
379 if (flags & L2CAP_LM_MASTER)
381 flags |= L2CAP_LM_MASTER;
383 if (!(flags & L2CAP_LM_MASTER))
385 flags &= ~L2CAP_LM_MASTER;
388 if (setsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags, sizeof(flags)) < 0)
394 static int rfcomm_set_master(int sock, int master)
400 if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags, &len) < 0)
404 if (flags & RFCOMM_LM_MASTER)
406 flags |= RFCOMM_LM_MASTER;
408 if (!(flags & RFCOMM_LM_MASTER))
410 flags &= ~RFCOMM_LM_MASTER;
413 if (setsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags, sizeof(flags)) < 0)
419 static int l2cap_set_lm(int sock, int level)
424 L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT,
425 L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT | L2CAP_LM_SECURE,
426 }, opt = lm_map[level];
428 if (setsockopt(sock, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt)) < 0)
434 static int rfcomm_set_lm(int sock, int level)
439 RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT,
440 RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT | RFCOMM_LM_SECURE,
441 }, opt = lm_map[level];
443 if (setsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &opt, sizeof(opt)) < 0)
449 static gboolean set_sec_level(int sock, BtIOType type, int level, GError **err)
451 struct bt_security sec;
454 if (level < BT_SECURITY_LOW || level > BT_SECURITY_HIGH) {
455 g_set_error(err, BT_IO_ERROR, EINVAL,
456 "Valid security level range is %d-%d",
457 BT_SECURITY_LOW, BT_SECURITY_HIGH);
461 memset(&sec, 0, sizeof(sec));
464 if (setsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec,
468 if (errno != ENOPROTOOPT) {
469 ERROR_FAILED(err, "setsockopt(BT_SECURITY)", errno);
473 if (type == BT_IO_L2CAP)
474 ret = l2cap_set_lm(sock, level);
476 ret = rfcomm_set_lm(sock, level);
479 ERROR_FAILED(err, "setsockopt(LM)", -ret);
486 static int l2cap_get_lm(int sock, int *sec_level)
492 if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &opt, &len) < 0)
497 if (opt & L2CAP_LM_AUTH)
498 *sec_level = BT_SECURITY_LOW;
499 if (opt & L2CAP_LM_ENCRYPT)
500 *sec_level = BT_SECURITY_MEDIUM;
501 if (opt & L2CAP_LM_SECURE)
502 *sec_level = BT_SECURITY_HIGH;
507 static int rfcomm_get_lm(int sock, int *sec_level)
513 if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &opt, &len) < 0)
518 if (opt & RFCOMM_LM_AUTH)
519 *sec_level = BT_SECURITY_LOW;
520 if (opt & RFCOMM_LM_ENCRYPT)
521 *sec_level = BT_SECURITY_MEDIUM;
522 if (opt & RFCOMM_LM_SECURE)
523 *sec_level = BT_SECURITY_HIGH;
528 static gboolean get_sec_level(int sock, BtIOType type, int *level,
531 struct bt_security sec;
535 memset(&sec, 0, sizeof(sec));
537 if (getsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec, &len) == 0) {
542 if (errno != ENOPROTOOPT) {
543 ERROR_FAILED(err, "getsockopt(BT_SECURITY)", errno);
547 if (type == BT_IO_L2CAP)
548 ret = l2cap_get_lm(sock, level);
550 ret = rfcomm_get_lm(sock, level);
553 ERROR_FAILED(err, "getsockopt(LM)", -ret);
560 static int l2cap_set_flushable(int sock, gboolean flushable)
565 if (setsockopt(sock, SOL_BLUETOOTH, BT_FLUSHABLE, &f, sizeof(f)) < 0)
571 static int set_priority(int sock, uint32_t prio)
573 if (setsockopt(sock, SOL_SOCKET, SO_PRIORITY, &prio, sizeof(prio)) < 0)
579 static gboolean get_key_size(int sock, int *size, GError **err)
581 struct bt_security sec;
584 memset(&sec, 0, sizeof(sec));
586 if (getsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec, &len) == 0) {
587 *size = sec.key_size;
594 static gboolean set_l2opts(int sock, uint16_t imtu, uint16_t omtu,
595 uint8_t mode, GError **err)
597 struct l2cap_options l2o;
600 memset(&l2o, 0, sizeof(l2o));
602 if (getsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &len) < 0) {
603 ERROR_FAILED(err, "getsockopt(L2CAP_OPTIONS)", errno);
614 if (setsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o, sizeof(l2o)) < 0) {
615 ERROR_FAILED(err, "setsockopt(L2CAP_OPTIONS)", errno);
622 static gboolean set_le_imtu(int sock, uint16_t imtu, GError **err)
624 if (setsockopt(sock, SOL_BLUETOOTH, BT_RCVMTU, &imtu,
626 ERROR_FAILED(err, "setsockopt(BT_RCVMTU)", errno);
633 static gboolean l2cap_set(int sock, uint8_t src_type, int sec_level,
634 uint16_t imtu, uint16_t omtu, uint8_t mode,
635 int master, int flushable, uint32_t priority,
638 if (imtu || omtu || mode) {
641 if (src_type == BDADDR_BREDR)
642 ret = set_l2opts(sock, imtu, omtu, mode, err);
644 ret = set_le_imtu(sock, imtu, err);
650 if (master >= 0 && l2cap_set_master(sock, master) < 0) {
651 ERROR_FAILED(err, "l2cap_set_master", errno);
655 if (flushable >= 0 && l2cap_set_flushable(sock, flushable) < 0) {
656 ERROR_FAILED(err, "l2cap_set_flushable", errno);
660 if (priority > 0 && set_priority(sock, priority) < 0) {
661 ERROR_FAILED(err, "set_priority", errno);
665 if (sec_level && !set_sec_level(sock, BT_IO_L2CAP, sec_level, err))
671 static int rfcomm_bind(int sock,
672 const bdaddr_t *src, uint8_t channel, GError **err)
674 struct sockaddr_rc addr;
676 memset(&addr, 0, sizeof(addr));
677 addr.rc_family = AF_BLUETOOTH;
678 bacpy(&addr.rc_bdaddr, src);
679 addr.rc_channel = channel;
681 if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
683 ERROR_FAILED(err, "rfcomm_bind", errno);
690 static int rfcomm_connect(int sock, const bdaddr_t *dst, uint8_t channel)
693 struct sockaddr_rc addr;
695 memset(&addr, 0, sizeof(addr));
696 addr.rc_family = AF_BLUETOOTH;
697 bacpy(&addr.rc_bdaddr, dst);
698 addr.rc_channel = channel;
700 err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
701 if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
707 static gboolean rfcomm_set(int sock, int sec_level, int master, GError **err)
709 if (sec_level && !set_sec_level(sock, BT_IO_RFCOMM, sec_level, err))
712 if (master >= 0 && rfcomm_set_master(sock, master) < 0) {
713 ERROR_FAILED(err, "rfcomm_set_master", errno);
720 static int sco_bind(int sock, const bdaddr_t *src, GError **err)
722 struct sockaddr_sco addr;
724 memset(&addr, 0, sizeof(addr));
725 addr.sco_family = AF_BLUETOOTH;
726 bacpy(&addr.sco_bdaddr, src);
728 if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
730 ERROR_FAILED(err, "sco_bind", errno);
737 static int sco_connect(int sock, const bdaddr_t *dst)
739 struct sockaddr_sco addr;
742 memset(&addr, 0, sizeof(addr));
743 addr.sco_family = AF_BLUETOOTH;
744 bacpy(&addr.sco_bdaddr, dst);
746 err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
747 if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
753 static gboolean sco_set(int sock, uint16_t mtu, uint16_t voice, GError **err)
755 struct sco_options sco_opt;
756 struct bt_voice bt_voice;
762 len = sizeof(sco_opt);
763 memset(&sco_opt, 0, len);
764 if (getsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt, &len) < 0) {
765 ERROR_FAILED(err, "getsockopt(SCO_OPTIONS)", errno);
770 if (setsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt,
771 sizeof(sco_opt)) < 0) {
772 ERROR_FAILED(err, "setsockopt(SCO_OPTIONS)", errno);
780 memset(&bt_voice, 0, sizeof(bt_voice));
781 bt_voice.setting = voice;
782 if (setsockopt(sock, SOL_BLUETOOTH, BT_VOICE, &bt_voice,
783 sizeof(bt_voice)) < 0) {
784 ERROR_FAILED(err, "setsockopt(BT_VOICE)", errno);
791 static gboolean parse_set_opts(struct set_opts *opts, GError **err,
792 BtIOOption opt1, va_list args)
794 BtIOOption opt = opt1;
797 memset(opts, 0, sizeof(*opts));
800 opts->type = BT_IO_SCO;
801 opts->defer = DEFAULT_DEFER_TIMEOUT;
803 opts->mode = L2CAP_MODE_BASIC;
804 opts->flushable = -1;
806 opts->src_type = BDADDR_BREDR;
807 opts->dst_type = BDADDR_BREDR;
809 while (opt != BT_IO_OPT_INVALID) {
811 case BT_IO_OPT_SOURCE:
812 str = va_arg(args, const char *);
813 str2ba(str, &opts->src);
815 case BT_IO_OPT_SOURCE_BDADDR:
816 bacpy(&opts->src, va_arg(args, const bdaddr_t *));
818 case BT_IO_OPT_SOURCE_TYPE:
819 opts->src_type = va_arg(args, int);
822 str2ba(va_arg(args, const char *), &opts->dst);
824 case BT_IO_OPT_DEST_BDADDR:
825 bacpy(&opts->dst, va_arg(args, const bdaddr_t *));
827 case BT_IO_OPT_DEST_TYPE:
828 opts->dst_type = va_arg(args, int);
830 case BT_IO_OPT_DEFER_TIMEOUT:
831 opts->defer = va_arg(args, int);
833 case BT_IO_OPT_SEC_LEVEL:
834 opts->sec_level = va_arg(args, int);
836 case BT_IO_OPT_CHANNEL:
837 opts->type = BT_IO_RFCOMM;
838 opts->channel = va_arg(args, int);
841 opts->type = BT_IO_L2CAP;
842 opts->psm = va_arg(args, int);
845 opts->type = BT_IO_L2CAP;
846 opts->cid = va_arg(args, int);
849 opts->mtu = va_arg(args, int);
850 opts->imtu = opts->mtu;
851 opts->omtu = opts->mtu;
854 opts->omtu = va_arg(args, int);
856 opts->mtu = opts->omtu;
859 opts->imtu = va_arg(args, int);
861 opts->mtu = opts->imtu;
863 case BT_IO_OPT_MASTER:
864 opts->master = va_arg(args, gboolean);
867 opts->mode = va_arg(args, int);
869 case BT_IO_OPT_FLUSHABLE:
870 opts->flushable = va_arg(args, gboolean);
872 case BT_IO_OPT_PRIORITY:
873 opts->priority = va_arg(args, int);
875 case BT_IO_OPT_VOICE:
876 opts->voice = va_arg(args, int);
878 case BT_IO_OPT_INVALID:
879 case BT_IO_OPT_KEY_SIZE:
880 case BT_IO_OPT_SOURCE_CHANNEL:
881 case BT_IO_OPT_DEST_CHANNEL:
882 case BT_IO_OPT_HANDLE:
883 case BT_IO_OPT_CLASS:
885 g_set_error(err, BT_IO_ERROR, EINVAL,
886 "Unknown option %d", opt);
890 opt = va_arg(args, int);
896 static gboolean get_src(int sock, void *src, socklen_t len, GError **err)
902 if (getsockname(sock, src, &olen) < 0) {
903 ERROR_FAILED(err, "getsockname", errno);
910 static gboolean get_dst(int sock, void *dst, socklen_t len, GError **err)
916 if (getpeername(sock, dst, &olen) < 0) {
917 ERROR_FAILED(err, "getpeername", errno);
924 static int l2cap_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
926 struct l2cap_conninfo info;
930 if (getsockopt(sock, SOL_L2CAP, L2CAP_CONNINFO, &info, &len) < 0)
934 *handle = info.hci_handle;
937 memcpy(dev_class, info.dev_class, 3);
942 static int l2cap_get_flushable(int sock, gboolean *flushable)
949 if (getsockopt(sock, SOL_BLUETOOTH, BT_FLUSHABLE, &f, &len) < 0)
960 static int get_priority(int sock, uint32_t *prio)
965 if (getsockopt(sock, SOL_SOCKET, SO_PRIORITY, prio, &len) < 0)
971 static gboolean l2cap_get(int sock, GError **err, BtIOOption opt1,
974 BtIOOption opt = opt1;
975 struct sockaddr_l2 src, dst;
976 struct l2cap_options l2o;
978 uint8_t dev_class[3];
981 gboolean flushable = FALSE, have_dst = FALSE;
984 if (!get_src(sock, &src, sizeof(src), err))
987 memset(&l2o, 0, sizeof(l2o));
989 if (src.l2_bdaddr_type != BDADDR_BREDR) {
990 len = sizeof(l2o.imtu);
991 if (getsockopt(sock, SOL_BLUETOOTH, BT_RCVMTU,
992 &l2o.imtu, &len) == 0)
995 /* Non-LE CoC enabled kernels will return one of these
996 * in which case we need to fall back to L2CAP_OPTIONS.
998 if (errno != EPROTONOSUPPORT && errno != ENOPROTOOPT) {
999 ERROR_FAILED(err, "getsockopt(BT_RCVMTU)", errno);
1005 if (getsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &len) < 0) {
1006 ERROR_FAILED(err, "getsockopt(L2CAP_OPTIONS)", errno);
1011 while (opt != BT_IO_OPT_INVALID) {
1013 case BT_IO_OPT_SOURCE:
1014 ba2str(&src.l2_bdaddr, va_arg(args, char *));
1016 case BT_IO_OPT_SOURCE_BDADDR:
1017 bacpy(va_arg(args, bdaddr_t *), &src.l2_bdaddr);
1019 case BT_IO_OPT_DEST:
1021 have_dst = get_dst(sock, &dst, sizeof(dst),
1025 ba2str(&dst.l2_bdaddr, va_arg(args, char *));
1027 case BT_IO_OPT_DEST_BDADDR:
1029 have_dst = get_dst(sock, &dst, sizeof(dst),
1033 bacpy(va_arg(args, bdaddr_t *), &dst.l2_bdaddr);
1035 case BT_IO_OPT_DEST_TYPE:
1037 have_dst = get_dst(sock, &dst, sizeof(dst),
1041 *(va_arg(args, uint8_t *)) = dst.l2_bdaddr_type;
1043 case BT_IO_OPT_DEFER_TIMEOUT:
1045 if (getsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP,
1046 va_arg(args, int *), &len) < 0) {
1047 ERROR_FAILED(err, "getsockopt(DEFER_SETUP)",
1052 case BT_IO_OPT_SEC_LEVEL:
1053 if (!get_sec_level(sock, BT_IO_L2CAP,
1054 va_arg(args, int *), err))
1057 case BT_IO_OPT_KEY_SIZE:
1058 if (!get_key_size(sock, va_arg(args, int *), err))
1063 *(va_arg(args, uint16_t *)) = btohs(src.l2_psm);
1068 have_dst = get_dst(sock, &dst, sizeof(dst),
1073 *(va_arg(args, uint16_t *)) = btohs(dst.l2_psm);
1077 *(va_arg(args, uint16_t *)) = btohs(src.l2_cid);
1082 have_dst = get_dst(sock, &dst, sizeof(dst),
1087 *(va_arg(args, uint16_t *)) = btohs(dst.l2_cid);
1089 case BT_IO_OPT_OMTU:
1090 if (src.l2_bdaddr_type == BDADDR_BREDR) {
1091 *(va_arg(args, uint16_t *)) = l2o.omtu;
1095 len = sizeof(l2o.omtu);
1096 if (getsockopt(sock, SOL_BLUETOOTH, BT_SNDMTU,
1097 &l2o.omtu, &len) < 0) {
1098 ERROR_FAILED(err, "getsockopt(BT_SNDMTU)",
1103 *(va_arg(args, uint16_t *)) = l2o.omtu;
1105 case BT_IO_OPT_IMTU:
1106 *(va_arg(args, uint16_t *)) = l2o.imtu;
1108 case BT_IO_OPT_MASTER:
1109 len = sizeof(flags);
1110 if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags,
1112 ERROR_FAILED(err, "getsockopt(L2CAP_LM)",
1116 *(va_arg(args, gboolean *)) =
1117 (flags & L2CAP_LM_MASTER) ? TRUE : FALSE;
1119 case BT_IO_OPT_HANDLE:
1120 if (l2cap_get_info(sock, &handle, dev_class) < 0) {
1121 ERROR_FAILED(err, "L2CAP_CONNINFO", errno);
1124 *(va_arg(args, uint16_t *)) = handle;
1126 case BT_IO_OPT_CLASS:
1127 if (l2cap_get_info(sock, &handle, dev_class) < 0) {
1128 ERROR_FAILED(err, "L2CAP_CONNINFO", errno);
1131 memcpy(va_arg(args, uint8_t *), dev_class, 3);
1133 case BT_IO_OPT_MODE:
1134 *(va_arg(args, uint8_t *)) = l2o.mode;
1136 case BT_IO_OPT_FLUSHABLE:
1137 if (l2cap_get_flushable(sock, &flushable) < 0) {
1138 ERROR_FAILED(err, "get_flushable", errno);
1141 *(va_arg(args, gboolean *)) = flushable;
1143 case BT_IO_OPT_PRIORITY:
1144 if (get_priority(sock, &priority) < 0) {
1145 ERROR_FAILED(err, "get_priority", errno);
1148 *(va_arg(args, uint32_t *)) = priority;
1150 case BT_IO_OPT_INVALID:
1151 case BT_IO_OPT_SOURCE_TYPE:
1152 case BT_IO_OPT_CHANNEL:
1153 case BT_IO_OPT_SOURCE_CHANNEL:
1154 case BT_IO_OPT_DEST_CHANNEL:
1156 case BT_IO_OPT_VOICE:
1158 g_set_error(err, BT_IO_ERROR, EINVAL,
1159 "Unknown option %d", opt);
1163 opt = va_arg(args, int);
1169 static int rfcomm_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
1171 struct rfcomm_conninfo info;
1175 if (getsockopt(sock, SOL_RFCOMM, RFCOMM_CONNINFO, &info, &len) < 0)
1179 *handle = info.hci_handle;
1182 memcpy(dev_class, info.dev_class, 3);
1187 static gboolean rfcomm_get(int sock, GError **err, BtIOOption opt1,
1190 BtIOOption opt = opt1;
1191 struct sockaddr_rc src, dst;
1192 gboolean have_dst = FALSE;
1195 uint8_t dev_class[3];
1196 uint16_t handle = 0;
1198 if (!get_src(sock, &src, sizeof(src), err))
1201 while (opt != BT_IO_OPT_INVALID) {
1203 case BT_IO_OPT_SOURCE:
1204 ba2str(&src.rc_bdaddr, va_arg(args, char *));
1206 case BT_IO_OPT_SOURCE_BDADDR:
1207 bacpy(va_arg(args, bdaddr_t *), &src.rc_bdaddr);
1209 case BT_IO_OPT_DEST:
1211 have_dst = get_dst(sock, &dst, sizeof(dst),
1215 ba2str(&dst.rc_bdaddr, va_arg(args, char *));
1217 case BT_IO_OPT_DEST_BDADDR:
1219 have_dst = get_dst(sock, &dst, sizeof(dst),
1223 bacpy(va_arg(args, bdaddr_t *), &dst.rc_bdaddr);
1225 case BT_IO_OPT_DEFER_TIMEOUT:
1227 if (getsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP,
1228 va_arg(args, int *), &len) < 0) {
1229 ERROR_FAILED(err, "getsockopt(DEFER_SETUP)",
1234 case BT_IO_OPT_SEC_LEVEL:
1235 if (!get_sec_level(sock, BT_IO_RFCOMM,
1236 va_arg(args, int *), err))
1239 case BT_IO_OPT_CHANNEL:
1240 if (src.rc_channel) {
1241 *(va_arg(args, uint8_t *)) = src.rc_channel;
1246 have_dst = get_dst(sock, &dst, sizeof(dst),
1251 *(va_arg(args, uint8_t *)) = dst.rc_channel;
1253 case BT_IO_OPT_SOURCE_CHANNEL:
1254 *(va_arg(args, uint8_t *)) = src.rc_channel;
1256 case BT_IO_OPT_DEST_CHANNEL:
1258 have_dst = get_dst(sock, &dst, sizeof(dst),
1263 *(va_arg(args, uint8_t *)) = dst.rc_channel;
1265 case BT_IO_OPT_MASTER:
1266 len = sizeof(flags);
1267 if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags,
1269 ERROR_FAILED(err, "getsockopt(RFCOMM_LM)",
1273 *(va_arg(args, gboolean *)) =
1274 (flags & RFCOMM_LM_MASTER) ? TRUE : FALSE;
1276 case BT_IO_OPT_HANDLE:
1277 if (rfcomm_get_info(sock, &handle, dev_class) < 0) {
1278 ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
1281 *(va_arg(args, uint16_t *)) = handle;
1283 case BT_IO_OPT_CLASS:
1284 if (rfcomm_get_info(sock, &handle, dev_class) < 0) {
1285 ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
1288 memcpy(va_arg(args, uint8_t *), dev_class, 3);
1290 case BT_IO_OPT_SOURCE_TYPE:
1291 case BT_IO_OPT_DEST_TYPE:
1292 case BT_IO_OPT_KEY_SIZE:
1296 case BT_IO_OPT_OMTU:
1297 case BT_IO_OPT_IMTU:
1298 case BT_IO_OPT_MODE:
1299 case BT_IO_OPT_FLUSHABLE:
1300 case BT_IO_OPT_PRIORITY:
1301 case BT_IO_OPT_VOICE:
1302 case BT_IO_OPT_INVALID:
1304 g_set_error(err, BT_IO_ERROR, EINVAL,
1305 "Unknown option %d", opt);
1309 opt = va_arg(args, int);
1315 static int sco_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
1317 struct sco_conninfo info;
1321 if (getsockopt(sock, SOL_SCO, SCO_CONNINFO, &info, &len) < 0)
1325 *handle = info.hci_handle;
1328 memcpy(dev_class, info.dev_class, 3);
1333 static gboolean sco_get(int sock, GError **err, BtIOOption opt1, va_list args)
1335 BtIOOption opt = opt1;
1336 struct sockaddr_sco src, dst;
1337 struct sco_options sco_opt;
1339 uint8_t dev_class[3];
1340 uint16_t handle = 0;
1342 len = sizeof(sco_opt);
1343 memset(&sco_opt, 0, len);
1344 if (getsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt, &len) < 0) {
1345 ERROR_FAILED(err, "getsockopt(SCO_OPTIONS)", errno);
1349 if (!get_src(sock, &src, sizeof(src), err))
1352 if (!get_dst(sock, &dst, sizeof(dst), err))
1355 while (opt != BT_IO_OPT_INVALID) {
1357 case BT_IO_OPT_SOURCE:
1358 ba2str(&src.sco_bdaddr, va_arg(args, char *));
1360 case BT_IO_OPT_SOURCE_BDADDR:
1361 bacpy(va_arg(args, bdaddr_t *), &src.sco_bdaddr);
1363 case BT_IO_OPT_DEST:
1364 ba2str(&dst.sco_bdaddr, va_arg(args, char *));
1366 case BT_IO_OPT_DEST_BDADDR:
1367 bacpy(va_arg(args, bdaddr_t *), &dst.sco_bdaddr);
1370 case BT_IO_OPT_IMTU:
1371 case BT_IO_OPT_OMTU:
1372 *(va_arg(args, uint16_t *)) = sco_opt.mtu;
1374 case BT_IO_OPT_HANDLE:
1375 if (sco_get_info(sock, &handle, dev_class) < 0) {
1376 ERROR_FAILED(err, "SCO_CONNINFO", errno);
1379 *(va_arg(args, uint16_t *)) = handle;
1381 case BT_IO_OPT_CLASS:
1382 if (sco_get_info(sock, &handle, dev_class) < 0) {
1383 ERROR_FAILED(err, "SCO_CONNINFO", errno);
1386 memcpy(va_arg(args, uint8_t *), dev_class, 3);
1388 case BT_IO_OPT_SOURCE_TYPE:
1389 case BT_IO_OPT_DEST_TYPE:
1390 case BT_IO_OPT_DEFER_TIMEOUT:
1391 case BT_IO_OPT_SEC_LEVEL:
1392 case BT_IO_OPT_KEY_SIZE:
1393 case BT_IO_OPT_CHANNEL:
1394 case BT_IO_OPT_SOURCE_CHANNEL:
1395 case BT_IO_OPT_DEST_CHANNEL:
1398 case BT_IO_OPT_MASTER:
1399 case BT_IO_OPT_MODE:
1400 case BT_IO_OPT_FLUSHABLE:
1401 case BT_IO_OPT_PRIORITY:
1402 case BT_IO_OPT_VOICE:
1403 case BT_IO_OPT_INVALID:
1405 g_set_error(err, BT_IO_ERROR, EINVAL,
1406 "Unknown option %d", opt);
1410 opt = va_arg(args, int);
1416 static gboolean get_valist(GIOChannel *io, BtIOType type, GError **err,
1417 BtIOOption opt1, va_list args)
1421 sock = g_io_channel_unix_get_fd(io);
1425 return l2cap_get(sock, err, opt1, args);
1427 return rfcomm_get(sock, err, opt1, args);
1429 return sco_get(sock, err, opt1, args);
1432 g_set_error(err, BT_IO_ERROR, EINVAL,
1433 "Unknown BtIO type %d", type);
1438 gboolean bt_io_accept(GIOChannel *io, BtIOConnect connect, gpointer user_data,
1439 GDestroyNotify destroy, GError **err)
1445 sock = g_io_channel_unix_get_fd(io);
1447 memset(&pfd, 0, sizeof(pfd));
1449 pfd.events = POLLOUT;
1451 if (poll(&pfd, 1, 0) < 0) {
1452 ERROR_FAILED(err, "poll", errno);
1456 if (!(pfd.revents & POLLOUT)) {
1457 if (read(sock, &c, 1) < 0) {
1458 ERROR_FAILED(err, "read", errno);
1463 accept_add(io, connect, user_data, destroy);
1468 gboolean bt_io_set(GIOChannel *io, GError **err, BtIOOption opt1, ...)
1472 struct set_opts opts;
1476 va_start(args, opt1);
1477 ret = parse_set_opts(&opts, err, opt1, args);
1483 type = bt_io_get_type(io, err);
1484 if (type == BT_IO_INVALID)
1487 sock = g_io_channel_unix_get_fd(io);
1491 return l2cap_set(sock, opts.src_type, opts.sec_level, opts.imtu,
1492 opts.omtu, opts.mode, opts.master,
1493 opts.flushable, opts.priority, err);
1495 return rfcomm_set(sock, opts.sec_level, opts.master, err);
1497 return sco_set(sock, opts.mtu, opts.voice, err);
1500 g_set_error(err, BT_IO_ERROR, EINVAL,
1501 "Unknown BtIO type %d", type);
1507 gboolean bt_io_get(GIOChannel *io, GError **err, BtIOOption opt1, ...)
1513 type = bt_io_get_type(io, err);
1514 if (type == BT_IO_INVALID)
1517 va_start(args, opt1);
1518 ret = get_valist(io, type, err, opt1, args);
1524 static GIOChannel *create_io(gboolean server, struct set_opts *opts,
1530 switch (opts->type) {
1532 sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
1534 ERROR_FAILED(err, "socket(SEQPACKET, L2CAP)", errno);
1537 if (l2cap_bind(sock, &opts->src, opts->src_type,
1538 server ? opts->psm : 0, opts->cid, err) < 0)
1540 if (!l2cap_set(sock, opts->src_type, opts->sec_level,
1541 opts->imtu, opts->omtu, opts->mode,
1542 opts->master, opts->flushable, opts->priority,
1547 sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
1549 ERROR_FAILED(err, "socket(STREAM, RFCOMM)", errno);
1552 if (rfcomm_bind(sock, &opts->src,
1553 server ? opts->channel : 0, err) < 0)
1555 if (!rfcomm_set(sock, opts->sec_level, opts->master, err))
1559 sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);
1561 ERROR_FAILED(err, "socket(SEQPACKET, SCO)", errno);
1564 if (sco_bind(sock, &opts->src, err) < 0)
1566 if (!sco_set(sock, opts->mtu, opts->voice, err))
1571 g_set_error(err, BT_IO_ERROR, EINVAL,
1572 "Unknown BtIO type %d", opts->type);
1576 io = g_io_channel_unix_new(sock);
1578 g_io_channel_set_close_on_unref(io, TRUE);
1579 g_io_channel_set_flags(io, G_IO_FLAG_NONBLOCK, NULL);
1589 GIOChannel *bt_io_connect(BtIOConnect connect, gpointer user_data,
1590 GDestroyNotify destroy, GError **gerr,
1591 BtIOOption opt1, ...)
1595 struct set_opts opts;
1599 va_start(args, opt1);
1600 ret = parse_set_opts(&opts, gerr, opt1, args);
1606 io = create_io(FALSE, &opts, gerr);
1610 sock = g_io_channel_unix_get_fd(io);
1612 switch (opts.type) {
1614 err = l2cap_connect(sock, &opts.dst, opts.dst_type,
1615 opts.psm, opts.cid);
1618 err = rfcomm_connect(sock, &opts.dst, opts.channel);
1621 err = sco_connect(sock, &opts.dst);
1625 g_set_error(gerr, BT_IO_ERROR, EINVAL,
1626 "Unknown BtIO type %d", opts.type);
1631 ERROR_FAILED(gerr, "connect", -err);
1632 g_io_channel_unref(io);
1636 connect_add(io, connect, user_data, destroy);
1641 GIOChannel *bt_io_listen(BtIOConnect connect, BtIOConfirm confirm,
1642 gpointer user_data, GDestroyNotify destroy,
1643 GError **err, BtIOOption opt1, ...)
1647 struct set_opts opts;
1651 va_start(args, opt1);
1652 ret = parse_set_opts(&opts, err, opt1, args);
1658 io = create_io(TRUE, &opts, err);
1662 sock = g_io_channel_unix_get_fd(io);
1665 setsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP, &opts.defer,
1666 sizeof(opts.defer));
1668 if (listen(sock, 5) < 0) {
1669 ERROR_FAILED(err, "listen", errno);
1670 g_io_channel_unref(io);
1674 server_add(io, connect, confirm, user_data, destroy);
1679 GQuark bt_io_error_quark(void)
1681 return g_quark_from_static_string("bt-io-error-quark");