src/devices/wifi/mac-low.cc
changeset 4509 b2654e0f071d
parent 4502 07d34c0d8d18
child 4512 d21a2eafb84d
equal deleted inserted replaced
4508:3135a5c24358 4509:b2654e0f071d
   108 
   108 
   109 MacLowTransmissionListener::MacLowTransmissionListener ()
   109 MacLowTransmissionListener::MacLowTransmissionListener ()
   110 {}
   110 {}
   111 MacLowTransmissionListener::~MacLowTransmissionListener ()
   111 MacLowTransmissionListener::~MacLowTransmissionListener ()
   112 {}
   112 {}
   113 MacLowNavListener::MacLowNavListener ()
   113 MacLowDcfListener::MacLowDcfListener ()
   114 {}
   114 {}
   115 MacLowNavListener::~MacLowNavListener ()
   115 MacLowDcfListener::~MacLowDcfListener ()
   116 {}
   116 {}
   117 
   117 
   118 MacLowTransmissionParameters::MacLowTransmissionParameters ()
   118 MacLowTransmissionParameters::MacLowTransmissionParameters ()
   119   : m_nextSize (0),
   119   : m_nextSize (0),
   120     m_waitAck (ACK_NONE),
   120     m_waitAck (ACK_NONE),
   421 MacLow::SetRxCallback (Callback<void,Ptr<Packet>,const WifiMacHeader *> callback)
   421 MacLow::SetRxCallback (Callback<void,Ptr<Packet>,const WifiMacHeader *> callback)
   422 {
   422 {
   423   m_rxCallback = callback;
   423   m_rxCallback = callback;
   424 }
   424 }
   425 void 
   425 void 
   426 MacLow::RegisterNavListener (MacLowNavListener *listener)
   426 MacLow::RegisterDcfListener (MacLowDcfListener *listener)
   427 {
   427 {
   428   m_navListeners.push_back (listener);
   428   m_dcfListeners.push_back (listener);
   429 }
   429 }
   430 
   430 
   431 
   431 
   432 void 
   432 void 
   433 MacLow::StartTransmission (Ptr<const Packet> packet, 
   433 MacLow::StartTransmission (Ptr<const Packet> packet, 
   541       WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ());
   541       WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ());
   542       station->ReportRxOk (rxSnr, txMode);
   542       station->ReportRxOk (rxSnr, txMode);
   543       station->ReportRtsOk (rxSnr, txMode, tag.Get ());
   543       station->ReportRtsOk (rxSnr, txMode, tag.Get ());
   544       
   544       
   545       m_ctsTimeoutEvent.Cancel ();
   545       m_ctsTimeoutEvent.Cancel ();
       
   546       NotifyCtsTimeoutResetNow ();
   546       m_listener->GotCts (rxSnr, txMode);
   547       m_listener->GotCts (rxSnr, txMode);
   547       NS_ASSERT (m_sendDataEvent.IsExpired ());
   548       NS_ASSERT (m_sendDataEvent.IsExpired ());
   548       m_sendDataEvent = Simulator::Schedule (GetSifs (), 
   549       m_sendDataEvent = Simulator::Schedule (GetSifs (), 
   549                                              &MacLow::SendDataAfterCts, this, 
   550                                              &MacLow::SendDataAfterCts, this, 
   550                                              hdr.GetAddr1 (),
   551                                              hdr.GetAddr1 (),
   567       bool gotAck = false;
   568       bool gotAck = false;
   568       if (m_txParams.MustWaitNormalAck () &&
   569       if (m_txParams.MustWaitNormalAck () &&
   569           m_normalAckTimeoutEvent.IsRunning ()) 
   570           m_normalAckTimeoutEvent.IsRunning ()) 
   570         {
   571         {
   571           m_normalAckTimeoutEvent.Cancel ();
   572           m_normalAckTimeoutEvent.Cancel ();
       
   573           NotifyAckTimeoutResetNow ();
   572           gotAck = true;
   574           gotAck = true;
   573         }
   575         }
   574       if (m_txParams.MustWaitFastAck () &&
   576       if (m_txParams.MustWaitFastAck () &&
   575           m_fastAckTimeoutEvent.IsRunning ()) 
   577           m_fastAckTimeoutEvent.IsRunning ()) 
   576         {
   578         {
   577           m_fastAckTimeoutEvent.Cancel ();
   579           m_fastAckTimeoutEvent.Cancel ();
       
   580           NotifyAckTimeoutResetNow ();
   578           gotAck = true;
   581           gotAck = true;
   579         }
   582         }
   580       if (gotAck) 
   583       if (gotAck) 
   581         {
   584         {
   582           m_listener->GotAck (rxSnr, txMode);
   585           m_listener->GotAck (rxSnr, txMode);
   794 }
   797 }
   795 
   798 
   796 void
   799 void
   797 MacLow::DoNavResetNow (Time duration)
   800 MacLow::DoNavResetNow (Time duration)
   798 {
   801 {
   799   for (NavListenersCI i = m_navListeners.begin (); i != m_navListeners.end (); i++) 
   802   for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) 
   800     {
   803     {
   801       (*i)->NavReset (duration);
   804       (*i)->NavReset (duration);
   802     }
   805     }
   803   m_lastNavStart = Simulator::Now ();
   806   m_lastNavStart = Simulator::Now ();
   804   m_lastNavStart = duration;
   807   m_lastNavStart = duration;
   805 }
   808 }
   806 bool
   809 bool
   807 MacLow::DoNavStartNow (Time duration)
   810 MacLow::DoNavStartNow (Time duration)
   808 {
   811 {
   809   for (NavListenersCI i = m_navListeners.begin (); i != m_navListeners.end (); i++) 
   812   for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) 
   810     {
   813     {
   811       (*i)->NavStart (duration);
   814       (*i)->NavStart (duration);
   812     }
   815     }
   813   Time newNavEnd = Simulator::Now () + duration;
   816   Time newNavEnd = Simulator::Now () + duration;
   814   Time oldNavEnd = m_lastNavStart + m_lastNavDuration;
   817   Time oldNavEnd = m_lastNavStart + m_lastNavDuration;
   817       m_lastNavStart = Simulator::Now ();
   820       m_lastNavStart = Simulator::Now ();
   818       m_lastNavDuration = duration;
   821       m_lastNavDuration = duration;
   819       return true;
   822       return true;
   820     }
   823     }
   821   return false;
   824   return false;
       
   825 }
       
   826 void
       
   827 MacLow::NotifyAckTimeoutStartNow (Time duration)
       
   828 {
       
   829   for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) 
       
   830     {
       
   831       (*i)->AckTimeoutStart (duration);
       
   832     }
       
   833 }
       
   834 void
       
   835 MacLow::NotifyAckTimeoutResetNow ()
       
   836 {
       
   837   for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) 
       
   838     {
       
   839       (*i)->AckTimeoutReset ();
       
   840     }
       
   841 }
       
   842 void
       
   843 MacLow::NotifyCtsTimeoutStartNow (Time duration)
       
   844 {
       
   845   for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) 
       
   846     {
       
   847       (*i)->CtsTimeoutStart (duration);
       
   848     }
       
   849 }
       
   850 void
       
   851 MacLow::NotifyCtsTimeoutResetNow ()
       
   852 {
       
   853   for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) 
       
   854     {
       
   855       (*i)->CtsTimeoutReset ();
       
   856     }
   822 }
   857 }
   823 
   858 
   824 void
   859 void
   825 MacLow::ForwardDown (Ptr<const Packet> packet, WifiMacHeader const* hdr, 
   860 MacLow::ForwardDown (Ptr<const Packet> packet, WifiMacHeader const* hdr, 
   826                      WifiMode txMode)
   861                      WifiMode txMode)
   943 
   978 
   944   Time txDuration = m_phy->CalculateTxDuration (GetRtsSize (), rtsTxMode, WIFI_PREAMBLE_LONG);
   979   Time txDuration = m_phy->CalculateTxDuration (GetRtsSize (), rtsTxMode, WIFI_PREAMBLE_LONG);
   945   Time timerDelay = txDuration + GetCtsTimeout ();
   980   Time timerDelay = txDuration + GetCtsTimeout ();
   946 
   981 
   947   NS_ASSERT (m_ctsTimeoutEvent.IsExpired ());
   982   NS_ASSERT (m_ctsTimeoutEvent.IsExpired ());
       
   983   NotifyCtsTimeoutStartNow (timerDelay);
   948   m_ctsTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::CtsTimeout, this);
   984   m_ctsTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::CtsTimeout, this);
   949 
   985 
   950   Ptr<Packet> packet = Create<Packet> ();
   986   Ptr<Packet> packet = Create<Packet> ();
   951   packet->AddHeader (rts);
   987   packet->AddHeader (rts);
   952   WifiMacTrailer fcs;
   988   WifiMacTrailer fcs;
   962   Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxMode, WIFI_PREAMBLE_LONG);
   998   Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxMode, WIFI_PREAMBLE_LONG);
   963   if (m_txParams.MustWaitNormalAck ()) 
   999   if (m_txParams.MustWaitNormalAck ()) 
   964     {
  1000     {
   965       Time timerDelay = txDuration + GetAckTimeout ();
  1001       Time timerDelay = txDuration + GetAckTimeout ();
   966       NS_ASSERT (m_normalAckTimeoutEvent.IsExpired ());
  1002       NS_ASSERT (m_normalAckTimeoutEvent.IsExpired ());
       
  1003       NotifyAckTimeoutStartNow (timerDelay);
   967       m_normalAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::NormalAckTimeout, this);
  1004       m_normalAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::NormalAckTimeout, this);
   968     } 
  1005     } 
   969   else if (m_txParams.MustWaitFastAck ()) 
  1006   else if (m_txParams.MustWaitFastAck ()) 
   970     {
  1007     {
   971       Time timerDelay = txDuration + GetPifs ();
  1008       Time timerDelay = txDuration + GetPifs ();
   972       NS_ASSERT (m_fastAckTimeoutEvent.IsExpired ());
  1009       NS_ASSERT (m_fastAckTimeoutEvent.IsExpired ());
       
  1010       NotifyAckTimeoutStartNow (timerDelay);
   973       m_fastAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::FastAckTimeout, this);
  1011       m_fastAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::FastAckTimeout, this);
   974     } 
  1012     } 
   975   else if (m_txParams.MustWaitSuperFastAck ()) 
  1013   else if (m_txParams.MustWaitSuperFastAck ()) 
   976     {
  1014     {
   977       Time timerDelay = txDuration + GetPifs ();
  1015       Time timerDelay = txDuration + GetPifs ();
   978       NS_ASSERT (m_superFastAckTimeoutEvent.IsExpired ());
  1016       NS_ASSERT (m_superFastAckTimeoutEvent.IsExpired ());
       
  1017       NotifyAckTimeoutStartNow (timerDelay);
   979       m_superFastAckTimeoutEvent = Simulator::Schedule (timerDelay, 
  1018       m_superFastAckTimeoutEvent = Simulator::Schedule (timerDelay, 
   980                                                         &MacLow::SuperFastAckTimeout, this);
  1019                                                         &MacLow::SuperFastAckTimeout, this);
   981     } 
  1020     } 
   982   else if (m_txParams.HasNextPacket ()) 
  1021   else if (m_txParams.HasNextPacket ()) 
   983     {
  1022     {