Skip to content

Commit 2368592

Browse files
wdebruijdavem330
authored andcommitted
net-timestamp: no-payload option in txtimestamp test
Demonstrate how SOF_TIMESTAMPING_OPT_TSONLY can be used and test the implementation. Signed-off-by: Willem de Bruijn <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent b245be1 commit 2368592

File tree

1 file changed

+24
-4
lines changed

1 file changed

+24
-4
lines changed

Documentation/networking/timestamping/txtimestamp.c

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ static int do_ipv6 = 1;
7070
static int cfg_payload_len = 10;
7171
static bool cfg_show_payload;
7272
static bool cfg_do_pktinfo;
73+
static bool cfg_loop_nodata;
7374
static uint16_t dest_port = 9000;
7475

7576
static struct sockaddr_in daddr;
@@ -141,6 +142,9 @@ static void print_payload(char *data, int len)
141142
{
142143
int i;
143144

145+
if (!len)
146+
return;
147+
144148
if (len > 70)
145149
len = 70;
146150

@@ -177,6 +181,7 @@ static void __recv_errmsg_cmsg(struct msghdr *msg, int payload_len)
177181
struct sock_extended_err *serr = NULL;
178182
struct scm_timestamping *tss = NULL;
179183
struct cmsghdr *cm;
184+
int batch = 0;
180185

181186
for (cm = CMSG_FIRSTHDR(msg);
182187
cm && cm->cmsg_len;
@@ -209,10 +214,18 @@ static void __recv_errmsg_cmsg(struct msghdr *msg, int payload_len)
209214
} else
210215
fprintf(stderr, "unknown cmsg %d,%d\n",
211216
cm->cmsg_level, cm->cmsg_type);
217+
218+
if (serr && tss) {
219+
print_timestamp(tss, serr->ee_info, serr->ee_data,
220+
payload_len);
221+
serr = NULL;
222+
tss = NULL;
223+
batch++;
224+
}
212225
}
213226

214-
if (serr && tss)
215-
print_timestamp(tss, serr->ee_info, serr->ee_data, payload_len);
227+
if (batch > 1)
228+
fprintf(stderr, "batched %d timestamps\n", batch);
216229
}
217230

218231
static int recv_errmsg(int fd)
@@ -244,7 +257,7 @@ static int recv_errmsg(int fd)
244257
if (ret == -1 && errno != EAGAIN)
245258
error(1, errno, "recvmsg");
246259

247-
if (ret > 0) {
260+
if (ret >= 0) {
248261
__recv_errmsg_cmsg(&msg, ret);
249262
if (cfg_show_payload)
250263
print_payload(data, cfg_payload_len);
@@ -309,6 +322,9 @@ static void do_test(int family, unsigned int opt)
309322
opt |= SOF_TIMESTAMPING_SOFTWARE |
310323
SOF_TIMESTAMPING_OPT_CMSG |
311324
SOF_TIMESTAMPING_OPT_ID;
325+
if (cfg_loop_nodata)
326+
opt |= SOF_TIMESTAMPING_OPT_TSONLY;
327+
312328
if (setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING,
313329
(char *) &opt, sizeof(opt)))
314330
error(1, 0, "setsockopt timestamping");
@@ -378,6 +394,7 @@ static void __attribute__((noreturn)) usage(const char *filepath)
378394
" -h: show this message\n"
379395
" -I: request PKTINFO\n"
380396
" -l N: send N bytes at a time\n"
397+
" -n: set no-payload option\n"
381398
" -r: use raw\n"
382399
" -R: use raw (IP_HDRINCL)\n"
383400
" -p N: connect to port N\n"
@@ -392,7 +409,7 @@ static void parse_opt(int argc, char **argv)
392409
int proto_count = 0;
393410
char c;
394411

395-
while ((c = getopt(argc, argv, "46hIl:p:rRux")) != -1) {
412+
while ((c = getopt(argc, argv, "46hIl:np:rRux")) != -1) {
396413
switch (c) {
397414
case '4':
398415
do_ipv6 = 0;
@@ -403,6 +420,9 @@ static void parse_opt(int argc, char **argv)
403420
case 'I':
404421
cfg_do_pktinfo = true;
405422
break;
423+
case 'n':
424+
cfg_loop_nodata = true;
425+
break;
406426
case 'r':
407427
proto_count++;
408428
cfg_proto = SOCK_RAW;

0 commit comments

Comments
 (0)