From fdda633d6d6ffbdb9fee955669cea013dc008fa9 Mon Sep 17 00:00:00 2001 From: Alberto Gallegos Ramonet Date: Fri, 30 Sep 2022 13:32:58 +0900 Subject: [PATCH] lr-wpan: Fixes PHY reaction after a TX during BUSY_RX --- src/lr-wpan/doc/lr-wpan-assocSequence.dia | Bin 6666 -> 7187 bytes src/lr-wpan/model/lr-wpan-csmaca.cc | 11 +-- src/lr-wpan/model/lr-wpan-mac.cc | 42 ++++++++---- src/lr-wpan/model/lr-wpan-mac.h | 2 +- src/lr-wpan/model/lr-wpan-phy.cc | 80 ++++++++++++++-------- src/lr-wpan/model/lr-wpan-phy.h | 13 ++-- 6 files changed, 88 insertions(+), 60 deletions(-) diff --git a/src/lr-wpan/doc/lr-wpan-assocSequence.dia b/src/lr-wpan/doc/lr-wpan-assocSequence.dia index f4b3870dd5c3354c3bd0b591a27d339b088abb81..c1b59f4c7b7c5318eaea123a350189ae0ad8e001 100644 GIT binary patch delta 6864 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 K;_k1TzX1ULylkBS delta 6359 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 diff --git a/src/lr-wpan/model/lr-wpan-csmaca.cc b/src/lr-wpan/model/lr-wpan-csmaca.cc index 16d329113..a79e499e6 100644 --- a/src/lr-wpan/model/lr-wpan-csmaca.cc +++ b/src/lr-wpan/model/lr-wpan-csmaca.cc @@ -181,7 +181,6 @@ LrWpanCsmaCa::GetUnitBackoffPeriod (void) const return m_aUnitBackoffPeriod; } - Time LrWpanCsmaCa::GetTimeToNextSlot (void) const { @@ -239,7 +238,6 @@ LrWpanCsmaCa::GetTimeToNextSlot (void) const } - void LrWpanCsmaCa::Start () { @@ -290,8 +288,6 @@ LrWpanCsmaCa::Cancel () m_mac->GetPhy ()->CcaCancel (); } - - void LrWpanCsmaCa::RandomBackoffDelay () { @@ -336,7 +332,7 @@ LrWpanCsmaCa::RandomBackoffDelay () << timeLeftInCap.As (Time::S) << ")"); - if (randomBackoff > timeLeftInCap) + if (randomBackoff >= timeLeftInCap) { uint64_t usedBackoffs = (double)(timeLeftInCap.GetSeconds () * symbolRate) / m_aUnitBackoffPeriod; m_randomBackoffPeriodsLeft -= usedBackoffs; @@ -351,7 +347,6 @@ LrWpanCsmaCa::RandomBackoffDelay () } } - Time LrWpanCsmaCa::GetTimeLeftInCap () { @@ -386,7 +381,6 @@ LrWpanCsmaCa::GetTimeLeftInCap () return (endCapTime - currentTime); } - void LrWpanCsmaCa::CanProceed () { @@ -547,7 +541,6 @@ LrWpanCsmaCa::PlmeCcaConfirm (LrWpanPhyEnumeration status) } } - void LrWpanCsmaCa::SetLrWpanMacTransCostCallback (LrWpanMacTransCostCallback c) { @@ -555,7 +548,6 @@ LrWpanCsmaCa::SetLrWpanMacTransCostCallback (LrWpanMacTransCostCallback c) m_lrWpanMacTransCostCallback = c; } - void LrWpanCsmaCa::SetLrWpanMacStateCallback (LrWpanMacStateCallback c) { @@ -569,7 +561,6 @@ LrWpanCsmaCa::SetBatteryLifeExtension (bool batteryLifeExtension) m_macBattLifeExt = batteryLifeExtension; } - int64_t LrWpanCsmaCa::AssignStreams (int64_t stream) { diff --git a/src/lr-wpan/model/lr-wpan-mac.cc b/src/lr-wpan/model/lr-wpan-mac.cc index 67583cb29..8136fc622 100644 --- a/src/lr-wpan/model/lr-wpan-mac.cc +++ b/src/lr-wpan/model/lr-wpan-mac.cc @@ -223,20 +223,35 @@ LrWpanMac::DoDispose () if (m_csmaCa) { m_csmaCa->Dispose (); - m_csmaCa = 0; + m_csmaCa = nullptr; } m_txPkt = nullptr; + for (uint32_t i = 0; i < m_txQueue.size (); i++) { - m_txQueue[i]->txQPkt = 0; + m_txQueue[i]->txQPkt = nullptr; delete m_txQueue[i]; } m_txQueue.clear (); - m_phy = 0; - m_mcpsDataIndicationCallback = MakeNullCallback< void, McpsDataIndicationParams, Ptr > (); - m_mlmeAssociateIndicationCallback = MakeNullCallback (); - m_mlmeCommStatusIndicationCallback = MakeNullCallback (); - m_mcpsDataConfirmCallback = MakeNullCallback< void, McpsDataConfirmParams > (); + + for (uint32_t i = 0; i < m_indTxQueue.size (); i++) + { + m_indTxQueue[i]->txQPkt = nullptr; + m_indTxQueue[i].release (); + } + m_indTxQueue.clear (); + + m_phy = nullptr; + m_mcpsDataConfirmCallback = MakeNullCallback (); + m_mcpsDataIndicationCallback = MakeNullCallback > (); + m_mlmeStartConfirmCallback = MakeNullCallback (); + m_mlmeBeaconNotifyIndicationCallback = MakeNullCallback > (); + m_mlmeSyncLossIndicationCallback = MakeNullCallback (); + m_mlmePollConfirmCallback = MakeNullCallback (); + m_mlmeScanConfirmCallback = MakeNullCallback (); + m_mlmeAssociateConfirmCallback = MakeNullCallback (); + m_mlmeAssociateIndicationCallback = MakeNullCallback (); + m_mlmeCommStatusIndicationCallback = MakeNullCallback (); m_beaconEvent.Cancel (); @@ -271,14 +286,14 @@ LrWpanMac::SetRxOnWhenIdle (bool rxOnWhenIdle) void LrWpanMac::SetShortAddress (Mac16Address address) { - //NS_LOG_FUNCTION (this << address); + NS_LOG_FUNCTION (this << address); m_shortAddress = address; } void LrWpanMac::SetExtendedAddress (Mac64Address address) { - //NS_LOG_FUNCTION (this << address); + NS_LOG_FUNCTION (this << address); m_selfExt = address; } @@ -1039,7 +1054,7 @@ LrWpanMac::SendAssocResponseCommand (Ptr rxDataReqPkt) { TxQueueElement *txQElement = new TxQueueElement; txQElement->txQPkt = indTxQElement->txQPkt; - m_txQueue.push_back (txQElement); + m_txQueue.emplace_back (txQElement); } else { @@ -2448,11 +2463,12 @@ LrWpanMac::DequeueInd (Mac64Address dst, IndTxQueueElement * entry) { PurgeInd (); - for (uint32_t i = 0; i < m_indTxQueue.size (); i++) + for (auto iter = m_indTxQueue.begin (); iter != m_indTxQueue.end (); iter ++) { - if (m_indTxQueue[i]->dstExtAddress == dst) + if ((*iter)->dstExtAddress == dst) { - *entry = *m_indTxQueue[i]; + *entry = **iter; + m_indTxQueue.erase (iter); return true; } } diff --git a/src/lr-wpan/model/lr-wpan-mac.h b/src/lr-wpan/model/lr-wpan-mac.h index 5e7a8c9b1..e9ad9038e 100644 --- a/src/lr-wpan/model/lr-wpan-mac.h +++ b/src/lr-wpan/model/lr-wpan-mac.h @@ -1875,7 +1875,7 @@ private: std::deque m_txQueue; /** - * The indirect transmit queue used by the MAC pending messages. + * The indirect transmit queue used by the MAC pending messages (a.k.a. The pending transaction list). */ std::deque > m_indTxQueue; diff --git a/src/lr-wpan/model/lr-wpan-phy.cc b/src/lr-wpan/model/lr-wpan-phy.cc index c9e07ccac..c23144a32 100644 --- a/src/lr-wpan/model/lr-wpan-phy.cc +++ b/src/lr-wpan/model/lr-wpan-phy.cc @@ -143,7 +143,7 @@ LrWpanPhy::LrWpanPhy (void) m_random->SetAttribute ("Min", DoubleValue (0.0)); m_random->SetAttribute ("Max", DoubleValue (1.0)); - + m_isRxCanceled = false; ChangeTrxState (IEEE_802_15_4_PHY_TRX_OFF); } @@ -160,13 +160,23 @@ LrWpanPhy::DoDispose (void) m_trxState = IEEE_802_15_4_PHY_TRX_OFF; m_trxStatePending = IEEE_802_15_4_PHY_IDLE; - m_mobility = 0; - m_device = 0; - m_channel = 0; - m_txPsd = 0; - m_noise = 0; - m_signal = 0; - m_errorModel = 0; + m_mobility = nullptr; + m_device = nullptr; + m_channel = nullptr; + m_antenna = nullptr; + m_txPsd = nullptr; + m_noise = nullptr; + m_signal = nullptr; + m_errorModel = nullptr; + m_currentRxPacket.first = nullptr; + m_currentTxPacket.first = nullptr; + + m_ccaRequest.Cancel (); + m_edRequest.Cancel (); + m_setTRXState.Cancel (); + m_pdDataRequest.Cancel (); + + m_random = nullptr; m_pdDataIndicationCallback = MakeNullCallback< void, uint32_t, Ptr, uint8_t > (); m_pdDataConfirmCallback = MakeNullCallback< void, LrWpanPhyEnumeration > (); m_plmeCcaConfirmCallback = MakeNullCallback< void, LrWpanPhyEnumeration > (); @@ -258,7 +268,6 @@ void LrWpanPhy::StartRx (Ptr spectrumRxParams) { NS_LOG_FUNCTION (this << spectrumRxParams); - LrWpanSpectrumValueHelper psdHelper; if (!m_edRequest.IsExpired ()) { @@ -285,7 +294,7 @@ LrWpanPhy::StartRx (Ptr spectrumRxParams) } } - m_rxEvent = Simulator::Schedule (spectrumRxParams->duration, &LrWpanPhy::EndRx, this, spectrumRxParams); + Simulator::Schedule (spectrumRxParams->duration, &LrWpanPhy::EndRx, this, spectrumRxParams); return; } @@ -371,7 +380,7 @@ LrWpanPhy::StartRx (Ptr spectrumRxParams) // Always call EndRx to update the interference. // We keep track of this event, and if necessary cancel this event when a TX of a packet. - m_rxEvent = Simulator::Schedule (spectrumRxParams->duration, &LrWpanPhy::EndRx, this, spectrumRxParams); + Simulator::Schedule (spectrumRxParams->duration, &LrWpanPhy::EndRx, this, spectrumRxParams); } void @@ -477,25 +486,36 @@ LrWpanPhy::EndRx (Ptr par) Ptr none = 0; m_currentRxPacket = std::make_pair (none, true); - // We may be waiting to apply a pending state change. - if (m_trxStatePending != IEEE_802_15_4_PHY_IDLE) + if (!m_isRxCanceled) { - // Only change the state immediately, if the transceiver is not already - // switching the state. - if (!m_setTRXState.IsRunning ()) + // We may be waiting to apply a pending state change. + if (m_trxStatePending != IEEE_802_15_4_PHY_IDLE) { - NS_LOG_LOGIC ("Apply pending state change to " << m_trxStatePending); - ChangeTrxState (m_trxStatePending); - m_trxStatePending = IEEE_802_15_4_PHY_IDLE; - if (!m_plmeSetTRXStateConfirmCallback.IsNull ()) + // Only change the state immediately, if the transceiver is not already + // switching the state. + if (!m_setTRXState.IsRunning ()) { - m_plmeSetTRXStateConfirmCallback (IEEE_802_15_4_PHY_SUCCESS); + NS_LOG_LOGIC ("Apply pending state change to " << m_trxStatePending); + ChangeTrxState (m_trxStatePending); + m_trxStatePending = IEEE_802_15_4_PHY_IDLE; + if (!m_plmeSetTRXStateConfirmCallback.IsNull ()) + { + m_plmeSetTRXStateConfirmCallback (IEEE_802_15_4_PHY_SUCCESS); + } } } + else + { + ChangeTrxState (IEEE_802_15_4_PHY_RX_ON); + } } else { - ChangeTrxState (IEEE_802_15_4_PHY_RX_ON); + // A TX event was forced during the reception of the frame. + // There is no need to change the PHY state after handling the signal, + // because the Forced TX already changed the PHY state. + // Return flag to default state + m_isRxCanceled = false; } } } @@ -756,11 +776,12 @@ LrWpanPhy::PlmeSetTRXStateRequest (LrWpanPhyEnumeration state) { if (m_currentRxPacket.first) { - //terminate reception if needed - //incomplete reception -- force packet discard + // TX_ON is being forced during a reception (For example, when a ACK or Beacon is issued) + // The current RX frame is marked as incomplete and the reception as canceled + // EndRx () will handle the rest accordingly NS_LOG_DEBUG ("force TX_ON, terminate reception"); m_currentRxPacket.second = true; - m_rxEvent.Cancel(); + m_isRxCanceled = true; } // If CCA is in progress, cancel CCA and return BUSY. @@ -775,7 +796,7 @@ LrWpanPhy::PlmeSetTRXStateRequest (LrWpanPhyEnumeration state) m_trxStatePending = IEEE_802_15_4_PHY_TX_ON; - // Delay for turnaround time + // Delay for turnaround time (BUSY_RX|RX_ON ---> TX_ON) Time setTime = Seconds ( (double) aTurnaroundTime / GetDataOrSymbolRate (false)); m_setTRXState = Simulator::Schedule (setTime, &LrWpanPhy::EndSetTRXState, this); return; @@ -811,11 +832,12 @@ LrWpanPhy::PlmeSetTRXStateRequest (LrWpanPhyEnumeration state) { NS_LOG_DEBUG ("force TRX_OFF, SUCCESS"); if (m_currentRxPacket.first) - { //terminate reception if needed - //incomplete reception -- force packet discard + { + // Terminate reception + // Mark the packet as incomplete and reception as canceled. NS_LOG_DEBUG ("force TRX_OFF, terminate reception"); m_currentRxPacket.second = true; - m_rxEvent.Cancel(); + m_isRxCanceled = true; } if (m_trxState == IEEE_802_15_4_PHY_BUSY_TX) { diff --git a/src/lr-wpan/model/lr-wpan-phy.h b/src/lr-wpan/model/lr-wpan-phy.h index 9686c47dc..1961e25a0 100644 --- a/src/lr-wpan/model/lr-wpan-phy.h +++ b/src/lr-wpan/model/lr-wpan-phy.h @@ -863,6 +863,12 @@ private: */ double m_rxSensitivity; + /** + * Indicates if the reception of frame has been canceled. + */ + bool m_isRxCanceled; + + /** * The accumulated signals currently received by the transceiver, including * the signal of a possibly received packet, as well as all signals @@ -911,13 +917,6 @@ private: */ EventId m_pdDataRequest; - /** - * Scheduler event for a currently running data reception. It makes possible to - * cancel the reception of a packet in case a packet with higher priority needs to - * be transmitted (i.e. Beacon or ACK ). - */ - EventId m_rxEvent; - /** * Uniform random variable stream. */