int _l2_ping_req_handler(int argc, char **argv) { size_t payload_strlen; uint16_t count = 5; timex_t start, end, period; if (transceiver_pid == KERNEL_PID_UNDEF) { puts("Transceiver not initialized"); return 1; } if (argc < 2) { printf("Usage:\t%s <ADDR> [COUNT] [MSG]\n", argv[0]); return 1; } char l2_payload[L2_PING_PAYLOAD_SIZE]; if (argc > 3) { payload_strlen = strlen(argv[3]); if (payload_strlen > L2_PING_PAYLOAD_SIZE) { printf("[l2_ping] Your input is too long and will be truncated to \"%.*s\".\n", L2_PING_PAYLOAD_SIZE, argv[3]); payload_strlen = L2_PING_PAYLOAD_SIZE; } memset(l2_payload, 0, L2_PING_PAYLOAD_SIZE); strncpy(l2_payload, argv[3], payload_strlen); } else { payload_strlen = 0; } if (argc > 2) { count = atoi(argv[2]); } printf("[l2_ping] Send %" PRIu8 " ping requests to %" PRIu16 " with interval %" PRIu32 ".%" PRIu32 "s and payload %s\n", count, atoi(argv[1]), timex_from_uint64(L2_PING_DEFAULT_INTERVAL).seconds, timex_from_uint64(L2_PING_DEFAULT_INTERVAL).microseconds, (argc > 3) ? l2_payload : "NULL"); vtimer_now(&start); l2_ping((radio_address_t) atoi(argv[1]), count, L2_PING_DEFAULT_INTERVAL, l2_payload, payload_strlen, 0); vtimer_now(&end); period = timex_sub(end, start); printf(" --- ping statistics for host %" PRIu16 " ---\n", l2_ping_stats.dst); printf(" %" PRIu16 " packets transmitted, %" PRIu16 " received, %" PRIu16 "%% packet loss, time %" PRIu32 ".%06" PRIu32 "s\n", l2_ping_stats.ping_count, l2_ping_stats.pong_count, 100 - ((l2_ping_stats.pong_count * 100) / l2_ping_stats.ping_count), period.seconds, period.microseconds); printf(" rtt min/avg/max = %" PRIu32 ".%06" PRIu32 "/%" PRIu32 ".%06" PRIu32 "/%" PRIu32 ".%06" PRIu32 " s\n", l2_ping_stats.min_rtt.seconds, l2_ping_stats.min_rtt.microseconds, l2_ping_stats.avg_rtt.seconds, l2_ping_stats.avg_rtt.microseconds, l2_ping_stats.max_rtt.seconds, l2_ping_stats.max_rtt.microseconds); return 0; }
static void test_timex_from_uint64(void) { timex_t time; time = timex_from_uint64(1001000); TEST_ASSERT(time.seconds == 1); TEST_ASSERT(time.microseconds == 1000); }
static void calc_rtt(void) { timex_t rtt = timex_sub(end, start); rtt_sum = timex_add(rtt_sum, rtt); l2_ping_stats.last_rtt = rtt; l2_ping_stats.avg_rtt = timex_from_uint64(timex_uint64(rtt_sum) / l2_ping_stats.pong_count); if (timex_cmp(rtt, l2_ping_stats.max_rtt) > 0) { l2_ping_stats.max_rtt = rtt; } if (timex_cmp(rtt, l2_ping_stats.min_rtt) < 0) { l2_ping_stats.min_rtt = rtt; } }
kernel_pid_t nhdp_start(void) { if (nhdp_pid == KERNEL_PID_UNDEF) { /* Init destination address for NHDP's packets */ /* Start the NHDP thread */ nhdp_pid = thread_create(nhdp_stack, sizeof(nhdp_stack), THREAD_PRIORITY_MAIN - 1, THREAD_CREATE_STACKTEST, _nhdp_runner, NULL, "NHDP"); #if (NHDP_METRIC_NEEDS_TIMER) /* Configure periodic timer message to refresh metric values */ if (nhdp_pid != KERNEL_PID_UNDEF) { metric_interval = timex_from_uint64(DAT_REFRESH_INTERVAL * SEC_IN_USEC); metric_msg.type = NHDP_METRIC_TIMER; metric_msg.content.ptr = NULL; xtimer_set_msg64(&metric_timer, timex_uint64(metric_interval), metric_msg, nhdp_pid); } #endif } return nhdp_pid; }
static void sleep_until_gate_reacts(void) { vtimer_sleep(timex_from_uint64(telemetry.reactivity_us)); }