31 #include "ns3/fatal-error.h"
34 #include "pending-data.h"
42 PendingData::PendingData () : size (0), data (0),
43 msgSize (0), responseSize (0)
48 PendingData::PendingData (uint32_t s, uint8_t* d, uint32_t msg, uint32_t resp)
49 : size (s), data (0), msgSize (msg), responseSize (resp)
54 data.push_back (Create<Packet> (d, size));
58 PendingData::PendingData(
const std::string& s)
59 : size (s.length () + 1), data (0),
60 msgSize (0), responseSize (0)
63 data.push_back (Create<Packet> ((uint8_t*)s.c_str (), size));
66 PendingData::PendingData(
const PendingData& c)
67 : size (c.Size ()), data (c.data),
68 msgSize (c.msgSize), responseSize (c.responseSize)
73 PendingData::~PendingData()
78 PendingData* PendingData::Copy ()
const
81 return new PendingData (*
this);
84 PendingData* PendingData::CopyS (uint32_t s)
87 return new PendingData (s, 0, msgSize, responseSize);
90 PendingData* PendingData::CopySD (uint32_t s, uint8_t* d)
93 return new PendingData (s, d, msgSize, responseSize);
96 void PendingData::Clear ()
103 void PendingData::Add (uint32_t s,
const uint8_t* d)
108 data.push_back (Create<Packet> (d,s));
112 data.push_back (Create<Packet> (s));
117 void PendingData::Add (Ptr<Packet> p)
121 size += p->GetSize ();
135 if (offset > size)
return 0;
136 return size - offset;
142 if (seqOffset < seqFront)
146 return seqOffset - seqFront;
149 Ptr<Packet> PendingData::CopyFromOffset (uint32_t s, uint32_t o)
156 return Create<Packet> ();
158 if (data.size () != 0)
161 std::vector<Ptr<Packet> >::size_type begin = 0;
162 bool beginFound =
false;
163 std::vector<Ptr<Packet> >::size_type end = 0;
164 Ptr<Packet> outPacket;
165 Ptr<Packet> endFragment;
166 for (std::vector<Ptr<Packet> >::size_type i=0; i<data.size (); ++i)
168 count+=data[i]->GetSize ();
175 Ptr<Packet> toFragment = data[i];
176 uint32_t packetStart = count - toFragment->GetSize ();
177 uint32_t packetOffset = o - packetStart;
178 outPacket = toFragment->CreateFragment (packetOffset, s1);
183 Ptr<Packet> toFragment = data[begin];
184 uint32_t packetStart = count - toFragment->GetSize ();
185 uint32_t packetOffset = o - packetStart;
186 uint32_t fragmentLength = count - o;
187 outPacket = toFragment->CreateFragment (packetOffset, fragmentLength);
195 Ptr<Packet> toFragment = data[end];
196 uint32_t packetStart = count - toFragment->GetSize ();
197 uint32_t fragmentLength = o + s1 - packetStart;
198 endFragment = toFragment->CreateFragment (0, fragmentLength);
203 for (std::vector<Ptr<Packet> >::size_type i=begin+1; i<end; ++i)
205 outPacket->AddAtEnd (data[i]);
209 outPacket->AddAtEnd (endFragment);
216 return Create<Packet> (s1);
220 Ptr<Packet> PendingData::CopyFromSeq (uint32_t s,
const SequenceNumber32& f,
const SequenceNumber32& o)
231 NS_ASSERT_MSG (count <= size,
"Trying to remove more data than in the buffer");
240 std::vector<Ptr<Packet> >::iterator endI = data.begin ();
241 uint32_t current = 0;
243 for (std::vector<
Ptr<Packet> >::iterator dataI = data.begin (); dataI < data.end (); dataI++)
245 if (current + (*dataI)->GetSize () > count)
249 current += (*dataI)->GetSize ();
252 data.erase (data.begin (), endI);
#define NS_LOG_FUNCTION(parameters)
virtual uint32_t RemoveToSeq(const SequenceNumber32 &seqFront, const SequenceNumber32 &seqOffset)
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
virtual uint32_t SizeFromOffset(uint32_t offset)
#define NS_ASSERT_MSG(condition, message)
virtual uint32_t SizeFromSeq(const SequenceNumber32 &seqFront, const SequenceNumber32 &seqOffset)
virtual uint32_t OffsetFromSeq(const SequenceNumber32 &seqFront, const SequenceNumber32 &seqOffset)