add some support for random access of data in packet fifos
authorNathan Binkert <binkertn@umich.edu>
Mon, 27 Feb 2006 01:31:08 +0000 (20:31 -0500)
committerNathan Binkert <binkertn@umich.edu>
Mon, 27 Feb 2006 01:31:08 +0000 (20:31 -0500)
dev/pktfifo.cc:
    add support for copying arbitrary data out of a
    packet fifo
dev/pktfifo.hh:
    add support for copying arbitrary data out of a
    packet fifo.
    Add functions to determine where in the fifo a
    particular packet is

--HG--
extra : convert_revision : f8ddc994ce8577f29af0de3fa418a01e4e2cb0f1

dev/pktfifo.cc
dev/pktfifo.hh

index b4fab2d6f3a451901730f7807b61b090adec4692..639009be9e8daf239c71650ef333ef1fa5e763af 100644 (file)
 
 using namespace std;
 
+bool
+PacketFifo::copyout(void *dest, int offset, int len)
+{
+    char *data = (char *)dest;
+    if (offset + len >= size())
+        return false;
+
+    list<PacketPtr>::iterator p = fifo.begin();
+    list<PacketPtr>::iterator end = fifo.end();
+    while (len > 0) {
+        while (offset >= (*p)->length) {
+            offset -= (*p)->length;
+            ++p;
+        }
+
+        if (p == end)
+            panic("invalid fifo");
+
+        int size = min((*p)->length - offset, len);
+        memcpy(data, (*p)->data, size);
+        offset = 0;
+        len -= size;
+        data += size;
+        ++p;
+    }
+
+    return true;
+}
+
+
 void
 PacketFifo::serialize(const string &base, ostream &os)
 {
@@ -40,8 +70,8 @@ PacketFifo::serialize(const string &base, ostream &os)
     paramOut(os, base + ".packets", fifo.size());
 
     int i = 0;
-    std::list<PacketPtr>::iterator p = fifo.begin();
-    std::list<PacketPtr>::iterator end = fifo.end();
+    list<PacketPtr>::iterator p = fifo.begin();
+    list<PacketPtr>::iterator end = fifo.end();
     while (p != end) {
         (*p)->serialize(csprintf("%s.packet%d", base, i), os);
         ++p;
index e63fd291fa1b52bb635e9b7cdee372d90f8449c1..e245840a80b88e4a4623d7354dc2e9a8ff590dfd 100644 (file)
@@ -127,6 +127,35 @@ class PacketFifo
         fifo.erase(i);
     }
 
+    bool copyout(void *dest, int offset, int len);
+
+    int countPacketsBefore(iterator end)
+    {
+        iterator i = fifo.begin();
+        int count = 0;
+
+        while (i != end) {
+            ++count;
+            ++i;
+        }
+
+        return count;
+    }
+
+    int countPacketsAfter(iterator i)
+    {
+        iterator end = fifo.end();
+        int count = 0;
+
+        while (i != end) {
+            ++count;
+            ++i;
+        }
+
+        return count;
+    }
+
+
 /**
  * Serialization stuff
  */