Add support to store less than the full packet in an etherdump
authorNathan Binkert <binkertn@umich.edu>
Fri, 23 Jul 2004 03:54:24 +0000 (23:54 -0400)
committerNathan Binkert <binkertn@umich.edu>
Fri, 23 Jul 2004 03:54:24 +0000 (23:54 -0400)
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

dev/etherdump.cc
dev/etherdump.hh

index 54e573be4c1811776ca50e06865b298b9dcc000a..27817d4569b4bef7c6e0673bb7fafb4badab0b99 100644 (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)
index ef4399e1aafbab556cf89a7d1fafab68736ba9cd..62364359e22f70e65cdc39ac051182426f48d7c3 100644 (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); }
 };