ARM: Add support for running multiple systems
[gem5.git] / src / dev / etherdump.cc
index 7dcf1ca97a856c0e241d982a3624fef9ed9723f0..21532bd59115aeaf46aa70a04e946d6bce9b3db5 100644 (file)
 #include "base/misc.hh"
 #include "base/output.hh"
 #include "dev/etherdump.hh"
-#include "params/EtherDump.hh"
 #include "sim/core.hh"
 
 using std::string;
 
-EtherDump::EtherDump(const string &name, const string &file, int max)
-    : SimObject(name), stream(file.c_str()), maxlen(max)
+EtherDump::EtherDump(const Params *p)
+    : SimObject(p), stream(simout.create(p->file, true)),
+      maxlen(p->maxlen)
 {
 }
 
-#define DLT_EN10MB             1               // Ethernet (10Mb)
-#define TCPDUMP_MAGIC          0xa1b2c3d4
-#define PCAP_VERSION_MAJOR     2
-#define PCAP_VERSION_MINOR     4
+#define DLT_EN10MB              1               // Ethernet (10Mb)
+#define TCPDUMP_MAGIC           0xa1b2c3d4
+#define PCAP_VERSION_MAJOR      2
+#define PCAP_VERSION_MINOR      4
 
 struct pcap_file_header {
     uint32_t magic;
     uint16_t version_major;
     uint16_t version_minor;
-    int32_t thiszone;          // gmt to local correction
-    uint32_t sigfigs;          // accuracy of timestamps
-    uint32_t snaplen;          // max length saved portion of each pkt
-    uint32_t linktype;         // data link type (DLT_*)
+    int32_t thiszone;           // gmt to local correction
+    uint32_t sigfigs;           // accuracy of timestamps
+    uint32_t snaplen;           // max length saved portion of each pkt
+    uint32_t linktype;          // data link type (DLT_*)
 };
 
 struct pcap_pkthdr {
     uint32_t seconds;
     uint32_t microseconds;
-    uint32_t caplen;           // length of portion present
-    uint32_t len;              // length this packet (off wire)
+    uint32_t caplen;            // length of portion present
+    uint32_t len;               // length this packet (off wire)
 };
 
 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));
+    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();
+    stream->flush();
 }
 
 void
 EtherDump::dumpPacket(EthPacketPtr &packet)
 {
     pcap_pkthdr pkthdr;
-    pkthdr.seconds = curtime + (curTick / Clock::Int::s);
-    pkthdr.microseconds = (curTick / Clock::Int::us) % ULL(1000000);
+    pkthdr.seconds = curTick() / SimClock::Int::s;
+    pkthdr.microseconds = (curTick() / SimClock::Int::us) % ULL(1000000);
     pkthdr.caplen = std::min(packet->length, maxlen);
     pkthdr.len = packet->length;
-    stream.write(reinterpret_cast<char *>(&pkthdr), sizeof(pkthdr));
-    stream.write(reinterpret_cast<char *>(packet->data), pkthdr.caplen);
-    stream.flush();
+    stream->write(reinterpret_cast<char *>(&pkthdr), sizeof(pkthdr));
+    stream->write(reinterpret_cast<char *>(packet->data), pkthdr.caplen);
+    stream->flush();
 }
 
 EtherDump *
 EtherDumpParams::create()
 {
-    return new EtherDump(name, simout.resolve(file), maxlen);
+    return new EtherDump(this);
 }