From 22fdd674937bb927a00b35b84cca66dda76c6fd5 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 13 Jan 2009 11:17:17 +0100 Subject: Add command option for triggering dedicated bonding --- test/l2test.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/test/l2test.c b/test/l2test.c index f8ff5f7d..babef00c 100644 --- a/test/l2test.c +++ b/test/l2test.c @@ -60,7 +60,8 @@ enum { LSEND, SENDDUMP, LSENDDUMP, - INFOREQ + INFOREQ, + PAIRING, }; static unsigned char *buf; @@ -840,6 +841,48 @@ failed: close(sk); } +static void do_pairing(char *svr) +{ + struct sockaddr_l2 addr; + int sk, opt; + + sk = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP); + if (sk < 0) { + perror("Can't create socket"); + return; + } + + memset(&addr, 0, sizeof(addr)); + addr.l2_family = AF_BLUETOOTH; + bacpy(&addr.l2_bdaddr, &bdaddr); + + if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + perror("Can't bind socket"); + goto failed; + } + + opt = L2CAP_LM_SECURE; + + if (setsockopt(sk, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt)) < 0) { + perror("Can't set link mode"); + goto failed; + } + + memset(&addr, 0, sizeof(addr)); + addr.l2_family = AF_BLUETOOTH; + str2ba(svr, &addr.l2_bdaddr); + + if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0 ) { + perror("Can't connect socket"); + goto failed; + } + + printf("Pairing successful\n"); + +failed: + close(sk); +} + static void usage(void) { printf("l2test - L2CAP testing\n" @@ -856,6 +899,7 @@ static void usage(void) "\t-y connect, then send, then dump incoming data\n" "\t-c connect, disconnect, connect, ...\n" "\t-m multiple connects\n" + "\t-p trigger dedicated bonding\n" "\t-z information request\n"); printf("Options:\n" @@ -883,7 +927,7 @@ int main(int argc, char *argv[]) bacpy(&bdaddr, BDADDR_ANY); - while ((opt=getopt(argc,argv,"rdscuwmnxyzb:i:P:I:O:B:N:L:C:D:X:RGAESMT")) != EOF) { + while ((opt=getopt(argc,argv,"rdscuwmnxyzpb:i:P:I:O:B:N:L:C:D:X:RGAESMT")) != EOF) { switch(opt) { case 'r': mode = RECV; @@ -935,6 +979,11 @@ int main(int argc, char *argv[]) need_addr = 1; break; + case 'p': + mode = PAIRING; + need_addr = 1; + break; + case 'b': data_size = atoi(optarg); break; @@ -1094,6 +1143,10 @@ int main(int argc, char *argv[]) case INFOREQ: info_request(argv[optind]); exit(0); + + case PAIRING: + do_pairing(argv[optind]); + exit(0); } syslog(LOG_INFO, "Exit"); -- cgit