summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dev/ethertap.cc47
-rw-r--r--dev/ethertap.hh3
2 files changed, 50 insertions, 0 deletions
diff --git a/dev/ethertap.cc b/dev/ethertap.cc
index b99d46ce5..339e7ac78 100644
--- a/dev/ethertap.cc
+++ b/dev/ethertap.cc
@@ -163,6 +163,7 @@ EtherTap::detach()
{
DPRINTF(Ethernet, "EtherTap detached\n");
delete event;
+ event = 0;
close(socket);
socket = -1;
}
@@ -262,6 +263,52 @@ EtherTap::retransmit()
txEvent.schedule(curTick + 1000);
}
+//=====================================================================
+
+void
+EtherTap::serialize(ostream &os)
+{
+ SERIALIZE_SCALAR(socket);
+ SERIALIZE_SCALAR(buflen);
+ SERIALIZE_ARRAY((uint8_t *)buffer,buflen);
+ SERIALIZE_SCALAR(buffer_offset);
+ SERIALIZE_SCALAR(data_len);
+
+ bool tapevent_present = false;
+ if (event) {
+ tapevent_present = true;
+ SERIALIZE_SCALAR(tapevent_present);
+ event->serialize(os);
+ }
+ else {
+ SERIALIZE_SCALAR(tapevent_present);
+ }
+}
+
+void
+EtherTap::unserialize(Checkpoint *cp, const std::string &section)
+{
+ UNSERIALIZE_SCALAR(socket);
+ UNSERIALIZE_SCALAR(buflen);
+ UNSERIALIZE_ARRAY((uint8_t *)buffer,buflen);
+ UNSERIALIZE_SCALAR(buffer_offset);
+ UNSERIALIZE_SCALAR(data_len);
+
+ bool tapevent_present;
+ UNSERIALIZE_SCALAR(tapevent_present);
+ if (tapevent_present) {
+ event = new TapEvent(this, socket, POLLIN|POLLERR);
+
+ event->unserialize(cp,section);
+
+ if (event->queued()) {
+ pollQueue.schedule(event);
+ }
+ }
+}
+
+//=====================================================================
+
BEGIN_DECLARE_SIM_OBJECT_PARAMS(EtherTap)
SimObjectParam<EtherInt *> peer;
diff --git a/dev/ethertap.hh b/dev/ethertap.hh
index 6e99bd91d..e2b1f640f 100644
--- a/dev/ethertap.hh
+++ b/dev/ethertap.hh
@@ -96,6 +96,9 @@ class EtherTap : public EtherInt
virtual bool recvPacket(PacketPtr packet);
virtual void sendDone();
+
+ virtual void serialize(std::ostream &os);
+ virtual void unserialize(Checkpoint *cp, const std::string &section);
};
#endif // __ETHERTAP_HH__