Make etherdump timestamps zero-based.

We previously used the actual wall time for the base timestamps,
making etherdumps non-deterministic.  This fixes that problem and
gets rid of the "malformed packet" at the front that we needed to
provide the right base timestamp to wireshark/tcpdump.
This commit is contained in:
Steve Reinhardt
2009-02-17 19:24:46 -08:00
parent 5d029ff11e
commit 6cfff91d43
2 changed files with 2 additions and 17 deletions

View File

@@ -75,31 +75,18 @@ struct pcap_pkthdr {
void
EtherDump::init()
{
curtime = time(NULL);
struct pcap_file_header hdr;
hdr.magic = TCPDUMP_MAGIC;
hdr.version_major = PCAP_VERSION_MAJOR;
hdr.version_minor = PCAP_VERSION_MINOR;
hdr.thiszone = -5 * 3600;
hdr.thiszone = 0;
hdr.snaplen = 1500;
hdr.sigfigs = 0;
hdr.linktype = DLT_EN10MB;
stream->write(reinterpret_cast<char *>(&hdr), sizeof(hdr));
/*
* output an empty packet with the current time so that we know
* when the simulation began. This allows us to correlate packets
* to sim_cycles.
*/
pcap_pkthdr pkthdr;
pkthdr.seconds = curtime;
pkthdr.microseconds = 0;
pkthdr.caplen = 0;
pkthdr.len = 0;
stream->write(reinterpret_cast<char *>(&pkthdr), sizeof(pkthdr));
stream->flush();
}
@@ -107,7 +94,7 @@ void
EtherDump::dumpPacket(EthPacketPtr &packet)
{
pcap_pkthdr pkthdr;
pkthdr.seconds = curtime + (curTick / Clock::Int::s);
pkthdr.seconds = curTick / Clock::Int::s;
pkthdr.microseconds = (curTick / Clock::Int::us) % ULL(1000000);
pkthdr.caplen = std::min(packet->length, maxlen);
pkthdr.len = packet->length;

View File

@@ -51,8 +51,6 @@ class EtherDump : public SimObject
void dumpPacket(EthPacketPtr &packet);
void init();
Tick curtime;
public:
typedef EtherDumpParams Params;
EtherDump(const Params *p);