Change sequence number type

This commit is contained in:
Manuel Requena
2012-01-31 10:31:24 +01:00
parent 1ccd0cd590
commit 54cbf81a0d
3 changed files with 66 additions and 63 deletions

View File

@@ -22,6 +22,7 @@
#define LTE_RLC_AM_HEADER_H
#include "ns3/header.h"
#include "ns3/lte-rlc-sequence-number.h"
#include <list>
@@ -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 <uint8_t> m_extensionBits1; // Includes E1 after ACK_SN
std::list <uint8_t> m_extensionBits2;

View File

@@ -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<Packet> 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<Packet> 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<Packet> 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<Packet> 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<Packet> 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<Packet> 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<Packet> 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<Packet> 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> 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);

View File

@@ -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 <vector>
@@ -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<Packet> > 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;
};