From c98b2f82a4e532ca61592b08e3ad60749eb9f8d7 Mon Sep 17 00:00:00 2001 From: Max Krasnyansky Date: Fri, 8 Mar 2002 21:12:35 +0000 Subject: Initial revision --- tools/l2ping.c | 251 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 tools/l2ping.c (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c new file mode 100644 index 00000000..9bb8a4d6 --- /dev/null +++ b/tools/l2ping.c @@ -0,0 +1,251 @@ +/* + BlueZ - Bluetooth protocol stack for Linux + Copyright (C) 2000-2001 Qualcomm Incorporated + + Written 2000,2001 by Maxim Krasnyansky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 as + published by the Free Software Foundation; + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM, + OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE + USE OR PERFORMANCE OF THIS SOFTWARE. + + ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS, + TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED. +*/ + +/* + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include "bluetooth.h" +#include "l2cap.h" + +/* Defaults */ +bdaddr_t bdaddr; +int size = 20; +int ident = 200; +int delay = 1; +int count = -1; + +/* Stats */ +int sent_pkt = 0, recv_pkt = 0; + +static float tv2fl(struct timeval tv) +{ + return (float)(tv.tv_sec*1000.0) + (float)(tv.tv_usec/1000.0); +} + +static void stat(int sig) +{ + int loss = sent_pkt ? (float)((sent_pkt-recv_pkt)/(sent_pkt/100.0)) : 0; + printf("%d sent, %d received, %d%% loss\n", sent_pkt, recv_pkt, loss); + exit(0); +} + +static void ping(char *svr) +{ + struct sockaddr_l2 addr; + struct sigaction sa; + char buf[2048]; + int s, i, opt, lost; + uint8_t id; + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = stat; + sigaction(SIGINT, &sa, NULL); + + if ((s = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP)) < 0) { + perror("Can't create socket."); + exit(1); + } + + memset(&addr, 0, sizeof(addr)); + addr.l2_family = AF_BLUETOOTH; + addr.l2_bdaddr = bdaddr; + if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + perror("Can't bind socket."); + exit(1); + } + + baswap(&addr.l2_bdaddr, strtoba(svr)); + if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + perror("Can't connect."); + exit(1); + } + + /* Get local address */ + opt = sizeof(addr); + if( getsockname(s, (struct sockaddr *)&addr, &opt) < 0 ) { + perror("Can't get local address."); + exit(1); + } + baswap(&bdaddr, &addr.l2_bdaddr); + + printf("Ping: %s from %s (data size %d) ...\n", svr, batostr(&bdaddr), size); + + /* Initialize buffer */ + for(i = L2CAP_CMD_HDR_SIZE; i < sizeof(buf); i++) + buf[i]=(i%40)+'A'; + + id = ident; + + while( count == -1 || count-- > 0 ){ + struct timeval tv_send, tv_recv, tv_diff; + l2cap_cmd_hdr *cmd = (l2cap_cmd_hdr *) buf; + + /* Build command header */ + cmd->code = L2CAP_ECHO_REQ; + cmd->ident = id; + cmd->len = __cpu_to_le16(size); + + gettimeofday(&tv_send, NULL); + + /* Send Echo Request */ + if( send(s, buf, size + L2CAP_CMD_HDR_SIZE, 0) <= 0 ){ + perror("Send failed"); + exit(1); + } + + /* Wait for Echo Response */ + lost = 0; + while( 1 ) { + struct pollfd pf[1]; + register int err; + + pf[0].fd = s; pf[0].events = POLLIN; + if( (err = poll(pf, 1, 10*1000)) < 0 ) { + perror("Poll failed"); + exit(1); + } + + if( !err ){ + lost = 1; + break; + } + + if( (err = recv(s, buf, sizeof(buf), 0)) < 0 ) { + perror("Recv failed"); + exit(1); + } + + if( !err ){ + printf("Disconnected\n"); + exit(1); + } + + cmd->len = __le16_to_cpu(cmd->len); + + /* Check for our id */ + if( cmd->ident != id ) + continue; + + /* Check type */ + if( cmd->code == L2CAP_ECHO_RSP ) + break; + if( cmd->code == L2CAP_COMMAND_REJ ){ + printf("Peer doesn't support Echo packets\n"); + exit(1); + } + + } + sent_pkt++; + + if( !lost ){ + recv_pkt++; + + gettimeofday(&tv_recv, NULL); + timersub(&tv_recv, &tv_send, &tv_diff); + + printf("%d bytes from %s id %d time %.2fms\n", cmd->len, svr, id, tv2fl(tv_diff)); + + if( delay ) sleep(delay); + } else { + printf("no response from %s: id %d\n", svr, id); + } + + if( ++id > 254 ) id = ident; + } + stat(0); +} + +static void usage(void) +{ + printf("l2ping - L2CAP ping\n"); + printf("Usage:\n"); + printf("\tl2ping [-S source addr] [-s size] [-c count] [-f] \n"); +} + +extern int optind,opterr,optopt; +extern char *optarg; + +int main(int argc, char *argv[]) +{ + register int opt; + + /* Default options */ + bacpy(&bdaddr, BDADDR_ANY); + + while ((opt=getopt(argc,argv,"s:c:fS:")) != EOF) { + switch(opt) { + case 'f': + /* Kinda flood ping */ + delay = 0; + break; + + case 'c': + count = atoi(optarg); + break; + + case 's': + size = atoi(optarg); + break; + + case 'S': + baswap(&bdaddr, strtoba(optarg)); + break; + + default: + usage(); + exit(1); + } + } + + if (!(argc - optind)) { + usage(); + exit(1); + } + + ping(argv[optind]); + + return 0; +} -- cgit From 04c8ddd5a5d720e75144755d071e2331c979d1ed Mon Sep 17 00:00:00 2001 From: Max Krasnyansky Date: Tue, 20 Aug 2002 04:39:54 +0000 Subject: Add 'bluetooth/' to includes --- tools/l2ping.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index 9bb8a4d6..310ba86b 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -47,8 +47,8 @@ #include #include -#include "bluetooth.h" -#include "l2cap.h" +#include +#include /* Defaults */ bdaddr_t bdaddr; -- cgit From 6b410af5c3e83f36ed8b5a620f1ab3029a271058 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Thu, 24 Jul 2003 17:34:34 +0000 Subject: Kill usage of strtoba() and batostr() --- tools/l2ping.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index 310ba86b..d5d7748b 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -77,6 +77,7 @@ static void ping(char *svr) struct sockaddr_l2 addr; struct sigaction sa; char buf[2048]; + char str[18]; int s, i, opt, lost; uint8_t id; @@ -97,7 +98,7 @@ static void ping(char *svr) exit(1); } - baswap(&addr.l2_bdaddr, strtoba(svr)); + str2ba(svr, &addr.l2_bdaddr); if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("Can't connect."); exit(1); @@ -109,9 +110,9 @@ static void ping(char *svr) perror("Can't get local address."); exit(1); } - baswap(&bdaddr, &addr.l2_bdaddr); + ba2str(&addr.l2_bdaddr, str); - printf("Ping: %s from %s (data size %d) ...\n", svr, batostr(&bdaddr), size); + printf("Ping: %s from %s (data size %d) ...\n", svr, str, size); /* Initialize buffer */ for(i = L2CAP_CMD_HDR_SIZE; i < sizeof(buf); i++) @@ -231,7 +232,7 @@ int main(int argc, char *argv[]) break; case 'S': - baswap(&bdaddr, strtoba(optarg)); + str2ba(optarg, &bdaddr); break; default: -- cgit From b66d3f9b2cb8934a0eb7ac07f347001984488ac6 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Wed, 28 Apr 2004 10:39:47 +0000 Subject: Unify copyright and license information --- tools/l2ping.c | 87 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 40 deletions(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index d5d7748b..85d12eee 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -1,30 +1,37 @@ -/* - BlueZ - Bluetooth protocol stack for Linux - Copyright (C) 2000-2001 Qualcomm Incorporated - - Written 2000,2001 by Maxim Krasnyansky - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 as - published by the Free Software Foundation; - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. - IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM, - OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER - RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE - USE OR PERFORMANCE OF THIS SOFTWARE. - - ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS, - TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED. -*/ - /* - * $Id$ + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2000-2001 Qualcomm Incorporated + * Copyright (C) 2002-2003 Maxim Krasnyansky + * Copyright (C) 2002-2004 Marcel Holtmann + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY + * CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, + * COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS + * SOFTWARE IS DISCLAIMED. + * + * + * $Id$ */ +#ifdef HAVE_CONFIG_H +#include +#endif + #include #include #include @@ -93,20 +100,20 @@ static void ping(char *svr) memset(&addr, 0, sizeof(addr)); addr.l2_family = AF_BLUETOOTH; addr.l2_bdaddr = bdaddr; - if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("Can't bind socket."); exit(1); - } + } str2ba(svr, &addr.l2_bdaddr); - if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("Can't connect."); exit(1); } /* Get local address */ opt = sizeof(addr); - if( getsockname(s, (struct sockaddr *)&addr, &opt) < 0 ) { + if (getsockname(s, (struct sockaddr *)&addr, &opt) < 0) { perror("Can't get local address."); exit(1); } @@ -115,7 +122,7 @@ static void ping(char *svr) printf("Ping: %s from %s (data size %d) ...\n", svr, str, size); /* Initialize buffer */ - for(i = L2CAP_CMD_HDR_SIZE; i < sizeof(buf); i++) + for (i = L2CAP_CMD_HDR_SIZE; i < sizeof(buf); i++) buf[i]=(i%40)+'A'; id = ident; @@ -132,34 +139,34 @@ static void ping(char *svr) gettimeofday(&tv_send, NULL); /* Send Echo Request */ - if( send(s, buf, size + L2CAP_CMD_HDR_SIZE, 0) <= 0 ){ + if (send(s, buf, size + L2CAP_CMD_HDR_SIZE, 0) <= 0) { perror("Send failed"); exit(1); } /* Wait for Echo Response */ lost = 0; - while( 1 ) { + while (1) { struct pollfd pf[1]; register int err; pf[0].fd = s; pf[0].events = POLLIN; - if( (err = poll(pf, 1, 10*1000)) < 0 ) { + if ((err = poll(pf, 1, 10*1000)) < 0) { perror("Poll failed"); exit(1); } - if( !err ){ + if (!err) { lost = 1; break; } - if( (err = recv(s, buf, sizeof(buf), 0)) < 0 ) { + if ((err = recv(s, buf, sizeof(buf), 0)) < 0) { perror("Recv failed"); exit(1); } - if( !err ){ + if (!err){ printf("Disconnected\n"); exit(1); } @@ -171,9 +178,9 @@ static void ping(char *svr) continue; /* Check type */ - if( cmd->code == L2CAP_ECHO_RSP ) + if (cmd->code == L2CAP_ECHO_RSP) break; - if( cmd->code == L2CAP_COMMAND_REJ ){ + if (cmd->code == L2CAP_COMMAND_REJ) { printf("Peer doesn't support Echo packets\n"); exit(1); } @@ -181,7 +188,7 @@ static void ping(char *svr) } sent_pkt++; - if( !lost ){ + if (!lost) { recv_pkt++; gettimeofday(&tv_recv, NULL); @@ -189,12 +196,12 @@ static void ping(char *svr) printf("%d bytes from %s id %d time %.2fms\n", cmd->len, svr, id, tv2fl(tv_diff)); - if( delay ) sleep(delay); + if (delay) sleep(delay); } else { printf("no response from %s: id %d\n", svr, id); } - if( ++id > 254 ) id = ident; + if (++id > 254) id = ident; } stat(0); } -- cgit From 4a5bc48ff3c2a2f3acdacc6fc6ee2632687455e7 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Mon, 16 Aug 2004 10:11:10 +0000 Subject: Don't include asm/types.h and asm/byteorder.h --- tools/l2ping.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index 85d12eee..af056bc6 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -51,9 +51,6 @@ #include #include -#include -#include - #include #include @@ -134,7 +131,7 @@ static void ping(char *svr) /* Build command header */ cmd->code = L2CAP_ECHO_REQ; cmd->ident = id; - cmd->len = __cpu_to_le16(size); + cmd->len = htobs(size); gettimeofday(&tv_send, NULL); @@ -171,7 +168,7 @@ static void ping(char *svr) exit(1); } - cmd->len = __le16_to_cpu(cmd->len); + cmd->len = btohs(cmd->len); /* Check for our id */ if( cmd->ident != id ) -- cgit From e7989c831f54770196b92d24d78f80d5c5161352 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Mon, 16 Aug 2004 11:22:22 +0000 Subject: Let the id display start with 0 even if internal it start with 200 --- tools/l2ping.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index af056bc6..1f3f3a41 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -191,7 +191,7 @@ static void ping(char *svr) gettimeofday(&tv_recv, NULL); timersub(&tv_recv, &tv_send, &tv_diff); - printf("%d bytes from %s id %d time %.2fms\n", cmd->len, svr, id, tv2fl(tv_diff)); + printf("%d bytes from %s id %d time %.2fms\n", cmd->len, svr, id - ident, tv2fl(tv_diff)); if (delay) sleep(delay); } else { -- cgit From b089fd9850e50bb0a75dacfb665ec1e85aaa30b4 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Mon, 11 Oct 2004 10:31:33 +0000 Subject: Add timeout option --- tools/l2ping.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index 1f3f3a41..45ddbe92 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -56,10 +56,11 @@ /* Defaults */ bdaddr_t bdaddr; -int size = 20; -int ident = 200; -int delay = 1; -int count = -1; +int size = 20; +int ident = 200; +int delay = 1; +int count = -1; +int timeout = 10; /* Stats */ int sent_pkt = 0, recv_pkt = 0; @@ -120,7 +121,7 @@ static void ping(char *svr) /* Initialize buffer */ for (i = L2CAP_CMD_HDR_SIZE; i < sizeof(buf); i++) - buf[i]=(i%40)+'A'; + buf[i] = (i % 40) + 'A'; id = ident; @@ -148,7 +149,7 @@ static void ping(char *svr) register int err; pf[0].fd = s; pf[0].events = POLLIN; - if ((err = poll(pf, 1, 10*1000)) < 0) { + if ((err = poll(pf, 1, timeout * 1000)) < 0) { perror("Poll failed"); exit(1); } @@ -193,12 +194,14 @@ static void ping(char *svr) printf("%d bytes from %s id %d time %.2fms\n", cmd->len, svr, id - ident, tv2fl(tv_diff)); - if (delay) sleep(delay); + if (delay) + sleep(delay); } else { printf("no response from %s: id %d\n", svr, id); } - if (++id > 254) id = ident; + if (++id > 254) + id = ident; } stat(0); } @@ -207,7 +210,7 @@ static void usage(void) { printf("l2ping - L2CAP ping\n"); printf("Usage:\n"); - printf("\tl2ping [-S source addr] [-s size] [-c count] [-f] \n"); + printf("\tl2ping [-S source addr] [-s size] [-c count] [-t timeout] [-f] \n"); } extern int optind,opterr,optopt; @@ -220,7 +223,7 @@ int main(int argc, char *argv[]) /* Default options */ bacpy(&bdaddr, BDADDR_ANY); - while ((opt=getopt(argc,argv,"s:c:fS:")) != EOF) { + while ((opt=getopt(argc,argv,"s:c:t:fS:")) != EOF) { switch(opt) { case 'f': /* Kinda flood ping */ @@ -231,6 +234,10 @@ int main(int argc, char *argv[]) count = atoi(optarg); break; + case 't': + timeout = atoi(optarg); + break; + case 's': size = atoi(optarg); break; -- cgit From 7a23b4eeb7f7fe7b2becd884fa1e9c5db5deedea Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 28 Jan 2005 17:43:16 +0000 Subject: Support data sizes bigger than 2048 bytes --- tools/l2ping.c | 123 +++++++++++++++++++++++++++++++++------------------------ 1 file changed, 72 insertions(+), 51 deletions(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index 45ddbe92..0e7a4be1 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -4,7 +4,7 @@ * * Copyright (C) 2000-2001 Qualcomm Incorporated * Copyright (C) 2002-2003 Maxim Krasnyansky - * Copyright (C) 2002-2004 Marcel Holtmann + * Copyright (C) 2002-2005 Marcel Holtmann * * * This program is free software; you can redistribute it and/or modify @@ -33,37 +33,32 @@ #endif #include -#include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include #include #include #include #include -#include -#include -#include -#include -#include - #include +#include +#include #include /* Defaults */ -bdaddr_t bdaddr; -int size = 20; -int ident = 200; -int delay = 1; -int count = -1; -int timeout = 10; +static bdaddr_t bdaddr; +static int size = 20; +static int ident = 200; +static int delay = 1; +static int count = -1; +static int timeout = 10; /* Stats */ -int sent_pkt = 0, recv_pkt = 0; +static int sent_pkt = 0; +static int recv_pkt = 0; static float tv2fl(struct timeval tv) { @@ -79,53 +74,77 @@ static void stat(int sig) static void ping(char *svr) { - struct sockaddr_l2 addr; struct sigaction sa; - char buf[2048]; + struct sockaddr_l2 addr; + socklen_t optlen; + unsigned char *buf; char str[18]; - int s, i, opt, lost; + int i, sk, lost; uint8_t id; memset(&sa, 0, sizeof(sa)); sa.sa_handler = stat; sigaction(SIGINT, &sa, NULL); - if ((s = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP)) < 0) { - perror("Can't create socket."); + buf = malloc(L2CAP_CMD_HDR_SIZE + size); + if (!buf) { + perror("Can't allocate buffer"); + exit(1); + } + + /* Create socket */ + sk = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP); + if (sk < 0) { + perror("Can't create socket"); + free(buf); exit(1); } + /* Bind to local address */ memset(&addr, 0, sizeof(addr)); addr.l2_family = AF_BLUETOOTH; - addr.l2_bdaddr = bdaddr; - if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { - perror("Can't bind socket."); + bacpy(&addr.l2_bdaddr, &bdaddr); + + if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + perror("Can't bind socket"); + close(sk); + free(buf); exit(1); } + /* Connect to remote device */ + memset(&addr, 0, sizeof(addr)); + addr.l2_family = AF_BLUETOOTH; str2ba(svr, &addr.l2_bdaddr); - if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { - perror("Can't connect."); + + if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + perror("Can't connect"); + close(sk); + free(buf); exit(1); } /* Get local address */ - opt = sizeof(addr); - if (getsockname(s, (struct sockaddr *)&addr, &opt) < 0) { - perror("Can't get local address."); + memset(&addr, 0, sizeof(addr)); + optlen = sizeof(addr); + + if (getsockname(sk, (struct sockaddr *) &addr, &optlen) < 0) { + perror("Can't get local address"); + close(sk); + free(buf); exit(1); } - ba2str(&addr.l2_bdaddr, str); + ba2str(&addr.l2_bdaddr, str); printf("Ping: %s from %s (data size %d) ...\n", svr, str, size); /* Initialize buffer */ - for (i = L2CAP_CMD_HDR_SIZE; i < sizeof(buf); i++) - buf[i] = (i % 40) + 'A'; + for (i = 0; i < size; i++) + buf[L2CAP_CMD_HDR_SIZE + i] = (i % 40) + 'A'; id = ident; - while( count == -1 || count-- > 0 ){ + while (count == -1 || count-- > 0) { struct timeval tv_send, tv_recv, tv_diff; l2cap_cmd_hdr *cmd = (l2cap_cmd_hdr *) buf; @@ -137,7 +156,7 @@ static void ping(char *svr) gettimeofday(&tv_send, NULL); /* Send Echo Request */ - if (send(s, buf, size + L2CAP_CMD_HDR_SIZE, 0) <= 0) { + if (send(sk, buf, L2CAP_CMD_HDR_SIZE + size, 0) <= 0) { perror("Send failed"); exit(1); } @@ -146,9 +165,11 @@ static void ping(char *svr) lost = 0; while (1) { struct pollfd pf[1]; - register int err; + int err; + + pf[0].fd = sk; + pf[0].events = POLLIN; - pf[0].fd = s; pf[0].events = POLLIN; if ((err = poll(pf, 1, timeout * 1000)) < 0) { perror("Poll failed"); exit(1); @@ -159,7 +180,7 @@ static void ping(char *svr) break; } - if ((err = recv(s, buf, sizeof(buf), 0)) < 0) { + if ((err = recv(sk, buf, L2CAP_CMD_HDR_SIZE + size, 0)) < 0) { perror("Recv failed"); exit(1); } @@ -210,21 +231,25 @@ static void usage(void) { printf("l2ping - L2CAP ping\n"); printf("Usage:\n"); - printf("\tl2ping [-S source addr] [-s size] [-c count] [-t timeout] [-f] \n"); + printf("\tl2ping [-i device] [-s size] [-c count] [-t timeout] [-f] \n"); } -extern int optind,opterr,optopt; -extern char *optarg; - int main(int argc, char *argv[]) { - register int opt; + int opt; /* Default options */ bacpy(&bdaddr, BDADDR_ANY); - while ((opt=getopt(argc,argv,"s:c:t:fS:")) != EOF) { + while ((opt=getopt(argc,argv,"i:s:c:t:f")) != EOF) { switch(opt) { + case 'i': + if (!strncasecmp(optarg, "hci", 3)) + hci_devba(atoi(optarg + 3), &bdaddr); + else + str2ba(optarg, &bdaddr); + break; + case 'f': /* Kinda flood ping */ delay = 0; @@ -242,10 +267,6 @@ int main(int argc, char *argv[]) size = atoi(optarg); break; - case 'S': - str2ba(optarg, &bdaddr); - break; - default: usage(); exit(1); -- cgit From e4b4cf97715729084740673c44dfabcf8b29fcfe Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 1 Feb 2005 11:37:23 +0000 Subject: Fix ident calculation --- tools/l2ping.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index 0e7a4be1..01b1f21b 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -193,7 +193,7 @@ static void ping(char *svr) cmd->len = btohs(cmd->len); /* Check for our id */ - if( cmd->ident != id ) + if (cmd->ident != id) continue; /* Check type */ @@ -218,7 +218,7 @@ static void ping(char *svr) if (delay) sleep(delay); } else { - printf("no response from %s: id %d\n", svr, id); + printf("no response from %s: id %d\n", svr, id - ident); } if (++id > 254) -- cgit From d3511a69c4be601fbe4c5c3d1f0cf1a8bb499a63 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 18 Mar 2005 13:49:49 +0000 Subject: Change default ping size to 44 bytes --- tools/l2ping.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index 01b1f21b..9741dc0e 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -50,7 +50,7 @@ /* Defaults */ static bdaddr_t bdaddr; -static int size = 20; +static int size = 44; static int ident = 200; static int delay = 1; static int count = -1; -- cgit From 632a9432774ff3a0c6e556e8f32a565b38890767 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 29 Oct 2005 22:36:31 +0000 Subject: Big cleanup of CVS relics --- tools/l2ping.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index 9741dc0e..3b46675d 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -8,24 +8,19 @@ * * * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation; + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY - * CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, - * COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS - * SOFTWARE IS DISCLAIMED. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * - * - * $Id$ */ #ifdef HAVE_CONFIG_H -- cgit From f2e48c44a7e4c9ee31b8ce2e302186f6047cfeab Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 3 Jan 2006 13:28:56 +0000 Subject: Update copyright information --- tools/l2ping.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index 3b46675d..0fe3d11a 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -4,7 +4,7 @@ * * Copyright (C) 2000-2001 Qualcomm Incorporated * Copyright (C) 2002-2003 Maxim Krasnyansky - * Copyright (C) 2002-2005 Marcel Holtmann + * Copyright (C) 2002-2006 Marcel Holtmann * * * This program is free software; you can redistribute it and/or modify -- cgit From 49244d8ca41191d042fbed0732bb14db99fd56c8 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 3 Feb 2006 18:45:50 +0000 Subject: Implement the gnip (reverse ping) support --- tools/l2ping.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index 0fe3d11a..0ae61c9d 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -50,6 +50,7 @@ static int ident = 200; static int delay = 1; static int count = -1; static int timeout = 10; +static int reverse = 0; /* Stats */ static int sent_pkt = 0; @@ -144,13 +145,17 @@ static void ping(char *svr) l2cap_cmd_hdr *cmd = (l2cap_cmd_hdr *) buf; /* Build command header */ - cmd->code = L2CAP_ECHO_REQ; cmd->ident = id; cmd->len = htobs(size); + if (reverse) + cmd->code = L2CAP_ECHO_RSP; + else + cmd->code = L2CAP_ECHO_REQ; + gettimeofday(&tv_send, NULL); - /* Send Echo Request */ + /* Send Echo Command */ if (send(sk, buf, L2CAP_CMD_HDR_SIZE + size, 0) <= 0) { perror("Send failed"); exit(1); @@ -192,8 +197,9 @@ static void ping(char *svr) continue; /* Check type */ - if (cmd->code == L2CAP_ECHO_RSP) + if (!reverse && cmd->code == L2CAP_ECHO_RSP) break; + if (cmd->code == L2CAP_COMMAND_REJ) { printf("Peer doesn't support Echo packets\n"); exit(1); @@ -226,7 +232,7 @@ static void usage(void) { printf("l2ping - L2CAP ping\n"); printf("Usage:\n"); - printf("\tl2ping [-i device] [-s size] [-c count] [-t timeout] [-f] \n"); + printf("\tl2ping [-i device] [-s size] [-c count] [-t timeout] [-f] [-r] \n"); } int main(int argc, char *argv[]) @@ -236,7 +242,7 @@ int main(int argc, char *argv[]) /* Default options */ bacpy(&bdaddr, BDADDR_ANY); - while ((opt=getopt(argc,argv,"i:s:c:t:f")) != EOF) { + while ((opt=getopt(argc,argv,"i:s:c:t:fr")) != EOF) { switch(opt) { case 'i': if (!strncasecmp(optarg, "hci", 3)) @@ -250,6 +256,11 @@ int main(int argc, char *argv[]) delay = 0; break; + case 'r': + /* Use responses instead of requests */ + reverse = 1; + break; + case 'c': count = atoi(optarg); break; -- cgit From 607695ed109340f4b7a5628420e0a8e8aee34f4e Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 13 Jan 2007 17:48:12 +0000 Subject: Update copyright information --- tools/l2ping.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index 0ae61c9d..6b1ae477 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -4,7 +4,7 @@ * * Copyright (C) 2000-2001 Qualcomm Incorporated * Copyright (C) 2002-2003 Maxim Krasnyansky - * Copyright (C) 2002-2006 Marcel Holtmann + * Copyright (C) 2002-2007 Marcel Holtmann * * * This program is free software; you can redistribute it and/or modify -- cgit From e823c15e43a6f924779e466d434c51157002d9ee Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 2 Feb 2008 03:37:05 +0000 Subject: Update copyright information --- tools/l2ping.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index 6b1ae477..1be911ae 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -4,7 +4,7 @@ * * Copyright (C) 2000-2001 Qualcomm Incorporated * Copyright (C) 2002-2003 Maxim Krasnyansky - * Copyright (C) 2002-2007 Marcel Holtmann + * Copyright (C) 2002-2008 Marcel Holtmann * * * This program is free software; you can redistribute it and/or modify -- cgit From 45c36dbd276501aa76d9798a8fafe6c202db7276 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Wed, 11 Jun 2008 13:20:50 +0000 Subject: Avoid direct inclusion of malloc.h --- tools/l2ping.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools/l2ping.c') diff --git a/tools/l2ping.c b/tools/l2ping.c index 1be911ae..1e2aab6d 100644 --- a/tools/l2ping.c +++ b/tools/l2ping.c @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include #include -- cgit