00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "mac-rx-middle.h"
00022 #include "wifi-mac-header.h"
00023
00024 #include "ns3/assert.h"
00025 #include "ns3/log.h"
00026 #include "ns3/packet.h"
00027 #include "ns3/simulator.h"
00028 #include <list>
00029
00030 NS_LOG_COMPONENT_DEFINE ("MacRxMiddle");
00031
00032 namespace ns3 {
00033
00034
00035 class OriginatorRxStatus {
00036 private:
00037 typedef std::list<Ptr<const Packet> > Fragments;
00038 typedef std::list<Ptr<const Packet> >::const_iterator FragmentsCI;
00039
00040 bool m_defragmenting;
00041 uint16_t m_lastSequenceControl;
00042 Fragments m_fragments;
00043 public:
00044 OriginatorRxStatus () {
00045
00046 m_lastSequenceControl = 0xffff;
00047 m_defragmenting = false;
00048 }
00049 ~OriginatorRxStatus () {
00050 m_fragments.clear ();
00051 }
00052 bool IsDeFragmenting (void) {
00053 return m_defragmenting;
00054 }
00055 void AccumulateFirstFragment (Ptr<const Packet> packet) {
00056 NS_ASSERT (!m_defragmenting);
00057 m_defragmenting = true;
00058 m_fragments.push_back (packet);
00059 }
00060 Ptr<Packet> AccumulateLastFragment (Ptr<const Packet> packet) {
00061 NS_ASSERT (m_defragmenting);
00062 m_fragments.push_back (packet);
00063 m_defragmenting = false;
00064 Ptr<Packet> full = Create<Packet> ();
00065 for (FragmentsCI i = m_fragments.begin (); i != m_fragments.end (); i++)
00066 {
00067 full->AddAtEnd (*i);
00068 }
00069 m_fragments.erase (m_fragments.begin (), m_fragments.end ());
00070 return full;
00071 }
00072 void AccumulateFragment (Ptr<const Packet> packet) {
00073 NS_ASSERT (m_defragmenting);
00074 m_fragments.push_back (packet);
00075 }
00076 bool IsNextFragment (uint16_t sequenceControl) {
00077 if ((sequenceControl >> 4) == (m_lastSequenceControl >> 4) &&
00078 (sequenceControl & 0x0f) == ((m_lastSequenceControl & 0x0f)+1))
00079 {
00080 return true;
00081 }
00082 else
00083 {
00084 return false;
00085 }
00086 }
00087 uint16_t GetLastSequenceControl (void)
00088 {
00089 return m_lastSequenceControl;
00090 }
00091 void SetSequenceControl (uint16_t sequenceControl)
00092 {
00093 m_lastSequenceControl = sequenceControl;
00094 }
00095
00096 };
00097
00098
00099 MacRxMiddle::MacRxMiddle ()
00100 {
00101 NS_LOG_FUNCTION_NOARGS ();
00102 }
00103
00104 MacRxMiddle::~MacRxMiddle ()
00105 {
00106 NS_LOG_FUNCTION_NOARGS ();
00107 for (OriginatorsI i = m_originatorStatus.begin ();
00108 i != m_originatorStatus.end (); i++)
00109 {
00110 delete (*i).second;
00111 }
00112 m_originatorStatus.erase (m_originatorStatus.begin (),
00113 m_originatorStatus.end ());
00114 for (QosOriginatorsI i = m_qosOriginatorStatus.begin ();
00115 i != m_qosOriginatorStatus.end (); i++)
00116 {
00117 delete (*i).second;
00118 }
00119 m_qosOriginatorStatus.erase (m_qosOriginatorStatus.begin (),
00120 m_qosOriginatorStatus.end ());
00121 }
00122
00123 void
00124 MacRxMiddle::SetForwardCallback (ForwardUpCallback callback)
00125 {
00126 NS_LOG_FUNCTION_NOARGS ();
00127 m_callback = callback;
00128 }
00129
00130 bool
00131 MacRxMiddle::SequenceControlSmaller (int seqca, int seqcb)
00132 {
00133 NS_LOG_FUNCTION (seqca << seqcb);
00134 int seqa = seqca >> 4;
00135 int seqb = seqcb >> 4;
00136 int delta = seqb - seqa;
00137 NS_LOG_DEBUG ("seqb="<<seqb<<", seqa="<<seqa<<", delta="<<delta);
00138 if (delta <= 0 && delta < -2048)
00139 {
00140 return true;
00141 }
00142 else if (delta >= 0 && delta < 2048)
00143 {
00144 return true;
00145 }
00146 else
00147 {
00148 return false;
00149 }
00150 }
00151
00152
00153 OriginatorRxStatus *
00154 MacRxMiddle::Lookup (WifiMacHeader const *hdr)
00155 {
00156 NS_LOG_FUNCTION (hdr);
00157 OriginatorRxStatus *originator;
00158 Mac48Address source = hdr->GetAddr2 ();
00159 if (hdr->IsQosData () &&
00160 !hdr->GetAddr2 ().IsBroadcast ())
00161 {
00162
00163 originator = m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid ())];
00164 if (originator == 0)
00165 {
00166 originator = new OriginatorRxStatus ();
00167 m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid ())] = originator;
00168 }
00169 }
00170 else
00171 {
00172
00173
00174
00175
00176
00177 originator = m_originatorStatus[source];
00178 if (originator == 0)
00179 {
00180 originator = new OriginatorRxStatus ();
00181 m_originatorStatus[source] = originator;
00182 }
00183 }
00184 return originator;
00185 }
00186
00187 bool
00188 MacRxMiddle::IsDuplicate (WifiMacHeader const*hdr,
00189 OriginatorRxStatus *originator) const
00190 {
00191 NS_LOG_FUNCTION (hdr << originator);
00192 if (hdr->IsRetry () &&
00193 originator->GetLastSequenceControl () == hdr->GetSequenceControl ())
00194 {
00195 return true;
00196 }
00197 return false;
00198 }
00199
00200 Ptr<Packet>
00201 MacRxMiddle::HandleFragments (Ptr<Packet> packet, WifiMacHeader const*hdr,
00202 OriginatorRxStatus *originator)
00203 {
00204 NS_LOG_FUNCTION (packet << hdr << originator);
00205 if (originator->IsDeFragmenting ())
00206 {
00207 if (hdr->IsMoreFragments ())
00208 {
00209 if (originator->IsNextFragment (hdr->GetSequenceControl ()))
00210 {
00211 NS_LOG_DEBUG ("accumulate fragment seq="<<hdr->GetSequenceNumber ()<<
00212 ", frag="<<hdr->GetFragmentNumber ()<<
00213 ", size="<<packet->GetSize ());
00214 originator->AccumulateFragment (packet);
00215 originator->SetSequenceControl (hdr->GetSequenceControl ());
00216 }
00217 else
00218 {
00219 NS_LOG_DEBUG ("non-ordered fragment");
00220 }
00221 return 0;
00222 }
00223 else
00224 {
00225 if (originator->IsNextFragment (hdr->GetSequenceControl ()))
00226 {
00227 NS_LOG_DEBUG ("accumulate last fragment seq="<<hdr->GetSequenceNumber ()<<
00228 ", frag="<<hdr->GetFragmentNumber ()<<
00229 ", size="<<hdr->GetSize ());
00230 Ptr<Packet> p = originator->AccumulateLastFragment (packet);
00231 originator->SetSequenceControl (hdr->GetSequenceControl ());
00232 return p;
00233 }
00234 else
00235 {
00236 NS_LOG_DEBUG ("non-ordered fragment");
00237 return 0;
00238 }
00239 }
00240 }
00241 else
00242 {
00243 if (hdr->IsMoreFragments ())
00244 {
00245 NS_LOG_DEBUG ("accumulate first fragment seq="<<hdr->GetSequenceNumber ()<<
00246 ", frag="<<hdr->GetFragmentNumber ()<<
00247 ", size="<<packet->GetSize ());
00248 originator->AccumulateFirstFragment (packet);
00249 originator->SetSequenceControl (hdr->GetSequenceControl ());
00250 return 0;
00251 }
00252 else
00253 {
00254 return packet;
00255 }
00256 }
00257 }
00258
00259 void
00260 MacRxMiddle::Receive (Ptr<Packet> packet, WifiMacHeader const *hdr)
00261 {
00262 NS_LOG_FUNCTION (packet << hdr);
00263 NS_ASSERT (hdr->IsData () || hdr->IsMgt ());
00264 OriginatorRxStatus *originator = Lookup (hdr);
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 if (!SequenceControlSmaller (originator->GetLastSequenceControl (),
00275 hdr->GetSequenceControl ()))
00276 {
00277 NS_LOG_DEBUG ("Sequence numbers have looped back. last recorded="<<originator->GetLastSequenceControl ()<<
00278 " currently seen="<< hdr->GetSequenceControl ());
00279 }
00280
00281 if (IsDuplicate (hdr, originator))
00282 {
00283 NS_LOG_DEBUG ("duplicate from="<<hdr->GetAddr2 ()<<
00284 ", seq="<<hdr->GetSequenceNumber ()<<
00285 ", frag="<<hdr->GetFragmentNumber ());
00286 return;
00287 }
00288 Ptr<Packet> agregate = HandleFragments (packet, hdr, originator);
00289 if (agregate == 0)
00290 {
00291 return;
00292 }
00293 NS_LOG_DEBUG ("forwarding data from="<<hdr->GetAddr2 ()<<
00294 ", seq="<<hdr->GetSequenceNumber ()<<
00295 ", frag="<<hdr->GetFragmentNumber ());
00296 if (!hdr->GetAddr1 ().IsBroadcast ())
00297 {
00298 originator->SetSequenceControl (hdr->GetSequenceControl ());
00299 }
00300 m_callback (agregate, hdr);
00301 }
00302
00303 }