Only the write support is initially useful, but an upcoming commit will add a user for the read support.
Signed-off-by: Ben Pfaff <b...@nicira.com> --- lib/pcap-file.c | 31 +++++++++++++++++++++---------- lib/pcap-file.h | 2 +- tests/test-flows.c | 4 ++-- utilities/ovs-ofctl.c | 2 +- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/lib/pcap-file.c b/lib/pcap-file.c index fbb0751..f13fe19 100644 --- a/lib/pcap-file.c +++ b/lib/pcap-file.c @@ -24,6 +24,7 @@ #include "byte-order.h" #include "compiler.h" #include "ofpbuf.h" +#include "timeval.h" #include "vlog.h" VLOG_DEFINE_THIS_MODULE(pcap); @@ -128,12 +129,13 @@ pcap_write_header(FILE *file) } int -pcap_read(FILE *file, struct ofpbuf **bufp) +pcap_read(FILE *file, struct ofpbuf **bufp, long long int *when) { struct pcaprec_hdr prh; struct ofpbuf *buf; void *data; size_t len; + bool swap; *bufp = NULL; @@ -151,15 +153,21 @@ pcap_read(FILE *file, struct ofpbuf **bufp) /* Calculate length. */ len = prh.incl_len; - if (len > 0xffff) { - uint32_t swapped_len = uint32_byteswap(len); - if (swapped_len > 0xffff) { - VLOG_WARN("bad packet length %zu or %"PRIu32" " - "reading pcap file", - len, swapped_len); + swap = len > 0xffff; + if (swap) { + len = uint32_byteswap(len); + if (len > 0xffff) { + VLOG_WARN("bad packet length %zu or %"PRIu32" reading pcap file", + len, uint32_byteswap(len)); return EPROTO; } - len = swapped_len; + } + + /* Calculate time. */ + if (when) { + uint32_t ts_sec = swap ? uint32_byteswap(prh.ts_sec) : prh.ts_sec; + uint32_t ts_usec = swap ? uint32_byteswap(prh.ts_usec) : prh.ts_usec; + *when = ts_sec * 1000LL + ts_usec / 1000; } /* Read packet. */ @@ -180,8 +188,11 @@ void pcap_write(FILE *file, struct ofpbuf *buf) { struct pcaprec_hdr prh; - prh.ts_sec = 0; - prh.ts_usec = 0; + struct timeval tv; + + xgettimeofday(&tv); + prh.ts_sec = tv.tv_sec; + prh.ts_usec = tv.tv_usec; prh.incl_len = buf->size; prh.orig_len = buf->size; ignore(fwrite(&prh, sizeof prh, 1, file)); diff --git a/lib/pcap-file.h b/lib/pcap-file.h index 46625c3..7148b18 100644 --- a/lib/pcap-file.h +++ b/lib/pcap-file.h @@ -24,7 +24,7 @@ struct ofpbuf; FILE *pcap_open(const char *file_name, const char *mode); int pcap_read_header(FILE *); void pcap_write_header(FILE *); -int pcap_read(FILE *, struct ofpbuf **); +int pcap_read(FILE *, struct ofpbuf **, long long int *when); void pcap_write(FILE *, struct ofpbuf *); #endif /* pcap-file.h */ diff --git a/tests/test-flows.c b/tests/test-flows.c index 6528b07..99a9e69 100644 --- a/tests/test-flows.c +++ b/tests/test-flows.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. + * Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -61,7 +61,7 @@ main(int argc OVS_UNUSED, char *argv[]) union flow_in_port in_port_; n++; - retval = pcap_read(pcap, &packet); + retval = pcap_read(pcap, &packet, NULL); if (retval == EOF) { ovs_fatal(0, "unexpected end of file reading pcap file"); } else if (retval) { diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index 1d1b47f..d7c2a12 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -3122,7 +3122,7 @@ ofctl_parse_pcap(int argc OVS_UNUSED, char *argv[]) struct flow flow; int error; - error = pcap_read(pcap, &packet); + error = pcap_read(pcap, &packet, NULL); if (error == EOF) { break; } else if (error) { -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev