/* 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;
if (socktype == SOCK_DGRAM) {
handler(sk);
+ close(sk);
return;
}
continue;
}
/* Child */
- close(sk);
/* Set receive buffer size */
if (rcvbuf && setsockopt(nsk, SOL_SOCKET, SO_RCVBUF, &rcvbuf,
}
handler(nsk);
+ close(sk);
syslog(LOG_INFO, "Disconnect: %m");
exit(0);
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);
size -= len;
}
- if (num_frames && send_delay && count && !(seq % count))
+ if (num_frames && send_delay && count &&
+ !(seq % (count + seq_start)))
usleep(send_delay);
}
}
{
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");
"\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"
"\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"
"\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[])
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':
break;
case 'B':
- filename = strdup(optarg);
+ filename = optarg;
break;
case 'N':
}
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);