diff options
author | Willem de Bruijn <willemb@google.com> | 2015-01-30 13:29:33 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-02-02 21:46:51 -0500 |
commit | 2368592365bc97e941d0c641a3ba24b06d2c469b (patch) | |
tree | 2011aa66f6379bd4713f47d2c03e895bc94ef26f | |
parent | b245be1f4db1a0394e4b6eb66059814b46670ac3 (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.c | 28 |
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; | |||
70 | static int cfg_payload_len = 10; | 70 | static int cfg_payload_len = 10; |
71 | static bool cfg_show_payload; | 71 | static bool cfg_show_payload; |
72 | static bool cfg_do_pktinfo; | 72 | static bool cfg_do_pktinfo; |
73 | static bool cfg_loop_nodata; | ||
73 | static uint16_t dest_port = 9000; | 74 | static uint16_t dest_port = 9000; |
74 | 75 | ||
75 | static struct sockaddr_in daddr; | 76 | static 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 | ||
218 | static int recv_errmsg(int fd) | 231 | static 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; |