@@ -70,6 +70,7 @@ static int do_ipv6 = 1;
7070static int cfg_payload_len = 10 ;
7171static bool cfg_show_payload ;
7272static bool cfg_do_pktinfo ;
73+ static bool cfg_loop_nodata ;
7374static uint16_t dest_port = 9000 ;
7475
7576static 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
218231static 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