@@ -73,6 +73,7 @@ static bool cfg_show_payload;
73
73
static bool cfg_do_pktinfo ;
74
74
static bool cfg_loop_nodata ;
75
75
static bool cfg_no_delay ;
76
+ static bool cfg_use_cmsg ;
76
77
static uint16_t dest_port = 9000 ;
77
78
78
79
static struct sockaddr_in daddr ;
@@ -269,8 +270,13 @@ static int recv_errmsg(int fd)
269
270
return ret == -1 ;
270
271
}
271
272
272
- static void do_test (int family , unsigned int opt )
273
+ static void do_test (int family , unsigned int report_opt )
273
274
{
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 ;
274
280
char * buf ;
275
281
int fd , i , val = 1 , total_len ;
276
282
@@ -321,17 +327,22 @@ static void do_test(int family, unsigned int opt)
321
327
}
322
328
}
323
329
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
+
327
337
if (cfg_loop_nodata )
328
- opt |= SOF_TIMESTAMPING_OPT_TSONLY ;
338
+ sock_opt |= SOF_TIMESTAMPING_OPT_TSONLY ;
329
339
330
340
if (setsockopt (fd , SOL_SOCKET , SO_TIMESTAMPING ,
331
- (char * ) & opt , sizeof (opt )))
341
+ (char * ) & sock_opt , sizeof (sock_opt )))
332
342
error (1 , 0 , "setsockopt timestamping" );
333
343
334
344
for (i = 0 ; i < cfg_num_pkts ; i ++ ) {
345
+ memset (& msg , 0 , sizeof (msg ));
335
346
memset (& ts_prev , 0 , sizeof (ts_prev ));
336
347
memset (buf , 'a' + i , total_len );
337
348
@@ -361,14 +372,38 @@ static void do_test(int family, unsigned int opt)
361
372
}
362
373
363
374
print_timestamp_usr ();
375
+
376
+ iov .iov_base = buf ;
377
+ iov .iov_len = total_len ;
378
+
364
379
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 ;
371
404
}
405
+
406
+ val = sendmsg (fd , & msg , 0 );
372
407
if (val != total_len )
373
408
error (1 , errno , "send" );
374
409
@@ -396,6 +431,7 @@ static void __attribute__((noreturn)) usage(const char *filepath)
396
431
" -6: only IPv6\n"
397
432
" -h: show this message\n"
398
433
" -c N: number of packets for each test\n"
434
+ " -C: use cmsg to set tstamp recording options\n"
399
435
" -D: no delay between packets\n"
400
436
" -F: poll() waits forever for an event\n"
401
437
" -I: request PKTINFO\n"
@@ -413,9 +449,9 @@ static void __attribute__((noreturn)) usage(const char *filepath)
413
449
static void parse_opt (int argc , char * * argv )
414
450
{
415
451
int proto_count = 0 ;
416
- char c ;
452
+ int c ;
417
453
418
- while ((c = getopt (argc , argv , "46c:DFhIl :np:rRux" )) != -1 ) {
454
+ while ((c = getopt (argc , argv , "46c:CDFhIl :np:rRux" )) != -1 ) {
419
455
switch (c ) {
420
456
case '4' :
421
457
do_ipv6 = 0 ;
@@ -426,6 +462,9 @@ static void parse_opt(int argc, char **argv)
426
462
case 'c' :
427
463
cfg_num_pkts = strtoul (optarg , NULL , 10 );
428
464
break ;
465
+ case 'C' :
466
+ cfg_use_cmsg = true;
467
+ break ;
429
468
case 'D' :
430
469
cfg_no_delay = true;
431
470
break ;
0 commit comments