pktfifo.hh revision 2566
1/* 2 * Copyright (c) 2004-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#ifndef __DEV_PKTFIFO_HH__ 30#define __DEV_PKTFIFO_HH__ 31 32#include <iosfwd> 33#include <list> 34#include <string> 35 36#include "dev/etherpkt.hh" 37#include "sim/serialize.hh" 38 39class Checkpoint; 40class PacketFifo 41{ 42 public: 43 typedef std::list<EthPacketPtr> fifo_list; 44 typedef fifo_list::iterator iterator; 45 46 protected: 47 std::list<EthPacketPtr> fifo; 48 int _maxsize; 49 int _size; 50 int _reserved; 51 52 public: 53 explicit PacketFifo(int max) : _maxsize(max), _size(0), _reserved(0) {} 54 virtual ~PacketFifo() {} 55 56 int packets() const { return fifo.size(); } 57 int maxsize() const { return _maxsize; } 58 int size() const { return _size; } 59 int reserved() const { return _reserved; } 60 int avail() const { return _maxsize - _size - _reserved; } 61 bool empty() const { return size() <= 0; } 62 bool full() const { return avail() <= 0; } 63 64 int reserve(int len = 0) 65 { 66 _reserved += len; 67 assert(avail() >= 0); 68 return _reserved; 69 } 70 71 iterator begin() { return fifo.begin(); } 72 iterator end() { return fifo.end(); } 73 74 EthPacketPtr front() { return fifo.front(); } 75 76 bool push(EthPacketPtr ptr) 77 { 78 assert(ptr->length); 79 assert(_reserved <= ptr->length); 80 assert(ptr->slack == 0); 81 if (avail() < ptr->length - _reserved) 82 return false; 83 84 _size += ptr->length; 85 fifo.push_back(ptr); 86 _reserved = 0; 87 return true; 88 } 89 90 void pop() 91 { 92 if (empty()) 93 return; 94 95 EthPacketPtr &packet = fifo.front(); 96 _size -= packet->length; 97 _size -= packet->slack; 98 packet->slack = 0; 99 packet = NULL; 100 fifo.pop_front(); 101 } 102 103 void clear() 104 { 105 for (iterator i = begin(); i != end(); ++i) 106 (*i)->slack = 0; 107 fifo.clear(); 108 _size = 0; 109 _reserved = 0; 110 } 111 112 void remove(iterator i) 113 { 114 EthPacketPtr &packet = *i; 115 if (i != fifo.begin()) { 116 iterator prev = i; 117 --prev; 118 assert(prev != fifo.end()); 119 (*prev)->slack += packet->length; 120 } else { 121 _size -= packet->length; 122 _size -= packet->slack; 123 } 124 125 packet->slack = 0; 126 packet = NULL; 127 fifo.erase(i); 128 } 129 130 bool copyout(void *dest, int offset, int len); 131 132 int countPacketsBefore(iterator end) 133 { 134 iterator i = fifo.begin(); 135 int count = 0; 136 137 while (i != end) { 138 ++count; 139 ++i; 140 } 141 142 return count; 143 } 144 145 int countPacketsAfter(iterator i) 146 { 147 iterator end = fifo.end(); 148 int count = 0; 149 150 while (i != end) { 151 ++count; 152 ++i; 153 } 154 155 return count; 156 } 157 158 159/** 160 * Serialization stuff 161 */ 162 public: 163 void serialize(const std::string &base, std::ostream &os); 164 void unserialize(const std::string &base, 165 Checkpoint *cp, const std::string §ion); 166}; 167 168#endif // __DEV_PKTFIFO_HH__ 169