Linux bluetooth development
 help / color / mirror / Atom feed
From: Martin Leopold <mleopold@worldonline.dk>
To: bluez-devel@lists.sourceforge.net
Subject: [Bluez-devel] Biderectional l2test
Date: Mon, 27 May 2002 00:05:50 +0200	[thread overview]
Message-ID: <20020526220550.GA3983@asterix> (raw)

[-- Attachment #1: Type: text/plain, Size: 2957 bytes --]

Hi All.
Following last weeks discussion I added a bidirectional test to l2test - 
this should make it possible for me to set up symmetric multislot 
connections, right?

l2test is running out of short commandline switches, so I chose -x, -y in 
lack of anything more intuitive. Most of the code is duplicated from 
elsewhere in l2test. It's missing a commandline switch to select the 
amount of packets to receive before computing the throughput. The 
sendbuffer is the same as for the "-s" sender and the receive buffer is 
set by the "-I" option. Since I've gotten this wrong more than once, 
comments are wellcome (wether this does what I think it does or not =)..

As I'm working at home today I havn't been able to try the same devices as 
I did last week (will do tomorow), so I tried with a BrainBoxes PCMCIA 
card and a Bluefrom USB unit.

First test: Same as last week (the Bluefrog box doesn't work with 
multislot packets for some reason).

Sender (BrainBoxes):
./hciconfig hci0 ptype DM1;./l2test -b 2000 -s 00:00:00:00:20:17
...

Receiver (Bluefrog):
./hciconfig hci0 ptype DM1;./l2test -b10000 -r -I 2000
l2test[1233]: Waiting for connection on psm 10 ...
l2test[1236]: Connect from 50:C2:C0:03:C2:8F [imtu 2000, omtu 672, 
flush_to 65535]
l2test[1236]: Receiving ...
l2test[1236]: 10000 bytes in 1.24 sec, 7.87 kB/s
l2test[1236]: 10000 bytes in 0.92 sec, 10.59 kB/s
l2test[1236]: 10000 bytes in 0.91 sec, 10.74 kB/s
l2test[1236]: 10000 bytes in 0.90 sec, 10.89 kB/s
l2test[1236]: 10000 bytes in 0.87 sec, 11.25 kB/s
...

With my new patch:
One host (Bluefrog):
./hciconfig hci0 ptype DM1;./l2test -b2000 -I 2000 -x
l2test[1302]: Waiting for connection on psm 10 ...
l2test[1302]: Connect from 50:C2:C0:03:C2:8F [imtu 2000, omtu 2000, 
flush_to 65535]
l2test[1302]: Received 12000 bytes in 2.86 sec, 4.10 kB/s
l2test[1302]: Received 12000 bytes in 2.80 sec, 4.19 kB/s
l2test[1302]: Received 12000 bytes in 2.47 sec, 4.74 kB/s
l2test[1302]: Received 12000 bytes in 1.83 sec, 6.39 kB/s
...

On the other host (BrainBoxes):
./hciconfig hci0 ptype DM1;./l2test -b2000 -I 2000 -y 00:00:00:00:20:17
l2test[1592]: Connected [imtu 2000, omtu 2000, flush_to 65535]
l2test[1592]: Received 12000 bytes in 0.43 sec, 27.05 kB/s
l2test[1592]: Received 12000 bytes in 0.91 sec, 12.94 kB/s
l2test[1592]: Received 12000 bytes in 0.37 sec, 32.04 kB/s
l2test[1592]: Received 12000 bytes in 0.20 sec, 59.82 kB/s
l2test[1592]: Received 12000 bytes in 0.43 sec, 27.41 kB/s
l2test[1592]: Received 12000 bytes in 0.43 sec, 27.09 kB/s
l2test[1592]: seq missmatch: 41 -> 42
...


So after all this trouble I still don't have clue what's going on!? If I 
reverse the "connector" (-y) and the "listener" (-x) both get about 
10kB/s. On several ocations the Bluefrog device has been shown to be ill 
in other ways, could this be it again or is there some blunder in my 
biderectional test?


-- 
Regards Martin Leopold.
Dept. of Computer Science, University of Copenhagen

[-- Attachment #2: bluez-utils-2.0-pre9.bidirectional.patch --]
[-- Type: text/plain, Size: 4919 bytes --]

--- bluez-utils-2.0-pre9.org/tools/l2test.c	Wed Mar 27 06:30:35 2002
+++ bluez-utils-2.0-pre9/tools/l2test.c	Sun May 26 23:52:43 2002
@@ -54,7 +54,9 @@
 	DUMP,
 	CONNECT,
 	CRECV,
-	LSEND
+	LSEND,
+	BILISTEN,
+	BICONNECT
 };
 
 unsigned char *buf;
@@ -74,6 +76,13 @@
 int auth = 0;
 int encrypt = 0;
 
+
+uint32_t verify_data(unsigned char *buf, int r, uint32_t seq);
+void bi_send_recv(int s);
+
+unsigned char *bi_recv_buf;
+int bi_recv_count=10000;
+
 float tv2fl(struct timeval tv)
 {
 	return (float)tv.tv_sec + (float)(tv.tv_usec/1000000.0);
@@ -246,9 +255,7 @@
 		gettimeofday(&tv_beg,NULL);
 		total = 0;
 		while (total < data_size) {
-			uint32_t sq;
-			uint16_t l;
-			int i,r;
+			int r;
 
 			if ((r = recv(s, buf, data_size, 0)) <= 0) {
 				if (r < 0)
@@ -257,26 +264,7 @@
 				return;	
 			}
 
-			/* Check sequence */
-			sq = btohl(*(uint32_t *)buf);
-			if (seq != sq) {
-				syslog(LOG_INFO, "seq missmatch: %d -> %d", seq, sq);
-				seq = sq;
-			}
-			seq++;
-			
-			/* Check length */
-			l = btohs(*(uint16_t *)(buf+4));
-			if (r != l) {
-				syslog(LOG_INFO, "size missmatch: %d -> %d", r, l);
-				continue;
-			}
-			
-			/* Verify data */	
-			for (i=6; i < r; i++) {
-				if (buf[i] != 0x7f)
-					syslog(LOG_INFO, "data missmatch: byte %d 0x%2.2x", i, buf[i]);
-			}
+			seq = verify_data(buf, r, seq);
 
 			total += r;
 		}
@@ -311,6 +299,101 @@
 	}
 }
 
+void bi_connect_mode(char* svr) {
+  int s;
+  if( (s = do_connect(svr)) < 0 )
+    exit(1);
+  bi_send_recv(s);
+}
+
+void bi_send_recv(int s) {
+  int i, r;
+  long total;
+  uint32_t recv_seq, send_seq;
+  struct timeval tv_beg, tv_end, tv_diff;
+  fd_set rset, wset;
+
+  /* Incoming packets are limited by the -I option */
+  if (!(bi_recv_buf = malloc(imtu))) {
+    perror("Can't allocate data buffer");
+    exit(1);
+  }
+  for(i=6; i < imtu; i++) buf[i]=0x7f;
+
+  send_seq = 0;
+  recv_seq = 0;
+  total = 0;
+  FD_ZERO(&rset);
+  FD_ZERO(&wset); 
+  gettimeofday(&tv_beg,NULL);
+  while(1) {
+    FD_SET(s, &rset);
+    FD_SET(s, &wset);
+    if (select(s+1, &rset, &wset, NULL, NULL)<0){
+      syslog(LOG_ERR, "Select failed. %s(%d)", strerror(errno), errno);
+      exit(-1);
+    }
+
+    if(FD_ISSET(s, &wset)) {
+      *(uint32_t *)buf = htobl(send_seq++);
+      *(uint16_t *)(buf+4) = htobs(data_size);
+	
+      if( send(s, buf, data_size, 0) <= 0 ) {
+	syslog(LOG_ERR, "Send failed. %s(%d)", strerror(errno), errno);
+	exit(1);
+      }
+    }
+    if(FD_ISSET(s, &rset)) {
+      if ((r = recv(s, bi_recv_buf, imtu, 0)) < 0) {
+	if (r < 0)
+	  syslog(LOG_ERR, "Read failed. %s(%d)", strerror(errno), errno);
+	return;
+      }
+      recv_seq = verify_data(bi_recv_buf, r, recv_seq);
+      total += r;
+
+      if(total >= bi_recv_count) {
+	gettimeofday(&tv_end,NULL);
+	timersub(&tv_end,&tv_beg,&tv_diff);
+	syslog(LOG_INFO,"Received %ld bytes in %.2f sec, %.2f kB/s", total,
+	       tv2fl(tv_diff), (float)(total / tv2fl(tv_diff) ) / 1024.0);
+	tv_beg=tv_end;
+	total=0;
+      }
+    }
+  }
+}
+
+uint32_t verify_data(unsigned char* buf, int r, uint32_t seq){
+  uint32_t sq;
+  uint16_t l;
+  int i;
+
+  /* Check sequence */
+  sq = btohl(*(uint32_t *)buf);
+  if (seq != sq) {
+    printf("seq missmatch: %d -> %d", seq, sq);
+    syslog(LOG_INFO, "seq missmatch: %d -> %d", seq, sq);
+    seq = sq;
+  }
+  seq++;
+			
+  /* Check length */
+  l = btohs(*(uint16_t *)(buf+4));
+  if (r != l) {
+    syslog(LOG_INFO, "size missmatch: %d -> %d", r, l);
+    goto done;
+  }
+		
+  /* Verify data */	
+  for (i=6; i < r; i++) {
+    if (buf[i] != 0x7f)
+      syslog(LOG_INFO, "data missmatch: byte %d 0x%2.2x", i, buf[i]);
+  }
+ done:
+  return seq;
+}
+
 void reconnect_mode(char *svr)
 {
 	while(1){
@@ -361,7 +444,9 @@
 		"\t-u connect and receive\n"
 		"\t-n connect and be silent\n"
 		"\t-c connect, disconnect, connect, ...\n"
-		"\t-m multiple connects\n");
+		"\t-m multiple connects\n"
+                "\t-x biderectional send/recv - listen\n"
+                "\t-y biderectional send/recv - connect\n");
 
 	printf("Options:\n"
 		"\t[-b bytes] [-S bdaddr] [-P psm]\n"
@@ -381,7 +466,7 @@
 
 	mode = RECV; need_addr = 0;
 	
-	while ((opt=getopt(argc,argv,"rdscuwmnb:P:I:O:S:MAE")) != EOF) {
+	while ((opt=getopt(argc,argv,"rdscuwmnxyxb:P:I:O:S:MAE")) != EOF) {
 		switch(opt) {
 		case 'r':
 			mode = RECV;
@@ -424,6 +509,15 @@
 			data_size = atoi(optarg);
 			break;
 
+		case 'x':
+		        mode=BILISTEN;
+			break;
+
+		case 'y':
+		        mode=BICONNECT;
+			need_addr = 1;
+			break;
+
 		case 'S':
 			baswap(&bdaddr, strtoba(optarg));
 			break;
@@ -476,6 +570,14 @@
 	openlog("l2test", LOG_PERROR | LOG_PID, LOG_LOCAL0);
 
 	switch( mode ){
+	        case BILISTEN:
+		        do_listen(bi_send_recv);
+ 		        break;
+
+	        case BICONNECT:
+	                bi_connect_mode(argv[optind]);
+ 		        break;
+
 		case RECV:
 			do_listen(recv_mode);
 			break;

                 reply	other threads:[~2002-05-26 22:05 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20020526220550.GA3983@asterix \
    --to=mleopold@worldonline.dk \
    --cc=bluez-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox