add some support for random access of data in packet fifos
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
This commit is contained in:
parent
10fcad4ce0
commit
9b18c0e872
2 changed files with 61 additions and 2 deletions
|
@ -31,6 +31,36 @@
|
||||||
|
|
||||||
using namespace std;
|
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
|
void
|
||||||
PacketFifo::serialize(const string &base, ostream &os)
|
PacketFifo::serialize(const string &base, ostream &os)
|
||||||
{
|
{
|
||||||
|
@ -40,8 +70,8 @@ PacketFifo::serialize(const string &base, ostream &os)
|
||||||
paramOut(os, base + ".packets", fifo.size());
|
paramOut(os, base + ".packets", fifo.size());
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
std::list<PacketPtr>::iterator p = fifo.begin();
|
list<PacketPtr>::iterator p = fifo.begin();
|
||||||
std::list<PacketPtr>::iterator end = fifo.end();
|
list<PacketPtr>::iterator end = fifo.end();
|
||||||
while (p != end) {
|
while (p != end) {
|
||||||
(*p)->serialize(csprintf("%s.packet%d", base, i), os);
|
(*p)->serialize(csprintf("%s.packet%d", base, i), os);
|
||||||
++p;
|
++p;
|
||||||
|
|
|
@ -127,6 +127,35 @@ class PacketFifo
|
||||||
fifo.erase(i);
|
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
|
* Serialization stuff
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue