int withintimelimits(struct timeval *start, struct timeval *stop) { unsigned long long delta; if (op_max_ms <= 0) return 1; delta = tv2msec(stop) - tv2msec(start); if (delta > op_max_ms) { DEBUG("Error - time limit breached: op_max_ms - %ld, time passed - %lld", op_max_ms, delta); errno = -ETIMEDOUT; return 0; } return 1; }
long long timeleft_ms(long long tsprev) { struct timeval tv; long long tscurr; tsprev /= 1000; gettimeofday(&tv, 0); tscurr = tv2msec(&tv); DEBUG("time elapsed: %lld/%lld", tscurr - tsprev, lease_ms); return lease_ms - (tscurr - tsprev); }
void warn(const char const *fn, char *msg, ...) { struct timeval tv; long long unsigned tscurr; char buf[512]; va_list va; int n; va_start(va, msg); n = vsprintf(buf, msg, va); va_end(va); buf[n] = 0; gettimeofday(&tv, 0); tscurr = tv2msec(&tv); fprintf(stderr, "[%s:%d:%llu]: %s: %s\n", progname, getpid(), tscurr, fn, buf); }
int main(int argc, char *argv[]) { bdaddr_t src, dst; struct hostent *he; uint8_t *echo_data; struct sockaddr_l2cap sa; int32_t n, s, count, wait, flood, echo_size, numeric; char *endp, *rname; /* Set defaults */ memcpy(&src, NG_HCI_BDADDR_ANY, sizeof(src)); memcpy(&dst, NG_HCI_BDADDR_ANY, sizeof(dst)); echo_data = (uint8_t *) calloc(NG_L2CAP_MAX_ECHO_SIZE, sizeof(uint8_t)); if (echo_data == NULL) { fprintf(stderr, "Failed to allocate echo data buffer"); exit(1); } /* * Set default echo size to the NG_L2CAP_MTU_MINIMUM minus * the size of the L2CAP signalling command header. */ echo_size = NG_L2CAP_MTU_MINIMUM - sizeof(ng_l2cap_cmd_hdr_t); count = -1; /* unimited */ wait = 1; /* sec */ flood = 0; numeric = 0; /* Parse command line arguments */ while ((n = getopt(argc, argv, "a:c:fi:nS:s:h")) != -1) { switch (n) { case 'a': if (!bt_aton(optarg, &dst)) { if ((he = bt_gethostbyname(optarg)) == NULL) errx(1, "%s: %s", optarg, hstrerror(h_errno)); memcpy(&dst, he->h_addr, sizeof(dst)); } break; case 'c': count = strtol(optarg, &endp, 10); if (count <= 0 || *endp != '\0') usage(); break; case 'f': flood = 1; break; case 'i': wait = strtol(optarg, &endp, 10); if (wait <= 0 || *endp != '\0') usage(); break; case 'n': numeric = 1; break; case 'S': if (!bt_aton(optarg, &src)) { if ((he = bt_gethostbyname(optarg)) == NULL) errx(1, "%s: %s", optarg, hstrerror(h_errno)); memcpy(&src, he->h_addr, sizeof(src)); } break; case 's': echo_size = strtol(optarg, &endp, 10); if (echo_size < sizeof(int32_t) || echo_size > NG_L2CAP_MAX_ECHO_SIZE || *endp != '\0') usage(); break; case 'h': default: usage(); break; } } if (memcmp(&dst, NG_HCI_BDADDR_ANY, sizeof(dst)) == 0) usage(); he = bt_gethostbyaddr((const char *)&dst, sizeof(dst), AF_BLUETOOTH); if (he == NULL || he->h_name == NULL || he->h_name[0] == '\0' || numeric) asprintf(&rname, "%s", bt_ntoa(&dst, NULL)); else rname = strdup(he->h_name); if (rname == NULL) errx(1, "Failed to create remote hostname"); s = socket(PF_BLUETOOTH, SOCK_RAW, BLUETOOTH_PROTO_L2CAP); if (s < 0) err(2, "Could not create socket"); memset(&sa, 0, sizeof(sa)); sa.l2cap_len = sizeof(sa); sa.l2cap_family = AF_BLUETOOTH; memcpy(&sa.l2cap_bdaddr, &src, sizeof(sa.l2cap_bdaddr)); if (bind(s, (struct sockaddr *) &sa, sizeof(sa)) < 0) err(3, "Could not bind socket, src bdaddr=%s", bt_ntoa(&sa.l2cap_bdaddr, NULL)); memset(&sa, 0, sizeof(sa)); sa.l2cap_len = sizeof(sa); sa.l2cap_family = AF_BLUETOOTH; memcpy(&sa.l2cap_bdaddr, &dst, sizeof(sa.l2cap_bdaddr)); if (connect(s, (struct sockaddr *) &sa, sizeof(sa)) < 0) err(4, "Could not connect socket, dst bdaddr=%s", bt_ntoa(&sa.l2cap_bdaddr, NULL)); /* Fill pattern */ for (n = 0; n < echo_size; ) { int32_t avail = min(echo_size - n, PATTERN_SIZE); memcpy(echo_data + n, pattern, avail); n += avail; } /* Start ping'ing */ for (n = 0; count == -1 || count > 0; n ++) { struct ng_btsocket_l2cap_raw_ping r; struct timeval a, b; int32_t fail; if (gettimeofday(&a, NULL) < 0) err(5, "Could not gettimeofday(a)"); fail = 0; *((int32_t *) echo_data) = htonl(n); r.result = 0; r.echo_size = echo_size; r.echo_data = echo_data; if (ioctl(s, SIOC_L2CAP_L2CA_PING, &r, sizeof(r)) < 0) { r.result = errno; fail = 1; /* warn("Could not ping, dst bdaddr=%s", bt_ntoa(&r.echo_dst, NULL)); */ } if (gettimeofday(&b, NULL) < 0) err(7, "Could not gettimeofday(b)"); tv_sub(&b, &a); fprintf(stdout, "%d bytes from %s seq_no=%d time=%.3f ms result=%#x %s\n", r.echo_size, rname, ntohl(*((int32_t *)(r.echo_data))), tv2msec(&b), r.result, ((fail == 0)? "" : strerror(errno))); if (!flood) { /* Wait */ a.tv_sec = wait; a.tv_usec = 0; select(0, NULL, NULL, NULL, &a); } if (count != -1) count --; } free(rname); free(echo_data); close(s); return (0); } /* main */