Skip to content

Commit 7085f47

Browse files
wdebruijdavem330
authored andcommitted
selftests: expand txtimestamp with cmsg support
Commit 3dd17e6 ("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: Willem de Bruijn <[email protected]> Acked-by: Soheil Hassas Yeganeh <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a6ae520 commit 7085f47

File tree

1 file changed

+53
-14
lines changed

1 file changed

+53
-14
lines changed

tools/testing/selftests/networking/timestamping/txtimestamp.c

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ static bool cfg_show_payload;
7373
static bool cfg_do_pktinfo;
7474
static bool cfg_loop_nodata;
7575
static bool cfg_no_delay;
76+
static bool cfg_use_cmsg;
7677
static uint16_t dest_port = 9000;
7778

7879
static struct sockaddr_in daddr;
@@ -269,8 +270,13 @@ static int recv_errmsg(int fd)
269270
return ret == -1;
270271
}
271272

272-
static void do_test(int family, unsigned int opt)
273+
static void do_test(int family, unsigned int report_opt)
273274
{
275+
char control[CMSG_SPACE(sizeof(uint32_t))];
276+
unsigned int sock_opt;
277+
struct cmsghdr *cmsg;
278+
struct msghdr msg;
279+
struct iovec iov;
274280
char *buf;
275281
int fd, i, val = 1, total_len;
276282

@@ -321,17 +327,22 @@ static void do_test(int family, unsigned int opt)
321327
}
322328
}
323329

324-
opt |= SOF_TIMESTAMPING_SOFTWARE |
325-
SOF_TIMESTAMPING_OPT_CMSG |
326-
SOF_TIMESTAMPING_OPT_ID;
330+
sock_opt = SOF_TIMESTAMPING_SOFTWARE |
331+
SOF_TIMESTAMPING_OPT_CMSG |
332+
SOF_TIMESTAMPING_OPT_ID;
333+
334+
if (!cfg_use_cmsg)
335+
sock_opt |= report_opt;
336+
327337
if (cfg_loop_nodata)
328-
opt |= SOF_TIMESTAMPING_OPT_TSONLY;
338+
sock_opt |= SOF_TIMESTAMPING_OPT_TSONLY;
329339

330340
if (setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING,
331-
(char *) &opt, sizeof(opt)))
341+
(char *) &sock_opt, sizeof(sock_opt)))
332342
error(1, 0, "setsockopt timestamping");
333343

334344
for (i = 0; i < cfg_num_pkts; i++) {
345+
memset(&msg, 0, sizeof(msg));
335346
memset(&ts_prev, 0, sizeof(ts_prev));
336347
memset(buf, 'a' + i, total_len);
337348

@@ -361,14 +372,38 @@ static void do_test(int family, unsigned int opt)
361372
}
362373

363374
print_timestamp_usr();
375+
376+
iov.iov_base = buf;
377+
iov.iov_len = total_len;
378+
364379
if (cfg_proto != SOCK_STREAM) {
365-
if (family == PF_INET)
366-
val = sendto(fd, buf, total_len, 0, (void *) &daddr, sizeof(daddr));
367-
else
368-
val = sendto(fd, buf, total_len, 0, (void *) &daddr6, sizeof(daddr6));
369-
} else {
370-
val = send(fd, buf, cfg_payload_len, 0);
380+
if (family == PF_INET) {
381+
msg.msg_name = (void *)&daddr;
382+
msg.msg_namelen = sizeof(daddr);
383+
} else {
384+
msg.msg_name = (void *)&daddr6;
385+
msg.msg_namelen = sizeof(daddr6);
386+
}
387+
}
388+
389+
msg.msg_iov = &iov;
390+
msg.msg_iovlen = 1;
391+
392+
if (cfg_use_cmsg) {
393+
memset(control, 0, sizeof(control));
394+
395+
msg.msg_control = control;
396+
msg.msg_controllen = sizeof(control);
397+
398+
cmsg = CMSG_FIRSTHDR(&msg);
399+
cmsg->cmsg_level = SOL_SOCKET;
400+
cmsg->cmsg_type = SO_TIMESTAMPING;
401+
cmsg->cmsg_len = CMSG_LEN(sizeof(uint32_t));
402+
403+
*((uint32_t *) CMSG_DATA(cmsg)) = report_opt;
371404
}
405+
406+
val = sendmsg(fd, &msg, 0);
372407
if (val != total_len)
373408
error(1, errno, "send");
374409

@@ -396,6 +431,7 @@ static void __attribute__((noreturn)) usage(const char *filepath)
396431
" -6: only IPv6\n"
397432
" -h: show this message\n"
398433
" -c N: number of packets for each test\n"
434+
" -C: use cmsg to set tstamp recording options\n"
399435
" -D: no delay between packets\n"
400436
" -F: poll() waits forever for an event\n"
401437
" -I: request PKTINFO\n"
@@ -413,9 +449,9 @@ static void __attribute__((noreturn)) usage(const char *filepath)
413449
static void parse_opt(int argc, char **argv)
414450
{
415451
int proto_count = 0;
416-
char c;
452+
int c;
417453

418-
while ((c = getopt(argc, argv, "46c:DFhIl:np:rRux")) != -1) {
454+
while ((c = getopt(argc, argv, "46c:CDFhIl:np:rRux")) != -1) {
419455
switch (c) {
420456
case '4':
421457
do_ipv6 = 0;
@@ -426,6 +462,9 @@ static void parse_opt(int argc, char **argv)
426462
case 'c':
427463
cfg_num_pkts = strtoul(optarg, NULL, 10);
428464
break;
465+
case 'C':
466+
cfg_use_cmsg = true;
467+
break;
429468
case 'D':
430469
cfg_no_delay = true;
431470
break;

0 commit comments

Comments
 (0)