src/lte/model/lte-rlc-um.cc
author Manuel Requena <manuel.requena@cttc.es>
Wed, 09 May 2012 19:08:03 +0200
changeset 8745 b94de33b24d3
parent 8726 f6f0e2531457
child 9351 6e074e67a1ad
permissions -rw-r--r--
Add maximum size to the RLC Transmission Buffer
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     2
/*
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     3
 * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     4
 *
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     8
 *
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    12
 * GNU General Public License for more details.
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    13
 *
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    17
 *
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    18
 * Author: Manuel Requena <manuel.requena@cttc.es>
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    19
 */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    20
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    21
#include "ns3/simulator.h"
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    22
#include "ns3/log.h"
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    23
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    24
#include "ns3/lte-rlc-header.h"
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    25
#include "ns3/lte-rlc-um.h"
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    26
#include "ns3/lte-rlc-sdu-status-tag.h"
8375
201d78643209 Add support for ReportBufferStatus parameters: txQueueSize and txQueueHolDelay
Manuel Requena <manuel.requena@cttc.es>
parents: 8361
diff changeset
    27
#include "ns3/lte-rlc-tag.h"
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    28
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    29
NS_LOG_COMPONENT_DEFINE ("LteRlcUm");
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    30
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    31
namespace ns3 {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    32
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    33
NS_OBJECT_ENSURE_REGISTERED (LteRlcUm);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    34
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    35
LteRlcUm::LteRlcUm ()
8745
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    36
  : m_maxTxBufferSize (2 * 1024 * 1024),
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    37
    m_txBufferSize (0),
8375
201d78643209 Add support for ReportBufferStatus parameters: txQueueSize and txQueueHolDelay
Manuel Requena <manuel.requena@cttc.es>
parents: 8361
diff changeset
    38
    m_sequenceNumber (0),
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    39
    m_vrUr (0),
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    40
    m_vrUx (0),
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    41
    m_vrUh (0),
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    42
    m_windowSize (512),
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    43
    m_expectedSeqNumber (0)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    44
{
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    45
  NS_LOG_FUNCTION (this);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    46
  m_reassemblingState = WAITING_S0_FULL;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    47
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    48
  Simulator::ScheduleNow (&LteRlcUm::Start, this);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    49
}
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    50
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    51
LteRlcUm::~LteRlcUm ()
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    52
{
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    53
}
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    54
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    55
TypeId
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    56
LteRlcUm::GetTypeId (void)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    57
{
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    58
  static TypeId tid = TypeId ("ns3::LteRlcUm")
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    59
    .SetParent<LteRlc> ()
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    60
    .AddConstructor<LteRlcUm> ()
8745
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    61
    .AddAttribute ("MaxTxBufferSize",
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    62
                   "Maximum Size of the Transmission Buffer (in Bytes)",
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    63
                   UintegerValue (2 * 1024 * 1024),
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    64
                   MakeUintegerAccessor (&LteRlcUm::m_maxTxBufferSize),
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    65
                   MakeUintegerChecker<uint32_t> ())
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    66
    ;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    67
  return tid;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    68
}
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    69
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    70
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    71
/**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    72
 * RLC SAP
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    73
 */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    74
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    75
void
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    76
LteRlcUm::DoTransmitPdcpPdu (Ptr<Packet> p)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    77
{
8708
108d9d416b4c Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents: 8666
diff changeset
    78
  NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << p->GetSize ());
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    79
8745
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    80
  if (m_txBufferSize + p->GetSize () <= m_maxTxBufferSize)
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    81
    {
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    82
      /** Store arrival time */
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    83
      RlcTag timeTag (Simulator::Now ());
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    84
      p->AddPacketTag (timeTag);
8375
201d78643209 Add support for ReportBufferStatus parameters: txQueueSize and txQueueHolDelay
Manuel Requena <manuel.requena@cttc.es>
parents: 8361
diff changeset
    85
8745
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    86
      /** Store PDCP PDU */
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    87
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    88
      LteRlcSduStatusTag tag;
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    89
      tag.SetStatus (LteRlcSduStatusTag::FULL_SDU);
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    90
      p->AddPacketTag (tag);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
    91
8745
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    92
      NS_LOG_LOGIC ("Tx Buffer: New packet added");
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    93
      m_txBuffer.push_back (p);
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    94
      m_txBufferSize += p->GetSize ();
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    95
      NS_LOG_LOGIC ("NumOfBuffers = " << m_txBuffer.size() );
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    96
      NS_LOG_LOGIC ("txBufferSize = " << m_txBufferSize);
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    97
    }
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    98
  else
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
    99
    {
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
   100
      // Discard full RLC SDU
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
   101
      NS_LOG_LOGIC ("TxBuffer is full. RLC SDU discarded");
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
   102
      NS_LOG_LOGIC ("MaxTxBufferSize = " << m_maxTxBufferSize);
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
   103
      NS_LOG_LOGIC ("txBufferSize    = " << m_txBufferSize);
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
   104
      NS_LOG_LOGIC ("packet size     = " << p->GetSize ());
b94de33b24d3 Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents: 8726
diff changeset
   105
    }
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   106
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   107
  /** Report Buffer Status */
8499
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
   108
  DoReportBufferStatus ();
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
   109
  m_rbsTimer.Cancel ();
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   110
}
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   111
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   112
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   113
/**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   114
 * MAC SAP
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   115
 */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   116
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   117
void
8714
398bbcbb3f42 Add MIMO model, test and documentation
Marco Miozzo <marco.miozzo@cttc.es>
parents: 8586
diff changeset
   118
LteRlcUm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer)
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   119
{
8708
108d9d416b4c Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents: 8666
diff changeset
   120
  NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << bytes);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   121
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   122
  if (bytes <= 2)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   123
    {
8709
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
   124
      // Stingy MAC: Header fix part is 2 bytes, we need more bytes for the data
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   125
      NS_LOG_LOGIC ("TX opportunity too small = " << bytes);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   126
      return;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   127
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   128
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   129
  Ptr<Packet> packet = Create<Packet> ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   130
  LteRlcHeader rlcHeader;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   131
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   132
  // Build Data field
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   133
  uint32_t nextSegmentSize = bytes - 2;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   134
  uint32_t nextSegmentId = 1;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   135
  uint32_t dataFieldTotalSize = 0;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   136
  uint32_t dataFieldAddedSize = 0;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   137
  std::vector < Ptr<Packet> > dataField;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   138
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   139
  // Remove the first packet from the transmission buffer.
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   140
  // If only a segment of the packet is taken, then the remaining is given back later
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   141
  if ( m_txBuffer.size () == 0 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   142
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   143
      NS_LOG_LOGIC ("No data pending");
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   144
      return;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   145
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   146
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   147
  NS_LOG_LOGIC ("SDUs in TxBuffer  = " << m_txBuffer.size ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   148
  NS_LOG_LOGIC ("First SDU buffer  = " << *(m_txBuffer.begin()));
8375
201d78643209 Add support for ReportBufferStatus parameters: txQueueSize and txQueueHolDelay
Manuel Requena <manuel.requena@cttc.es>
parents: 8361
diff changeset
   149
  NS_LOG_LOGIC ("First SDU size    = " << (*(m_txBuffer.begin()))->GetSize ());
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   150
  NS_LOG_LOGIC ("Next segment size = " << nextSegmentSize);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   151
  NS_LOG_LOGIC ("Remove SDU from TxBuffer");
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   152
  Ptr<Packet> firstSegment = (*(m_txBuffer.begin ()))->Copy ();
8375
201d78643209 Add support for ReportBufferStatus parameters: txQueueSize and txQueueHolDelay
Manuel Requena <manuel.requena@cttc.es>
parents: 8361
diff changeset
   153
  m_txBufferSize -= (*(m_txBuffer.begin()))->GetSize ();
8377
3ae363919ea3 Add estimated size of RLC headers in queue size
Manuel Requena <manuel.requena@cttc.es>
parents: 8375
diff changeset
   154
  NS_LOG_LOGIC ("txBufferSize      = " << m_txBufferSize );
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   155
  m_txBuffer.erase (m_txBuffer.begin ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   156
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   157
  while ( firstSegment && (firstSegment->GetSize () > 0) && (nextSegmentSize > 0) )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   158
    {
8493
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   159
      NS_LOG_LOGIC ("WHILE ( firstSegment && firstSegment->GetSize > 0 && nextSegmentSize > 0 )");
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   160
      NS_LOG_LOGIC ("    firstSegment size = " << firstSegment->GetSize ());
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   161
      NS_LOG_LOGIC ("    nextSegmentSize   = " << nextSegmentSize);
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   162
      if ( (firstSegment->GetSize () > nextSegmentSize) ||
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   163
           // Segment larger than 2047 octets can only be mapped to the end of the Data field
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   164
           (firstSegment->GetSize () > 2047)
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   165
         )
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   166
        {
8493
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   167
          // Take the minimum size, due to the 2047-bytes 3GPP exception
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   168
          // This exception is due to the length of the LI field (just 11 bits)
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   169
          uint32_t currSegmentSize = std::min (firstSegment->GetSize (), nextSegmentSize);
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   170
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   171
          NS_LOG_LOGIC ("    IF ( firstSegment > nextSegmentSize ||");
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   172
          NS_LOG_LOGIC ("         firstSegment > 2047 )");
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   173
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   174
          // Segment txBuffer.FirstBuffer and
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   175
          // Give back the remaining segment to the transmission buffer
8493
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   176
          Ptr<Packet> newSegment = firstSegment->CreateFragment (0, currSegmentSize);
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   177
          NS_LOG_LOGIC ("    newSegment size   = " << newSegment->GetSize ());
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   178
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   179
          // Status tag of the new and remaining segments
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   180
          // Note: This is the only place where a PDU is segmented and
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   181
          // therefore its status can change
8493
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   182
          LteRlcSduStatusTag oldTag, newTag;
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   183
          firstSegment->RemovePacketTag (oldTag);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   184
          newSegment->RemovePacketTag (newTag);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   185
          if (oldTag.GetStatus () == LteRlcSduStatusTag::FULL_SDU)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   186
            {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   187
              newTag.SetStatus (LteRlcSduStatusTag::FIRST_SEGMENT);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   188
              oldTag.SetStatus (LteRlcSduStatusTag::LAST_SEGMENT);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   189
            }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   190
          else if (oldTag.GetStatus () == LteRlcSduStatusTag::LAST_SEGMENT)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   191
            {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   192
              newTag.SetStatus (LteRlcSduStatusTag::MIDDLE_SEGMENT);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   193
              //oldTag.SetStatus (LteRlcSduStatusTag::LAST_SEGMENT);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   194
            }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   195
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   196
          // Give back the remaining segment to the transmission buffer
8493
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   197
          firstSegment->RemoveAtStart (currSegmentSize);
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   198
          NS_LOG_LOGIC ("    firstSegment size (after RemoveAtStart) = " << firstSegment->GetSize ());
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   199
          if (firstSegment->GetSize () > 0)
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   200
            {
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   201
              firstSegment->AddPacketTag (oldTag);
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   202
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   203
              m_txBuffer.insert (m_txBuffer.begin (), firstSegment);
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   204
              m_txBufferSize += (*(m_txBuffer.begin()))->GetSize ();
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   205
8493
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   206
              NS_LOG_LOGIC ("    TX buffer: Give back the remaining segment");
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   207
              NS_LOG_LOGIC ("    TX buffers = " << m_txBuffer.size ());
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   208
              NS_LOG_LOGIC ("    Front buffer size = " << (*(m_txBuffer.begin()))->GetSize ());
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   209
              NS_LOG_LOGIC ("    txBufferSize = " << m_txBufferSize );
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   210
            }
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   211
          else
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   212
            {
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   213
              // Whole segment was taken, so adjust tag
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   214
              if (newTag.GetStatus () == LteRlcSduStatusTag::FIRST_SEGMENT)
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   215
                {
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   216
                  newTag.SetStatus (LteRlcSduStatusTag::FULL_SDU);
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   217
                }
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   218
              else if (newTag.GetStatus () == LteRlcSduStatusTag::MIDDLE_SEGMENT)
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   219
                {
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   220
                  newTag.SetStatus (LteRlcSduStatusTag::LAST_SEGMENT);
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   221
                }
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   222
            }
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   223
          // Segment is completely taken or
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   224
          // the remaining segment is given back to the transmission buffer
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   225
          firstSegment = 0;
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   226
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   227
          // Put status tag once it has been adjusted
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   228
          newSegment->AddPacketTag (newTag);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   229
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   230
          // Add Segment to Data field
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   231
          dataFieldAddedSize = newSegment->GetSize ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   232
          dataFieldTotalSize += dataFieldAddedSize;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   233
          dataField.push_back (newSegment);
8493
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   234
          newSegment = 0;
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   235
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   236
          // ExtensionBit (Next_Segment - 1) = 0
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   237
          rlcHeader.PushExtensionBit (LteRlcHeader::DATA_FIELD_FOLLOWS);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   238
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   239
          // no LengthIndicator for the last one
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   240
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   241
          nextSegmentSize -= dataFieldAddedSize;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   242
          nextSegmentId++;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   243
8493
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   244
          // nextSegmentSize MUST be zero (only if segment is smaller or equal to 2047)
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   245
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   246
          // (NO more segments) → exit
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   247
          // break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   248
        }
8586
6c6fdf44d58b Process of very small segments at the end of a PDU
Manuel Requena <manuel.requena@cttc.es>
parents: 8572
diff changeset
   249
      else if ( (nextSegmentSize - firstSegment->GetSize () <= 2) || (m_txBuffer.size () == 0) )
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   250
        {
8586
6c6fdf44d58b Process of very small segments at the end of a PDU
Manuel Requena <manuel.requena@cttc.es>
parents: 8572
diff changeset
   251
          NS_LOG_LOGIC ("    IF nextSegmentSize - firstSegment->GetSize () <= 2 || txBuffer.size == 0");
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   252
          // Add txBuffer.FirstBuffer to DataField
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   253
          dataFieldAddedSize = firstSegment->GetSize ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   254
          dataFieldTotalSize += dataFieldAddedSize;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   255
          dataField.push_back (firstSegment);
8493
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   256
          firstSegment = 0;
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   257
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   258
          // ExtensionBit (Next_Segment - 1) = 0
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   259
          rlcHeader.PushExtensionBit (LteRlcHeader::DATA_FIELD_FOLLOWS);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   260
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   261
          // no LengthIndicator for the last one
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   262
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   263
          nextSegmentSize -= dataFieldAddedSize;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   264
          nextSegmentId++;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   265
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   266
          NS_LOG_LOGIC ("        SDUs in TxBuffer  = " << m_txBuffer.size ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   267
          if (m_txBuffer.size () > 0)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   268
            {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   269
              NS_LOG_LOGIC ("        First SDU buffer  = " << *(m_txBuffer.begin()));
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   270
              NS_LOG_LOGIC ("        First SDU size    = " << (*(m_txBuffer.begin()))->GetSize ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   271
            }
8493
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   272
          NS_LOG_LOGIC ("        Next segment size = " << nextSegmentSize);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   273
8586
6c6fdf44d58b Process of very small segments at the end of a PDU
Manuel Requena <manuel.requena@cttc.es>
parents: 8572
diff changeset
   274
          // nextSegmentSize <= 2 (only if txBuffer is not empty)
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   275
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   276
          // (NO more segments) → exit
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   277
          // break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   278
        }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   279
      else // (firstSegment->GetSize () < m_nextSegmentSize) && (m_txBuffer.size () > 0)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   280
        {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   281
          NS_LOG_LOGIC ("    IF firstSegment < NextSegmentSize && txBuffer.size > 0");
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   282
          // Add txBuffer.FirstBuffer to DataField
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   283
          dataFieldAddedSize = firstSegment->GetSize ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   284
          dataFieldTotalSize += dataFieldAddedSize;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   285
          dataField.push_back (firstSegment);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   286
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   287
          // ExtensionBit (Next_Segment - 1) = 1
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   288
          rlcHeader.PushExtensionBit (LteRlcHeader::E_LI_FIELDS_FOLLOWS);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   289
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   290
          // LengthIndicator (Next_Segment)  = txBuffer.FirstBuffer.length()
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   291
          rlcHeader.PushLengthIndicator (firstSegment->GetSize ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   292
8586
6c6fdf44d58b Process of very small segments at the end of a PDU
Manuel Requena <manuel.requena@cttc.es>
parents: 8572
diff changeset
   293
          nextSegmentSize -= ((nextSegmentId % 2) ? (2) : (1)) + dataFieldAddedSize;
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   294
          nextSegmentId++;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   295
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   296
          NS_LOG_LOGIC ("        SDUs in TxBuffer  = " << m_txBuffer.size ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   297
          if (m_txBuffer.size () > 0)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   298
            {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   299
              NS_LOG_LOGIC ("        First SDU buffer  = " << *(m_txBuffer.begin()));
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   300
              NS_LOG_LOGIC ("        First SDU size    = " << (*(m_txBuffer.begin()))->GetSize ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   301
            }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   302
          NS_LOG_LOGIC ("        Next segment size = " << nextSegmentSize);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   303
          NS_LOG_LOGIC ("        Remove SDU from TxBuffer");
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   304
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   305
          // (more segments)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   306
          firstSegment = (*(m_txBuffer.begin ()))->Copy ();
8377
3ae363919ea3 Add estimated size of RLC headers in queue size
Manuel Requena <manuel.requena@cttc.es>
parents: 8375
diff changeset
   307
          m_txBufferSize -= (*(m_txBuffer.begin()))->GetSize ();
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   308
          m_txBuffer.erase (m_txBuffer.begin ());
8377
3ae363919ea3 Add estimated size of RLC headers in queue size
Manuel Requena <manuel.requena@cttc.es>
parents: 8375
diff changeset
   309
          NS_LOG_LOGIC ("        txBufferSize = " << m_txBufferSize );
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   310
        }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   311
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   312
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   313
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   314
  // Build RLC header
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   315
  rlcHeader.SetSequenceNumber (m_sequenceNumber++);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   316
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   317
  // Build RLC PDU with DataField and Header
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   318
  std::vector< Ptr<Packet> >::iterator it;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   319
  it = dataField.begin ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   320
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   321
  uint8_t framingInfo = 0;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   322
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   323
  // FIRST SEGMENT
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   324
  LteRlcSduStatusTag tag;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   325
  (*it)->RemovePacketTag (tag);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   326
  if ( (tag.GetStatus () == LteRlcSduStatusTag::FULL_SDU) ||
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   327
        (tag.GetStatus () == LteRlcSduStatusTag::FIRST_SEGMENT) )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   328
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   329
      framingInfo |= LteRlcHeader::FIRST_BYTE;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   330
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   331
  else
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   332
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   333
      framingInfo |= LteRlcHeader::NO_FIRST_BYTE;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   334
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   335
  (*it)->AddPacketTag (tag);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   336
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   337
  while (it < dataField.end ())
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   338
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   339
      NS_LOG_LOGIC ("Adding SDU/segment to packet, length = " << (*it)->GetSize ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   340
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   341
      packet->AddAtEnd (*it);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   342
      it++;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   343
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   344
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   345
  // LAST SEGMENT (Note: There could be only one and be the first one)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   346
  it--;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   347
  (*it)->RemovePacketTag (tag);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   348
  if ( (tag.GetStatus () == LteRlcSduStatusTag::FULL_SDU) ||
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   349
        (tag.GetStatus () == LteRlcSduStatusTag::LAST_SEGMENT) )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   350
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   351
      framingInfo |= LteRlcHeader::LAST_BYTE;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   352
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   353
  else
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   354
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   355
      framingInfo |= LteRlcHeader::NO_LAST_BYTE;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   356
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   357
  (*it)->AddPacketTag (tag);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   358
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   359
  rlcHeader.SetFramingInfo (framingInfo);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   360
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   361
  NS_LOG_LOGIC ("RLC header: " << rlcHeader);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   362
  packet->AddHeader (rlcHeader);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   363
8422
550cd0670022 Add RLC stats
Manuel Requena <manuel.requena@cttc.es>
parents: 8377
diff changeset
   364
  // Sender timestamp
550cd0670022 Add RLC stats
Manuel Requena <manuel.requena@cttc.es>
parents: 8377
diff changeset
   365
  RlcTag rlcTag (Simulator::Now ());
550cd0670022 Add RLC stats
Manuel Requena <manuel.requena@cttc.es>
parents: 8377
diff changeset
   366
  packet->AddByteTag (rlcTag);
550cd0670022 Add RLC stats
Manuel Requena <manuel.requena@cttc.es>
parents: 8377
diff changeset
   367
  m_txPdu (m_rnti, m_lcid, packet->GetSize ());
550cd0670022 Add RLC stats
Manuel Requena <manuel.requena@cttc.es>
parents: 8377
diff changeset
   368
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   369
  // Send RLC PDU to MAC layer
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   370
  LteMacSapProvider::TransmitPduParameters params;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   371
  params.pdu = packet;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   372
  params.rnti = m_rnti;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   373
  params.lcid = m_lcid;
8714
398bbcbb3f42 Add MIMO model, test and documentation
Marco Miozzo <marco.miozzo@cttc.es>
parents: 8586
diff changeset
   374
  params.layer = layer;
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   375
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   376
  m_macSapProvider->TransmitPdu (params);
8499
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
   377
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
   378
  if (! m_txBuffer.empty ())
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
   379
    {
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
   380
      m_rbsTimer.Cancel ();
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
   381
      m_rbsTimer = Simulator::Schedule (MilliSeconds (10), &LteRlcUm::ExpireRbsTimer, this);
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
   382
    }
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   383
}
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   384
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   385
void
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   386
LteRlcUm::DoNotifyHarqDeliveryFailure ()
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   387
{
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   388
  NS_LOG_FUNCTION (this);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   389
}
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   390
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   391
void
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   392
LteRlcUm::DoReceivePdu (Ptr<Packet> p)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   393
{
8708
108d9d416b4c Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents: 8666
diff changeset
   394
  NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << p->GetSize ());
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   395
8422
550cd0670022 Add RLC stats
Manuel Requena <manuel.requena@cttc.es>
parents: 8377
diff changeset
   396
  // Receiver timestamp
550cd0670022 Add RLC stats
Manuel Requena <manuel.requena@cttc.es>
parents: 8377
diff changeset
   397
  RlcTag rlcTag;
550cd0670022 Add RLC stats
Manuel Requena <manuel.requena@cttc.es>
parents: 8377
diff changeset
   398
  Time delay;
550cd0670022 Add RLC stats
Manuel Requena <manuel.requena@cttc.es>
parents: 8377
diff changeset
   399
  if (p->FindFirstMatchingByteTag (rlcTag))
550cd0670022 Add RLC stats
Manuel Requena <manuel.requena@cttc.es>
parents: 8377
diff changeset
   400
    {
550cd0670022 Add RLC stats
Manuel Requena <manuel.requena@cttc.es>
parents: 8377
diff changeset
   401
      delay = Simulator::Now() - rlcTag.GetSenderTimestamp ();
550cd0670022 Add RLC stats
Manuel Requena <manuel.requena@cttc.es>
parents: 8377
diff changeset
   402
    }
8666
cd02fdf79147 Clean traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8638
diff changeset
   403
  m_rxPdu (m_rnti, m_lcid, p->GetSize (), delay.GetNanoSeconds ());
8422
550cd0670022 Add RLC stats
Manuel Requena <manuel.requena@cttc.es>
parents: 8377
diff changeset
   404
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   405
  // 5.1.2.2 Receive operations
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   406
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   407
  // Get RLC header parameters
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   408
  LteRlcHeader rlcHeader;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   409
  p->PeekHeader (rlcHeader);
8493
e6926c24bdd6 Support of PDU segments larger than 2047
Manuel Requena <manuel.requena@cttc.es>
parents: 8422
diff changeset
   410
  NS_LOG_LOGIC ("RLC header: " << rlcHeader);
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   411
  SequenceNumber10 seqNumber = rlcHeader.GetSequenceNumber ();
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   412
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   413
  // 5.1.2.2.1 General
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   414
  // The receiving UM RLC entity shall maintain a reordering window according to state variable VR(UH) as follows:
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   415
  // - a SN falls within the reordering window if (VR(UH) - UM_Window_Size) <= SN < VR(UH);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   416
  // - a SN falls outside of the reordering window otherwise.
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   417
  // When receiving an UMD PDU from lower layer, the receiving UM RLC entity shall:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   418
  // - either discard the received UMD PDU or place it in the reception buffer (see sub clause 5.1.2.2.2);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   419
  // - if the received UMD PDU was placed in the reception buffer:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   420
  // - update state variables, reassemble and deliver RLC SDUs to upper layer and start/stop t-Reordering as needed (see sub clause 5.1.2.2.3);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   421
  // When t-Reordering expires, the receiving UM RLC entity shall:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   422
  // - update state variables, reassemble and deliver RLC SDUs to upper layer and start t-Reordering as needed (see sub clause 5.1.2.2.4).
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   423
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   424
  // 5.1.2.2.2 Actions when an UMD PDU is received from lower layer
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   425
  // When an UMD PDU with SN = x is received from lower layer, the receiving UM RLC entity shall:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   426
  // - if VR(UR) < x < VR(UH) and the UMD PDU with SN = x has been received before; or
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   427
  // - if (VR(UH) - UM_Window_Size) <= x < VR(UR):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   428
  //    - discard the received UMD PDU;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   429
  // - else:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   430
  //    - place the received UMD PDU in the reception buffer.
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   431
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   432
  NS_LOG_LOGIC ("VR(UR) = " << m_vrUr);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   433
  NS_LOG_LOGIC ("VR(UX) = " << m_vrUx);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   434
  NS_LOG_LOGIC ("VR(UH) = " << m_vrUh);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   435
  NS_LOG_LOGIC ("SN = " << seqNumber);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   436
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   437
  m_vrUr.SetModulusBase (m_vrUh - m_windowSize);
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   438
  m_vrUh.SetModulusBase (m_vrUh - m_windowSize);
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   439
  seqNumber.SetModulusBase (m_vrUh - m_windowSize);
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   440
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   441
  if ( ( (m_vrUr < seqNumber) && (seqNumber < m_vrUh) && (m_rxBuffer.count (seqNumber.GetValue ()) > 0) ) ||
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   442
       ( ((m_vrUh - m_windowSize) <= seqNumber) && (seqNumber < m_vrUr) )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   443
     )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   444
    {
8708
108d9d416b4c Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents: 8666
diff changeset
   445
      NS_LOG_LOGIC ("PDU discarded");
108d9d416b4c Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents: 8666
diff changeset
   446
      p = 0;
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   447
      return;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   448
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   449
  else
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   450
    {
8708
108d9d416b4c Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents: 8666
diff changeset
   451
      NS_LOG_LOGIC ("Place PDU in the reception buffer");
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   452
      m_rxBuffer[seqNumber.GetValue ()] = p;
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   453
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   454
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   455
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   456
  // 5.1.2.2.3 Actions when an UMD PDU is placed in the reception buffer
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   457
  // When an UMD PDU with SN = x is placed in the reception buffer, the receiving UM RLC entity shall:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   458
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   459
  // - if x falls outside of the reordering window:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   460
  //    - update VR(UH) to x + 1;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   461
  //    - reassemble RLC SDUs from any UMD PDUs with SN that falls outside of the reordering window, remove
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   462
  //      RLC headers when doing so and deliver the reassembled RLC SDUs to upper layer in ascending order of the
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   463
  //      RLC SN if not delivered before;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   464
  //    - if VR(UR) falls outside of the reordering window:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   465
  //        - set VR(UR) to (VR(UH) - UM_Window_Size);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   466
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   467
  if ( ! IsInsideReorderingWindow (seqNumber))
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   468
    {
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   469
      NS_LOG_LOGIC ("SN is outside the reordering window");
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   470
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   471
      m_vrUh = seqNumber + 1;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   472
      NS_LOG_LOGIC ("New VR(UH) = " << m_vrUh);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   473
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   474
      ReassembleOutsideWindow ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   475
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   476
      if ( ! IsInsideReorderingWindow (m_vrUr) )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   477
        {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   478
          m_vrUr = m_vrUh - m_windowSize;
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   479
          NS_LOG_LOGIC ("VR(UR) is outside the reordering window");
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   480
          NS_LOG_LOGIC ("New VR(UR) = " << m_vrUr);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   481
        }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   482
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   483
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   484
  // - if the reception buffer contains an UMD PDU with SN = VR(UR):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   485
  //    - update VR(UR) to the SN of the first UMD PDU with SN > current VR(UR) that has not been received;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   486
  //    - reassemble RLC SDUs from any UMD PDUs with SN < updated VR(UR), remove RLC headers when doing
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   487
  //      so and deliver the reassembled RLC SDUs to upper layer in ascending order of the RLC SN if not delivered
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   488
  //      before;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   489
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   490
  if ( m_rxBuffer.count (m_vrUr.GetValue ()) > 0 )
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   491
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   492
      NS_LOG_LOGIC ("Reception buffer contains SN = " << m_vrUr);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   493
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   494
      std::map <uint16_t, Ptr<Packet> >::iterator it;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   495
      uint16_t newVrUr;
8709
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
   496
      SequenceNumber10 oldVrUr = m_vrUr;
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   497
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   498
      it = m_rxBuffer.find (m_vrUr.GetValue ());
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   499
      newVrUr = (it->first) + 1;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   500
      while ( m_rxBuffer.count (newVrUr) > 0 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   501
        {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   502
          newVrUr++;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   503
        }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   504
      m_vrUr = newVrUr;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   505
      NS_LOG_LOGIC ("New VR(UR) = " << m_vrUr);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   506
8709
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
   507
      ReassembleSnInterval (oldVrUr, m_vrUr);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   508
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   509
8618
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
   510
  // m_vrUh can change previously, set new modulus base
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
   511
  // for the t-Reordering timer-related comparisons
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
   512
  m_vrUr.SetModulusBase (m_vrUh - m_windowSize);
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
   513
  m_vrUx.SetModulusBase (m_vrUh - m_windowSize);
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
   514
  m_vrUh.SetModulusBase (m_vrUh - m_windowSize);
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
   515
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   516
  // - if t-Reordering is running:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   517
  //    - if VR(UX) <= VR(UR); or
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   518
  //    - if VR(UX) falls outside of the reordering window and VR(UX) is not equal to VR(UH)::
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   519
  //        - stop and reset t-Reordering;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   520
  if ( m_reorderingTimer.IsRunning () )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   521
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   522
      NS_LOG_LOGIC ("Reordering timer is running");
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   523
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   524
      if ( (m_vrUx <= m_vrUr) ||
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   525
           ((! IsInsideReorderingWindow (m_vrUx)) && (m_vrUx != m_vrUh)) )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   526
        {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   527
          NS_LOG_LOGIC ("Stop reordering timer");
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   528
          m_reorderingTimer.Cancel ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   529
        }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   530
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   531
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   532
  // - if t-Reordering is not running (includes the case when t-Reordering is stopped due to actions above):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   533
  //    - if VR(UH) > VR(UR):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   534
  //        - start t-Reordering;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   535
  //        - set VR(UX) to VR(UH).
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   536
  if ( ! m_reorderingTimer.IsRunning () )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   537
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   538
      NS_LOG_LOGIC ("Reordering timer is not running");
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   539
8618
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
   540
      if ( m_vrUh > m_vrUr )
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   541
        {
8618
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
   542
          NS_LOG_LOGIC ("VR(UH) > VR(UR)");
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   543
          NS_LOG_LOGIC ("Start reordering timer");
8618
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
   544
          m_reorderingTimer = Simulator::Schedule (Time ("0.1s"),
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   545
                                                   &LteRlcUm::ExpireReorderingTimer ,this);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   546
          m_vrUx = m_vrUh;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   547
          NS_LOG_LOGIC ("New VR(UX) = " << m_vrUx);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   548
        }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   549
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   550
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   551
}
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   552
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   553
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   554
void
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   555
LteRlcUm::Start ()
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   556
{
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   557
  NS_LOG_FUNCTION (this);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   558
8499
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
   559
  DoReportBufferStatus ();
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   560
}
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   561
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   562
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   563
bool
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   564
LteRlcUm::IsInsideReorderingWindow (SequenceNumber10 seqNumber)
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   565
{
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   566
  NS_LOG_FUNCTION (this << seqNumber);
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   567
  NS_LOG_LOGIC ("Reordering Window: " <<
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   568
                m_vrUh << " - " << m_windowSize << " <= " << seqNumber << " < " << m_vrUh);
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   569
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   570
  m_vrUh.SetModulusBase (m_vrUh - m_windowSize);
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   571
  seqNumber.SetModulusBase (m_vrUh - m_windowSize);
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   572
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   573
  if ( ((m_vrUh - m_windowSize) <= seqNumber) && (seqNumber < m_vrUh))
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   574
    {
8618
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
   575
      NS_LOG_LOGIC (seqNumber << " is INSIDE the reordering window");
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   576
      return true;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   577
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   578
  else
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   579
    {
8618
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
   580
      NS_LOG_LOGIC (seqNumber << " is OUTSIDE the reordering window");
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   581
      return false;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   582
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   583
}
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   584
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   585
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   586
void
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   587
LteRlcUm::ReassembleAndDeliver (Ptr<Packet> packet)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   588
{
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   589
  LteRlcHeader rlcHeader;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   590
  packet->RemoveHeader (rlcHeader);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   591
  uint8_t framingInfo = rlcHeader.GetFramingInfo ();
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
   592
  SequenceNumber10 currSeqNumber = rlcHeader.GetSequenceNumber ();
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   593
  bool expectedSnLost;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   594
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   595
  if ( currSeqNumber != m_expectedSeqNumber )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   596
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   597
      expectedSnLost = true;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   598
      NS_LOG_LOGIC ("There are losses. Expected SN = " << m_expectedSeqNumber << ". Current SN = " << currSeqNumber);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   599
      m_expectedSeqNumber = currSeqNumber + 1;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   600
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   601
  else
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   602
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   603
      expectedSnLost = false;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   604
      NS_LOG_LOGIC ("No losses. Expected SN = " << m_expectedSeqNumber << ". Current SN = " << currSeqNumber);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   605
      m_expectedSeqNumber++;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   606
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   607
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   608
  // Build list of SDUs
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   609
  uint8_t extensionBit;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   610
  uint16_t lengthIndicator;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   611
  do
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   612
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   613
      extensionBit = rlcHeader.PopExtensionBit ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   614
      NS_LOG_LOGIC ("E = " << (uint16_t)extensionBit);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   615
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   616
      if ( extensionBit == 0 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   617
        {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   618
          m_sdusBuffer.push_back (packet);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   619
        }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   620
      else // extensionBit == 1
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   621
        {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   622
          lengthIndicator = rlcHeader.PopLengthIndicator ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   623
          NS_LOG_LOGIC ("LI = " << lengthIndicator);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   624
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   625
          // Check if there is enough data in the packet
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   626
          if ( lengthIndicator >= packet->GetSize () )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   627
            {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   628
              NS_LOG_LOGIC ("INTERNAL ERROR: Not enough data in the packet (" << packet->GetSize () << "). Needed LI=" << lengthIndicator);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   629
            }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   630
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   631
          // Split packet in two fragments
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   632
          Ptr<Packet> data_field = packet->CreateFragment (0, lengthIndicator);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   633
          packet->RemoveAtStart (lengthIndicator);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   634
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   635
          m_sdusBuffer.push_back (data_field);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   636
        }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   637
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   638
  while ( extensionBit == 1 );
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   639
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   640
  std::list < Ptr<Packet> >::iterator it;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   641
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   642
  // Current reassembling state
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   643
  if      (m_reassemblingState == WAITING_S0_FULL)  NS_LOG_LOGIC ("Reassembling State = 'WAITING_S0_FULL'");
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   644
  else if (m_reassemblingState == WAITING_SI_SF)    NS_LOG_LOGIC ("Reassembling State = 'WAITING_SI_SF'");
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   645
  else                                              NS_LOG_LOGIC ("Reassembling State = Unknown state");
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   646
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   647
  // Received framing Info
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   648
  NS_LOG_LOGIC ("Framing Info = " << (uint16_t)framingInfo);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   649
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   650
  // Reassemble the list of SDUs (when there is no losses)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   651
  if (!expectedSnLost)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   652
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   653
      switch (m_reassemblingState)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   654
        {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   655
          case WAITING_S0_FULL:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   656
                  switch (framingInfo)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   657
                    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   658
                      case (LteRlcHeader::FIRST_BYTE | LteRlcHeader::LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   659
                              m_reassemblingState = WAITING_S0_FULL;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   660
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   661
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   662
                              * Deliver one or multiple PDUs
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   663
                              */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   664
                              for ( it = m_sdusBuffer.begin () ; it != m_sdusBuffer.end () ; it++ )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   665
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   666
                                  m_rlcSapUser->ReceivePdcpPdu (*it);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   667
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   668
                              m_sdusBuffer.clear ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   669
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   670
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   671
                      case (LteRlcHeader::FIRST_BYTE | LteRlcHeader::NO_LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   672
                              m_reassemblingState = WAITING_SI_SF;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   673
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   674
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   675
                              * Deliver full PDUs
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   676
                              */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   677
                              while ( m_sdusBuffer.size () > 1 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   678
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   679
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   680
                                  m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   681
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   682
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   683
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   684
                              * Keep S0
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   685
                              */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   686
                              m_keepS0 = m_sdusBuffer.front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   687
                              m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   688
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   689
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   690
                      case (LteRlcHeader::NO_FIRST_BYTE | LteRlcHeader::LAST_BYTE):
8638
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   691
                              m_reassemblingState = WAITING_S0_FULL;
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   692
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   693
                              /**
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   694
                               * Discard SI or SN
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   695
                               */
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   696
                              m_sdusBuffer.pop_front ();
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   697
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   698
                              /**
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   699
                               * Deliver zero, one or multiple PDUs
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   700
                               */
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   701
                              while ( ! m_sdusBuffer.empty () )
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   702
                                {
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   703
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   704
                                  m_sdusBuffer.pop_front ();
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   705
                                }
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   706
                      break;
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   707
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   708
                      case (LteRlcHeader::NO_FIRST_BYTE | LteRlcHeader::NO_LAST_BYTE):
8638
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   709
                              if ( m_sdusBuffer.size () == 1 )
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   710
                                {
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   711
                                  m_reassemblingState = WAITING_S0_FULL;
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   712
                                }
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   713
                              else
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   714
                                {
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   715
                                  m_reassemblingState = WAITING_SI_SF;
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   716
                                }
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   717
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   718
                              /**
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   719
                               * Discard SI or SN
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   720
                               */
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   721
                              m_sdusBuffer.pop_front ();
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   722
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   723
                              if ( m_sdusBuffer.size () > 0 )
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   724
                                {
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   725
                                  /**
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   726
                                   * Deliver zero, one or multiple PDUs
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   727
                                   */
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   728
                                  while ( m_sdusBuffer.size () > 1 )
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   729
                                    {
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   730
                                      m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   731
                                      m_sdusBuffer.pop_front ();
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   732
                                    }
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   733
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   734
                                  /**
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   735
                                   * Keep S0
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   736
                                   */
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   737
                                  m_keepS0 = m_sdusBuffer.front ();
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   738
                                  m_sdusBuffer.pop_front ();
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   739
                                }
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   740
                      break;
5a6544286265 Fix bad state transition in the SDU reassembling process
Manuel Requena <manuel.requena@cttc.es>
parents: 8618
diff changeset
   741
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   742
                      default:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   743
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   744
                              * ERROR: Transition not possible
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   745
                              */
8708
108d9d416b4c Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents: 8666
diff changeset
   746
                              NS_LOG_LOGIC ("INTERNAL ERROR: Transition not possible. FI = " << (uint32_t) framingInfo);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   747
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   748
                    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   749
          break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   750
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   751
          case WAITING_SI_SF:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   752
                  switch (framingInfo)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   753
                    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   754
                      case (LteRlcHeader::NO_FIRST_BYTE | LteRlcHeader::LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   755
                              m_reassemblingState = WAITING_S0_FULL;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   756
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   757
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   758
                              * Deliver (Kept)S0 + SN
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   759
                              */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   760
                              m_keepS0->AddAtEnd (m_sdusBuffer.front ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   761
                              m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   762
                              m_rlcSapUser->ReceivePdcpPdu (m_keepS0);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   763
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   764
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   765
                                * Deliver zero, one or multiple PDUs
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   766
                                */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   767
                              while ( ! m_sdusBuffer.empty () )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   768
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   769
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   770
                                  m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   771
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   772
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   773
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   774
                      case (LteRlcHeader::NO_FIRST_BYTE | LteRlcHeader::NO_LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   775
                              m_reassemblingState = WAITING_SI_SF;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   776
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   777
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   778
                              * Keep SI
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   779
                              */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   780
                              if ( m_sdusBuffer.size () == 1 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   781
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   782
                                  m_keepS0->AddAtEnd (m_sdusBuffer.front ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   783
                                  m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   784
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   785
                              else // m_sdusBuffer.size () > 1
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   786
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   787
                                  /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   788
                                  * Deliver (Kept)S0 + SN
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   789
                                  */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   790
                                  m_keepS0->AddAtEnd (m_sdusBuffer.front ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   791
                                  m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   792
                                  m_rlcSapUser->ReceivePdcpPdu (m_keepS0);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   793
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   794
                                  /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   795
                                  * Deliver zero, one or multiple PDUs
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   796
                                  */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   797
                                  while ( m_sdusBuffer.size () > 1 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   798
                                    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   799
                                      m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   800
                                      m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   801
                                    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   802
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   803
                                  /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   804
                                  * Keep S0
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   805
                                  */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   806
                                  m_keepS0 = m_sdusBuffer.front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   807
                                  m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   808
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   809
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   810
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   811
                      case (LteRlcHeader::FIRST_BYTE | LteRlcHeader::LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   812
                      case (LteRlcHeader::FIRST_BYTE | LteRlcHeader::NO_LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   813
                      default:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   814
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   815
                                * ERROR: Transition not possible
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   816
                                */
8708
108d9d416b4c Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents: 8666
diff changeset
   817
                              NS_LOG_LOGIC ("INTERNAL ERROR: Transition not possible. FI = " << (uint32_t) framingInfo);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   818
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   819
                    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   820
          break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   821
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   822
          default:
8708
108d9d416b4c Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents: 8666
diff changeset
   823
                NS_LOG_LOGIC ("INTERNAL ERROR: Wrong reassembling state = " << (uint32_t) m_reassemblingState);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   824
          break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   825
        }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   826
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   827
  else // Reassemble the list of SDUs (when there are losses, i.e. the received SN is not the expected one)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   828
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   829
      switch (m_reassemblingState)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   830
        {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   831
          case WAITING_S0_FULL:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   832
                  switch (framingInfo)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   833
                    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   834
                      case (LteRlcHeader::FIRST_BYTE | LteRlcHeader::LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   835
                              m_reassemblingState = WAITING_S0_FULL;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   836
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   837
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   838
                               * Deliver one or multiple PDUs
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   839
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   840
                              for ( it = m_sdusBuffer.begin () ; it != m_sdusBuffer.end () ; it++ )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   841
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   842
                                  m_rlcSapUser->ReceivePdcpPdu (*it);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   843
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   844
                              m_sdusBuffer.clear ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   845
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   846
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   847
                      case (LteRlcHeader::FIRST_BYTE | LteRlcHeader::NO_LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   848
                              m_reassemblingState = WAITING_SI_SF;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   849
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   850
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   851
                               * Deliver full PDUs
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   852
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   853
                              while ( m_sdusBuffer.size () > 1 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   854
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   855
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   856
                                  m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   857
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   858
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   859
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   860
                               * Keep S0
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   861
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   862
                              m_keepS0 = m_sdusBuffer.front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   863
                              m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   864
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   865
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   866
                      case (LteRlcHeader::NO_FIRST_BYTE | LteRlcHeader::LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   867
                              m_reassemblingState = WAITING_S0_FULL;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   868
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   869
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   870
                               * Discard SN
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   871
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   872
                              m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   873
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   874
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   875
                               * Deliver zero, one or multiple PDUs
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   876
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   877
                              while ( ! m_sdusBuffer.empty () )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   878
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   879
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   880
                                  m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   881
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   882
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   883
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   884
                      case (LteRlcHeader::NO_FIRST_BYTE | LteRlcHeader::NO_LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   885
                              if ( m_sdusBuffer.size () == 1 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   886
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   887
                                  m_reassemblingState = WAITING_S0_FULL;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   888
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   889
                              else
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   890
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   891
                                  m_reassemblingState = WAITING_SI_SF;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   892
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   893
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   894
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   895
                               * Discard SI or SN
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   896
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   897
                              m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   898
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   899
                              if ( m_sdusBuffer.size () > 0 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   900
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   901
                                  /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   902
                                  * Deliver zero, one or multiple PDUs
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   903
                                  */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   904
                                  while ( m_sdusBuffer.size () > 1 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   905
                                    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   906
                                      m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   907
                                      m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   908
                                    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   909
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   910
                                  /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   911
                                  * Keep S0
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   912
                                  */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   913
                                  m_keepS0 = m_sdusBuffer.front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   914
                                  m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   915
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   916
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   917
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   918
                      default:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   919
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   920
                               * ERROR: Transition not possible
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   921
                               */
8708
108d9d416b4c Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents: 8666
diff changeset
   922
                              NS_LOG_LOGIC ("INTERNAL ERROR: Transition not possible. FI = " << (uint32_t) framingInfo);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   923
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   924
                    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   925
          break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   926
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   927
          case WAITING_SI_SF:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   928
                  switch (framingInfo)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   929
                    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   930
                      case (LteRlcHeader::FIRST_BYTE | LteRlcHeader::LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   931
                              m_reassemblingState = WAITING_S0_FULL;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   932
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   933
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   934
                               * Discard S0
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   935
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   936
                              m_keepS0 = 0;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   937
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   938
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   939
                               * Deliver one or multiple PDUs
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   940
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   941
                              while ( ! m_sdusBuffer.empty () )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   942
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   943
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   944
                                  m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   945
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   946
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   947
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   948
                      case (LteRlcHeader::FIRST_BYTE | LteRlcHeader::NO_LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   949
                              m_reassemblingState = WAITING_SI_SF;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   950
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   951
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   952
                               * Discard S0
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   953
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   954
                              m_keepS0 = 0;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   955
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   956
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   957
                               * Deliver zero, one or multiple PDUs
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   958
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   959
                              while ( m_sdusBuffer.size () > 1 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   960
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   961
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   962
                                  m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   963
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   964
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   965
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   966
                               * Keep S0
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   967
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   968
                              m_keepS0 = m_sdusBuffer.front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   969
                              m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   970
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   971
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   972
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   973
                      case (LteRlcHeader::NO_FIRST_BYTE | LteRlcHeader::LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   974
                              m_reassemblingState = WAITING_S0_FULL;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   975
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   976
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   977
                               * Discard S0
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   978
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   979
                              m_keepS0 = 0;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   980
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   981
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   982
                               * Discard SI or SN
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   983
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   984
                              m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   985
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   986
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   987
                               * Deliver zero, one or multiple PDUs
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   988
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   989
                              while ( ! m_sdusBuffer.empty () )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   990
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   991
                                  m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   992
                                  m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   993
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   994
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   995
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   996
                      case (LteRlcHeader::NO_FIRST_BYTE | LteRlcHeader::NO_LAST_BYTE):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   997
                              if ( m_sdusBuffer.size () == 1 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   998
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
   999
                                  m_reassemblingState = WAITING_S0_FULL;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1000
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1001
                              else
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1002
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1003
                                  m_reassemblingState = WAITING_SI_SF;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1004
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1005
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1006
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1007
                               * Discard S0
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1008
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1009
                              m_keepS0 = 0;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1010
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1011
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1012
                               * Discard SI or SN
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1013
                               */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1014
                              m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1015
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1016
                              if ( m_sdusBuffer.size () > 0 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1017
                                {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1018
                                  /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1019
                                   * Deliver zero, one or multiple PDUs
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1020
                                   */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1021
                                  while ( m_sdusBuffer.size () > 1 )
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1022
                                    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1023
                                      m_rlcSapUser->ReceivePdcpPdu (m_sdusBuffer.front ());
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1024
                                      m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1025
                                    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1026
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1027
                                  /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1028
                                   * Keep S0
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1029
                                   */
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1030
                                  m_keepS0 = m_sdusBuffer.front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1031
                                  m_sdusBuffer.pop_front ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1032
                                }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1033
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1034
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1035
                      default:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1036
                              /**
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1037
                                * ERROR: Transition not possible
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1038
                                */
8708
108d9d416b4c Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents: 8666
diff changeset
  1039
                              NS_LOG_LOGIC ("INTERNAL ERROR: Transition not possible. FI = " << (uint32_t) framingInfo);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1040
                      break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1041
                    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1042
          break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1043
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1044
          default:
8708
108d9d416b4c Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents: 8666
diff changeset
  1045
                NS_LOG_LOGIC ("INTERNAL ERROR: Wrong reassembling state = " << (uint32_t) m_reassemblingState);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1046
          break;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1047
        }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1048
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1049
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1050
}
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1051
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1052
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1053
void
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1054
LteRlcUm::ReassembleOutsideWindow (void)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1055
{
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1056
  NS_LOG_LOGIC ("Reassemble Outside Window");
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1057
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1058
  std::map <uint16_t, Ptr<Packet> >::iterator it;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1059
  it = m_rxBuffer.begin ();
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1060
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
  1061
  while ( (it != m_rxBuffer.end ()) && ! IsInsideReorderingWindow (SequenceNumber10 (it->first)) )
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1062
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1063
      NS_LOG_LOGIC ("SN = " << it->first);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1064
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1065
      // Reassemble RLC SDUs and deliver the PDCP PDU to upper layer
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1066
      ReassembleAndDeliver (it->second);
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
  1067
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
  1068
      std::map <uint16_t, Ptr<Packet> >::iterator it_tmp = it;
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
  1069
      ++it;
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
  1070
      m_rxBuffer.erase (it_tmp);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1071
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1072
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1073
  if (it != m_rxBuffer.end ())
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1074
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1075
      NS_LOG_LOGIC ("(SN = " << it->first << ") is inside the reordering window");
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1076
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1077
}
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1078
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1079
void
8709
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1080
LteRlcUm::ReassembleSnInterval (SequenceNumber10 lowSeqNumber, SequenceNumber10 highSeqNumber)
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1081
{
8709
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1082
  NS_LOG_LOGIC ("Reassemble SN between " << lowSeqNumber << " and " << highSeqNumber);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1083
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1084
  std::map <uint16_t, Ptr<Packet> >::iterator it;
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
  1085
8709
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1086
  SequenceNumber10 reassembleSn = lowSeqNumber;
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1087
  NS_LOG_LOGIC ("reassembleSN = " << reassembleSn);
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1088
  NS_LOG_LOGIC ("highSeqNumber = " << highSeqNumber);
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1089
  while (reassembleSn < highSeqNumber)
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1090
    {
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1091
      NS_LOG_LOGIC ("reassembleSn < highSeqNumber");
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1092
      it = m_rxBuffer.find (reassembleSn.GetValue ());
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1093
      NS_LOG_LOGIC ("it->first  = " << it->first);
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1094
      NS_LOG_LOGIC ("it->second = " << it->second);
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1095
      if (it != m_rxBuffer.end () )
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1096
        {
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1097
          NS_LOG_LOGIC ("SN = " << it->first);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1098
8709
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1099
          // Reassemble RLC SDUs and deliver the PDCP PDU to upper layer
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1100
          ReassembleAndDeliver (it->second);
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1101
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1102
          m_rxBuffer.erase (it);
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1103
        }
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1104
        
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1105
      reassembleSn++;
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1106
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1107
}
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1108
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1109
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1110
void
8499
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1111
LteRlcUm::DoReportBufferStatus (void)
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1112
{
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1113
  Time holDelay (0);
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1114
  uint32_t queueSize = 0;
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1115
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1116
  if (! m_txBuffer.empty ())
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1117
    {
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1118
      RlcTag holTimeTag;
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1119
      m_txBuffer.front ()->PeekPacketTag (holTimeTag);
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1120
      holDelay = Simulator::Now () - holTimeTag.GetSenderTimestamp ();
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1121
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1122
      queueSize = m_txBufferSize + 2 * m_txBuffer.size (); // Data in tx queue + estimated headers size
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1123
    }
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1124
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1125
  LteMacSapProvider::ReportBufferStatusParameters r;
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1126
  r.rnti = m_rnti;
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1127
  r.lcid = m_lcid;
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1128
  r.txQueueSize = queueSize;
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1129
  r.txQueueHolDelay = holDelay.GetMilliSeconds () ;
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1130
  r.retxQueueSize = 0;
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1131
  r.retxQueueHolDelay = 0;
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1132
  r.statusPduSize = 0;
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1133
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1134
  NS_LOG_LOGIC ("Send ReportBufferStatus = " << r.txQueueSize << ", " << r.txQueueHolDelay );
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1135
  m_macSapProvider->ReportBufferStatus (r);
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1136
}
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1137
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1138
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1139
void
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1140
LteRlcUm::ExpireReorderingTimer (void)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1141
{
8708
108d9d416b4c Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents: 8666
diff changeset
  1142
  NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid);
8618
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
  1143
  NS_LOG_LOGIC ("Reordering timer has expired");
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1144
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1145
  // 5.1.2.2.4 Actions when t-Reordering expires
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1146
  // When t-Reordering expires, the receiving UM RLC entity shall:
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1147
  // - update VR(UR) to the SN of the first UMD PDU with SN >= VR(UX) that has not been received;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1148
  // - reassemble RLC SDUs from any UMD PDUs with SN < updated VR(UR), remove RLC headers when doing so
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1149
  //   and deliver the reassembled RLC SDUs to upper layer in ascending order of the RLC SN if not delivered before;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1150
  // - if VR(UH) > VR(UR):
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1151
  //    - start t-Reordering;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1152
  //    - set VR(UX) to VR(UH).
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1153
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1154
  std::map <uint16_t, Ptr<Packet> >::iterator it;
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
  1155
  SequenceNumber10 newVrUr = m_vrUx;
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1156
8572
ada66b065cc2 Fix processing of the sequence number
Manuel Requena <manuel.requena@cttc.es>
parents: 8499
diff changeset
  1157
  while ( (it = m_rxBuffer.find (newVrUr.GetValue ())) != m_rxBuffer.end () )
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1158
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1159
      newVrUr++;
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1160
    }
8709
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1161
  SequenceNumber10 oldVrUr = m_vrUr;
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1162
  m_vrUr = newVrUr;
8618
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
  1163
  NS_LOG_LOGIC ("New VR(UR) = " << m_vrUr);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1164
8709
a64f5b0ff6f7 Fix bug in reassemble of RLC UM PDUs
Manuel Requena <manuel.requena@cttc.es>
parents: 8708
diff changeset
  1165
  ReassembleSnInterval (oldVrUr, m_vrUr);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1166
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1167
  if ( m_vrUh > m_vrUr)
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1168
    {
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1169
      NS_LOG_LOGIC ("Start reordering timer");
8618
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
  1170
      m_reorderingTimer = Simulator::Schedule (Time ("0.1s"),
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1171
                                               &LteRlcUm::ExpireReorderingTimer, this);
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1172
      m_vrUx = m_vrUh;
8618
e09a5d6ed1c5 Change some traces
Manuel Requena <manuel.requena@cttc.es>
parents: 8586
diff changeset
  1173
      NS_LOG_LOGIC ("New VR(UX) = " << m_vrUx);
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1174
    }
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1175
}
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1176
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1177
8499
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1178
void
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1179
LteRlcUm::ExpireRbsTimer (void)
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1180
{
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1181
  NS_LOG_LOGIC ("RBS Timer expires");
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1182
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1183
  if (! m_txBuffer.empty ())
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1184
    {
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1185
      DoReportBufferStatus ();
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1186
      m_rbsTimer = Simulator::Schedule (MilliSeconds (10), &LteRlcUm::ExpireRbsTimer, this);
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1187
    }
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1188
}
c2658133775b Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents: 8493
diff changeset
  1189
8361
d7f82b579891 UM RLC entity
Manuel Requena <manuel.requena@cttc.es>
parents:
diff changeset
  1190
} // namespace ns3