Bug 2184 [wifi] - integer overflow in MacLow; remove dependcy between tx and rx reference number field in MPDU status
authorS?bastien Deronne <sebastien.deronne@gmail.com>
Sat, 10 Oct 2015 11:01:44 +0200
changeset 11683 dad754e84171
parent 11682 daa3bfadabef
child 11684 f3fd4725ae30
Bug 2184 [wifi] - integer overflow in MacLow; remove dependcy between tx and rx reference number field in MPDU status
RELEASE_NOTES
src/wave/helper/wave-helper.cc
src/wifi/examples/test-interference-helper.cc
src/wifi/examples/wifi-phy-test.cc
src/wifi/helper/yans-wifi-helper.cc
src/wifi/model/mac-low.cc
src/wifi/model/mac-low.h
src/wifi/model/wifi-phy.h
src/wifi/model/yans-wifi-channel.cc
src/wifi/model/yans-wifi-channel.h
src/wifi/model/yans-wifi-phy.cc
src/wifi/model/yans-wifi-phy.h
--- a/RELEASE_NOTES	Mon Sep 28 20:23:11 2015 -0700
+++ b/RELEASE_NOTES	Sat Oct 10 11:01:44 2015 +0200
@@ -28,6 +28,7 @@
 - Bug 1132 - useless for loops in block-ack-test-suite.cc
 - Bug 2183 - LiIonEnergySourceHelper is not in the energy wscript
 - Bug 2003 - Missing DSSS short PLCP preamble
+- Bug 2184 - integer overflow in MacLow
 
 Known issues
 ------------
--- a/src/wave/helper/wave-helper.cc	Mon Sep 28 20:23:11 2015 -0700
+++ b/src/wave/helper/wave-helper.cc	Sat Oct 10 11:01:44 2015 +0200
@@ -209,7 +209,6 @@
         if (txVector.IsAggregation ())
           {
             uint16_t ampduStatusFlags = RadiotapHeader::A_MPDU_STATUS_NONE;
-            ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_DELIMITER_CRC_KNOWN;
             ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
             /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
             AmpduSubframeHeader hdr;
@@ -221,7 +220,7 @@
               {
                 ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
               }
-            header.SetAmpduStatus (aMpdu.referenceNumber, ampduStatusFlags, hdr.GetCrc ());
+            header.SetAmpduStatus (aMpdu.mpduRefNumber, ampduStatusFlags, hdr.GetCrc ());
           }
 
         if (preamble == WIFI_PREAMBLE_VHT)
@@ -405,7 +404,7 @@
 
         if (txVector.IsAggregation ())
           {
-            uint16_t ampduStatusFlags = 0;
+            uint16_t ampduStatusFlags = RadiotapHeader::A_MPDU_STATUS_NONE;
             ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_DELIMITER_CRC_KNOWN;
             ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
             /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
@@ -418,7 +417,7 @@
               {
                 ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
               }
-            header.SetAmpduStatus (aMpdu.referenceNumber, ampduStatusFlags, hdr.GetCrc ());
+            header.SetAmpduStatus (aMpdu.mpduRefNumber, ampduStatusFlags, hdr.GetCrc ());
           }
 
         if (preamble == WIFI_PREAMBLE_VHT)
--- a/src/wifi/examples/test-interference-helper.cc	Mon Sep 28 20:23:11 2015 -0700
+++ b/src/wifi/examples/test-interference-helper.cc	Sat Oct 10 11:01:44 2015 +0200
@@ -106,7 +106,7 @@
   WifiTxVector txVector;
   txVector.SetTxPowerLevel (m_input.txPowerLevelA);
   txVector.SetMode (WifiMode (m_input.txModeA));
-  m_txA->SendPacket (p, txVector, m_input.preamble, 0, 0);
+  m_txA->SendPacket (p, txVector, m_input.preamble, 0);
 }
 
 void
@@ -116,7 +116,7 @@
   WifiTxVector txVector;
   txVector.SetTxPowerLevel (m_input.txPowerLevelB);
   txVector.SetMode (WifiMode (m_input.txModeB));
-  m_txB->SendPacket (p, txVector, m_input.preamble, 0, 0);
+  m_txB->SendPacket (p, txVector, m_input.preamble, 0);
 }
 
 InterferenceExperiment::InterferenceExperiment ()
--- a/src/wifi/examples/wifi-phy-test.cc	Mon Sep 28 20:23:11 2015 -0700
+++ b/src/wifi/examples/wifi-phy-test.cc	Sat Oct 10 11:01:44 2015 +0200
@@ -74,7 +74,7 @@
   WifiTxVector txVector;
   txVector.SetTxPowerLevel (m_input.txPowerLevel);
   txVector.SetMode (mode);
-  m_tx->SendPacket (p, txVector, WIFI_PREAMBLE_LONG, 0, 0);
+  m_tx->SendPacket (p, txVector, WIFI_PREAMBLE_LONG, 0);
 }
 
 void
@@ -182,7 +182,7 @@
   WifiTxVector txVector;
   txVector.SetTxPowerLevel (m_input.txPowerLevelA);
   txVector.SetMode (WifiMode (m_input.txModeA));
-  m_txA->SendPacket (p, txVector, WIFI_PREAMBLE_LONG, 0, 0);
+  m_txA->SendPacket (p, txVector, WIFI_PREAMBLE_LONG, 0);
 }
 
 void
@@ -193,7 +193,7 @@
   WifiTxVector txVector;
   txVector.SetTxPowerLevel (m_input.txPowerLevelB);
   txVector.SetMode (WifiMode (m_input.txModeB));
-  m_txB->SendPacket (p, txVector, WIFI_PREAMBLE_LONG, 0, 0);
+  m_txB->SendPacket (p, txVector, WIFI_PREAMBLE_LONG, 0);
 }
 
 void
--- a/src/wifi/helper/yans-wifi-helper.cc	Mon Sep 28 20:23:11 2015 -0700
+++ b/src/wifi/helper/yans-wifi-helper.cc	Sat Oct 10 11:01:44 2015 +0200
@@ -371,7 +371,6 @@
         if (txVector.IsAggregation ())
           {
             uint16_t ampduStatusFlags = RadiotapHeader::A_MPDU_STATUS_NONE;
-            ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_DELIMITER_CRC_KNOWN;
             ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
             /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
             AmpduSubframeHeader hdr;
@@ -383,7 +382,7 @@
               {
                 ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
               }
-            header.SetAmpduStatus (aMpdu.referenceNumber, ampduStatusFlags, hdr.GetCrc ());
+            header.SetAmpduStatus (aMpdu.mpduRefNumber, ampduStatusFlags, hdr.GetCrc ());
           }
 
         if (preamble == WIFI_PREAMBLE_VHT)
@@ -567,7 +566,7 @@
 
         if (txVector.IsAggregation ())
           {
-            uint16_t ampduStatusFlags = 0;
+            uint16_t ampduStatusFlags = RadiotapHeader::A_MPDU_STATUS_NONE;
             ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_DELIMITER_CRC_KNOWN;
             ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST_KNOWN;
             /* For PCAP file, MPDU Delimiter and Padding should be removed by the MAC Driver */
@@ -580,7 +579,7 @@
               {
                 ampduStatusFlags |= RadiotapHeader::A_MPDU_STATUS_LAST;
               }
-            header.SetAmpduStatus (aMpdu.referenceNumber, ampduStatusFlags, hdr.GetCrc ());
+            header.SetAmpduStatus (aMpdu.mpduRefNumber, ampduStatusFlags, hdr.GetCrc ());
           }
 
         if (preamble == WIFI_PREAMBLE_VHT)
--- a/src/wifi/model/mac-low.cc	Mon Sep 28 20:23:11 2015 -0700
+++ b/src/wifi/model/mac-low.cc	Sat Oct 10 11:01:44 2015 +0200
@@ -365,8 +365,7 @@
     m_listener (0),
     m_phyMacLowListener (0),
     m_ctsToSelfSupported (false),
-    m_receivedAtLeastOneMpdu (false),
-    m_mpduReferenceNumber (0)
+    m_receivedAtLeastOneMpdu (false)
 {
   NS_LOG_FUNCTION (this);
   m_lastNavDuration = Seconds (0);
@@ -1605,7 +1604,7 @@
                 ", seq=0x" << std::hex << m_currentHdr.GetSequenceControl () << std::dec);
   if (!m_ampdu || hdr->IsRts ())
     {
-      m_phy->SendPacket (packet, txVector, preamble, 0, 0);
+      m_phy->SendPacket (packet, txVector, preamble, 0);
     }
   else
     {
@@ -1658,11 +1657,11 @@
                 {
                   packetType = 0;
                 }
-              m_phy->SendPacket (newPacket, txVector, preamble, packetType, m_mpduReferenceNumber);
+              m_phy->SendPacket (newPacket, txVector, preamble, packetType);
             }
           else
             {
-              Simulator::Schedule (delay, &MacLow::SendPacket, this, newPacket, txVector, preamble, packetType, m_mpduReferenceNumber);
+              Simulator::Schedule (delay, &MacLow::SendPacket, this, newPacket, txVector, preamble, packetType);
             }
           if (queueSize > 1)
             {
@@ -1670,15 +1669,14 @@
             }
           preamble = WIFI_PREAMBLE_NONE;
         }
-      m_mpduReferenceNumber = ((m_mpduReferenceNumber + 1) % 4294967296);
     }
 }
 
 void
-MacLow::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber)
+MacLow::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType)
 {
   NS_LOG_DEBUG ("Sending MPDU as part of A-MPDU");
-  m_phy->SendPacket (packet, txVector, preamble, packetType, mpduReferenceNumber);
+  m_phy->SendPacket (packet, txVector, preamble, packetType);
 }
 
 void
--- a/src/wifi/model/mac-low.h	Mon Sep 28 20:23:11 2015 -0700
+++ b/src/wifi/model/mac-low.h	Sat Oct 10 11:01:44 2015 +0200
@@ -892,9 +892,8 @@
    * \param txVector
    * \param preamble
    * \param packetType
-   * \param mpduReferenceNumber
    */
-  void SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber);
+  void SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType);
   /**
    * Return a TXVECTOR for the RTS frame given the destination.
    * The function consults WifiRemoteStationManager, which controls the rate
@@ -1373,7 +1372,6 @@
   WifiTxVector m_currentTxVector;     //!< TXVECTOR used for the current packet transmission
   bool m_receivedAtLeastOneMpdu;      //!< Flag whether an MPDU has already been successfully received while receiving an A-MPDU
   std::vector<Item> m_txPackets;      //!< Contain temporary items to be sent with the next A-MPDU transmission, once RTS/CTS exchange has succeeded. It is not used in other cases.
-  uint32_t m_mpduReferenceNumber;       //!< A-MPDU reference number to identify all subframes belonging to the same A-MPDU
 };
 
 } //namespace ns3
--- a/src/wifi/model/wifi-phy.h	Mon Sep 28 20:23:11 2015 -0700
+++ b/src/wifi/model/wifi-phy.h	Sat Oct 10 11:01:44 2015 +0200
@@ -48,7 +48,7 @@
 struct mpduInfo
 {
   uint8_t packetType;
-  uint32_t referenceNumber;
+  uint32_t mpduRefNumber;
 };
 
 /**
@@ -222,9 +222,8 @@
    *        power is calculated as txPowerMin + txPowerLevel * (txPowerMax - txPowerMin) / nTxLevels
    * \param preamble the type of preamble to use to send this packet.
    * \param packetType the type of the packet 0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU
-   * \param mpduReferenceNumber the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
    */
-  virtual void SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, enum WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber) = 0;
+  virtual void SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, enum WifiPreamble preamble, uint8_t packetType) = 0;
 
   /**
    * \param listener the new listener
@@ -1111,8 +1110,7 @@
    */
   typedef void (* MonitorSnifferRxCallback)(Ptr<const Packet> packet, uint16_t channelFreqMhz,
                                             uint16_t channelNumber, uint32_t rate, WifiPreamble preamble,
-                                            WifiTxVector txVector, struct mpduInfo aMpdu,
-                                            struct signalNoiseDbm signalNoise);
+                                            WifiTxVector txVector, struct mpduInfo aMpdu, struct signalNoiseDbm signalNoise);
 
   /**
    * Public method used to fire a MonitorSniffer trace for a wifi packet being transmitted.
@@ -1298,8 +1296,7 @@
    * const  references because of their sizes.
    */
   TracedCallback<Ptr<const Packet>, uint16_t, uint16_t, uint32_t,
-                 WifiPreamble, WifiTxVector,
-                 struct mpduInfo, struct signalNoiseDbm> m_phyMonitorSniffRxTrace;
+                 WifiPreamble, WifiTxVector, struct mpduInfo, struct signalNoiseDbm> m_phyMonitorSniffRxTrace;
 
   /**
    * A trace source that emulates a wifi device in monitor mode
@@ -1314,8 +1311,7 @@
    * of its size.
    */
   TracedCallback<Ptr<const Packet>, uint16_t, uint16_t, uint32_t,
-                 WifiPreamble, WifiTxVector,
-                 struct mpduInfo> m_phyMonitorSniffTxTrace;
+                 WifiPreamble, WifiTxVector, struct mpduInfo> m_phyMonitorSniffTxTrace;
 
   uint32_t m_totalAmpduNumSymbols; //!< Number of symbols previously transmitted for the MPDUs in an A-MPDU, used for the computation of the number of symbols needed for the last MPDU in the A-MPDU
   uint32_t m_totalAmpduSize;       //!< Total size of the previously transmitted MPDUs in an A-MPDU, used for the computation of the number of symbols needed for the last MPDU in the A-MPDU
--- a/src/wifi/model/yans-wifi-channel.cc	Mon Sep 28 20:23:11 2015 -0700
+++ b/src/wifi/model/yans-wifi-channel.cc	Sat Oct 10 11:01:44 2015 +0200
@@ -79,7 +79,7 @@
 
 void
 YansWifiChannel::Send (Ptr<YansWifiPhy> sender, Ptr<const Packet> packet, double txPowerDbm,
-                       WifiTxVector txVector, WifiPreamble preamble, struct mpduInfo aMpdu, Time duration) const
+                       WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType, Time duration) const
 {
   Ptr<MobilityModel> senderMobility = sender->GetMobility ()->GetObject<MobilityModel> ();
   NS_ASSERT (senderMobility != 0);
@@ -113,7 +113,7 @@
 
           struct Parameters parameters;
           parameters.rxPowerDbm = rxPowerDbm;
-          parameters.aMpdu = aMpdu;
+          parameters.packetType = packetType;
           parameters.duration = duration;
           parameters.txVector = txVector;
           parameters.preamble = preamble;
@@ -128,7 +128,7 @@
 void
 YansWifiChannel::Receive (uint32_t i, Ptr<Packet> packet, struct Parameters parameters) const
 {
-  m_phyList[i]->StartReceivePreambleAndHeader (packet, parameters.rxPowerDbm, parameters.txVector, parameters.preamble, parameters.aMpdu, parameters.duration);
+  m_phyList[i]->StartReceivePreambleAndHeader (packet, parameters.rxPowerDbm, parameters.txVector, parameters.preamble, parameters.packetType, parameters.duration);
 }
 
 uint32_t
--- a/src/wifi/model/yans-wifi-channel.h	Mon Sep 28 20:23:11 2015 -0700
+++ b/src/wifi/model/yans-wifi-channel.h	Sat Oct 10 11:01:44 2015 +0200
@@ -40,7 +40,7 @@
 struct Parameters
 {
   double rxPowerDbm;
-  struct mpduInfo aMpdu;
+  uint8_t packetType;
   Time duration;
   WifiTxVector txVector;
   WifiPreamble preamble;
@@ -92,8 +92,7 @@
    * \param txPowerDbm the tx power associated to the packet
    * \param txVector the TXVECTOR associated to the packet
    * \param preamble the preamble associated to the packet
-   * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
-   *        and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
+   * \param packetType The type of the packet (values: 0 not an A-MPDU, 1 corresponds to any packets in an A-MPDU except the last one, 2 is the last packet in an A-MPDU)
    * \param duration the transmission duration associated to the packet
    *
    * This method should not be invoked by normal users. It is
@@ -102,7 +101,7 @@
    * e.g. PHYs that are operating on the same channel.
    */
   void Send (Ptr<YansWifiPhy> sender, Ptr<const Packet> packet, double txPowerDbm,
-             WifiTxVector txVector, WifiPreamble preamble, struct mpduInfo aMpdu, Time duration) const;
+             WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType, Time duration) const;
 
   /**
    * Assign a fixed random variable stream number to the random variables
--- a/src/wifi/model/yans-wifi-phy.cc	Mon Sep 28 20:23:11 2015 -0700
+++ b/src/wifi/model/yans-wifi-phy.cc	Sat Oct 10 11:01:44 2015 +0200
@@ -190,7 +190,9 @@
     m_endPlcpRxEvent (),
     m_channelStartingFrequency (0),
     m_mpdusNum (0),
-    m_plcpSuccess (false)
+    m_plcpSuccess (false),
+    m_txMpduReferenceNumber (0xffffffff),
+    m_rxMpduReferenceNumber (0xffffffff)
 {
   NS_LOG_FUNCTION (this);
   m_random = CreateObject<UniformRandomVariable> ();
@@ -572,11 +574,12 @@
                                             double rxPowerDbm,
                                             WifiTxVector txVector,
                                             enum WifiPreamble preamble,
-                                            struct mpduInfo aMpdu, Time rxDuration)
+                                            uint8_t packetType,
+                                            Time rxDuration)
 {
   //This function should be later split to check separately whether plcp preamble and plcp header can be successfully received.
   //Note: plcp preamble reception is not yet modeled.
-  NS_LOG_FUNCTION (this << packet << rxPowerDbm << txVector.GetMode () << preamble << (uint32_t)aMpdu.packetType);
+  NS_LOG_FUNCTION (this << packet << rxPowerDbm << txVector.GetMode () << preamble << (uint32_t)packetType);
   AmpduTag ampduTag;
   rxPowerDbm += m_rxGainDb;
   double rxPowerW = DbmToW (rxPowerDbm);
@@ -653,6 +656,7 @@
             {
               //received the first MPDU in an MPDU
               m_mpdusNum = ampduTag.GetNoOfMpdus () - 1;
+              m_rxMpduReferenceNumber++;
             }
           else if (preamble == WIFI_PREAMBLE_NONE && packet->PeekPacketTag (ampduTag) && m_mpdusNum > 0)
             {
@@ -684,12 +688,12 @@
             {
               NS_ASSERT (m_endPlcpRxEvent.IsExpired ());
               m_endPlcpRxEvent = Simulator::Schedule (preambleAndHeaderDuration, &YansWifiPhy::StartReceivePacket, this,
-                                                      packet, txVector, preamble, aMpdu, event);
+                                                      packet, txVector, preamble, packetType, event);
             }
 
           NS_ASSERT (m_endRxEvent.IsExpired ());
           m_endRxEvent = Simulator::Schedule (rxDuration, &YansWifiPhy::EndReceive, this,
-                                              packet, preamble, aMpdu, event);
+                                              packet, preamble, packetType, event);
         }
       else
         {
@@ -726,10 +730,10 @@
 YansWifiPhy::StartReceivePacket (Ptr<Packet> packet,
                                  WifiTxVector txVector,
                                  enum WifiPreamble preamble,
-                                 struct mpduInfo aMpdu,
+                                 uint8_t packetType,
                                  Ptr<InterferenceHelper::Event> event)
 {
-  NS_LOG_FUNCTION (this << packet << txVector.GetMode () << preamble << (uint32_t)aMpdu.packetType);
+  NS_LOG_FUNCTION (this << packet << txVector.GetMode () << preamble << (uint32_t)packetType);
   NS_ASSERT (IsStateRx ());
   NS_ASSERT (m_endPlcpRxEvent.IsExpired ());
   AmpduTag ampduTag;
@@ -763,7 +767,7 @@
 }
 
 void
-YansWifiPhy::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber)
+YansWifiPhy::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType)
 {
   NS_LOG_FUNCTION (this << packet << txVector.GetMode () << txVector.GetMode ().GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1) << preamble << (uint32_t)txVector.GetTxPowerLevel () << (uint32_t)packetType);
   /* Transmission can happen if:
@@ -800,12 +804,17 @@
     {
       dataRate500KbpsUnits = txVector.GetMode ().GetDataRate (txVector.GetChannelWidth (), txVector.IsShortGuardInterval (), 1) * txVector.GetNss () / 500000;
     }
+  if (packetType == 1 && preamble != WIFI_PREAMBLE_NONE)
+    {
+      //send the first MPDU in an MPDU
+      m_txMpduReferenceNumber++;
+    }
   struct mpduInfo aMpdu;
   aMpdu.packetType = packetType;
-  aMpdu.referenceNumber = mpduReferenceNumber;
+  aMpdu.mpduRefNumber = m_txMpduReferenceNumber;
   NotifyMonitorSniffTx (packet, (uint16_t)GetChannelFrequencyMhz (), GetChannelNumber (), dataRate500KbpsUnits, preamble, txVector, aMpdu);
   m_state->SwitchToTx (txDuration, packet, GetPowerDbm (txVector.GetTxPowerLevel ()), txVector, preamble);
-  m_channel->Send (this, packet, GetPowerDbm (txVector.GetTxPowerLevel ()) + m_txGainDb, txVector, preamble, aMpdu, txDuration);
+  m_channel->Send (this, packet, GetPowerDbm (txVector.GetTxPowerLevel ()) + m_txGainDb, txVector, preamble, packetType, txDuration);
 }
 
 uint32_t
@@ -1141,7 +1150,7 @@
 }
 
 void
-YansWifiPhy::EndReceive (Ptr<Packet> packet, enum WifiPreamble preamble, struct mpduInfo aMpdu, Ptr<InterferenceHelper::Event> event)
+YansWifiPhy::EndReceive (Ptr<Packet> packet, enum WifiPreamble preamble, uint8_t packetType, Ptr<InterferenceHelper::Event> event)
 {
   NS_LOG_FUNCTION (this << packet << event);
   NS_ASSERT (IsStateRx ());
@@ -1171,6 +1180,9 @@
           struct signalNoiseDbm signalNoise;
           signalNoise.signal = RatioToDb (event->GetRxPowerW ()) + 30;
           signalNoise.noise = RatioToDb (event->GetRxPowerW () / snrPer.snr) - GetRxNoiseFigure () + 30;
+          struct mpduInfo aMpdu;
+          aMpdu.packetType = packetType;
+          aMpdu.mpduRefNumber = m_rxMpduReferenceNumber;
           NotifyMonitorSniffRx (packet, (uint16_t)GetChannelFrequencyMhz (), GetChannelNumber (), dataRate500KbpsUnits, event->GetPreambleType (), event->GetTxVector (), aMpdu, signalNoise);
           m_state->SwitchFromRxEndOk (packet, snrPer.snr, event->GetTxVector (), event->GetPreambleType ());
         }
@@ -1186,7 +1198,7 @@
       m_state->SwitchFromRxEndError (packet, snrPer.snr);
     }
 
-  if (preamble == WIFI_PREAMBLE_NONE && aMpdu.packetType == 2)
+  if (preamble == WIFI_PREAMBLE_NONE && packetType == 2)
     {
       m_plcpSuccess = false;
     }
--- a/src/wifi/model/yans-wifi-phy.h	Mon Sep 28 20:23:11 2015 -0700
+++ b/src/wifi/model/yans-wifi-phy.h	Sat Oct 10 11:01:44 2015 +0200
@@ -107,15 +107,14 @@
    * \param rxPowerDbm the receive power in dBm
    * \param txVector the TXVECTOR of the arriving packet
    * \param preamble the preamble of the arriving packet
-   * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
-   *        and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
+   * \param packetType The type of the received packet (values: 0 not an A-MPDU, 1 corresponds to any packets in an A-MPDU except the last one, 2 is the last packet in an A-MPDU)
    * \param rxDuration the duration needed for the reception of the packet
    */
   void StartReceivePreambleAndHeader (Ptr<Packet> packet,
                                       double rxPowerDbm,
                                       WifiTxVector txVector,
                                       WifiPreamble preamble,
-                                      struct mpduInfo aMpdu,
+                                      uint8_t packetType,
                                       Time rxDuration);
   /**
    * Starting receiving the payload of a packet (i.e. the first bit of the packet has arrived).
@@ -123,14 +122,13 @@
    * \param packet the arriving packet
    * \param txVector the TXVECTOR of the arriving packet
    * \param preamble the preamble of the arriving packet
-   * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
-   *        and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
+   * \param packetType The type of the received packet (values: 0 not an A-MPDU, 1 corresponds to any packets in an A-MPDU except the last one, 2 is the last packet in an A-MPDU)
    * \param event the corresponding event of the first time the packet arrives
    */
   void StartReceivePacket (Ptr<Packet> packet,
                            WifiTxVector txVector,
                            WifiPreamble preamble,
-                           struct mpduInfo aMpdu,
+                           uint8_t packetType,
                            Ptr<InterferenceHelper::Event> event);
 
   /**
@@ -281,7 +279,7 @@
 
   virtual void SetReceiveOkCallback (WifiPhy::RxOkCallback callback);
   virtual void SetReceiveErrorCallback (WifiPhy::RxErrorCallback callback);
-  virtual void SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, enum WifiPreamble preamble, uint8_t packetType, uint32_t mpduReferenceNumber);
+  virtual void SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, enum WifiPreamble preamble, uint8_t packetType);
   virtual void RegisterListener (WifiPhyListener *listener);
   virtual void UnregisterListener (WifiPhyListener *listener);
   virtual void SetSleepMode (void);
@@ -513,11 +511,10 @@
    *
    * \param packet the packet that the last bit has arrived
    * \param preamble the preamble of the arriving packet
-   * \param aMpdu the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU)
-   *        and the A-MPDU reference number (must be a different value for each A-MPDU but the same for each subframe within one A-MPDU)
+   * \param packetType The type of the received packet (values: 0 not an A-MPDU, 1 corresponds to any packets in an A-MPDU except the last one, 2 is the last packet in an A-MPDU)
    * \param event the corresponding event of the first time the packet arrives
    */
-  void EndReceive (Ptr<Packet> packet, enum WifiPreamble preamble, struct mpduInfo aMpdu, Ptr<InterferenceHelper::Event> event);
+  void EndReceive (Ptr<Packet> packet, enum WifiPreamble preamble, uint8_t packetType, Ptr<InterferenceHelper::Event> event);
 
   bool     m_initialized;         //!< Flag for runtime initialization
   double   m_edThresholdW;        //!< Energy detection threshold in watts
@@ -592,6 +589,8 @@
   Time m_channelSwitchDelay;            //!< Time required to switch between channel
   uint16_t m_mpdusNum;                  //!< carries the number of expected mpdus that are part of an A-MPDU
   bool m_plcpSuccess;                   //!< Flag if the PLCP of the packet or the first MPDU in an A-MPDU has been received
+  uint32_t m_txMpduReferenceNumber;     //!< A-MPDU reference number to identify all transmitted subframes belonging to the same received A-MPDU
+  uint32_t m_rxMpduReferenceNumber;     //!< A-MPDU reference number to identify all received subframes belonging to the same received A-MPDU
 };
 
 } //namespace ns3