3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2000-2001 Qualcomm Incorporated
6 * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
7 * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
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
41 #include <sys/ioctl.h>
42 #include <sys/socket.h>
44 #include <bluetooth/bluetooth.h>
45 #include <bluetooth/hci.h>
46 #include <bluetooth/hci_lib.h>
47 #include <bluetooth/l2cap.h>
49 #define NIBBLE_TO_ASCII(c) ((c) < 0x0a ? (c) + 0x30 : (c) + 0x57)
69 static unsigned char *buf;
72 static int imtu = 672;
75 /* Default FCS option */
76 static int fcs = 0x01;
78 /* Default Transmission Window */
79 static int txwin_size = 63;
81 /* Default Max Transmission */
82 static int max_transmit = 3;
84 /* Default data size */
85 static long data_size = -1;
86 static long buffer_size = 2048;
88 /* Default addr and psm and cid */
89 static bdaddr_t bdaddr;
90 #ifdef __TIZEN_PATCH__
91 static unsigned short psm = 0;
93 static unsigned short psm = 0x1011;
95 static unsigned short cid = 0;
97 /* Default number of frames to send (-1 = infinite) */
98 static int num_frames = -1;
100 /* Default number of consecutive frames before the delay */
101 static int count = 1;
103 /* Default delay after sending count number of frames */
104 static unsigned long send_delay = 0;
106 /* Default delay before receiving */
107 static unsigned long recv_delay = 0;
109 static char *filename = NULL;
111 static int rfcmode = 0;
112 static int master = 0;
114 static int encrypt = 0;
115 static int secure = 0;
116 static int socktype = SOCK_SEQPACKET;
117 static int linger = 0;
118 static int reliable = 0;
119 static int timestamp = 0;
120 static int defer_setup = 0;
121 static int priority = -1;
122 static int rcvbuf = 0;
123 static int chan_policy = -1;
124 static int bdaddr_type = 0;
126 struct lookup_table {
131 static struct lookup_table l2cap_modes[] = {
132 { "basic", L2CAP_MODE_BASIC },
134 { "flowctl", L2CAP_MODE_FLOWCTL },
135 { "retrans", L2CAP_MODE_RETRANS },
137 { "ertm", L2CAP_MODE_ERTM },
138 { "streaming", L2CAP_MODE_STREAMING },
142 static struct lookup_table chan_policies[] = {
143 { "bredr", BT_CHANNEL_POLICY_BREDR_ONLY },
144 { "bredr_pref", BT_CHANNEL_POLICY_BREDR_PREFERRED },
145 { "amp_pref", BT_CHANNEL_POLICY_AMP_PREFERRED },
149 static struct lookup_table bdaddr_types[] = {
150 { "bredr", BDADDR_BREDR },
151 { "le_public", BDADDR_LE_PUBLIC },
152 { "le_random", BDADDR_LE_RANDOM },
156 static int get_lookup_flag(struct lookup_table *table, char *name)
160 for (i = 0; table[i].name; i++)
161 if (!strcasecmp(table[i].name, name))
162 return table[i].flag;
167 static void print_lookup_values(struct lookup_table *table, char *header)
171 printf("%s\n", header);
173 for (i = 0; table[i].name; i++)
174 printf("\t%s\n", table[i].name);
177 static float tv2fl(struct timeval tv)
179 return (float)tv.tv_sec + (float)(tv.tv_usec/1000000.0);
182 static char *ltoh(unsigned long c, char* s)
186 c1 = (c >> 28) & 0x0f;
187 *(s++) = NIBBLE_TO_ASCII (c1);
188 c1 = (c >> 24) & 0x0f;
189 *(s++) = NIBBLE_TO_ASCII (c1);
190 c1 = (c >> 20) & 0x0f;
191 *(s++) = NIBBLE_TO_ASCII (c1);
192 c1 = (c >> 16) & 0x0f;
193 *(s++) = NIBBLE_TO_ASCII (c1);
194 c1 = (c >> 12) & 0x0f;
195 *(s++) = NIBBLE_TO_ASCII (c1);
196 c1 = (c >> 8) & 0x0f;
197 *(s++) = NIBBLE_TO_ASCII (c1);
198 c1 = (c >> 4) & 0x0f;
199 *(s++) = NIBBLE_TO_ASCII (c1);
201 *(s++) = NIBBLE_TO_ASCII (c1);
206 static char *ctoh(char c, char* s)
210 c1 = (c >> 4) & 0x0f;
211 *(s++) = NIBBLE_TO_ASCII (c1);
213 *(s++) = NIBBLE_TO_ASCII (c1);
218 static void hexdump(unsigned char *s, unsigned long l)
222 unsigned long i, n = 0;
232 for (i = 0; i < 16; i++) {
237 pb = ctoh (*(s + i), pb);
241 for (i = 0; i < 16; i++) {
245 *(pb++) = (isprint (*(s + i)) ? *(s + i) : '.');
254 static int do_connect(char *svr)
256 struct sockaddr_l2 addr;
257 struct l2cap_options opts;
258 struct l2cap_conninfo conn;
263 sk = socket(PF_BLUETOOTH, socktype, BTPROTO_L2CAP);
265 syslog(LOG_ERR, "Can't create socket: %s (%d)",
266 strerror(errno), errno);
270 /* Bind to local address */
271 memset(&addr, 0, sizeof(addr));
272 addr.l2_family = AF_BLUETOOTH;
273 bacpy(&addr.l2_bdaddr, &bdaddr);
275 if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
276 syslog(LOG_ERR, "Can't bind socket: %s (%d)",
277 strerror(errno), errno);
281 /* Get default options */
282 memset(&opts, 0, sizeof(opts));
283 optlen = sizeof(opts);
285 if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, &optlen) < 0) {
286 syslog(LOG_ERR, "Can't get default L2CAP options: %s (%d)",
287 strerror(errno), errno);
291 /* Set new options */
297 opts.txwin_size = txwin_size;
298 opts.max_tx = max_transmit;
300 if (setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, sizeof(opts)) < 0) {
301 syslog(LOG_ERR, "Can't set L2CAP options: %s (%d)",
302 strerror(errno), errno);
307 /* Enable SO_TIMESTAMP */
311 if (setsockopt(sk, SOL_SOCKET, SO_TIMESTAMP, &t, sizeof(t)) < 0) {
312 syslog(LOG_ERR, "Can't enable SO_TIMESTAMP: %s (%d)",
313 strerror(errno), errno);
319 if (chan_policy != -1) {
320 if (setsockopt(sk, SOL_BLUETOOTH, BT_CHANNEL_POLICY,
321 &chan_policy, sizeof(chan_policy)) < 0) {
322 syslog(LOG_ERR, "Can't enable chan policy : %s (%d)",
323 strerror(errno), errno);
328 /* Enable SO_LINGER */
330 struct linger l = { .l_onoff = 1, .l_linger = linger };
332 if (setsockopt(sk, SOL_SOCKET, SO_LINGER, &l, sizeof(l)) < 0) {
333 syslog(LOG_ERR, "Can't enable SO_LINGER: %s (%d)",
334 strerror(errno), errno);
342 opt |= L2CAP_LM_RELIABLE;
344 opt |= L2CAP_LM_MASTER;
346 opt |= L2CAP_LM_AUTH;
348 opt |= L2CAP_LM_ENCRYPT;
350 opt |= L2CAP_LM_SECURE;
352 if (setsockopt(sk, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt)) < 0) {
353 syslog(LOG_ERR, "Can't set L2CAP link mode: %s (%d)",
354 strerror(errno), errno);
358 /* Set receive buffer size */
359 if (rcvbuf && setsockopt(sk, SOL_SOCKET, SO_RCVBUF,
360 &rcvbuf, sizeof(rcvbuf)) < 0) {
361 syslog(LOG_ERR, "Can't set socket rcv buf size: %s (%d)",
362 strerror(errno), errno);
366 optlen = sizeof(rcvbuf);
367 if (getsockopt(sk, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &optlen) < 0) {
368 syslog(LOG_ERR, "Can't get socket rcv buf size: %s (%d)",
369 strerror(errno), errno);
373 /* Connect to remote device */
374 memset(&addr, 0, sizeof(addr));
375 addr.l2_family = AF_BLUETOOTH;
376 str2ba(svr, &addr.l2_bdaddr);
377 addr.l2_bdaddr_type = bdaddr_type;
379 addr.l2_cid = htobs(cid);
381 addr.l2_psm = htobs(psm);
382 #ifndef __TIZEN_PATCH__
387 if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0 ) {
388 syslog(LOG_ERR, "Can't connect: %s (%d)",
389 strerror(errno), errno);
393 /* Get current options */
394 memset(&opts, 0, sizeof(opts));
395 optlen = sizeof(opts);
397 if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, &optlen) < 0) {
398 syslog(LOG_ERR, "Can't get L2CAP options: %s (%d)",
399 strerror(errno), errno);
403 /* Get connection information */
404 memset(&conn, 0, sizeof(conn));
405 optlen = sizeof(conn);
407 if (getsockopt(sk, SOL_L2CAP, L2CAP_CONNINFO, &conn, &optlen) < 0) {
408 syslog(LOG_ERR, "Can't get L2CAP connection information: %s (%d)",
409 strerror(errno), errno);
413 if (priority > 0 && setsockopt(sk, SOL_SOCKET, SO_PRIORITY, &priority,
414 sizeof(priority)) < 0) {
415 syslog(LOG_ERR, "Can't set socket priority: %s (%d)",
416 strerror(errno), errno);
420 if (getsockopt(sk, SOL_SOCKET, SO_PRIORITY, &opt, &optlen) < 0) {
421 syslog(LOG_ERR, "Can't get socket priority: %s (%d)",
422 strerror(errno), errno);
426 syslog(LOG_INFO, "Connected [imtu %d, omtu %d, flush_to %d, "
427 "mode %d, handle %d, class 0x%02x%02x%02x, priority %d, rcvbuf %d]",
428 opts.imtu, opts.omtu, opts.flush_to, opts.mode, conn.hci_handle,
429 conn.dev_class[2], conn.dev_class[1], conn.dev_class[0], opt,
432 omtu = (opts.omtu > buffer_size) ? buffer_size : opts.omtu;
433 imtu = (opts.imtu > buffer_size) ? buffer_size : opts.imtu;
442 static void do_listen(void (*handler)(int sk))
444 struct sockaddr_l2 addr;
445 struct l2cap_options opts;
446 struct l2cap_conninfo conn;
452 sk = socket(PF_BLUETOOTH, socktype, BTPROTO_L2CAP);
454 syslog(LOG_ERR, "Can't create socket: %s (%d)",
455 strerror(errno), errno);
459 /* Bind to local address */
460 memset(&addr, 0, sizeof(addr));
461 addr.l2_family = AF_BLUETOOTH;
462 bacpy(&addr.l2_bdaddr, &bdaddr);
464 addr.l2_cid = htobs(cid);
466 addr.l2_psm = htobs(psm);
470 if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
471 syslog(LOG_ERR, "Can't bind socket: %s (%d)",
472 strerror(errno), errno);
479 opt |= L2CAP_LM_RELIABLE;
481 opt |= L2CAP_LM_MASTER;
483 opt |= L2CAP_LM_AUTH;
485 opt |= L2CAP_LM_ENCRYPT;
487 opt |= L2CAP_LM_SECURE;
489 if (opt && setsockopt(sk, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt)) < 0) {
490 syslog(LOG_ERR, "Can't set L2CAP link mode: %s (%d)",
491 strerror(errno), errno);
495 /* Get default options */
496 memset(&opts, 0, sizeof(opts));
497 optlen = sizeof(opts);
499 if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, &optlen) < 0) {
500 syslog(LOG_ERR, "Can't get default L2CAP options: %s (%d)",
501 strerror(errno), errno);
505 /* Set new options */
512 opts.txwin_size = txwin_size;
513 opts.max_tx = max_transmit;
515 if (setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, sizeof(opts)) < 0) {
516 syslog(LOG_ERR, "Can't set L2CAP options: %s (%d)",
517 strerror(errno), errno);
521 if (socktype == SOCK_DGRAM) {
526 /* Enable deferred setup */
529 if (opt && setsockopt(sk, SOL_BLUETOOTH, BT_DEFER_SETUP,
530 &opt, sizeof(opt)) < 0) {
531 syslog(LOG_ERR, "Can't enable deferred setup : %s (%d)",
532 strerror(errno), errno);
537 /* Listen for connections */
538 if (listen(sk, 10)) {
539 syslog(LOG_ERR, "Can not listen on the socket: %s (%d)",
540 strerror(errno), errno);
544 /* Check for socket address */
545 memset(&addr, 0, sizeof(addr));
546 optlen = sizeof(addr);
548 if (getsockname(sk, (struct sockaddr *) &addr, &optlen) < 0) {
549 syslog(LOG_ERR, "Can't get socket name: %s (%d)",
550 strerror(errno), errno);
554 psm = btohs(addr.l2_psm);
555 cid = btohs(addr.l2_cid);
557 syslog(LOG_INFO, "Waiting for connection on psm %d ...", psm);
560 memset(&addr, 0, sizeof(addr));
561 optlen = sizeof(addr);
563 nsk = accept(sk, (struct sockaddr *) &addr, &optlen);
565 syslog(LOG_ERR, "Accept failed: %s (%d)",
566 strerror(errno), errno);
577 /* Set receive buffer size */
578 if (rcvbuf && setsockopt(nsk, SOL_SOCKET, SO_RCVBUF, &rcvbuf,
579 sizeof(rcvbuf)) < 0) {
580 syslog(LOG_ERR, "Can't set rcv buf size: %s (%d)",
581 strerror(errno), errno);
585 optlen = sizeof(rcvbuf);
586 if (getsockopt(nsk, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &optlen)
588 syslog(LOG_ERR, "Can't get rcv buf size: %s (%d)",
589 strerror(errno), errno);
593 /* Get current options */
594 memset(&opts, 0, sizeof(opts));
595 optlen = sizeof(opts);
597 if (getsockopt(nsk, SOL_L2CAP, L2CAP_OPTIONS, &opts, &optlen) < 0) {
598 syslog(LOG_ERR, "Can't get L2CAP options: %s (%d)",
599 strerror(errno), errno);
606 /* Get connection information */
607 memset(&conn, 0, sizeof(conn));
608 optlen = sizeof(conn);
610 if (getsockopt(nsk, SOL_L2CAP, L2CAP_CONNINFO, &conn, &optlen) < 0) {
611 syslog(LOG_ERR, "Can't get L2CAP connection information: %s (%d)",
612 strerror(errno), errno);
619 if (priority > 0 && setsockopt(sk, SOL_SOCKET, SO_PRIORITY,
620 &priority, sizeof(priority)) < 0) {
621 syslog(LOG_ERR, "Can't set socket priority: %s (%d)",
622 strerror(errno), errno);
627 optlen = sizeof(priority);
628 if (getsockopt(nsk, SOL_SOCKET, SO_PRIORITY, &opt, &optlen) < 0) {
629 syslog(LOG_ERR, "Can't get socket priority: %s (%d)",
630 strerror(errno), errno);
634 ba2str(&addr.l2_bdaddr, ba);
635 syslog(LOG_INFO, "Connect from %s [imtu %d, omtu %d, "
636 "flush_to %d, mode %d, handle %d, "
637 "class 0x%02x%02x%02x, priority %d, rcvbuf %d]",
638 ba, opts.imtu, opts.omtu, opts.flush_to,
639 opts.mode, conn.hci_handle, conn.dev_class[2],
640 conn.dev_class[1], conn.dev_class[0], opt,
643 omtu = (opts.omtu > buffer_size) ? buffer_size : opts.omtu;
644 imtu = (opts.imtu > buffer_size) ? buffer_size : opts.imtu;
647 /* Enable SO_TIMESTAMP */
651 if (setsockopt(nsk, SOL_SOCKET, SO_TIMESTAMP, &t, sizeof(t)) < 0) {
652 syslog(LOG_ERR, "Can't enable SO_TIMESTAMP: %s (%d)",
653 strerror(errno), errno);
659 /* Enable SO_LINGER */
661 struct linger l = { .l_onoff = 1, .l_linger = linger };
663 if (setsockopt(nsk, SOL_SOCKET, SO_LINGER, &l, sizeof(l)) < 0) {
664 syslog(LOG_ERR, "Can't enable SO_LINGER: %s (%d)",
665 strerror(errno), errno);
671 /* Handle deferred setup */
673 syslog(LOG_INFO, "Waiting for %d seconds",
674 abs(defer_setup) - 1);
675 sleep(abs(defer_setup) - 1);
677 if (defer_setup < 0) {
685 syslog(LOG_INFO, "Disconnect: %m");
696 static void dump_mode(int sk)
705 len = read(sk, buf, sizeof(buf));
707 syslog(LOG_ERR, "Initial read error: %s (%d)",
708 strerror(errno), errno);
710 syslog(LOG_INFO, "Initial bytes %d", len);
713 syslog(LOG_INFO, "Receiving ...");
720 if (select(sk + 1, &rset, NULL, NULL, NULL) < 0)
723 if (!FD_ISSET(sk, &rset))
726 len = read(sk, buf, data_size);
729 if (reliable && (errno == ECOMM)) {
730 syslog(LOG_INFO, "L2CAP Error ECOMM - clearing error and continuing.");
731 optlen = sizeof(opt);
732 if (getsockopt(sk, SOL_SOCKET, SO_ERROR, &opt, &optlen) < 0) {
733 syslog(LOG_ERR, "Couldn't getsockopt(SO_ERROR): %s (%d)",
734 strerror(errno), errno);
739 syslog(LOG_ERR, "Read error: %s(%d)",
740 strerror(errno), errno);
746 syslog(LOG_INFO, "Recevied %d bytes", len);
751 static void recv_mode(int sk)
753 struct timeval tv_beg, tv_end, tv_diff;
765 len = read(sk, buf, sizeof(buf));
767 syslog(LOG_ERR, "Initial read error: %s (%d)",
768 strerror(errno), errno);
770 syslog(LOG_INFO, "Initial bytes %d", len);
776 syslog(LOG_INFO, "Receiving ...");
778 memset(ts, 0, sizeof(ts));
781 p.events = POLLIN | POLLERR | POLLHUP;
785 gettimeofday(&tv_beg, NULL);
787 while (total < data_size) {
793 if (poll(&p, 1, -1) <= 0)
796 if (p.revents & (POLLERR | POLLHUP))
799 len = recv(sk, buf, data_size, 0);
801 if (reliable && (errno == ECOMM)) {
802 syslog(LOG_INFO, "L2CAP Error ECOMM - clearing error and continuing.\n");
803 optlen = sizeof(opt);
804 if (getsockopt(sk, SOL_SOCKET, SO_ERROR, &opt, &optlen) < 0) {
805 syslog(LOG_ERR, "Couldn't getsockopt(SO_ERROR): %s (%d)",
806 strerror(errno), errno);
811 syslog(LOG_ERR, "Read failed: %s (%d)",
812 strerror(errno), errno);
822 if (ioctl(sk, SIOCGSTAMP, &tv) < 0) {
824 memset(ts, 0, sizeof(ts));
826 sprintf(ts, "[%ld.%ld] ",
827 tv.tv_sec, tv.tv_usec);
832 sq = btohl(*(uint32_t *) buf);
834 syslog(LOG_INFO, "seq missmatch: %d -> %d", seq, sq);
840 l = btohs(*(uint16_t *) (buf + 4));
842 syslog(LOG_INFO, "size missmatch: %d -> %d", len, l);
847 for (i = 6; i < len; i++) {
849 syslog(LOG_INFO, "data missmatch: byte %d 0x%2.2x", i, buf[i]);
854 gettimeofday(&tv_end, NULL);
856 timersub(&tv_end, &tv_beg, &tv_diff);
858 syslog(LOG_INFO,"%s%ld bytes in %.2f sec, %.2f kB/s", ts, total,
859 tv2fl(tv_diff), (float)(total / tv2fl(tv_diff) ) / 1024.0);
863 static void do_send(int sk)
866 int i, fd, len, buflen, size, sent;
868 syslog(LOG_INFO, "Sending ...");
874 fd = open(filename, O_RDONLY);
876 syslog(LOG_ERR, "Open failed: %s (%d)",
877 strerror(errno), errno);
882 size = read(fd, buf, data_size);
884 buflen = (size > omtu) ? omtu : size;
886 len = send(sk, buf + sent, buflen, 0);
893 for (i = 6; i < data_size; i++)
898 while ((num_frames == -1) || (num_frames-- > 0)) {
899 *(uint32_t *) buf = htobl(seq);
900 *(uint16_t *) (buf + 4) = htobs(data_size);
906 buflen = (size > omtu) ? omtu : size;
908 len = send(sk, buf, buflen, 0);
909 if (len < 0 || len != buflen) {
910 syslog(LOG_ERR, "Send failed: %s (%d)",
911 strerror(errno), errno);
919 if (num_frames && send_delay && count && !(seq % count))
924 static void send_mode(int sk)
928 syslog(LOG_INFO, "Closing channel ...");
929 if (shutdown(sk, SHUT_RDWR) < 0)
930 syslog(LOG_INFO, "Close failed: %m");
932 syslog(LOG_INFO, "Done");
935 static void senddump_mode(int sk)
942 static void send_and_recv_mode(int sk)
946 if ((flags = fcntl(sk, F_GETFL, 0)) < 0)
948 fcntl(sk, F_SETFL, flags | O_NONBLOCK);
950 /* fork for duplex channel */
958 static void reconnect_mode(char *svr)
961 int sk = do_connect(svr);
966 static void connect_mode(char *svr)
971 if ((sk = do_connect(svr)) < 0)
975 p.events = POLLERR | POLLHUP;
979 if (poll(&p, 1, 500))
983 syslog(LOG_INFO, "Disconnected");
988 static void multi_connect_mode(int argc, char *argv[])
993 for (n = 0; n < argc; n++) {
994 for (i = 0; i < count; i++) {
999 sk = do_connect(argv[n]);
1009 static void info_request(char *svr)
1011 unsigned char buf[48];
1012 l2cap_cmd_hdr *cmd = (l2cap_cmd_hdr *) buf;
1013 l2cap_info_req *req = (l2cap_info_req *) (buf + L2CAP_CMD_HDR_SIZE);
1014 l2cap_info_rsp *rsp = (l2cap_info_rsp *) (buf + L2CAP_CMD_HDR_SIZE);
1016 uint32_t channels, mask = 0x0000;
1017 struct sockaddr_l2 addr;
1020 sk = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP);
1022 perror("Can't create socket");
1026 memset(&addr, 0, sizeof(addr));
1027 addr.l2_family = AF_BLUETOOTH;
1028 bacpy(&addr.l2_bdaddr, &bdaddr);
1030 if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
1031 perror("Can't bind socket");
1035 memset(&addr, 0, sizeof(addr));
1036 addr.l2_family = AF_BLUETOOTH;
1037 str2ba(svr, &addr.l2_bdaddr);
1038 addr.l2_bdaddr_type = bdaddr_type;
1040 if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0 ) {
1041 perror("Can't connect socket");
1045 memset(buf, 0, sizeof(buf));
1046 cmd->code = L2CAP_INFO_REQ;
1048 cmd->len = htobs(2);
1049 req->type = htobs(0x0001);
1051 if (send(sk, buf, L2CAP_CMD_HDR_SIZE + L2CAP_INFO_REQ_SIZE, 0) < 0) {
1052 perror("Can't send info request");
1056 err = recv(sk, buf, L2CAP_CMD_HDR_SIZE + L2CAP_INFO_RSP_SIZE + 2, 0);
1058 perror("Can't receive info response");
1062 switch (btohs(rsp->result)) {
1064 memcpy(&mtu, rsp->data, sizeof(mtu));
1065 printf("Connectionless MTU size is %d\n", btohs(mtu));
1068 printf("Connectionless MTU is not supported\n");
1072 memset(buf, 0, sizeof(buf));
1073 cmd->code = L2CAP_INFO_REQ;
1075 cmd->len = htobs(2);
1076 req->type = htobs(0x0002);
1078 if (send(sk, buf, L2CAP_CMD_HDR_SIZE + L2CAP_INFO_REQ_SIZE, 0) < 0) {
1079 perror("Can't send info request");
1083 err = recv(sk, buf, L2CAP_CMD_HDR_SIZE + L2CAP_INFO_RSP_SIZE + 4, 0);
1085 perror("Can't receive info response");
1089 switch (btohs(rsp->result)) {
1091 memcpy(&mask, rsp->data, sizeof(mask));
1092 printf("Extended feature mask is 0x%04x\n", btohl(mask));
1093 if (mask & L2CAP_FEAT_FLOWCTL)
1094 printf(" Flow control mode\n");
1095 if (mask & L2CAP_FEAT_RETRANS)
1096 printf(" Retransmission mode\n");
1097 if (mask & L2CAP_FEAT_BIDIR_QOS)
1098 printf(" Bi-directional QoS\n");
1099 if (mask & L2CAP_FEAT_ERTM)
1100 printf(" Enhanced Retransmission mode\n");
1101 if (mask & L2CAP_FEAT_STREAMING)
1102 printf(" Streaming mode\n");
1103 if (mask & L2CAP_FEAT_FCS)
1104 printf(" FCS Option\n");
1105 if (mask & L2CAP_FEAT_EXT_FLOW)
1106 printf(" Extended Flow Specification\n");
1107 if (mask & L2CAP_FEAT_FIXED_CHAN)
1108 printf(" Fixed Channels\n");
1109 if (mask & L2CAP_FEAT_EXT_WINDOW)
1110 printf(" Extended Window Size\n");
1111 if (mask & L2CAP_FEAT_UCD)
1112 printf(" Unicast Connectionless Data Reception\n");
1115 printf("Extended feature mask is not supported\n");
1122 memset(buf, 0, sizeof(buf));
1123 cmd->code = L2CAP_INFO_REQ;
1125 cmd->len = htobs(2);
1126 req->type = htobs(0x0003);
1128 if (send(sk, buf, L2CAP_CMD_HDR_SIZE + L2CAP_INFO_REQ_SIZE, 0) < 0) {
1129 perror("Can't send info request");
1133 err = recv(sk, buf, L2CAP_CMD_HDR_SIZE + L2CAP_INFO_RSP_SIZE + 8, 0);
1135 perror("Can't receive info response");
1139 switch (btohs(rsp->result)) {
1141 memcpy(&channels, rsp->data, sizeof(channels));
1142 printf("Fixed channels list is 0x%04x\n", btohl(channels));
1145 printf("Fixed channels list is not supported\n");
1153 static void do_pairing(char *svr)
1155 struct sockaddr_l2 addr;
1158 sk = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP);
1160 perror("Can't create socket");
1164 memset(&addr, 0, sizeof(addr));
1165 addr.l2_family = AF_BLUETOOTH;
1166 bacpy(&addr.l2_bdaddr, &bdaddr);
1168 if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
1169 perror("Can't bind socket");
1174 opt = L2CAP_LM_SECURE;
1176 opt = L2CAP_LM_ENCRYPT;
1178 if (setsockopt(sk, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt)) < 0) {
1179 perror("Can't set link mode");
1183 memset(&addr, 0, sizeof(addr));
1184 addr.l2_family = AF_BLUETOOTH;
1185 str2ba(svr, &addr.l2_bdaddr);
1186 addr.l2_bdaddr_type = bdaddr_type;
1188 if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0 ) {
1189 perror("Can't connect socket");
1193 printf("Pairing successful\n");
1199 static void usage(void)
1201 printf("l2test - L2CAP testing\n"
1203 printf("\tl2test <mode> [options] [bdaddr]\n");
1205 "\t-r listen and receive\n"
1206 "\t-w listen and send\n"
1207 "\t-d listen and dump incoming data\n"
1208 "\t-x listen, then send, then dump incoming data\n"
1209 "\t-t listen, then send and receive at the same time\n"
1210 "\t-q connect, then send and receive at the same time\n"
1211 "\t-s connect and send\n"
1212 "\t-u connect and receive\n"
1213 "\t-n connect and be silent\n"
1214 "\t-y connect, then send, then dump incoming data\n"
1215 "\t-c connect, disconnect, connect, ...\n"
1216 "\t-m multiple connects\n"
1217 "\t-p trigger dedicated bonding\n"
1218 "\t-z information request\n");
1221 "\t[-b bytes] [-i device] [-P psm] [-J cid]\n"
1222 "\t[-I imtu] [-O omtu]\n"
1223 "\t[-L seconds] enable SO_LINGER\n"
1224 "\t[-W seconds] enable deferred setup\n"
1225 "\t[-B filename] use data packets from file\n"
1226 "\t[-N num] send num frames (default = infinite)\n"
1227 "\t[-C num] send num frames before delay (default = 1)\n"
1228 "\t[-D milliseconds] delay after sending num frames (default = 0)\n"
1229 "\t[-K milliseconds] delay before receiving (default = 0)\n"
1230 "\t[-X mode] l2cap mode (help for list, default = basic)\n"
1231 "\t[-a policy] chan policy (help for list, default = bredr)\n"
1232 "\t[-F fcs] use CRC16 check (default = 1)\n"
1233 "\t[-Q num] Max Transmit value (default = 3)\n"
1234 "\t[-Z size] Transmission Window size (default = 63)\n"
1235 "\t[-Y priority] socket priority\n"
1236 "\t[-H size] Maximum receive buffer size\n"
1237 "\t[-R] reliable mode\n"
1238 "\t[-G] use connectionless channel (datagram)\n"
1239 "\t[-U] use sock stream\n"
1240 "\t[-A] request authentication\n"
1241 "\t[-E] request encryption\n"
1242 "\t[-S] secure connection\n"
1243 "\t[-M] become master\n"
1244 "\t[-T] enable timestamps\n"
1245 "\t[-V type] address type (help for list, default = bredr)\n");
1248 int main(int argc, char *argv[])
1250 struct sigaction sa;
1251 int opt, sk, mode = RECV, need_addr = 0;
1253 bacpy(&bdaddr, BDADDR_ANY);
1255 while ((opt = getopt(argc, argv, "rdscuwmntqxyzpb:a:"
1256 "i:P:I:O:J:B:N:L:W:C:D:X:F:Q:Z:Y:H:K:V:RUGAESMT")) != EOF) {
1323 data_size = atoi(optarg);
1327 if (!strncasecmp(optarg, "hci", 3))
1328 hci_devba(atoi(optarg + 3), &bdaddr);
1330 str2ba(optarg, &bdaddr);
1338 imtu = atoi(optarg);
1342 omtu = atoi(optarg);
1346 linger = atoi(optarg);
1350 defer_setup = atoi(optarg);
1354 filename = strdup(optarg);
1358 num_frames = atoi(optarg);
1362 count = atoi(optarg);
1366 send_delay = atoi(optarg) * 1000;
1370 recv_delay = atoi(optarg) * 1000;
1374 rfcmode = get_lookup_flag(l2cap_modes, optarg);
1376 if (rfcmode == -1) {
1377 print_lookup_values(l2cap_modes,
1378 "List L2CAP modes:");
1385 chan_policy = get_lookup_flag(chan_policies, optarg);
1387 if (chan_policy == -1) {
1388 print_lookup_values(chan_policies,
1389 "List L2CAP chan policies:");
1396 priority = atoi(optarg);
1424 socktype = SOCK_DGRAM;
1428 socktype = SOCK_STREAM;
1436 max_transmit = atoi(optarg);
1440 txwin_size = atoi(optarg);
1448 rcvbuf = atoi(optarg);
1452 bdaddr_type = get_lookup_flag(bdaddr_types, optarg);
1454 if (bdaddr_type == -1) {
1455 print_lookup_values(bdaddr_types,
1456 "List Address types:");
1468 if (need_addr && !(argc - optind)) {
1474 buffer_size = (omtu > imtu) ? omtu : imtu;
1476 buffer_size = data_size;
1478 if (!(buf = malloc(buffer_size))) {
1479 perror("Can't allocate data buffer");
1483 memset(&sa, 0, sizeof(sa));
1484 sa.sa_handler = SIG_IGN;
1485 sa.sa_flags = SA_NOCLDSTOP;
1486 sigaction(SIGCHLD, &sa, NULL);
1488 openlog("l2test", LOG_PERROR | LOG_PID, LOG_LOCAL0);
1492 do_listen(recv_mode);
1496 sk = do_connect(argv[optind]);
1503 do_listen(dump_mode);
1507 sk = do_connect(argv[optind]);
1514 do_listen(send_mode);
1518 reconnect_mode(argv[optind]);
1522 multi_connect_mode(argc - optind, argv + optind);
1526 connect_mode(argv[optind]);
1530 sk = do_connect(argv[optind]);
1537 do_listen(senddump_mode);
1541 do_listen(send_and_recv_mode);
1545 sk = do_connect(argv[optind]);
1549 send_and_recv_mode(sk);
1553 info_request(argv[optind]);
1557 do_pairing(argv[optind]);
1561 syslog(LOG_INFO, "Exit");