Commit 7085f47f authored by Willem de Bruijn's avatar Willem de Bruijn Committed by David S. Miller

selftests: expand txtimestamp with cmsg support

Commit 3dd17e63 ("sock: accept SO_TIMESTAMPING flags in socket
cmsg") added support for passing tx timestamping options per-call
in sendmsg.

Expand the txtimestamp test with support for this feature.
Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
Acked-by: default avatarSoheil Hassas Yeganeh <soheil@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a6ae520d
...@@ -73,6 +73,7 @@ static bool cfg_show_payload; ...@@ -73,6 +73,7 @@ static bool cfg_show_payload;
static bool cfg_do_pktinfo; static bool cfg_do_pktinfo;
static bool cfg_loop_nodata; static bool cfg_loop_nodata;
static bool cfg_no_delay; static bool cfg_no_delay;
static bool cfg_use_cmsg;
static uint16_t dest_port = 9000; static uint16_t dest_port = 9000;
static struct sockaddr_in daddr; static struct sockaddr_in daddr;
...@@ -269,8 +270,13 @@ static int recv_errmsg(int fd) ...@@ -269,8 +270,13 @@ static int recv_errmsg(int fd)
return ret == -1; return ret == -1;
} }
static void do_test(int family, unsigned int opt) static void do_test(int family, unsigned int report_opt)
{ {
char control[CMSG_SPACE(sizeof(uint32_t))];
unsigned int sock_opt;
struct cmsghdr *cmsg;
struct msghdr msg;
struct iovec iov;
char *buf; char *buf;
int fd, i, val = 1, total_len; int fd, i, val = 1, total_len;
...@@ -321,17 +327,22 @@ static void do_test(int family, unsigned int opt) ...@@ -321,17 +327,22 @@ static void do_test(int family, unsigned int opt)
} }
} }
opt |= SOF_TIMESTAMPING_SOFTWARE | sock_opt = SOF_TIMESTAMPING_SOFTWARE |
SOF_TIMESTAMPING_OPT_CMSG | SOF_TIMESTAMPING_OPT_CMSG |
SOF_TIMESTAMPING_OPT_ID; SOF_TIMESTAMPING_OPT_ID;
if (!cfg_use_cmsg)
sock_opt |= report_opt;
if (cfg_loop_nodata) if (cfg_loop_nodata)
opt |= SOF_TIMESTAMPING_OPT_TSONLY; sock_opt |= SOF_TIMESTAMPING_OPT_TSONLY;
if (setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING, if (setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING,
(char *) &opt, sizeof(opt))) (char *) &sock_opt, sizeof(sock_opt)))
error(1, 0, "setsockopt timestamping"); error(1, 0, "setsockopt timestamping");
for (i = 0; i < cfg_num_pkts; i++) { for (i = 0; i < cfg_num_pkts; i++) {
memset(&msg, 0, sizeof(msg));
memset(&ts_prev, 0, sizeof(ts_prev)); memset(&ts_prev, 0, sizeof(ts_prev));
memset(buf, 'a' + i, total_len); memset(buf, 'a' + i, total_len);
...@@ -361,14 +372,38 @@ static void do_test(int family, unsigned int opt) ...@@ -361,14 +372,38 @@ static void do_test(int family, unsigned int opt)
} }
print_timestamp_usr(); print_timestamp_usr();
iov.iov_base = buf;
iov.iov_len = total_len;
if (cfg_proto != SOCK_STREAM) { if (cfg_proto != SOCK_STREAM) {
if (family == PF_INET) if (family == PF_INET) {
val = sendto(fd, buf, total_len, 0, (void *) &daddr, sizeof(daddr)); msg.msg_name = (void *)&daddr;
else msg.msg_namelen = sizeof(daddr);
val = sendto(fd, buf, total_len, 0, (void *) &daddr6, sizeof(daddr6)); } else {
} else { msg.msg_name = (void *)&daddr6;
val = send(fd, buf, cfg_payload_len, 0); msg.msg_namelen = sizeof(daddr6);
}
}
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
if (cfg_use_cmsg) {
memset(control, 0, sizeof(control));
msg.msg_control = control;
msg.msg_controllen = sizeof(control);
cmsg = CMSG_FIRSTHDR(&msg);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SO_TIMESTAMPING;
cmsg->cmsg_len = CMSG_LEN(sizeof(uint32_t));
*((uint32_t *) CMSG_DATA(cmsg)) = report_opt;
} }
val = sendmsg(fd, &msg, 0);
if (val != total_len) if (val != total_len)
error(1, errno, "send"); error(1, errno, "send");
...@@ -396,6 +431,7 @@ static void __attribute__((noreturn)) usage(const char *filepath) ...@@ -396,6 +431,7 @@ static void __attribute__((noreturn)) usage(const char *filepath)
" -6: only IPv6\n" " -6: only IPv6\n"
" -h: show this message\n" " -h: show this message\n"
" -c N: number of packets for each test\n" " -c N: number of packets for each test\n"
" -C: use cmsg to set tstamp recording options\n"
" -D: no delay between packets\n" " -D: no delay between packets\n"
" -F: poll() waits forever for an event\n" " -F: poll() waits forever for an event\n"
" -I: request PKTINFO\n" " -I: request PKTINFO\n"
...@@ -413,9 +449,9 @@ static void __attribute__((noreturn)) usage(const char *filepath) ...@@ -413,9 +449,9 @@ static void __attribute__((noreturn)) usage(const char *filepath)
static void parse_opt(int argc, char **argv) static void parse_opt(int argc, char **argv)
{ {
int proto_count = 0; int proto_count = 0;
char c; int c;
while ((c = getopt(argc, argv, "46c:DFhIl:np:rRux")) != -1) { while ((c = getopt(argc, argv, "46c:CDFhIl:np:rRux")) != -1) {
switch (c) { switch (c) {
case '4': case '4':
do_ipv6 = 0; do_ipv6 = 0;
...@@ -426,6 +462,9 @@ static void parse_opt(int argc, char **argv) ...@@ -426,6 +462,9 @@ static void parse_opt(int argc, char **argv)
case 'c': case 'c':
cfg_num_pkts = strtoul(optarg, NULL, 10); cfg_num_pkts = strtoul(optarg, NULL, 10);
break; break;
case 'C':
cfg_use_cmsg = true;
break;
case 'D': case 'D':
cfg_no_delay = true; cfg_no_delay = true;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment