Add support to store less than the full packet in an etherdump

and actually default to only storing a max of 96 bytes per
packet since that should be plenty to fit all of the headers in.

--HG--
extra : convert_revision : 0c4a6571d80536477ed166e695d957e39da0334e
This commit is contained in:
Nathan Binkert
2004-07-22 23:54:24 -04:00
parent 552b954180
commit c9e6a15196
2 changed files with 11 additions and 7 deletions

View File

@@ -32,6 +32,7 @@
#include <sys/time.h>
#include <algorithm>
#include <string>
#include "base/misc.hh"
@@ -41,8 +42,8 @@
using std::string;
EtherDump::EtherDump(const string &name, const string &file)
: SimObject(name)
EtherDump::EtherDump(const string &name, const string &file, int max)
: SimObject(name), maxlen(max)
{
if (!file.empty())
stream.open(file.c_str());
@@ -113,22 +114,24 @@ EtherDump::dumpPacket(PacketPtr &packet)
pcap_pkthdr pkthdr;
pkthdr.seconds = curtime + (curTick / s_freq);
pkthdr.microseconds = (curTick / us_freq) % ULL(1000000);
pkthdr.caplen = packet->length;
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), packet->length);
stream.write(reinterpret_cast<char *>(packet->data), pkthdr.caplen);
stream.flush();
}
BEGIN_DECLARE_SIM_OBJECT_PARAMS(EtherDump)
Param<string> file;
Param<int> maxlen;
END_DECLARE_SIM_OBJECT_PARAMS(EtherDump)
BEGIN_INIT_SIM_OBJECT_PARAMS(EtherDump)
INIT_PARAM(file, "file to dump packets to")
INIT_PARAM(file, "file to dump packets to"),
INIT_PARAM_DFLT(maxlen, "max portion of packet data to dump", 96)
END_INIT_SIM_OBJECT_PARAMS(EtherDump)
@@ -148,7 +151,7 @@ CREATE_SIM_OBJECT(EtherDump)
}
}
return new EtherDump(getInstanceName(), filename);
return new EtherDump(getInstanceName(), filename, maxlen);
}
REGISTER_SIM_OBJECT("EtherDump", EtherDump)

View File

@@ -44,6 +44,7 @@ class EtherDump : public SimObject
{
private:
std::ofstream stream;
const int maxlen;
void dumpPacket(PacketPtr &packet);
void init();
@@ -52,7 +53,7 @@ class EtherDump : public SimObject
Tick us_freq;
public:
EtherDump(const std::string &name, const std::string &file);
EtherDump(const std::string &name, const std::string &file, int max);
inline void dump(PacketPtr &pkt) { if (stream.is_open()) dumpPacket(pkt); }
};