aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWillem de Bruijn <willemb@google.com>2015-01-30 13:29:33 -0500
committerDavid S. Miller <davem@davemloft.net>2015-02-02 21:46:51 -0500
commit2368592365bc97e941d0c641a3ba24b06d2c469b (patch)
tree2011aa66f6379bd4713f47d2c03e895bc94ef26f
parentb245be1f4db1a0394e4b6eb66059814b46670ac3 (diff)
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 <willemb@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--Documentation/networking/timestamping/txtimestamp.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/Documentation/networking/timestamping/txtimestamp.c b/Documentation/networking/timestamping/txtimestamp.c
index 05694febc238..8217510d3842 100644
--- a/Documentation/networking/timestamping/txtimestamp.c
+++ b/Documentation/networking/timestamping/txtimestamp.c
@@ -70,6 +70,7 @@ static int do_ipv6 = 1;
70static int cfg_payload_len = 10; 70static int cfg_payload_len = 10;
71static bool cfg_show_payload; 71static bool cfg_show_payload;
72static bool cfg_do_pktinfo; 72static bool cfg_do_pktinfo;
73static bool cfg_loop_nodata;
73static uint16_t dest_port = 9000; 74static uint16_t dest_port = 9000;
74 75
75static struct sockaddr_in daddr; 76static struct sockaddr_in daddr;
@@ -141,6 +142,9 @@ static void print_payload(char *data, int len)
141{ 142{
142 int i; 143 int i;
143 144
145 if (!len)
146 return;
147
144 if (len > 70) 148 if (len > 70)
145 len = 70; 149 len = 70;
146 150
@@ -177,6 +181,7 @@ static void __recv_errmsg_cmsg(struct msghdr *msg, int payload_len)
177 struct sock_extended_err *serr = NULL; 181 struct sock_extended_err *serr = NULL;
178 struct scm_timestamping *tss = NULL; 182 struct scm_timestamping *tss = NULL;
179 struct cmsghdr *cm; 183 struct cmsghdr *cm;
184 int batch = 0;
180 185
181 for (cm = CMSG_FIRSTHDR(msg); 186 for (cm = CMSG_FIRSTHDR(msg);
182 cm && cm->cmsg_len; 187 cm && cm->cmsg_len;
@@ -209,10 +214,18 @@ static void __recv_errmsg_cmsg(struct msghdr *msg, int payload_len)
209 } else 214 } else
210 fprintf(stderr, "unknown cmsg %d,%d\n", 215 fprintf(stderr, "unknown cmsg %d,%d\n",
211 cm->cmsg_level, cm->cmsg_type); 216 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 }
212 } 225 }
213 226
214 if (serr && tss) 227 if (batch > 1)
215 print_timestamp(tss, serr->ee_info, serr->ee_data, payload_len); 228 fprintf(stderr, "batched %d timestamps\n", batch);
216} 229}
217 230
218static int recv_errmsg(int fd) 231static int recv_errmsg(int fd)
@@ -244,7 +257,7 @@ static int recv_errmsg(int fd)
244 if (ret == -1 && errno != EAGAIN) 257 if (ret == -1 && errno != EAGAIN)
245 error(1, errno, "recvmsg"); 258 error(1, errno, "recvmsg");
246 259
247 if (ret > 0) { 260 if (ret >= 0) {
248 __recv_errmsg_cmsg(&msg, ret); 261 __recv_errmsg_cmsg(&msg, ret);
249 if (cfg_show_payload) 262 if (cfg_show_payload)
250 print_payload(data, cfg_payload_len); 263 print_payload(data, cfg_payload_len);
@@ -309,6 +322,9 @@ static void do_test(int family, unsigned int opt)
309 opt |= SOF_TIMESTAMPING_SOFTWARE | 322 opt |= SOF_TIMESTAMPING_SOFTWARE |
310 SOF_TIMESTAMPING_OPT_CMSG | 323 SOF_TIMESTAMPING_OPT_CMSG |
311 SOF_TIMESTAMPING_OPT_ID; 324 SOF_TIMESTAMPING_OPT_ID;
325 if (cfg_loop_nodata)
326 opt |= SOF_TIMESTAMPING_OPT_TSONLY;
327
312 if (setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING, 328 if (setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING,
313 (char *) &opt, sizeof(opt))) 329 (char *) &opt, sizeof(opt)))
314 error(1, 0, "setsockopt timestamping"); 330 error(1, 0, "setsockopt timestamping");
@@ -378,6 +394,7 @@ static void __attribute__((noreturn)) usage(const char *filepath)
378 " -h: show this message\n" 394 " -h: show this message\n"
379 " -I: request PKTINFO\n" 395 " -I: request PKTINFO\n"
380 " -l N: send N bytes at a time\n" 396 " -l N: send N bytes at a time\n"
397 " -n: set no-payload option\n"
381 " -r: use raw\n" 398 " -r: use raw\n"
382 " -R: use raw (IP_HDRINCL)\n" 399 " -R: use raw (IP_HDRINCL)\n"
383 " -p N: connect to port N\n" 400 " -p N: connect to port N\n"
@@ -392,7 +409,7 @@ static void parse_opt(int argc, char **argv)
392 int proto_count = 0; 409 int proto_count = 0;
393 char c; 410 char c;
394 411
395 while ((c = getopt(argc, argv, "46hIl:p:rRux")) != -1) { 412 while ((c = getopt(argc, argv, "46hIl:np:rRux")) != -1) {
396 switch (c) { 413 switch (c) {
397 case '4': 414 case '4':
398 do_ipv6 = 0; 415 do_ipv6 = 0;
@@ -403,6 +420,9 @@ static void parse_opt(int argc, char **argv)
403 case 'I': 420 case 'I':
404 cfg_do_pktinfo = true; 421 cfg_do_pktinfo = true;
405 break; 422 break;
423 case 'n':
424 cfg_loop_nodata = true;
425 break;
406 case 'r': 426 case 'r':
407 proto_count++; 427 proto_count++;
408 cfg_proto = SOCK_RAW; 428 cfg_proto = SOCK_RAW;