21 #include "mac-rx-middle.h"
22 #include "wifi-mac-header.h"
24 #include "ns3/assert.h"
26 #include "ns3/packet.h"
27 #include "ns3/simulator.h"
28 #include "ns3/sequence-number.h"
39 typedef std::list<Ptr<const Packet> > Fragments;
40 typedef std::list<Ptr<const Packet> >::const_iterator FragmentsCI;
43 uint16_t m_lastSequenceControl;
44 Fragments m_fragments;
49 m_lastSequenceControl = 0xffff;
50 m_defragmenting =
false;
56 bool IsDeFragmenting (
void)
58 return m_defragmenting;
63 m_defragmenting =
true;
64 m_fragments.push_back (packet);
69 m_fragments.push_back (packet);
70 m_defragmenting =
false;
72 for (FragmentsCI i = m_fragments.begin (); i != m_fragments.end (); i++)
76 m_fragments.erase (m_fragments.begin (), m_fragments.end ());
82 m_fragments.push_back (packet);
84 bool IsNextFragment (uint16_t sequenceControl)
86 if ((sequenceControl >> 4) == (m_lastSequenceControl >> 4)
87 && (sequenceControl & 0x0f) == ((m_lastSequenceControl & 0x0f) + 1))
96 uint16_t GetLastSequenceControl (
void)
98 return m_lastSequenceControl;
100 void SetSequenceControl (uint16_t sequenceControl)
102 m_lastSequenceControl = sequenceControl;
108 MacRxMiddle::MacRxMiddle ()
113 MacRxMiddle::~MacRxMiddle ()
116 for (OriginatorsI i = m_originatorStatus.begin ();
117 i != m_originatorStatus.end (); i++)
121 m_originatorStatus.erase (m_originatorStatus.begin (),
122 m_originatorStatus.end ());
123 for (QosOriginatorsI i = m_qosOriginatorStatus.begin ();
124 i != m_qosOriginatorStatus.end (); i++)
128 m_qosOriginatorStatus.erase (m_qosOriginatorStatus.begin (),
129 m_qosOriginatorStatus.end ());
133 MacRxMiddle::SetForwardCallback (ForwardUpCallback callback)
136 m_callback = callback;
140 MacRxMiddle::Lookup (
const WifiMacHeader *hdr)
143 OriginatorRxStatus *originator;
144 Mac48Address source = hdr->GetAddr2 ();
145 if (hdr->IsQosData ()
146 && !hdr->GetAddr2 ().IsGroup ())
149 originator = m_qosOriginatorStatus[std::make_pair (source, hdr->GetQosTid ())];
152 originator =
new OriginatorRxStatus ();
153 m_qosOriginatorStatus[std::make_pair (source, hdr->GetQosTid ())] = originator;
163 originator = m_originatorStatus[source];
166 originator =
new OriginatorRxStatus ();
167 m_originatorStatus[source] = originator;
174 MacRxMiddle::IsDuplicate (
const WifiMacHeader* hdr,
175 OriginatorRxStatus *originator)
const
179 && originator->GetLastSequenceControl () == hdr->GetSequenceControl ())
187 MacRxMiddle::HandleFragments (Ptr<Packet> packet,
const WifiMacHeader *hdr,
188 OriginatorRxStatus *originator)
191 if (originator->IsDeFragmenting ())
193 if (hdr->IsMoreFragments ())
195 if (originator->IsNextFragment (hdr->GetSequenceControl ()))
197 NS_LOG_DEBUG (
"accumulate fragment seq=" << hdr->GetSequenceNumber () <<
198 ", frag=" << hdr->GetFragmentNumber () <<
199 ", size=" << packet->GetSize ());
200 originator->AccumulateFragment (packet);
201 originator->SetSequenceControl (hdr->GetSequenceControl ());
211 if (originator->IsNextFragment (hdr->GetSequenceControl ()))
213 NS_LOG_DEBUG (
"accumulate last fragment seq=" << hdr->GetSequenceNumber () <<
214 ", frag=" << hdr->GetFragmentNumber () <<
215 ", size=" << hdr->GetSize ());
216 Ptr<Packet> p = originator->AccumulateLastFragment (packet);
217 originator->SetSequenceControl (hdr->GetSequenceControl ());
229 if (hdr->IsMoreFragments ())
231 NS_LOG_DEBUG (
"accumulate first fragment seq=" << hdr->GetSequenceNumber () <<
232 ", frag=" << hdr->GetFragmentNumber () <<
233 ", size=" << packet->GetSize ());
234 originator->AccumulateFirstFragment (packet);
235 originator->SetSequenceControl (hdr->GetSequenceControl ());
249 NS_ASSERT (hdr->IsData () || hdr->IsMgt ());
262 NS_LOG_DEBUG (
"Sequence numbers have looped back. last recorded=" << originator->GetLastSequenceControl () <<
263 " currently seen=" << hdr->GetSequenceControl ());
266 if (IsDuplicate (hdr, originator))
269 ", seq=" << hdr->GetSequenceNumber () <<
270 ", frag=" << hdr->GetFragmentNumber ());
273 Ptr<Packet> agregate = HandleFragments (packet, hdr, originator);
278 NS_LOG_DEBUG (
"forwarding data from=" << hdr->GetAddr2 () <<
279 ", seq=" << hdr->GetSequenceNumber () <<
280 ", frag=" << hdr->GetFragmentNumber ());
281 if (!hdr->GetAddr1 ().
IsGroup ())
283 originator->SetSequenceControl (hdr->GetSequenceControl ());
285 m_callback (agregate, hdr);
#define NS_LOG_FUNCTION(parameters)
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
#define NS_LOG_FUNCTION_NOARGS()
void Receive(Ptr< Packet > packet, const WifiMacHeader *hdr)
void AddAtEnd(Ptr< const Packet > packet)
Generic "sequence number" class.
#define NS_LOG_DEBUG(msg)