src/devices/wifi/mac-low.cc
changeset 2268 0e57ac711220
parent 2177 d2d60d000963
child 2286 3704959cf153
--- a/src/devices/wifi/mac-low.cc	Wed Dec 12 09:33:22 2007 +0100
+++ b/src/devices/wifi/mac-low.cc	Wed Dec 12 12:03:38 2007 +0100
@@ -366,7 +366,8 @@
 
   //NS_ASSERT (m_phy->IsStateIdle ());
 
-  MY_DEBUG ("startTx size="<< GetCurrentSize () << ", to=" << m_currentHdr.GetAddr1()<<", listener="<<m_listener);
+  MY_DEBUG ("startTx size="<< GetSize (m_currentPacket, &m_currentHdr) << 
+            ", to=" << m_currentHdr.GetAddr1()<<", listener="<<m_listener);
 
   if (m_txParams.MustSendRts ()) 
     {
@@ -597,21 +598,25 @@
   return m_parameters->GetCtsTimeout ();
 }
 uint32_t 
-MacLow::GetCurrentSize (void) const
+MacLow::GetSize (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
 {
   WifiMacTrailer fcs;
-  return m_currentPacket->GetSize () + m_currentHdr.GetSize () + fcs.GetSerializedSize ();
+  return packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
 }
 
 WifiMode
-MacLow::GetRtsTxMode (Mac48Address to) const
+MacLow::GetRtsTxMode (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
 {
-  return GetStation (to)->GetRtsMode ();
+  Mac48Address to = hdr->GetAddr1 ();
+  return GetStation (to)->GetRtsMode (packet);
 }
 WifiMode
-MacLow::GetDataTxMode (Mac48Address to, uint32_t size) const
+MacLow::GetDataTxMode (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
 {
-  return GetStation (to)->GetDataMode (size);
+  Mac48Address to = hdr->GetAddr1 ();
+  WifiMacTrailer fcs;
+  uint32_t size =  packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
+  return GetStation (to)->GetDataMode (packet, size);
 }
 
 WifiMode
@@ -627,35 +632,38 @@
 
 
 Time
-MacLow::CalculateOverallTxTime (uint32_t dataSize, Mac48Address to, 
+MacLow::CalculateOverallTxTime (Ptr<const Packet> packet,
+                                WifiMacHeader const*hdr, 
                                 MacLowTransmissionParameters const& params) const
 {
   Time txTime = Seconds (0);
-  WifiMode rtsMode = GetRtsTxMode (to);
-  WifiMode dataMode = GetDataTxMode (to, dataSize);
+  WifiMode rtsMode = GetRtsTxMode (packet, hdr);
+  WifiMode dataMode = GetDataTxMode (packet, hdr);
   if (params.MustSendRts ()) 
     {
       txTime += m_phy->CalculateTxDuration (GetRtsSize (), rtsMode, WIFI_PREAMBLE_LONG);
-      txTime += GetCtsDuration (m_currentHdr.GetAddr1 (), rtsMode);
+      txTime += GetCtsDuration (hdr->GetAddr1 (), rtsMode);
       txTime += GetSifs () * Scalar (2);
     }
+  uint32_t dataSize = GetSize (packet, hdr);
   txTime += m_phy->CalculateTxDuration (dataSize, dataMode, WIFI_PREAMBLE_LONG);
   if (params.MustWaitAck ())
     {
       txTime += GetSifs ();
-      txTime += GetAckDuration (m_currentHdr.GetAddr1 (), dataMode);
+      txTime += GetAckDuration (hdr->GetAddr1 (), dataMode);
     }
   return txTime;
 }
 
 Time
-MacLow::CalculateTransmissionTime (uint32_t dataSize, Mac48Address to, 
+MacLow::CalculateTransmissionTime (Ptr<const Packet> packet,
+                                   WifiMacHeader const*hdr, 
                                    MacLowTransmissionParameters const& params) const
 {
-  Time txTime = CalculateOverallTxTime (dataSize, to, params);
+  Time txTime = CalculateOverallTxTime (packet, hdr, params);
   if (params.HasNextPacket ()) 
     {
-      WifiMode dataMode = GetDataTxMode (to, dataSize );
+      WifiMode dataMode = GetDataTxMode (packet, hdr);
       txTime += GetSifs ();
       txTime += m_phy->CalculateTxDuration (params.GetNextPacketSize (), dataMode, WIFI_PREAMBLE_LONG);
     }
@@ -833,7 +841,7 @@
   rts.SetDsNotTo ();
   rts.SetAddr1 (m_currentHdr.GetAddr1 ());
   rts.SetAddr2 (m_device->GetSelfAddress ());
-  WifiMode rtsTxMode = GetRtsTxMode (m_currentHdr.GetAddr1 ());
+  WifiMode rtsTxMode = GetRtsTxMode (m_currentPacket, &m_currentHdr);
   Time duration = Seconds (0);
   if (m_txParams.HasDurationId ()) 
     {
@@ -841,11 +849,12 @@
     } 
   else 
     {
-      WifiMode dataTxMode = GetDataTxMode (m_currentHdr.GetAddr1 (), GetCurrentSize ());
+      WifiMode dataTxMode = GetDataTxMode (m_currentPacket, &m_currentHdr);
       duration += GetSifs ();
       duration += GetCtsDuration (m_currentHdr.GetAddr1 (), rtsTxMode);
       duration += GetSifs ();
-      duration += m_phy->CalculateTxDuration (GetCurrentSize (), dataTxMode, WIFI_PREAMBLE_LONG);
+      duration += m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), 
+                                              dataTxMode, WIFI_PREAMBLE_LONG);
       duration += GetSifs ();
       duration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxMode);
     }
@@ -868,8 +877,8 @@
 void
 MacLow::StartDataTxTimers (void)
 {
-  WifiMode dataTxMode = GetDataTxMode (m_currentHdr.GetAddr1 (), GetCurrentSize ());
-  Time txDuration = m_phy->CalculateTxDuration (GetCurrentSize (), dataTxMode, WIFI_PREAMBLE_LONG);
+  WifiMode dataTxMode = GetDataTxMode (m_currentPacket, &m_currentHdr);
+  Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxMode, WIFI_PREAMBLE_LONG);
   if (m_txParams.MustWaitNormalAck ()) 
     {
       Time timerDelay = txDuration + GetAckTimeout ();
@@ -908,7 +917,7 @@
   /* send this packet directly. No RTS is needed. */
   StartDataTxTimers ();
 
-  WifiMode dataTxMode = GetDataTxMode (m_currentHdr.GetAddr1 (), GetCurrentSize ());
+  WifiMode dataTxMode = GetDataTxMode (m_currentPacket, &m_currentHdr);
   Time duration = Seconds (0.0);
   if (m_txParams.HasDurationId ()) 
     {
@@ -1000,11 +1009,12 @@
   NS_ASSERT (m_currentPacket != 0);
   StartDataTxTimers ();
 
-  WifiMode dataTxMode = GetDataTxMode (m_currentHdr.GetAddr1 (), GetCurrentSize ());
+  WifiMode dataTxMode = GetDataTxMode (m_currentPacket, &m_currentHdr);
   Time newDuration = Seconds (0);
   newDuration += GetSifs ();
   newDuration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxMode);
-  Time txDuration = m_phy->CalculateTxDuration (GetCurrentSize (), dataTxMode, WIFI_PREAMBLE_LONG);
+  Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), 
+                                                dataTxMode, WIFI_PREAMBLE_LONG);
   duration -= txDuration;
   duration -= GetSifs ();