From 54cbf81a0d9d189103d4f06bc630ea67880d0f28 Mon Sep 17 00:00:00 2001 From: Manuel Requena Date: Tue, 31 Jan 2012 10:31:24 +0100 Subject: [PATCH] Change sequence number type --- src/lte/model/lte-rlc-am-header.h | 15 +++--- src/lte/model/lte-rlc-am.cc | 88 +++++++++++++++---------------- src/lte/model/lte-rlc-am.h | 26 ++++----- 3 files changed, 66 insertions(+), 63 deletions(-) diff --git a/src/lte/model/lte-rlc-am-header.h b/src/lte/model/lte-rlc-am-header.h index 05b8dfe27..99ecc0f90 100644 --- a/src/lte/model/lte-rlc-am-header.h +++ b/src/lte/model/lte-rlc-am-header.h @@ -22,6 +22,7 @@ #define LTE_RLC_AM_HEADER_H #include "ns3/header.h" +#include "ns3/lte-rlc-sequence-number.h" #include @@ -65,8 +66,8 @@ public: // DATA PDU // - void SetSequenceNumber (uint16_t sequenceNumber); - uint16_t GetSequenceNumber () const; + void SetSequenceNumber (SequenceNumber10 sequenceNumber); + SequenceNumber10 GetSequenceNumber () const; void SetFramingInfo (uint8_t framingInfo); uint8_t GetFramingInfo () const; @@ -124,8 +125,8 @@ public: // CONTROL PDU // - void SetAckSn (uint16_t ackSn); - uint16_t GetAckSn () const; + void SetAckSn (SequenceNumber10 ackSn); + SequenceNumber10 GetAckSn () const; static TypeId GetTypeId (void); @@ -143,7 +144,7 @@ private: uint8_t m_resegmentationFlag; uint8_t m_pollingBit; uint8_t m_framingInfo; // 2 bits - uint16_t m_sequenceNumber; // 10 bits + SequenceNumber10 m_sequenceNumber; uint8_t m_lastSegmentFlag; uint16_t m_segmentOffset; uint16_t m_lastOffset; @@ -155,8 +156,8 @@ private: uint8_t m_controlPduType; // Status PDU fields - uint16_t m_ackSn; - uint16_t m_nackSn; + SequenceNumber10 m_ackSn; + SequenceNumber10 m_nackSn; std::list m_extensionBits1; // Includes E1 after ACK_SN std::list m_extensionBits2; diff --git a/src/lte/model/lte-rlc-am.cc b/src/lte/model/lte-rlc-am.cc index 84e7afdeb..1842b9ec0 100644 --- a/src/lte/model/lte-rlc-am.cc +++ b/src/lte/model/lte-rlc-am.cc @@ -38,9 +38,9 @@ LteRlcAm::LteRlcAm () // Buffers m_txonBufferSize = 0; - m_retxBuffer.resize (512); + m_retxBuffer.resize (1024); m_retxBufferSize = 0; - m_txedBuffer.resize (512); + m_txedBuffer.resize (1024); m_txedBufferSize = 0; m_statusPduRequested = false; @@ -304,7 +304,7 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes) dataFieldAddedSize = firstSegment->GetSize (); dataFieldTotalSize += dataFieldAddedSize; dataField.push_back (firstSegment); - firstSegment = 0; // TODO how to put a null ptr to Packet? + firstSegment = 0; // ExtensionBit (Next_Segment - 1) = 0 rlcAmHeader.PushExtensionBit (LteRlcAmHeader::DATA_FIELD_FOLLOWS); @@ -320,9 +320,9 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes) NS_LOG_LOGIC (" First SDU buffer = " << *(m_txonBuffer.begin())); NS_LOG_LOGIC (" First SDU size = " << (*(m_txonBuffer.begin()))->GetSize ()); } - NS_LOG_LOGIC (" Next segment size = " << nextSegmentSize << " (should be 0)"); + NS_LOG_LOGIC (" Next segment size = " << nextSegmentSize); - // nextSegmentSize MUST be zero + // nextSegmentSize MUST be zero (only if txonBuffer is not empty) // (NO more segments) → exit // break; @@ -341,7 +341,7 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes) // LengthIndicator (Next_Segment) = txBuffer.FirstBuffer.length() rlcAmHeader.PushLengthIndicator (firstSegment->GetSize ()); - nextSegmentSize -= ((nextSegmentId % 2) ? (2) : (1)) + dataFieldAddedSize; // TODO??? + nextSegmentSize -= ((nextSegmentId % 2) ? (2) : (1)) + dataFieldAddedSize; nextSegmentId++; NS_LOG_LOGIC (" SDUs in TxBuffer = " << m_txonBuffer.size ()); @@ -366,9 +366,7 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes) // Build RLC header // - rlcAmHeader.SetSequenceNumber ( m_vtS ); - m_vtS = (m_vtS + 1) % 1024; - + rlcAmHeader.SetSequenceNumber ( m_vtS++ ); rlcAmHeader.SetResegmentationFlag (LteRlcAmHeader::PDU); rlcAmHeader.SetLastSegmentFlag (LteRlcAmHeader::LAST_PDU_SEGMENT); rlcAmHeader.SetSegmentOffset (0); @@ -465,7 +463,7 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes) // Store new PDU into the Transmitted PDU Buffer NS_LOG_LOGIC ("Put transmitted PDU in the txedBuffer"); m_txedBufferSize += packet->GetSize (); - m_txedBuffer.at ( rlcAmHeader.GetSequenceNumber () ) = packet; + m_txedBuffer.at ( rlcAmHeader.GetSequenceNumber ().GetValue () ) = packet; // Send RLC PDU to MAC layer LteMacSapProvider::TransmitPduParameters params; @@ -544,7 +542,7 @@ LteRlcAm::DoReceivePdu (Ptr p) // - update state variables and start t-Reordering as needed (see sub clause 5.1.3.2.4). - uint16_t seqNumber = rlcAmHeader.GetSequenceNumber (); + SequenceNumber10 seqNumber = rlcAmHeader.GetSequenceNumber (); if ( rlcAmHeader.GetResegmentationFlag () == LteRlcAmHeader::SEGMENT ) { @@ -640,8 +638,8 @@ LteRlcAm::DoReceivePdu (Ptr p) else { NS_LOG_LOGIC ("Place AMD PDU in the reception buffer ( SN = " << seqNumber << " )"); - m_rxonBuffer[ seqNumber ].m_byteSegments.push_back (p); - m_rxonBuffer[ seqNumber ].m_pduComplete = true; + m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.push_back (p); + m_rxonBuffer[ seqNumber.GetValue () ].m_pduComplete = true; // - if some byte segments of the AMD PDU contained in the RLC data PDU have been received before: // - discard the duplicate byte segments. @@ -656,7 +654,7 @@ LteRlcAm::DoReceivePdu (Ptr p) if ( seqNumber >= m_vrH ) { - m_vrH = (seqNumber + 1) % 1024; + m_vrH = seqNumber + 1; NS_LOG_LOGIC ("New VR(H) = " << m_vrH); } @@ -664,11 +662,12 @@ LteRlcAm::DoReceivePdu (Ptr p) // - update VR(MS) to the SN of the first AMD PDU with SN > current VR(MS) for // which not all byte segments have been received; - if ( m_rxonBuffer[ m_vrMs ].m_pduComplete ) + if ( m_rxonBuffer[ m_vrMs.GetValue () ].m_pduComplete ) { - while ( m_rxonBuffer[ m_vrMs ].m_pduComplete ) + while ( m_rxonBuffer[ m_vrMs.GetValue () ].m_pduComplete ) { - m_vrMs = (m_vrMs + 1) % 1024; + m_vrMs++; + NS_LOG_LOGIC ("Incr VR(MS) = " << m_vrMs); } NS_LOG_LOGIC ("New VR(MS) = " << m_vrMs); } @@ -681,11 +680,11 @@ LteRlcAm::DoReceivePdu (Ptr p) if ( seqNumber == m_vrR ) { - if ( m_rxonBuffer[ seqNumber ].m_pduComplete ) + if ( m_rxonBuffer[ seqNumber.GetValue () ].m_pduComplete ) { - while ( m_rxonBuffer[ m_vrR ].m_pduComplete ) + while ( m_rxonBuffer[ m_vrR.GetValue () ].m_pduComplete ) { - m_vrR = (m_vrR + 1) % 1024; + m_vrR++; } NS_LOG_LOGIC ("New VR(R) = " << m_vrR); m_vrMr = m_vrR + m_windowSize; @@ -693,9 +692,10 @@ LteRlcAm::DoReceivePdu (Ptr p) } NS_LOG_LOGIC ("Reassemble and Deliver ( SN = " << seqNumber << " )"); - NS_ASSERT_MSG (m_rxonBuffer[ seqNumber ].m_byteSegments.size () == 1, + NS_ASSERT_MSG (m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.size () == 1, "Too many segments. PDU Reassembly process didn't work"); - ReassembleAndDeliver (m_rxonBuffer[ seqNumber ].m_byteSegments.front ()); + ReassembleAndDeliver (m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.front ()); + m_rxonBuffer.erase (seqNumber.GetValue ()); } // - if t-Reordering is running: @@ -831,38 +831,38 @@ LteRlcAm::DoReceivePdu (Ptr p) { NS_LOG_INFO ("Control AM RLC PDU"); - uint16_t ackSn = rlcAmHeader.GetAckSn (); - uint16_t seqNumber = m_vtA; + SequenceNumber10 ackSn = rlcAmHeader.GetAckSn (); + SequenceNumber10 seqNumber = m_vtA; while (seqNumber < ackSn) { NS_LOG_INFO ("seqNumber = " << seqNumber); NS_LOG_INFO ("ackSn = " << ackSn); NS_LOG_INFO ("m_txedBuffer(seqNumber).size = " << m_txedBuffer.size ()); - if (m_txedBuffer.at (seqNumber)) + if (m_txedBuffer.at (seqNumber.GetValue())) { - NS_LOG_INFO ("m_txedBuffer(seqNumber)->GetSize = " << m_txedBuffer.at (seqNumber)->GetSize ()); - m_txedBufferSize -= m_txedBuffer.at (seqNumber)->GetSize (); - m_txedBuffer.at (seqNumber) = 0; + NS_LOG_INFO ("m_txedBuffer(seqNumber)->GetSize = " << m_txedBuffer.at (seqNumber.GetValue ())->GetSize ()); + m_txedBufferSize -= m_txedBuffer.at (seqNumber.GetValue ())->GetSize (); + m_txedBuffer.at (seqNumber.GetValue ()) = 0; } seqNumber++; } while (seqNumber < m_vtS) { - if (m_txedBuffer.at (seqNumber)) + if (m_txedBuffer.at (seqNumber.GetValue ())) { - m_retxBuffer.at (seqNumber).m_pdu = m_txedBuffer.at (seqNumber); - m_retxBuffer.at (seqNumber).m_retxCount = 0; - m_retxBufferSize += m_retxBuffer.at (seqNumber).m_pdu->GetSize (); + m_retxBuffer.at (seqNumber.GetValue ()).m_pdu = m_txedBuffer.at (seqNumber.GetValue ()); + m_retxBuffer.at (seqNumber.GetValue ()).m_retxCount = 0; + m_retxBufferSize += m_retxBuffer.at (seqNumber.GetValue ()).m_pdu->GetSize (); - m_txedBufferSize -= m_txedBuffer.at (seqNumber)->GetSize (); - m_txedBuffer.at (seqNumber) = 0; + m_txedBufferSize -= m_txedBuffer.at (seqNumber.GetValue ())->GetSize (); + m_txedBuffer.at (seqNumber.GetValue ()) = 0; } - else if (m_retxBuffer.at (seqNumber).m_pdu) + else if (m_retxBuffer.at (seqNumber.GetValue ()).m_pdu) { - m_retxBuffer.at (seqNumber).m_retxCount++; - if (m_retxBuffer.at (seqNumber).m_retxCount >= m_maxRetxThreshold) + m_retxBuffer.at (seqNumber.GetValue ()).m_retxCount++; + if (m_retxBuffer.at (seqNumber.GetValue ()).m_retxCount >= m_maxRetxThreshold) { NS_LOG_INFO ("Max RETX_COUNT for SN = " << seqNumber); } @@ -870,7 +870,7 @@ LteRlcAm::DoReceivePdu (Ptr p) seqNumber++; } - + return; } else @@ -901,7 +901,7 @@ LteRlcAm::Start () bool -LteRlcAm::IsInsideReceivingWindow (uint16_t seqNumber) +LteRlcAm::IsInsideReceivingWindow (SequenceNumber10 seqNumber) { if ( ( ((m_vrR - m_vrR) % 1024) <= ((seqNumber - m_vrR) % 1024) ) && ( ((seqNumber - m_vrR) % 1024) < ((m_vrMr - m_vrR) % 1024) ) @@ -922,20 +922,20 @@ LteRlcAm::ReassembleAndDeliver (Ptr packet) LteRlcAmHeader rlcAmHeader; packet->RemoveHeader (rlcAmHeader); uint8_t framingInfo = rlcAmHeader.GetFramingInfo (); - uint16_t currSeqNumber = rlcAmHeader.GetSequenceNumber (); + SequenceNumber10 currSeqNumber = rlcAmHeader.GetSequenceNumber (); bool expectedSnLost; if ( currSeqNumber != m_expectedSeqNumber ) { expectedSnLost = true; NS_LOG_LOGIC ("There are losses. Expected SN = " << m_expectedSeqNumber << ". Current SN = " << currSeqNumber); - m_expectedSeqNumber = (currSeqNumber + 1) % 1024; + m_expectedSeqNumber = currSeqNumber + 1; } else { expectedSnLost = false; NS_LOG_LOGIC ("No losses. Expected SN = " << m_expectedSeqNumber << ". Current SN = " << currSeqNumber); - m_expectedSeqNumber = (m_expectedSeqNumber + 1) % 1024; + m_expectedSeqNumber = m_expectedSeqNumber + 1; } // Build list of SDUs @@ -1402,9 +1402,9 @@ LteRlcAm::ExpireReorderingTimer (void) // - set VR(X) to VR(H). m_vrMs = m_vrX; - while ( m_rxonBuffer[ m_vrMs ].m_pduComplete ) + while ( m_rxonBuffer[ m_vrMs.GetValue () ].m_pduComplete ) { - m_vrMs = (m_vrMs + 1) % 1024; + m_vrMs++; } NS_LOG_LOGIC ("New VR(MS) = " << m_vrMs); diff --git a/src/lte/model/lte-rlc-am.h b/src/lte/model/lte-rlc-am.h index b0da5b0b9..587daf4c9 100644 --- a/src/lte/model/lte-rlc-am.h +++ b/src/lte/model/lte-rlc-am.h @@ -21,6 +21,8 @@ #ifndef LTE_RLC_AM_H #define LTE_RLC_AM_H +#include "ns3/lte-rlc-sequence-number.h" + #include "ns3/lte-rlc.h" #include @@ -61,7 +63,7 @@ private: void ExpireReorderingTimer (void); void ExpirePollRetransmitTimer (void); - bool IsInsideReceivingWindow (uint16_t seqNumber); + bool IsInsideReceivingWindow (SequenceNumber10 seqNumber); // // void ReassembleOutsideWindow (void); // void ReassembleSnLessThan (uint16_t seqNumber); @@ -89,7 +91,7 @@ private: struct PduBuffer { - uint16_t m_seqNumber; + SequenceNumber10 m_seqNumber; std::list < Ptr > m_byteSegments; bool m_pduComplete; @@ -110,17 +112,17 @@ private: * State variables. See section 7.1 in TS 36.322 */ // Transmitting side - uint16_t m_vtA; // VT(A) - uint16_t m_vtMs; // VT(MS) - uint16_t m_vtS; // VT(S) - uint16_t m_pollSn; // POLL_SN + SequenceNumber10 m_vtA; // VT(A) + SequenceNumber10 m_vtMs; // VT(MS) + SequenceNumber10 m_vtS; // VT(S) + SequenceNumber10 m_pollSn; // POLL_SN // Receiving side - uint16_t m_vrR; // VR(R) - uint16_t m_vrMr; // VR(MR) - uint16_t m_vrX; // VR(X) - uint16_t m_vrMs; // VR(MS) - uint16_t m_vrH; // VR(H) + SequenceNumber10 m_vrR; // VR(R) + SequenceNumber10 m_vrMr; // VR(MR) + SequenceNumber10 m_vrX; // VR(X) + SequenceNumber10 m_vrMs; // VR(MS) + SequenceNumber10 m_vrH; // VR(H) /** * Counters. See section 7.1 in TS 36.322 @@ -159,7 +161,7 @@ private: /** * Expected Sequence Number */ - uint16_t m_expectedSeqNumber; + SequenceNumber10 m_expectedSeqNumber; };