Add serialization for packets on the ethernet link,
authorRon Dreslinski <rdreslin@umich.edu>
Fri, 20 Feb 2004 17:44:41 +0000 (12:44 -0500)
committerRon Dreslinski <rdreslin@umich.edu>
Fri, 20 Feb 2004 17:44:41 +0000 (12:44 -0500)
and for link events

--HG--
extra : convert_revision : 0054dbc4a42dd38ff8bbf64af303bc509dd5aa8a

dev/etherlink.cc
dev/etherlink.hh

index 676b1da1c6f3d873cfb14aa5b2b70bc6d140ff6c..7c70b82ce510ba69ba994645f448d0d1d0317c54 100644 (file)
@@ -42,6 +42,7 @@
 #include "dev/etherpkt.hh"
 #include "sim/builder.hh"
 #include "sim/universe.hh"
+#include "sim/system.hh"
 
 using namespace std;
 
@@ -84,6 +85,20 @@ EtherLink::Link::Link(const std::string &name, double rate, EtherDump *d)
       dump(d), event(&mainEventQueue, this)
 {}
 
+void
+EtherLink::serialize(ostream &os)
+{
+    link1->serialize(os);
+    link2->serialize(os);
+}
+
+void
+EtherLink::unserialize(Checkpoint *cp, const string &section)
+{
+    link1->unserialize(cp, section);
+    link2->unserialize(cp, section);
+}
+
 void
 EtherLink::Link::txDone()
 {
@@ -121,6 +136,42 @@ EtherLink::Link::transmit(PacketPtr &pkt)
     return true;
 }
 
+void
+EtherLink::Link::serialize(ostream &os)
+{
+    bool packetExists = false;
+    if (packet) packetExists = true;
+    SERIALIZE_SCALAR(packetExists);
+    if (packetExists) {
+        nameOut(os, csprintf("%s.linkPacket", name()));
+        packet->serialize(os);
+    }
+
+    bool event_scheduled = event.scheduled();
+    SERIALIZE_SCALAR(event_scheduled);
+    if (event_scheduled) {
+        SERIALIZE_SCALAR(event.when());
+    }
+}
+
+void
+EtherLink::Link::unserialize(Checkpoint *cp, const string &section)
+{
+    bool event_scheduled, packetExists;
+    Tick eventTime;
+    UNSERIALIZE_SCALAR(packetExists);
+    if (packetExists) {
+        packet = new EtherPacket;
+        packet->unserialize(cp, csprintf("%s.linkPacket", section));
+    }
+
+    UNSERIALIZE_SCALAR(event_scheduled);
+    if (event_scheduled) {
+        UNSERIALIZE_SCALAR(eventTime);
+        event.schedule(eventTime);
+    }
+}
+
 BEGIN_DECLARE_SIM_OBJECT_PARAMS(EtherLink)
 
     SimObjectParam<EtherInt *> interface1;
index e1a7957ee330583c08f1aade905d488a8d3b414a..8505570a61b9d3c81a5c63dca8e32d0872083154 100644 (file)
@@ -96,6 +96,9 @@ class EtherLink : public SimObject
 
         void setTxInt(Interface *i) { assert(!txint); txint = i; }
         void setRxInt(Interface *i) { assert(!rxint); rxint = i; }
+
+        virtual void serialize(std::ostream &os);
+        virtual void unserialize(Checkpoint *cp, const std::string &section);
     };
 
     /*
@@ -122,6 +125,10 @@ class EtherLink : public SimObject
     EtherLink(const std::string &name, EtherInt *i1, EtherInt *i2,
               Tick speed, EtherDump *dump);
     virtual ~EtherLink();
+
+    virtual void serialize(std::ostream &os);
+    virtual void unserialize(Checkpoint *cp, const std::string &section);
+
 };
 
 #endif // __ETHERLINK_HH__