Lines Matching +full:te +full:- +full:source
1 // SPDX-License-Identifier: GPL-2.0-only
8 * - SCHED, SND and ACK timestamps
9 * - RAW, UDP and TCP
10 * - IPv4 and IPv6
11 * - various packet sizes (to test GSO and TSO)
17 * A simple `nc6 [-u] -l -p $DESTPORT` will do
87 static int saved_tskey = -1;
88 static int saved_tskey_type = -1;
105 return ts->tv_sec * NSEC_PER_SEC + ts->tv_nsec; in timespec_to_ns64()
110 return ts->tv_sec * USEC_PER_SEC + ts->tv_nsec / NSEC_PER_USEC; in timespec_to_us64()
113 static void init_timing_event(struct timing_event *te) in init_timing_event() argument
115 te->min = INT64_MAX; in init_timing_event()
116 te->max = 0; in init_timing_event()
117 te->total = 0; in init_timing_event()
118 te->count = 0; in init_timing_event()
121 static void add_timing_event(struct timing_event *te, in add_timing_event() argument
124 int64_t ts_delta = timespec_to_ns64(t_end) - timespec_to_ns64(t_start); in add_timing_event()
126 te->count++; in add_timing_event()
127 if (ts_delta < te->min) in add_timing_event()
128 te->min = ts_delta; in add_timing_event()
129 if (ts_delta > te->max) in add_timing_event()
130 te->max = ts_delta; in add_timing_event()
131 te->total += ts_delta; in add_timing_event()
141 if (saved_tskey == -1 || cfg_use_cmsg_opt_id) in validate_key()
168 cur64 - start64, min_delay, max_delay); in validate_timestamp()
187 if (!(cur->tv_sec | cur->tv_nsec)) in __print_timestamp()
192 name, cur->tv_sec, cur->tv_nsec, in __print_timestamp()
196 name, cur->tv_sec, cur->tv_nsec / NSEC_PER_USEC, in __print_timestamp()
200 ts_delta = timespec_to_ns64(cur) - timespec_to_ns64(&ts_usr); in __print_timestamp()
227 validate_timestamp(&tss->ts[0], 0); in print_timestamp()
228 add_timing_event(&usr_enq, &ts_usr, &tss->ts[0]); in print_timestamp()
232 validate_timestamp(&tss->ts[0], cfg_delay_snd); in print_timestamp()
233 add_timing_event(&usr_snd, &ts_usr, &tss->ts[0]); in print_timestamp()
237 validate_timestamp(&tss->ts[0], cfg_delay_ack); in print_timestamp()
238 add_timing_event(&usr_ack, &ts_usr, &tss->ts[0]); in print_timestamp()
244 __print_timestamp(tsname, &tss->ts[0], tskey, payload_len); in print_timestamp()
247 static void print_timing_event(char *name, struct timing_event *te) in print_timing_event() argument
249 if (!te->count) in print_timing_event()
252 fprintf(stderr, " %s: count=%d", name, te->count); in print_timing_event()
254 __print_ts_delta_formatted((int64_t)(te->total / te->count)); in print_timing_event()
256 __print_ts_delta_formatted(te->min); in print_timing_event()
258 __print_ts_delta_formatted(te->max); in print_timing_event()
320 cm && cm->cmsg_len; in __recv_errmsg_cmsg()
322 if (cm->cmsg_level == SOL_SOCKET && in __recv_errmsg_cmsg()
323 cm->cmsg_type == SCM_TIMESTAMPING) { in __recv_errmsg_cmsg()
325 } else if ((cm->cmsg_level == SOL_IP && in __recv_errmsg_cmsg()
326 cm->cmsg_type == IP_RECVERR) || in __recv_errmsg_cmsg()
327 (cm->cmsg_level == SOL_IPV6 && in __recv_errmsg_cmsg()
328 cm->cmsg_type == IPV6_RECVERR) || in __recv_errmsg_cmsg()
329 (cm->cmsg_level == SOL_PACKET && in __recv_errmsg_cmsg()
330 cm->cmsg_type == PACKET_TX_TIMESTAMP)) { in __recv_errmsg_cmsg()
332 if (serr->ee_errno != ENOMSG || in __recv_errmsg_cmsg()
333 serr->ee_origin != SO_EE_ORIGIN_TIMESTAMPING) { in __recv_errmsg_cmsg()
335 serr->ee_errno, in __recv_errmsg_cmsg()
336 serr->ee_origin); in __recv_errmsg_cmsg()
339 } else if (cm->cmsg_level == SOL_IP && in __recv_errmsg_cmsg()
340 cm->cmsg_type == IP_PKTINFO) { in __recv_errmsg_cmsg()
342 print_pktinfo(AF_INET, info->ipi_ifindex, in __recv_errmsg_cmsg()
343 &info->ipi_spec_dst, &info->ipi_addr); in __recv_errmsg_cmsg()
344 } else if (cm->cmsg_level == SOL_IPV6 && in __recv_errmsg_cmsg()
345 cm->cmsg_type == IPV6_PKTINFO) { in __recv_errmsg_cmsg()
347 print_pktinfo(AF_INET6, info6->ipi6_ifindex, in __recv_errmsg_cmsg()
348 NULL, &info6->ipi6_addr); in __recv_errmsg_cmsg()
351 cm->cmsg_level, cm->cmsg_type); in __recv_errmsg_cmsg()
354 print_timestamp(tss, serr->ee_info, serr->ee_data, in __recv_errmsg_cmsg()
396 if (ret == -1 && errno != EAGAIN) in recv_errmsg()
406 return ret == -1; in recv_errmsg()
429 pseudo_sum += udph->len; in get_udp_csum()
432 csum_start -= alen * 2; in get_udp_csum()
433 csum_len = ntohs(udph->len) + alen * 2; in get_udp_csum()
444 iph->ihl = 5; in fill_header_ipv4()
445 iph->version = 4; in fill_header_ipv4()
446 iph->ttl = 2; in fill_header_ipv4()
447 iph->saddr = daddr.sin_addr.s_addr; /* set for udp csum calc */ in fill_header_ipv4()
448 iph->daddr = daddr.sin_addr.s_addr; in fill_header_ipv4()
449 iph->protocol = IPPROTO_UDP; in fill_header_ipv4()
462 ip6h->version = 6; in fill_header_ipv6()
463 ip6h->payload_len = htons(sizeof(struct udphdr) + cfg_payload_len); in fill_header_ipv6()
464 ip6h->nexthdr = IPPROTO_UDP; in fill_header_ipv6()
465 ip6h->hop_limit = 64; in fill_header_ipv6()
467 ip6h->saddr = daddr6.sin6_addr; in fill_header_ipv6()
468 ip6h->daddr = daddr6.sin6_addr; in fill_header_ipv6()
479 udph->source = ntohs(dest_port + 1); /* spoof */ in fill_header_udp()
480 udph->dest = ntohs(dest_port); in fill_header_udp()
481 udph->len = ntohs(sizeof(*udph) + cfg_payload_len); in fill_header_udp()
482 udph->check = 0; in fill_header_udp()
484 udph->check = get_udp_csum(udph, is_ipv4 ? sizeof(struct in_addr) : in fill_header_udp()
543 saved_tskey = -1; in do_test()
640 cmsg->cmsg_level = SOL_SOCKET; in do_test()
641 cmsg->cmsg_type = SO_TIMESTAMPING; in do_test()
642 cmsg->cmsg_len = CMSG_LEN(sizeof(uint32_t)); in do_test()
648 cmsg->cmsg_level = SOL_SOCKET; in do_test()
649 cmsg->cmsg_type = SCM_TS_OPT_ID; in do_test()
650 cmsg->cmsg_len = CMSG_LEN(sizeof(uint32_t)); in do_test()
676 print_timing_event("USR-ENQ", &usr_enq); in do_test()
677 print_timing_event("USR-SND", &usr_snd); in do_test()
678 print_timing_event("USR-ACK", &usr_ack); in do_test()
691 " -4: only IPv4\n" in usage()
692 " -6: only IPv6\n" in usage()
693 " -h: show this message\n" in usage()
694 " -b: busy poll to read from error queue\n" in usage()
695 " -c N: number of packets for each test\n" in usage()
696 " -C: use cmsg to set tstamp recording options\n" in usage()
697 " -e: use level-triggered epoll() instead of poll()\n" in usage()
698 " -E: use event-triggered epoll() instead of poll()\n" in usage()
699 " -F: poll()/epoll() waits forever for an event\n" in usage()
700 " -I: request PKTINFO\n" in usage()
701 " -l N: send N bytes at a time\n" in usage()
702 " -L listen on hostname and port\n" in usage()
703 " -n: set no-payload option\n" in usage()
704 " -N: print timestamps and durations in nsec (instead of usec)\n" in usage()
705 " -o N: use SCM_TS_OPT_ID control message to provide N as tskey\n" in usage()
706 " -p N: connect to port N\n" in usage()
707 " -P: use PF_PACKET\n" in usage()
708 " -r: use raw\n" in usage()
709 " -R: use raw (IP_HDRINCL)\n" in usage()
710 " -S N: usec to sleep before reading error queue\n" in usage()
711 " -t N: tolerance (usec) for timestamp validation\n" in usage()
712 " -u: use udp\n" in usage()
713 " -v: validate SND delay (usec)\n" in usage()
714 " -V: validate ACK delay (usec)\n" in usage()
715 " -x: show payload (up to 70 bytes)\n", in usage()
726 "46bc:CeEFhIl:LnNo:p:PrRS:t:uv:V:x")) != -1) { in parse_opt()
750 cfg_poll_timeout = -1; in parse_opt()
821 error(1, 0, "pass -4 or -6, not both"); in parse_opt()
823 error(1, 0, "pass -P, -r, -R or -u, not multiple"); in parse_opt()
831 if (optind != argc - 1) in parse_opt()
847 if (!have_ipv4 && cur->ai_family == AF_INET) { in resolve_hostname()
848 memcpy(&daddr, cur->ai_addr, sizeof(daddr)); in resolve_hostname()
852 else if (!have_ipv6 && cur->ai_family == AF_INET6) { in resolve_hostname()
853 memcpy(&daddr6, cur->ai_addr, sizeof(daddr6)); in resolve_hostname()
857 cur = cur->ai_next; in resolve_hostname()
878 if (fd == -1) in do_listen()
931 resolve_hostname(argv[argc - 1]); in main()