diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2013-10-13 07:04:24 -0700 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2013-10-13 07:04:24 -0700 |
commit | 213d27cce0f1f4ec2e0908c5d79e9d8bd29b72ec (patch) | |
tree | f5ce145314f3ade7eda11d3b609087fa37479aec /tools/l2test.c | |
parent | 89bbe0aed8df436f49ca3adf05379fcf1e6e951e (diff) | |
download | bluez-213d27cce0f1f4ec2e0908c5d79e9d8bd29b72ec.tar.gz |
tools: Print L2CAP address information of connections
Diffstat (limited to 'tools/l2test.c')
-rw-r--r-- | tools/l2test.c | 73 |
1 files changed, 67 insertions, 6 deletions
diff --git a/tools/l2test.c b/tools/l2test.c index a105ca6a2..125532b83 100644 --- a/tools/l2test.c +++ b/tools/l2test.c @@ -120,8 +120,8 @@ static int chan_policy = -1; static int bdaddr_type = 0; struct lookup_table { - char *name; - int flag; + const char *name; + int flag; }; static struct lookup_table l2cap_modes[] = { @@ -160,6 +160,17 @@ static int get_lookup_flag(struct lookup_table *table, char *name) return -1; } +static const char *get_lookup_str(struct lookup_table *table, int flag) +{ + int i; + + for (i = 0; table[i].name; i++) + if (table[i].flag == flag) + return table[i].name; + + return NULL; +} + static void print_lookup_values(struct lookup_table *table, char *header) { int i; @@ -254,6 +265,7 @@ static int do_connect(char *svr) struct l2cap_conninfo conn; socklen_t optlen; int sk, opt; + char ba[18]; /* Create socket */ sk = socket(PF_BLUETOOTH, socktype, BTPROTO_L2CAP); @@ -418,7 +430,37 @@ static int do_connect(char *svr) goto error; } - syslog(LOG_INFO, "Connected [imtu %d, omtu %d, flush_to %d, " + /* Check for remote address */ + memset(&addr, 0, sizeof(addr)); + optlen = sizeof(addr); + + if (getpeername(sk, (struct sockaddr *) &addr, &optlen) < 0) { + syslog(LOG_ERR, "Can't get socket name: %s (%d)", + strerror(errno), errno); + goto error; + } + + ba2str(&addr.l2_bdaddr, ba); + syslog(LOG_INFO, "Connected to %s (%s, psm %d, scid %d)", ba, + get_lookup_str(bdaddr_types, addr.l2_bdaddr_type), + addr.l2_psm, addr.l2_cid); + + /* Check for socket address */ + memset(&addr, 0, sizeof(addr)); + optlen = sizeof(addr); + + if (getsockname(sk, (struct sockaddr *) &addr, &optlen) < 0) { + syslog(LOG_ERR, "Can't get socket name: %s (%d)", + strerror(errno), errno); + goto error; + } + + ba2str(&addr.l2_bdaddr, ba); + syslog(LOG_INFO, "Local device %s (%s, psm %d, scid %d)", ba, + get_lookup_str(bdaddr_types, addr.l2_bdaddr_type), + addr.l2_psm, addr.l2_cid); + + syslog(LOG_INFO, "Options [imtu %d, omtu %d, flush_to %d, " "mode %d, handle %d, class 0x%02x%02x%02x, priority %d, rcvbuf %d]", opts.imtu, opts.omtu, opts.flush_to, opts.mode, conn.hci_handle, conn.dev_class[2], conn.dev_class[1], conn.dev_class[0], opt, @@ -610,7 +652,7 @@ static void do_listen(void (*handler)(int sk)) } } - if (priority > 0 && setsockopt(sk, SOL_SOCKET, SO_PRIORITY, + if (priority > 0 && setsockopt(nsk, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority)) < 0) { syslog(LOG_ERR, "Can't set socket priority: %s (%d)", strerror(errno), errno); @@ -626,10 +668,29 @@ static void do_listen(void (*handler)(int sk)) } ba2str(&addr.l2_bdaddr, ba); - syslog(LOG_INFO, "Connect from %s [imtu %d, omtu %d, " + syslog(LOG_INFO, "Connect from %s (%s, psm %d, dcid %d)", ba, + get_lookup_str(bdaddr_types, addr.l2_bdaddr_type), + addr.l2_psm, addr.l2_cid); + + /* Check for socket address */ + memset(&addr, 0, sizeof(addr)); + optlen = sizeof(addr); + + if (getsockname(nsk, (struct sockaddr *) &addr, &optlen) < 0) { + syslog(LOG_ERR, "Can't get socket name: %s (%d)", + strerror(errno), errno); + goto error; + } + + ba2str(&addr.l2_bdaddr, ba); + syslog(LOG_INFO, "Local device %s (%s, psm %d, scid %d)", ba, + get_lookup_str(bdaddr_types, addr.l2_bdaddr_type), + addr.l2_psm, addr.l2_cid); + + syslog(LOG_INFO, "Options [imtu %d, omtu %d, " "flush_to %d, mode %d, handle %d, " "class 0x%02x%02x%02x, priority %d, rcvbuf %d]", - ba, opts.imtu, opts.omtu, opts.flush_to, + opts.imtu, opts.omtu, opts.flush_to, opts.mode, conn.hci_handle, conn.dev_class[2], conn.dev_class[1], conn.dev_class[0], opt, rcvbuf); |