Upgrade bluez5_37 :Merge the code from private
[platform/upstream/bluez.git] / tools / l2test.c
index 83c5cbd..50c4dc1 100644 (file)
@@ -119,7 +119,13 @@ static unsigned long send_delay = 0;
 /* Default delay before receiving */
 static unsigned long recv_delay = 0;
 
-static char *filename = NULL;
+/* Default delay before disconnecting */
+static unsigned long disc_delay = 0;
+
+/* Initial sequence value when sending frames */
+static int seq_start = 0;
+
+static const char *filename = NULL;
 
 static int rfcmode = 0;
 static int master = 0;
@@ -597,6 +603,7 @@ static void do_listen(void (*handler)(int sk))
 
        if (socktype == SOCK_DGRAM) {
                handler(sk);
+               close(sk);
                return;
        }
 
@@ -649,7 +656,6 @@ static void do_listen(void (*handler)(int sk))
                        continue;
                }
                /* Child */
-               close(sk);
 
                /* Set receive buffer size */
                if (rcvbuf && setsockopt(nsk, SOL_SOCKET, SO_RCVBUF, &rcvbuf,
@@ -774,6 +780,7 @@ static void do_listen(void (*handler)(int sk))
                }
 
                handler(nsk);
+               close(sk);
 
                syslog(LOG_INFO, "Disconnect: %m");
                exit(0);
@@ -979,13 +986,18 @@ static void do_send(int sk)
                        sent += len;
                        size -= len;
                }
+
+               close(fd);
                return;
        } else {
                for (i = 6; i < data_size; i++)
                        buf[i] = 0x7f;
        }
 
-       seq = 0;
+       if (!count && send_delay)
+               usleep(send_delay);
+
+       seq = seq_start;
        while ((num_frames == -1) || (num_frames-- > 0)) {
                put_le32(seq, buf);
                put_le16(data_size, buf + 4);
@@ -1008,7 +1020,8 @@ static void do_send(int sk)
                        size -= len;
                }
 
-               if (num_frames && send_delay && count && !(seq % count))
+               if (num_frames && send_delay && count &&
+                                               !(seq % (count + seq_start)))
                        usleep(send_delay);
        }
 }
@@ -1017,6 +1030,9 @@ static void send_mode(int sk)
 {
        do_send(sk);
 
+       if (disc_delay)
+               usleep(disc_delay);
+
        syslog(LOG_INFO, "Closing channel ...");
        if (shutdown(sk, SHUT_RDWR) < 0)
                syslog(LOG_INFO, "Close failed: %m");
@@ -1450,11 +1466,9 @@ static void usage(void)
                "\t-m multiple connects\n"
                "\t-p trigger dedicated bonding\n"
 #ifdef __TIZEN_PATCH__
-               "\t-z information request\n"
-               "\t-o configuration request\n");
-#else
-               "\t-z information request\n");
+               "\t-o configuration request\n"
 #endif
+               "\t-z information request\n");
 
        printf("Options:\n"
                "\t[-b bytes] [-i device] [-P psm] [-J cid]\n"
@@ -1466,6 +1480,7 @@ static void usage(void)
                "\t[-C num] send num frames before delay (default = 1)\n"
                "\t[-D milliseconds] delay after sending num frames (default = 0)\n"
                "\t[-K milliseconds] delay before receiving (default = 0)\n"
+               "\t[-g milliseconds] delay before disconnecting (default = 0)\n"
                "\t[-X mode] l2cap mode (help for list, default = basic)\n"
                "\t[-a policy] chan policy (help for list, default = bredr)\n"
                "\t[-F fcs] use CRC16 check (default = 1)\n"
@@ -1481,12 +1496,11 @@ static void usage(void)
                "\t[-S] secure connection\n"
                "\t[-M] become master\n"
                "\t[-T] enable timestamps\n"
-#ifdef __TIZEN_PATCH__
                "\t[-V type] address type (help for list, default = bredr)\n"
-               "\t[-e DCID] destination CID\n");
-#else
-               "\t[-V type] address type (help for list, default = bredr)\n");
+#ifdef __TIZEN_PATCH__
+               "\t[-f DCID] destination CID\n"
 #endif
+               "\t[-e seq] initial sequence value (default = 0)\n");
 }
 
 int main(int argc, char *argv[])
@@ -1497,11 +1511,11 @@ int main(int argc, char *argv[])
        bacpy(&bdaddr, BDADDR_ANY);
 
 #ifdef __TIZEN_PATCH__
-       while ((opt = getopt(argc, argv, "rdscouwmntqxyzpb:a:"
-               "i:P:I:O:J:B:N:L:W:C:D:X:F:Q:Z:Y:H:K:V:e:RUGAESMT")) != EOF) {
+       while ((opt = getopt(argc, argv, "a:b:cde:f:g:i:mnopqrstuwxyz"
+               "AB:C:D:EF:GH:I:J:K:L:MN:O:P:Q:RSTUV:W:X:Y:Z:")) != EOF) {
 #else
-       while ((opt = getopt(argc, argv, "rdscuwmntqxyzpb:a:"
-               "i:P:I:O:J:B:N:L:W:C:D:X:F:Q:Z:Y:H:K:V:RUGAESMT")) != EOF) {
+       while ((opt = getopt(argc, argv, "a:b:cde:g:i:mnpqrstuwxyz"
+               "AB:C:D:EF:GH:I:J:K:L:MN:O:P:Q:RSTUV:W:X:Y:Z:")) != EOF) {
 #endif
                switch (opt) {
                case 'r':
@@ -1607,7 +1621,7 @@ int main(int argc, char *argv[])
                        break;
 
                case 'B':
-                       filename = strdup(optarg);
+                       filename = optarg;
                        break;
 
                case 'N':
@@ -1714,12 +1728,22 @@ int main(int argc, char *argv[])
                        }
 
                        break;
+
 #ifdef __TIZEN_PATCH__
-               case 'e':
+               case 'f':
                        dcid = atoi(optarg);
                        printf("dcid %d", dcid);
                        break;
 #endif
+
+               case 'e':
+                       seq_start = atoi(optarg);
+                       break;
+
+               case 'g':
+                       disc_delay = atoi(optarg) * 1000;
+                       break;
+
                default:
                        usage();
                        exit(1);